diff --git a/' b/' new file mode 100644 index 000000000..9d0aeac4f --- /dev/null +++ b/' @@ -0,0 +1,2179 @@ +[Adblock Plus 2.0] +! Checksum: f48jtUEnjAdHrPRYhqA5hQ +! Title: Fanboy's Enhanced Tracking List +! Updated: 10 Jul 2017 +! This list expires after 4 days +! License: http://creativecommons.org/licenses/by/3.0/ +! Homepage: http://www.fanboy.co.nz/ +! Reporting Issues: https://github.com/ryanbr/fanboy-adblock/issues +! +! Legal stuff (T&C's). +! In no event shall Fanboy List, or the list author be liable for any indirect, direct, punitive, special, incidental, or consequential damages whatsoever. +! By downloading or viewing, or using this list, you are accepting these terms and the license. +! +&referer=$image,script,domain=~gismeteo.ru|~vuokraovi.com|~24ur.com|~cdon.dk|~cdon.fi|~cdon.no|~cdon.se|~ratp.fr|~skype.com +-coremetrics- +-CoreMetrics. +-elqImg. +-flash-cookies/ +-omniture- +-omniture.js +-OmnitureSWF. +-s_code. +-sitecatalyst. +-webtrends- +-Webtrends. +-webtrends_ +.cmdatatagutils. +.com/ga.*.js +.com/ga.js +.com/mt.js +.eluminate. +.event-tracking.js +.hbx.js? +.omniture. +.omniture_ +.php?referer= +.s_code.js +.s_code_ +.siteCatalyst. +.siteCatalystTL. +.slimsurveys. +.tealium. +.Webtrends.js +/_/batch|$~third-party,xmlhttprequest +/_omniture/* +/_tl_track.js +/abpTest/* +/adobe-dtm- +/Adobe-DTM/* +/ajax/hit/* +/akqa.tracking. +/amp-analytics- +/analytics/*/xtcore.js +/analytics/mbox_ +/at.js.php| +/atm_code.js +/audiencemeasurement. +/bidiqCookieDropper. +/boomerang-0*.js +/catalyst.js +/cllc.tracking.js +/cm_controldata. +/cmdatagutils. +/cmdatatagutils. +/cmdatatagutils_ +/cmEluminate. +/cmtaggingservices. +/ComScorePeopleCom. +/cookie-id.js? +/coremetrics- +/coremetrics. +/coremetrics/* +/CoreMetricsSupportLib/* +/CoreMetricsTracking. +/customOmnitureData.js +/dcs_head.js +/dcs_tag1.js +/dcs_tag2.js +/dcs_tag_ +/dcstag_ +/ecomfw.min.js +/elq_tracking- +/elqCPers. +/elqFCS. +/eluminate. +/eluminate_ +/figp.js +/foresee- +/foreseeforesee- +/forsee- +/foxomniture.swf +/FoxOmnitureMonitor. +/fp.min.jsp +/fp2.js +/gaManager.js +/gamepageomniture. +/gannettomniture.swf +/gatag_v2. +/global_analytics. +/global_tracking.js +/gs-analytics. +/h-code- +/h-code.js +/h_code. +/h_code_ +/hbx-load.html +/hbx.js +/hbx/hbx_ +/hbx2.js +/hbx_custom. +/hbx_page_code_ +/hbxfunctions.js +/hbxmedia. +/hbxmodify. +/hbxscript. +/hbxvariables. +/hitbox/hbx_ +/includes/s_code +/iv_nv_footer. +/iv_nv_header. +/javascript/hbx_ +/javascript/tracking.js +/javascript/webtrends +/jquery.dfp.gpt. +/jquery.truste-consent- +/js/analytics/* +/js/catalyst_ru.js +/js/hbx- +/js/hbx_*.js +/js/mbox- +/js/mbox_ +/js/omn/* +/js/omni_ +/kenshoo.js +/lib/boomerang/*$script +/llbmetrics. +/loadingpageomniture. +/logomnitureevent.js +/mbox-*.js$script +/mbox.01. +/mbox.20. +/mbox.js +/mbox.orig.js +/mbox39. +/mbox_09. +/mbox_rc. +/mbox_v1_ +/metricspar_ +/mod_pagespeed_beacon? +/NBCUComScore. +/NBCUOmnitureTracking. +/omn_global_ +/omni_config. +/omni_footer_ +/omni_functions.js +/omni_mdt.js +/omni_mediatrack_ +/omniHelper. +/omniSearch_ +/omnitrack.js +/omnitracking. +/omniture- +/omniture. +/omniture/* +/omniture2. +/omniture? +/omniture_ +/omnitureactionsource. +/omnitureAnalyticsImpl. +/OmnitureAppMeasurementExtension. +/omnitureBase. +/omniturebodyhcode. +/omnitureCode. +/omnitureCompat. +/omnitureConfig. +/omnitureconfig/* +/omniturecore.js +/omnitureEvents. +/omnitureEventSink. +/omnitureFix. +/OmnitureHandler. +/OmnitureHelper. +/OmnitureJavascriptHandler. +/OmnitureJS. +/omniturejs/* +/OmnitureLibrary. +/omnituremedia.swf +/OmniturePageCode. +/omniturePlugin. +/omniturePlugin_ +/omniturerefresh. +/OmnitureScript. +/omnitureService. +/OmnitureSWF- +/OmnitureTrackerAS3. +/omnituretracking/* +/omnituretrackingjs/* +/omnitureZoneTracker. +/omniunih_ +/OmniUserObjAndHelper. +/omtr_code. +/omtr_code_ +/omtr_tc.js +/ote/ote.js +/ote/ste.js +/page-addviews? +/pageLevelOmniture. +/pagespeed.js +/ParseOmniture. +/PluginEndPlayOmniture_ +/prebid.min.js +/pubsys.js +/reporting.do? +/resonance.js +/s-code- +/s-code.js +/s2_code. +/s_am_code. +/s_code- +/s_code. +/s_code/* +/s_code1. +/s_code2. +/s_code3. +/s_code_ +/s_codefullsol. +/s_codeFULLTTO. +/s_codeH. +/s_codeMaps. +/s_codeV2. +/s_config_ +/s_crainsc.js +/s_dr_code_ +/s_h_code. +/s_i_code. +/s_local_customization. +/s_nd_code.js +/s_nd_code_ +/s_one_code. +/s_prod_code. +/s_remote_code. +/s_remote_code_ +/s_site_catalyst. +/s_tan_code. +/s_wpn_code. +/sc_code_ +/scode- +/scode.js +/scode_ +/scripts/hbx_ +/scripts/mbox. +/sctl.js? +/sdc.js +/sdc_include_ +/sdcTrackingCode. +/shc_code.js +/sikomniture_ +/site-catalyst. +/site_catalyst. +/site_catalyst/* +/site_catalyst_ +/site_specific_code. +/sitebrand-$script +/sitecatalyst-http- +/sitecatalyst. +/sitecatalyst/* +/sitecatalyst_ +/SiteCatalystAnalytics. +/SiteCatalystCode_ +/SiteCatalystEventListener. +/sitecatalystfooter. +/sitecatalysth.js +/SiteCatalystH243. +/SiteCatalystInclude. +/sitecatalystlib.js +/siteClarity/* +/sitewise_cms. +/smart_source_*/dcs_$script +/smartbanner/appbanner.js +/smeadvert- +/somni.js +/sonyOmnitureTracker. +/stat?event=pixel. +/survey_jspage. +/tagging-akqa. +/tan_code.js +/tealium/* +/thcn_code.js +/thcn_code_ +/touch-clarity. +/TouchClarity. +/tracking/hbx- +/urchin_util. +/vs_code.js +/wa_code. +/wa_process.js +/wanalytics- +/web_trends_ +/webtrack_tag_ +/webtrends- +/webtrends. +/webtrends/*$script +/webtrends1. +/webtrends2. +/webtrends3. +/webtrends75_ +/webtrends8_ +/webtrends_ +/webtrendsAP_ +/webtrendsasync. +/webtrendsasyncloader. +/webtrendsdt. +/webtrendsExt. +/WebTrendsJS/* +/WebtrendsPlugin. +/WebTrendsRedirector. +/webtrendsTag. +/webtrendsTrack. +/webtrendsUS. +/WidgetOmniture. +/wmgbeaconcode. +/wmps_tracker. +/wt-tag. +/wt_capi_ +/wt_plugins. +/wt_tag.js +/wt_tracking. +/wtbase2.js +/wtbrand.js +/wtcollect. +/WTdcsCollect.js +/WTFarmersSite.js +/wtfindingmethod. +/wtrack/? +/wx-metrics.js +=s_code.js +=s_code_ +=webtrends. +?referer*http= +?referrer*http= +_chl_code. +_CoreMetrics/ +_hbx_ad_refresh +_hbx_proxy. +_hcode.js +_hightraffic_code.js +_omnireport. +_omniture.$~object-subrequest +_Omniture_ +_omnitureVarsComm. +_s-code. +_s_code- +_s_code. +_s_code_ +_s_remote_code. +_scode.js +_sdc.js +_sdcTrackingCode. +_SiteCatalyst. +_sitecatalyst_ +_urchin.js +_WebTrends.js +_webtrends/ +_webtrends_ +_wtBase.js +_wtbaseV2. +_wtInit.js +! popads tracking +/favicon.ico$image,third-party,domain=~reddit.com +! +! CDN scripts (Ad and Tracking scripts) Test filters. +! +/cdn-cgi/pe/bag2?*atrk.js +/cdn-cgi/pe/bag2?*pagead2.googlesyndication.com +! +! ---------- Cookie/Subscription Checking ------ +! +###issuem-leaky-paywall-articles-zero-remaining-nag +###pianoMediaBar +##.acn-zero-remaining-overlay +##.adblock-notification-wrapper +##.piano-subscribe +/article-countdown-nag.js +/check-ad-free/? +/ep-paywall-portlet/* +/paymeterconfig/* +/paywall.min.js +/tn-paywall/* +@@||torontosun.com/assets/js/paywall.min.js +jsonline.com##.blockOverlay +jsonline.com##.blockPage +nautil.us###adpayload +||accu.fm/audio/sweeper/ +||cointent.com^$third-party +||mediapass.com^$third-party +||newsmemory.com^$third-party +||piano-media.com^$third-party +||ppjol.net^$third-party +||subscriptiongenius.com^$third-party +||syncronex.com^$third-party +||tinypass.com^$third-party +! +! +! ---------- Personal Filters ------ +! +###topstuff > #wmxmsg +##iframe[src^="https://isupportjournalism.com/"][style] +@@||thepiratebay.org^*/details.js| +@@||thepiratebay.org^*/effects.js| +@@||thepiratebay.org^*/jquery.min.js| +@@||thepiratebay.org^*/prototype.js| +@@||thepiratebay.org^*/scriptaculous.js| +@@||thepiratebay.org^*/tpb.js| +arstechnica.com##a[href="/subscriptions/"] +blu-ray.com###getstarted +drugs.com##div[style="left: 0px; position: fixed; top: auto; bottom: 48px;"] +facebook.com###stream_pagelet > #pagelet_megaphone +fark.com##.top_right_container +flightradar24.com###bottomRightPanel +forum.hwbot.org##CENTER > A[href^="https://teespring.com/"] +imagebam.com###viroll +imagebam.com###viroll-header +kpopstarz.com##.ad +libertyunyielding.com##.vertical-share-buttons +nautil.us##.auto_add +player.twitch.tv##.player-overlay +rogerebert.com##.share +theguardian.com##.contributions__epic +trademe.co.nz###advertisingOptOutBanner +wolframalpha.com###headerad-pro +wolframalpha.com###sidebar +wolframalpha.com###subpod_zoom +||thepiratebay.org^$script +! +! Adblock Warnings +! +game-debate.com##.loadIn300by250 +homerun.re,strikeout.co,vipbox.sx,vipleague.co##span > div +pornhub.com###abAlert +redtube.com###slidePanelContainerAB +thenewcivilrightsmovement.com##.block-alert +unlimited-recipes.com#@##adsense +wowhead.com##[data-was-parent="true"] +youporn.com###adblock_1 +! +! ---------- 1st party blocking rules ---------- +! +|http://$image,third-party,domain=extremetech.com +||53.com/resources/js/wt.js +||aarp.net/etc/aarp/statics/global/js/mbox. +||addthis.com/static/r07/core130.js +||adziff.com/mostclicked/ +||akamai.net/*/includes/iv_footer.js +||akamai.net/*/includes/iv_header.js +||akamai.net/cache.lego.com/Stats/ +||amazonaws.com/af-bdaz/bquery.js +||bankofamerica.com/www/global/js/tc_logging.js +||bjs.com^*_landing.js +||bosch.com/WTg/WTg.js +||bt.com/media/js/SiteCatalyst- +||burberry.com^*/webtrendsMC.js +||carpartswholesale.com/includes/cpw_s_code*.js +||cbc.ca/g/stats/linktracker.js +||cbc.ca/includes/stats/hbx_ +||ccom-cdn.com/assets/js/ga.js +||cdc.gov/JScript/metrics/ +||cf*.rackcdn.com^$script,domain=chowhound.com|businessinsider.com|cbsnews.com|cbssports.com|chow.com|cnet.com|colbertlateshow.com|comingsoon.net|conferenceusa.com|destructoid.com|flixist.com|gamefaqs.com|gamespot.com|last.fm|mamma.com|memory-alpha.org|metacritic.com|metrolyrics.com|mp3.com|pch.com|techrepublic.com|tv.com|tvguide.com|wikia.com +||chevron.com/js/chevron_ga.js +||cknw.com^*/s_cknwam_code.js +||cleartrip.com/javascripts/ga.*.js +||comparison411.com/px.gif +||copy.com/logs +||cya2.net/js/STAT/ +||cyanogenmod.org/tracking.js +||dialog.com/js/wt.js +||ehow.com/px.gif +||epson.com/2005redesign/ww_ga.js +||expedia.com^*/tracking.js? +||extremetech.com/wp-content/themes/extremetech/js/site.js?p=*&r=*&q=*%*&s=*&*. +||firstdirect.com/*/scripts/optimise.js +||foodandwine.com/javascripts/_fw_track.js +||force.com/resource/*/js_hitcount +||force.com/resource/*/js_omniture +||fujitsu.com/inc/wt.js +||geo.query.yahoo.com^$xmlhttprequest +||gizmodo.com/api/*/annotations +||goo.gl/*?a=$image,domain=9gag.com +||google.*/url?sa=T&source=web&cd=$image +||google.com/jsremotelog? +||google.com/sierralogout? +||gotraffic.net^*/breg-min.js +||govt.nz/ga.js +||hola.org/_virt_track_activation +||hollywood.com/toolbar_reporting.js +||images-amazon.com^*/js/mbox. +||imgur.com/min/px.js +||ioam.de/iam.js +||lasikplus.com/scripts/s_code +||lendingclub.com^*/home_mbox_ +||libertymutual.com^*/analytics/SC_Code.js +||linkedin.com/pulse/api/tracking? +||mail.google.com/mail/rc/?$image +||mail.google.com/mail/u/0/images/c.gif +||manta-r1.com^*/js::omniture_s_code +||medium.com/*/impression$xmlhttprequest +||msecnd.net^*/dcs-red-tag3- +||mtv.ca/scripts/globalpagetrackingalternate.js +||mulberry.com/includes/tracking.js +||nationaljournal.com/js/omniture +||nationwide.com/aq-static/scripts/js/nw_wt_fpc.js +||neopets.com/js/ga.js +||newyorker.com/static/failsafe/ +||nissanusa.com/js/crm/page_tags/*.js +||nokia.co.in^*/nokia_popup_script_in.js +||nyc.gov/html/misc/scripts/nycwebtrends.js +||nyt.com/analytics/tagx-simple.min.js +||olark.com/nrpc/*=pollevents +||onlineshoes.com^*/s_ols_code. +||oodle.com/jaml/reporting/ +||player.foxfdm.com^*/FoxComscorePlugIn.swf$domain=fox.com|fxnetworks.com +||quora.com/_/$image +||randomhouse.com/js/resxclsa35.js +||reuters.com/pulse/2/trb.js +||reutersmedia.net^*/rcom-tracking.js +||rogersdigitalmedia.com/libs/analytics/RDMOmniture.swf +||s.update.entrepreneur.com^ +||schwab.com^*filename=hbx.js +||seatguru.com^*/sg-tracking.js +||servingyourtown.com/js/metrics.js +||shoes.com/scripts/bvreporting.js +||shoplocal.com/*/scripts/tracking.js +||slimg.com/js/AWD/Tracking.nano.js +||spotify.com/xhr/json/log.php +||thomasnet.com/javascript/dcs_ +||timeinc.net/shared/static/swf/ComScoreEWCom.swf +||toptenreviews.com/scripts/omn_id.php +||trademe.co.nz/Javascript/LoadAudienceSegs-bdl? +||trademe.co.nz^*/LogJavaScriptError.ashx +||travelpn.com/js/WRc6.js +||treehousetv.com/Scripts/urloverride.js +||tribdss.com/meter/ +||ukbride.co.uk/js/frontend/tracker.js +||upworthy.com/api/geo.js +||webassetsb.scea.com/pscomauth/groups/*/ps_mbox_js.js$domain=playstation.com +||webroot.com/js/om_sc.js +||wsj.net/javascript/*/Tracking.js +||yimg.com/uq/syndication/yad.js +||yimg.com^*/g-d-min.js +||yimg.com^*/gemini.js +! +! ---------- 3rd party blocking rules ---------- +! +||5min.com/flashcookie/ +||5min.com/Handlers/FiveminCookieCache.ashx +||algorithmia.com^$third-party +||areyouahuman.com^$third-party +||avgthreatlabs.com^$third-party +||badge.clevergirlscollective.com^$third-party +||bbb.org/logo/$third-party +||bbb.org/seals/$third-party +||blockertools.net^$third-party +||browser-update.org^$third-party +||bunsen.wapolabs.com^ +||buzzbytes.net^$third-party +||capture.trackjs.com^ +||chameleonx.net^$third-party +||cloudfront.net/capture/$script +||cloudharmony.net^$third-party +||consent-st.truste.com^$third-party +||doctortrusted.org^$third-party +||doubleclick.net^$third-party +||dsr.livefyre.com/livecountping/ +||dynamicyield.com^$third-party +||errors.perso.nile.works^ +||etrust.pro^$third-party +||fairblocker.com^$third-party +||feastie.com/badges/$third-party +||fwmrm.net^*/SurveyExtension.swf +||fwmrm.net^*/VastTranslator.swf +||geo.query.yahoo.com^$third-party +||gleam.io^$third-party +||google-analytics.com^$third-party +||google.com/coop/cse/$~stylesheet,third-party +||googlecommerce.com/trustedstores/$third-party,domain=~google.com +||googletagservices.com/tag/js/check*.js +||grvcdn.com/moth-min.js +||gstatic.com/pub-config/ca-pub-*.js$third-party,domain=~google.com +||images.dmca.com^$third-party +||images.scanalert.com^$third-party +||instantssl.com^$image,third-party +||joinbot.com^$third-party +||jsrdn.com/s/cs.js +||kalooga.com^$third-party +||leadpages.net/leadbox-*.js$third-party +||mark.reevoo.com^$third-party +||matchcows.com^$third-party +||mcafeesecure.com/meter/$third-party +||mcafeesecure.com/verify-float?$third-party +||medals.bizrate.com^$third-party +||my.leadpages.net^$third-party +||natoms.com^$third-party +||nile.works/test-statistics? +||nsg.symantec.com^$third-party +||ooh.li^$third-party +||ooyala.com/3rdparty/visible_measures_ +||p.d.*.com/v1/$third-party +||preferences.truste.com^$third-party +||privacy-policy.truste.com^$third-party +||pubnub.com/time/*uuid=$third-party +||resellerratings.com^$third-party +||richrelevance.com^$third-party +||salecycle.com^$third-party +||seal.alphassl.com^$third-party +||seal.digicert.com^$third-party +||seal.godaddy.com^$third-party +||seal.networksolutions.com^$third-party +||seal.starfieldtech.com^$third-party +||seal.stellaservice.com^$third-party +||seal.thawte.com^$third-party +||seal.verisign.com^$third-party +||seal.websecurity.norton.com^$third-party +||sealserver.trustwave.com^$third-party +||securitymetrics.com^$third-party +||sellpoint.net^$third-party +||services.disqus.com/event.js?$third-party +||shield.sitelock.com^$third-party +||shoprunner.com^$third-party +||smarticon.geotrust.com^$third-party +||snapsurveys.com^$third-party +||stats.computecmedia.de^ +||syncaccess.net^$third-party +||tags.tiqcdn.com/utag/*/utag.v.js +||targeting.wpdigital.net^ +||tracedseals.starfieldtech.com^$third-party +||trackjs.com^*/tracker.js$third-party +||trustlogo.com^$third-party +||truthfulhead.com^ +||verify.authorize.net^$third-party +||webengage.com^$third-party +||websecurity.norton.com^$third-party +||websitealive.com^$third-party +||websitealive5.com^$third-party +||webutation.net^$third-party +||widget.prnewswire.com^$third-party +||widgets.trustedshops.com^$third-party +||wurfl.io^$third-party +||ywxi.net^$third-party,domain=~mcafee.com +! +! +!--------- Unsorted Rules -------- +! +||freestat.hu^$third-party +||midphase.com^*/img.pl?$third-party +||mystats.nl^$third-party +||ovnet.fr^$third-party +||pakranks.com^$third-party +||predicta.com.br^$third-party +||site-id.nl^$third-party +||statsector.hu^$third-party +||tracknet.twyn.com^ +||webcount.finn.no^ +! +!---------- French Trackers ---------- +! +||be2.com/tracker; +||beead.fr^$third-party +||clickintext.net^$third-party +||ip-label.net/Data/coll.aspx?$third-party +||stats.stats.fr^ +||tracking.bestofmicro.com^ +||tracking.infos-du-net.com^ +||tracking.presence-pc.com^ +||tracking.tomsguide.fr^ +||veoxa.com^ +! +!---------- Dutch Trackers ------------ +! +||letsstat.nl^$third-party +! +!---------- Taiwan Trackers ------------ +! +! +!---------- German Trackers ------------ +! +.de/log/? +.de/pstat/ +.de/stat/ +.de/track/ +.tv/tracking? +||easyranking.de^$third-party +||hitcount.de^$third-party +||hitpage.de^$third-party +||ipstats.de^$third-party +||met.vgwort.de/na/ +||perlentaucher.de/cgi-bin/blanky? +||ranktraffic.de^$third-party +||rapidstats.de^$third-party +||serverkompetenz.net/cpx.php?$third-party +||trafficcenter.de^$third-party +||trk.newtention.net^ +! +!---------- Anti Adblock & Anti Adblock Tracking ------ +! These filters are for websites tracking and monitoring adblock users +! +/abp_detection/* +/adBlockerTrack_ +/adverst.js +/javascript/ads.js$script,~third-party +@@/ad_bomb/*$image +@@/adblocker/adcheck.js$script,~third-party +@@/ads/adframe.js$script,~third-party +@@||startclass.com/ad? +@@/ads/ads.js$script,~third-party +@@/app/adframe.js$script,~third-party +@@/javascript/advertisement.js$script,~third-party +@@/javascripts/advert.js$script,~third-party +@@/js/adframe.js$script,~third-party +@@/js/ads.js$script,~third-party +@@/js/advert.js$script,~third-party +@@/js/advertisement.js$script,~third-party +@@/js/adverts.$script,~third-party +@@/jsad/advertisement.js$xmlhttprequest,~third-party +@@/plugins/ad-blocking-detector/*$script,~third-party +@@/scripts/ads.js$script +@@/wp-content/*/adframe.js$script,~third-party +@@/wp-content/*/ads.js$script +@@/wp-content/*/adsbygoogle.js$script +@@/wp-content/*/advert.js$script +@@/wp-content/*/advertisement*.js$script +@@/wp-content/*/advertising*.js +@@/wp-content/*/show-ads.js$script +@@||9c9media.com^*/advertisement.js +@@||abcnews.com/assets/js/adblocker.js +@@||ads.mic.com/host.js +@@||ads1-adnow.com/js/ads.js +@@||adxprts.com^*/ads.js$script +@@||akamaihd.net^*/ads.js +@@||akamaized.net^*/ads.js +@@||anandabazar.com^*/gads.js +@@||animeflv.net/ads.js +@@||animeid.io/static/ads.js +@@||aol.com/advertisers/advertisers.txt?$script,xmlhttprequest +@@||archived.moe^$generichide +@@||as-cdn.tk/js/ads.js +@@||autoworldnews.com/common/js/common/ads.js +@@||babycenter.com^*/ads.js +@@||benczmark.pl^*/b.ads.js +@@||bicycling.com/*ad$script +@@||bicycling.com^*/ads. +@@||bitsngo.net/widget-scripts/extra_content/ads.js$domain=ynet.co.il +@@||blbrd.co/advertisement.js +@@||blockertools.net/v1/adframe.js +@@||bolor-toli.com^$generichide +@@||btcsworld.com/libs/advertisement.js +@@||burning-feeds.com/resources/js/advertising.js +@@||buzzfed.com^*/ads.js +@@||buzzfeed.com^*/ads.js +@@||canada.com^*/advertisement.js +@@||cbsistatic.com^*/advertisement*.js +@@||cdn77.org^*/ads.js +@@||cdnslate.com/wp-srv/ad/*/loader.min.js +@@||cdscdn.com/Js/advertise.js +@@||cinemamkv.xyz^$generichide +@@||citylab.com^*/advert$script +@@||classistatic.com^*/advertising.js +@@||cloudfront.net/adsmin/$script +@@||cloudwebcopy.com^$generichide +@@||comeadvertisewithus.com^*/ads.js +@@||complex.com/ads.js +@@||computerbase.de/js/ads.$script +@@||computerera.co.in^$generichide +@@||core.windows.net^*/advert.js$script +@@||cpubenchmark.net/js/ads.js +@@||crackedcdn.com/media/ad-block-detect/ +@@||crackhex.ch/advertisement.js +@@||crunchyroll.com^*/ads_$script +@@||cursecdn.com^*/adsense.js +@@||cyberterminators.co^$generichide +@@||da-ads.com/ads.js$script +@@||dailydot.com^*/ads.$script +@@||dailymail.co.uk/adstest2/$script +@@||datalog.co.uk/js/ads.js +@@||dato.porn/js/pop.js$script +@@||detectadblock.com/ads.js +@@||dictionary.com/js/advertisement.js +@@||dingit.tv^$generichide +@@||doubleclick.net/adframe.js +@@||doubleclick.net/instream/ad_status.js +@@||ds1-adnow.com/js/ads.js +@@||dslr.net/css/ads.js$domain=dslreports.com +@@||dxzone.com/js/ads.js +@@||el-mundo.net/js/advertisement.js +@@||encyclopedia.com^*/ads.js +@@||engineeringtoolbox.com^*/ads.js +@@||epiotrkow.pl/js/reklama.js +@@||escdn.co/ads/ads.js +@@||espncdn.com^*/ads.js +@@||eviesays.com^*/ads.js$script +@@||exactly0r.com/advertising.js +@@||explosm.net/js/adsense.js +@@||findthedata.com/ga.$script +@@||flashgames.ru^*/advertisement.js +@@||flashx1.tv/js/showad$script +@@||fncstatic.com^*/ads.js +@@||forums.qrz.com/js/advertisement.js +@@||freepd.com^*/advertisement.js +@@||freetutorials.us^$generichide +@@||freetvall.com^$generichide +@@||fsdn.com/con/js/adframe.js +@@||fsdn.com^*/ad.js +@@||ft-static.com^*/ads.js$domain=ft.com +@@||fusion.net/experiments/ad.js +@@||gameallianz.com^*/ads.js +@@||gamerant.com/advertisement.js +@@||gamersclub.com.br/js/ads.js +@@||gamespot.com/js/ads.js +@@||gannett-cdn.com^*/show_ads.js +@@||gatehousemedia.com^*/ads.js +@@||gcstatic.com^*/ads.js +@@||generatorlinkpremium.com/ads/$script,~third-party +@@||geo.de^$generichide +@@||geo.de^*/advertisement.js +@@||gogoanime.ch/static/ads.js +@@||grcrt.net/popads/ads.js +@@||gtsstatic.com^*/prebid_$script +@@||hardwareheaven.com^*/advertisement.js +@@||hardwarezone.com.sg/js/ads.js +@@||healthline.com^*/advertising.js +@@||ibtimes.co.uk^*/ads.js +@@||idg.com.au/adsmin/show_ads.js +@@||imagepearl.com/view/advertisement.js +@@||imgur.com/min/advertising.js +@@||imgwallet.com^/advertisement.js +@@||inc.com/js/ads.js +@@||infojobs.com.br^*/adframe.js +@@||integritystat.com^*/ads.js +@@||intoday.in^*/advert$script +@@||jilhub.xyz^$generichide +@@||kiplinger.com/js/adblock.js +@@||koditalk.org/uploads/*adframe.js +@@||l2s.io^$generichide +@@||ladbible.com^*/ads.js +@@||lamcdn.net^*/advert-$script +@@||latin.it/banner.php +@@||leech.ae^$generichide +@@||listamais.com.br/Resources/js/ads.js +@@||litecoin-faucet.com/libs/advertisement.js +@@||maango.info^$generichide +@@||mac4ever.com/adserver.adtech.de/$script +@@||mangaeden.com^*/advertisement.js +@@||mathwarehouse.com^*/advertising/$script +@@||maxisciences.com^*/advertisement.js +@@||mdotlabs.com/ads.js +@@||media-amazon.com^*/showads. +@@||medianetworkinternational.com/js/advertisement.js +@@||medicalnewstoday.com/ads.html +@@||menshealth.com^*ad$script +@@||mfbcdn.net/scripts/ads.js +@@||minatosuki.com^$generichide +@@||mirror.ninja/static/js/advertising.js +@@||mmo-champion.com^*/adsense.js +@@||motherjones.net/adtracking.js +@@||motherless.com/scripts/site_ads.js +@@||mshcdn.com/assets/advertisement-*.js +@@||msn.com/advertisement.ad.js +@@||muyinteresante.es/js/ads.js +@@||myex.com/ads/$script +@@||mygaming.co.za^*/ads.js +@@||nasdaq.com/includes/advertisement.js +@@||nbc.com/generetic/scripts/ads.js +@@||netdna-ssl.com^*/ads.min.js +@@||newser.com^*/adblock.js +@@||newsmax.com/js/ads.adblock.js +@@||nexusmods.com^*/advert.js +@@||ngenix.net^*/ads.js +@@||nzherald.co.nz^*/ad/$script +@@||oddee.com/js/advertising.js +@@||onionstatic.com^*/ad-block-check.jpg +@@||ookla.com/www/test.js +@@||ora.tv^*/adframe.js +@@||over-blog-kiwi.com^*/ads.js +@@||p.d.*.com/v1/*/ad$script +@@||pandora.com^*/ads.js +@@||pcgameshardware.de/common/deliverad/$script +@@||perveden.com^*/advertisement.js +@@||photobucket.com^*/ads.js +@@||player.h-cdn.com/ads.js +@@||pordede.com^*/ads.js +@@||pornrabbit.com/static/advertisement.js +@@||pressdemocrat.com/js/ads.js +@@||ps4news.com/ad/adframe.js +@@||quoka.de/assets/js/adframe.js +@@||rackcdn.com/js/ads.js +@@||radiomagonline.com/js/ads.js +@@||rawgit.com/brastagi/javascript/gh-pages/adframe.js +@@||realclearscience.com/scripts/ads.js +@@||receive-a-sms.com/showads.js +@@||revealedtricks4u.com^$generichide +@@||rnbxclusive.site^$generichide +@@||rodalesorganiclife.com^*/ads. +@@||sadeempc.com^$generichide +@@||samsclubresources.com^*/ads.js +@@||sankakucomplex.com^$generichide +@@||sdlcdn.com^*/ads.js +@@||seattletimes.com^*/ad-test.js +@@||seeker.com/ads.js +@@||semana.com/Scripts/ads.js +@@||sh.st^$generichide +@@||sharespark.net^*/ads.js +@@||shink.in/js/ads.js +@@||shink.in/js/showads.js +@@||short.am/js/show_ads.js +@@||shush.se/_ads.js +@@||silicon.co.uk^*/advertising.js +@@||sinclairstoryline.com^*/ads.js +@@||skidrowcrack.com/adsense.js +@@||smartadcheck.de/js/*/ad/$script +@@||smashingmagazine.com^*/ads.$script +@@||softgames.de/assets/showads.js +@@||ssl-images-amazon.com^*/ads/$script +@@||stocks.cafe/js/showads.js +@@||studybreakmedia.com/doubleclick/$script +@@||sueddeutsche.de^*/ads.js +@@||sweclockers.com/js/ad.js +@@||talkradio.co.uk^*/show_ads.js +@@||techsite.io/static/js/adsbygoogle.js +@@||the-star.co.ke/classifieds/Scripts/ads.js +@@||theatlantic.com^*/advertisement.js +@@||thedailybeast.com^*/advert.$script +@@||theoutline.com/ads.js +@@||therse.info/popunder.gif$image +@@||thestranger.com^*/ads.js +@@||thewrap.com/ad_frame.php +@@||thoaimedia.com^$generichide +@@||thrashermagazine.com/codePlayground/advertisement.js +@@||tnwcdn.com/assets/js/advertising.js$domain=thenextweb.com +@@||townnews.com^*advertisements.js$script +@@||tradera.com/fusion/check?$xmlhttprequest +@@||traffichaus.com^*/advertisement.js$script +@@||translatica.pl/ads.js +@@||transparentcalifornia.com/static/js/ads.js +@@||tribunasalamanca.com/ads.html +@@||ttef.in/gads.js +@@||tvn.pl/tools/_ads/$script +@@||tvtechnology.com/js/ads.js +@@||txxx.com/js/advertising.js +@@||undeniable.info^*/showads.js +@@||uploadboy.com/ads.js +@@||upworthy.com/assets/ads/$script +@@||veedi.com^*/advert.js +@@||vendiscuss.net/uploads/set_resources_*ad$script +@@||vice.com/assets/js/vmp/adblocker/ +@@||vice.com^*/ads.js +@@||videoadex.com/jw/advertisement.js +@@||videohelp.com/ads.js +@@||vidoza.net/js/pop.js +@@||vidup.me/adsense.js +@@||vidyomani.com^*/showads.js +@@||vidzi.tv/static/ads.js +@@||vk.com/ads?adslogger$script +@@||vox-cdn.com/javascripts/lib/advertisement. +@@||washingtonexaminer.com^*/ad-block.png +@@||weather.com^*/pubads.js +@@||websking.com/static/js/advertisement.js +@@||westeros.org^$generichide +@@||wired.co.uk/static/js/ads.js +@@||wmp.media/ads/$script +@@||womenshealthmag.com^*ad$script +@@||wtop.com/advertisement.js +@@||xkorean.net^$generichide +@@||xmovies8.ru^*/adsbygoogle.js +@@||xmovies8.tv/themes/_js/adsbygoogle.js +@@||yiv.com^$generichide +@@||zdnet.de^*/advertising.js +||cloudfront.net/abw.js +||sqweb.com^$third-party +||techweb.com/adblocktrack +! blockadblock domains +@@||adclixx.net^$script,domain=linkdrop.net|sznpaste.net|cloudwebcopy.com|freeomovie.com|linkneverdie.com|rule34hentai.net|finalservers.net|yalujailbreak.net +@@||adnetasia.com^$script,domain=linkdrop.net|sznpaste.net|rule34hentai.net|cloudwebcopy.com|freeomovie.com|linkneverdie.com|finalservers.net|yalujailbreak.net +@@||adtrackers.net^$script,domain=rule34hentai.net|linkdrop.net|sznpaste.net|finalservers.net|cloudwebcopy.com|freeomovie.com|yalujailbreak.net|linkneverdie.com +@@||bannertrack.net^$script,domain=rule34hentai.net|finalservers.net|linkdrop.net|sznpaste.net|yalujailbreak.net|cloudwebcopy.com|freeomovie.com|linkneverdie.com +@@||doubleclickbygoogle.com^$image,domain=rule34hentai.net|yalujailbreak.net|sznpaste.net|linkdrop.net|linkneverdie.com|cloudwebcopy.com|freeomovie.com +@@||foxnetworks.com^$image,domain=finalservers.net|yalujailbreak.net|linkneverdie.com|sznpaste.net|linkdrop.net|freeomovie.com|cloudwebcopy.com +@@||google.com/adsense/$image,domain=finalservers.net|yalujailbreak.net|linkneverdie.com|sznpaste.net|linkdrop.net|freeomovie.com|cloudwebcopy.com +@@||gstatic.com/adx/doubleclick.ico$image,third-party +@@||twitter.com^$domain=rule34hentai.net|finalservers.net|yalujailbreak.net|linkneverdie.com|sznpaste.net|linkdrop.net|freeomovie.com|cloudwebcopy.com +@@||yahoo.com^$image,domain=finalservers.net|rule34hentai.net|yalujailbreak.net|linkneverdie.com|sznpaste.net|linkdrop.net|freeomovie.com|cloudwebcopy.com +! +! Test filters to block popups +/\.amazonaws\.com\/.*[a-zA-Z0-9\/]{30,}/$script,xmlhttprequest,third-party +/\.cloudfront\.net/\?.*[a-zA-Z0-9]{5,16}/$subdocument,script,third-party +/\.cloudfront\.net\/[\w\/\-.+]{90,}/$script,third-party +@@||cloudfront.net/assets/$script,third-party +@@||cloudfront.net/gp/$script,third-party +! Admiral +/\.com/.*[a-f0-9]{110}/$script,third-party +! popads +/\:\/\/www\.([a-z]{12})\.com\/[a-z]{1,6}\.js/$script,third-party +! "DANESCO TRADING" +/\.com\/[\w\/\-.+]{320,}/$subdocument,third-party +! +!---------- Anti Adblock Warnings ------ +! +! Generic whitelists used for checks +@@||ad.doubleclick.net/ddm/$image +@@||ad.doubleclick.net/favicon.ico$image +@@||d3ujids68p6xmq.cloudfront.net^$script +! +! Elements hiding by a generichide +! +! 4chan +@@||google.*/ads/$image,domain=4chan.org +cyberterminators.co##.td-post-sharing +cyberterminators.co##.wpInsertInPostAd +! publicleech.xyz +@@||popmyads.com/pma.js$script,domain=publicleech.xyz +! xxvideosporno.net +@@||xxvideosporno.net^$generichide +! pg3dhacks.com +@@||pg3dhacks.com^$generichide +! mylivecricket.tv +@@||mylivecricket.tv^$generichide +mylivecricket.tv###share-buttons +mylivecricket.tv###vad +! litecoin-faucet.com +@@||litecoin-faucet.com^$generichide +! verdirectotv.com +@@||verdirectotv.com^$generichide +verdirectotv.com##img[src^="http://verdirectotv.com/wp-content/themes/wtb-video-black/"] +! saikoanimes.net +@@||saikoanimes.net^$generichide +! filmesonline1080p.com +@@||filmesonline1080p.com^$generichide +! narutoimagem.com +@@.png#$image,domain=narutoimagem.com +@@||narutoimagem.com^$generichide +! wolverdon-filmes.org +@@.png#$image,domain=wolverdon-filmes.org +@@||wolverdon-filmes.org^$generichide +! pornotorrentz.com +@@||pornotorrentz.com^$generichide +! meganetv.id +@@||meganetv.id^$generichide +! hiphopisdream.info +@@||hiphopisdream.info^$generichide +! doridro.net +@@.png#$image,domain=doridro.net +@@||doridro.net^$generichide +! indianhotcomics.com +@@||indianhotcomics.com^$generichide +! pinayporndaddy.com +@@||pinayporndaddy.com^$generichide +! iklangratiz.com +@@||iklangratiz.com^$generichide +! hdmovie7.today +@@||hdmovie7.today^$generichide +! telecinetorrent.com +@@.png#$image,domain=telecinetorrent.com +@@||telecinetorrent.com^$generichide +! comandofilmestorrents.com +@@.png#$image,domain=comandofilmestorrents.com +@@||comandofilmestorrents.com^$generichide +! yourfreetube.net +@@.png#$image,domain=yourfreetube.net +@@||yourfreetube.net^$generichide +! streamingdramakorea.com +@@||streamingdramakorea.com^$generichide +! gaana.com +gaana.com##.add_block +! kshowes.net +@@||cicklow.com/adblock/$image +! gamesfullextreme.com +@@||gamesfullextreme.com^$generichide +! animesonline2hd.org +@@||animesonline2hd.org^$generichide +! filmpornoita.net +@@||filmpornoita.net/advertisement.js +! gelbooru.com +@@||ajax.googleapis.com^$script,domain=gelbooru.com +@@||assets.gelbooru.com//images/$image,domain=gelbooru.com +@@||assets.gelbooru.com/samples/$image +@@||assets.gelbooru.com/thumbnails/$image +@@||gelbooru.com/ads.js +@@||gelbooru.com/layout/$image +||gelbooru.com^$image,~third-party +! wdbloog.com +@@||blogspot.com*/ad$image,domain=wdbloog.com +@@||wdbloog.com^$generichide +! image sites +imagepearl.com###continue +imgspice.com,imagetwist.com##script + [style*="z-index:"] +! dailydeportes.pw +@@.gif#$image,domain=trplay.us +@@||dailydeportes.pw^$generichide +! teenboytwink.com +@@||teenboytwink.com^$generichide +! indoporn.co +@@||indoporn.co^$generichide +! beelink.in +@@||beelink.in^$generichide +! javgay.com +@@||javgay.com^$generichide +! bytesloader.com +@@||bytesloader.com^$generichide +@@||popads.net/pop.js$xmlhttprequest,domain=bytesloader.com +! jpidols.tv +@@.png#$image,domain=jpidols.tv +@@||jpidols.tv^$generichide +! codexpcgames.com +@@||codexpcgames.com^$generichide +! gaypornmasters.com +@@||gaypornmasters.com^$generichide +! turbogvideos.com +@@||turbogvideos.com^$generichide +! kizzboy.com +@@||kizzboy.com^$generichide +! verliga.net +@@||verliga.net^$generichide +@@||verliga.net^*/adblock.js +! querofilmehd.com +@@||querofilmehd.com^$generichide +! javdrama.com +@@||javdrama.com^$generichide +javdrama.com##a[href^="http://www.adxpansion.com"] +! torjackan.info +@@||torjackan.info^$generichide +! ncaa.com +@@||fwmrm.net/ad/g/$script,domain=ncaa.com +@@||ncaa.com^$generichide +@@||z.moatads.com^$domain=ncaa.com +ncaa.com###mss-legal-banner +ncaa.com###ncaa-top-ad +ncaa.com##.banner-container +! bangbross.org +@@.png#$image,domain=bangbross.org +@@||openload.co^$genericblock,generichide +! camwhores.co +@@||camwhores.co^$generichide +! indohooker.com +@@||indohooker.com^$generichide +! torrentsgamez.com +@@||torrentsgamez.com^$generichide +! xcomicsx.com +@@||xcomicsx.com^$generichide +! goolsport.net +@@.gif#$image,domain=playerhd2.pw +@@||goolsport.net^$generichide +! beintube.com +@@||beintube.com^$generichide +beintube.com###taboola-right-rail-thumbnails +beintube.com##.btn-facebook +beintube.com##.btn-google-plus +beintube.com##.btn-linkedin +beintube.com##.btn-pinterest +beintube.com##.btn-twitter +! pornhdx.tv +@@||pornhdx.tv^$generichide +pornhdx.tv##.onplayerADS +! pipocao.com +@@||pipocao.com^$generichide +! animeai2.net +@@||animeai2.net^$generichide +! animeheaven.eu +@@||animeheaven.eu/b/$script +@@||animeheaven.eu/fuckadblock.js +@@||animeheaven.eu^$generichide +! cinestrenostv.tv +@@.gif#$image,domain=cinestrenostv.tv +@@||latelete.tv^$generichide +cinestrenostv.tv##div[style*="position:relative"] +! theargus.co.uk +theargus.co.uk##div[style="display:block!important"] +! lukkr.com +@@||lukkr.com^$generichide +! appdrop.net +@@||appdrop.net^$generichide +! squidboards.com +squidboards.com##.funboxWrapper +squidboards.com##.premiumBlock +squidboards.com##.top_block +! aftonbladet.se +@@||aftonbladet.se/dist/js/advert.js +! yalujailbreak.net +@@||yalujailbreak.net^$generichide +! bludv.com +@@||blogspot.com^$image,domain=bludv.com +@@||bludv.com^$generichide +! theatlantic.com +||theatlantic.com/assets/static/b/theatlantic/js/vendors.min.*.js +! smitedatamining.com +@@||smitedatamining.com^$generichide +smitedatamining.com###cookie-law-info-again +smitedatamining.com###cookie-law-info-bar +smitedatamining.com###odyssey-banner +smitedatamining.com##.author-social +smitedatamining.com##.et_social_sidebar_networks +smitedatamining.com##.share-post +smitedatamining.com##.social-icons +smitedatamining.com##[data-ad-slot] +! mangakita.net +@@.png#$image,domain=mangakita.net +@@||mangakita.net^$generichide +! dailymaverick.co.za +@@||b-cdn.net/ads/ads.js +! kingofdown.com +@@.jpg#$image,domain=kingofshrink.com +@@.png#$image,domain=kingofdown.com +@@||kingofdown.com^$generichide +@@||kingofshrink.com^$generichide +@@||pagead2.googlesyndication.com/pagead/show_ads.js$domain=kingofdown.com|kingofshrink.com +! dispatch.com +@@||dispatch.com^$generichide +dispatch.com###baseLeaderBillboardDesktop +dispatch.com###baseLeaderboard +dispatch.com###baseMedRecDesktop +dispatch.com###dialog-message +dispatch.com##.ad-container +dispatch.com##.article-meta-social +dispatch.com##.social +dispatch.com##[data-gh-lazy-ad-loaded] +! dogefaucet.com +@@||ads.korri.fr^$script,domain=dogefaucet.com +@@||dogefaucet.com^$generichide +! macgames-download.com +@@.jpg#$image,domain=macgames-download.com +@@||macgames-download.com^$generichide +! hardware.info +hardware.info#@#.advertorial +! raptu.com +@@||bambergerkennanchitinous.com^$script,domain=raptu.com +@@||raptu.com/js/googleads.js +@@||raptu.com^$generichide +! geekzone.co.nz +@@||geekzone.co.nz^$generichide +geekzone.co.nz##.share__button +! flashback.org +@@||flashback.org/ads/ +! adage.com +@@||adage.com^$generichide +adage.com###shareme +adage.com##.article-ad +adage.com##.nav-social +adage.com##.vjs-icon-share +! gigaleecher.com +||gigaleecher.com/templates/plugmod/giga.js +! kitguru.net +kitguru.net##[id][style*="background:"] +kitguru.net##a[class][data-track] +kitguru.net##div[style^="z-index:"] +! vortez.net +@@||vortez.net/ads.js +@@||vortez.net^$generichide +! indiewire.com +||indiewire.com^*/delivery.js +! spaste.com +@@||spaste.com/ads/ads.html +@@||spaste.com/ads/ads.jpg +@@||spaste.com^$generichide +! picload.org +@@||picload.org/image/$image +! runnersworld.co runnersworld.comm +@@||runnersworld.com^*ads. +! coderexample.com +@@||coderexample.com^$generichide +coderexample.com##[data-ad-client] +! nydailynews.com +@@||nydailynews.com^$generichide +nydailynews.com###ra-share-bottom +nydailynews.com###rf-email +nydailynews.com###rf-follow +nydailynews.com###taboola-below-article-thumbnails +nydailynews.com###taboola-right-rail-thumbnails +nydailynews.com###taboola-right-rail-thumbnails-2nd +nydailynews.com##.ra-share +nydailynews.com##.ri-facebook +nydailynews.com##.ri-instagram +nydailynews.com##.ri-twitter +! fullepisodes.biz +@@.jpg#$image,domain=fullepisodes.biz +@@||fullepisodes.biz^$generichide +@@||pagead2.googlesyndication.com/pagead/show_ads.js$domain=fullepisodes.biz +! shrink-service.it +@@||shrink-service.it^$generichide +||shrink-service.it/js/jsRHadBlock.js +! wwwshooter.com +@@||wwwshooter.com/includes/js/adblockdetect/ +wwwshooter.com###skyScraper +wwwshooter.com##[data-ad-client] +! gamereactor +@@||gamereactor.dk^$generichide +@@||gamereactor.eu^$generichide +gamereactor.dk,gamereactor.eu###ads_top2 +gamereactor.dk,gamereactor.eu###cookielawwarning +gamereactor.dk,gamereactor.eu###facebooknotification +gamereactor.dk,gamereactor.eu###likebuttons +gamereactor.dk,gamereactor.eu##.fb-like +gamereactor.dk,gamereactor.eu##.fb-like-box +gamereactor.dk,gamereactor.eu##.fbLikeBox +gamereactor.dk,gamereactor.eu##.twitter-follow-button +! uvnc.com +@@.gif#$image,domain=uvnc.com +@@||uvnc.com^$generichide +! pipocas.tv +@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$domain=pipocas.tv +@@||pipocas.tv^$generichide +! how2play.pl +@@||spolecznosci.net^*/advertisement.js +! gry.pl +@@||gry.pl^*/advertisement.js +! clubic.com +@@||clubic.com^$generichide +clubic.com###cookieu_header +clubic.com##.button-social +clubic.com##.footer-social +clubic.com##.OUTBRAIN +! buickforums.com +@@||buickforums.com/forums/abp/$script +buickforums.com##td[align="center"][height="150"] +||madisonross.com/adblock.html +||madisonross.com/images/top.jpg +! filechoco.net +@@||78cc571ae97.net/googlead.js$domain=filechoco.net +@@||filechoco.net^$generichide +! jav911.com +@@||jav911.com^$generichide +! new-skys.net +@@||new-skys.net^$generichide +@@||pagead2.googlesyndication.com/pagead/js/*/show_ads_impl.js$domain=new-skys.net +@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$domain=new-skys.net +@@||pagead2.googlesyndication.com/pagead/show_ads.js$domain=new-skys.net +! hax +@@||haxcolors.com/js/advertisement.js +@@||haxcolors.com^$generichide +@@||haxmaps.com/js/advertisement.js +@@||haxmaps.com^$generichide +@@||haxrec.com/js/advertisement.js +@@||haxrec.com^$generichide +! hqporner.com +@@/ads.js$script,domain=mydaddy.cc +! shqiperiatv.com +@@||tvshqiphd.com/adblock.js +! mobilenations +@@||incrediblesugar.com^$xmlhttprequest,domain=crackberry.com +@@||loudloss.com^$xmlhttprequest,domain=windowscentral.com +@@||similarsabine.com^$xmlhttprequest,domain=imore.com +@@||sneakystamp.com^$xmlhttprequest,domain=androidcentral.com +! sopsport.org +@@||sopsport.org^$generichide +sopsport.org##.ya-share2__container +! tg007.nett +@@||tg007.net^$generichide +g007.net###socialbuttons +tg007.net##.fb-page +! eurogamer.net +@@/ads$script,domain=eurogamer.net,third-party +@@||vg247.*/doubleclick/$script,third-party +eurogamer.net##.fc-root +! hackinformer.com +@@||hackinformer.com^$generichide +@@||hackinformer.com^*/ads.js +hackinformer.com##.share-post +hackinformer.com##[data-ad-client] +! techsini.com +techsini.com##.san_sticky_notice +! u2s.io +@@||u2s.io^$generichide +u2s.io##.banner-inner +! gamecopyworld.eu +@@||filetarget.net/*ads.js?$script +@@||gamecopyworld.com/*ads.js$script +@@||gamecopyworld.eu/*ads.js?$script +! im-infected.com +@@||im-infected.com^$generichide +im-infected.com###cookie-notice +im-infected.com##.fb-like +im-infected.com##[title="Follow us on Twitter"] +im-infected.com##[title="Like us on Facebook"] +! phonearena.com +phonearena.com##.adblock_awareness +! vulture.com +vulture.com###bottom +! hubturkey.net +@@||e-mete.com/js/ads*.js +! blockadblock.com +@@|https://$image,script,third-party,domain=blockadblock.com +@@||blockadblock.com^$generichide +! macos-app.com +@@||macos-app.com^$generichide +macos-app.com##.widget_FacebookLikeBox +macos-app.com##[data-ad-client] +! prevention.com +@@||prevention.com^*ad$script +! distrowatch.com +distrowatch.com##A[href] > IMG[src][alt] +! themeslide.com +@@||themeslide.com^$generichide +themeslide.com##[id^="bsac-"] +! demonoid.pw +demonoid.pw##[id*="ScriptRoot"] +demonoid.pw##img[src]:first-child + table[width="100%"][cellspacing="0"] +demonoid.pw##TD[class] > #bbb:last-child +! wintips.org +@@||wintips.org/wp-content/plugins/ad-$script,xmlhttprequest +! spoiler.net +spoiler.net##.home-side +spoiler.net##.spoiler-side +spoiler.net##.spoiler-top +! gamezone.com +@@||gamezone.com/assets/advert$script +@@||gamezone.com^$generichide +gamezone.com##.share-buttons +gamezone.com##div[id^="zergnet-widget-"] +! runningmagazine.ca +@@||runningmagazine.ca^$generichide +! surfline.com +@@||surfline.com^$generichide +surfline.com###dialog-cookies +surfline.com##.footer-icon-facebook +surfline.com##.footer-icon-googleplus +surfline.com##.footer-icon-twitter +surfline.com##.footer-icon-youtube +! pri.org +@@||pri.org^$generichide +pri.org###sharing-links---header-container +pri.org##.donate +pri.org##.gig-comment-shareLink +pri.org##.promo-box--promo +pri.org##.sharing-links--body +! keshavcommoditycalls.com +@@||keshavcommoditycalls.com^$generichide +keshavcommoditycalls.com###social +keshavcommoditycalls.com##.sd-sharing +! onperiscope.com +@@||pagead2.googlesyndication.com/pagead/js/*/show_ads_impl.js$domain=onperiscope.com +@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$domain=onperiscope.com +onperiscope.com##.banner +! forum.pac-rom.com +forum.pac-rom.com#@#.banner_ads +! croydonguardian.co.uk +croydonguardian.co.uk##SCRIPT + [id][style*="display:block"] +! nordichardware.se +@@||nordichardware.se^$generichide +nordichardware.se##.footer-social-wrap +nordichardware.se##.td-post-sharing +nordichardware.se##.td-scroll-up +nordichardware.se##.td-social-icon-wrap +nordichardware.se##img[alt="Facebook"] +! wordsense +@@||pagead2.googlesyndication.com/pagead/js*/show_ads_impl.js$domain=wordsense.eu +@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$domain=wordsense.eu +@@||wordsense.eu^$generichide +wordsense.eu##.cc_banner +wordsense.eu##[data-ad-client] +! eurogamer.net,rockpapershotgun.com,vg247.com +@@||amazon-adsystem.com^*/getads.js$domain=eurogamer.net|rockpapershotgun.com|vg247.com +! pocketnow +pocketnow.com##a div > img[src*="/wp-content/uploads/"] +pocketnow.com##div + a > img[src*="/wp-content/uploads/"] +pocketnow.com##iframe + style + div[class] +pocketnow.com##iframe[class] +pocketnow.com##script + a[href*="/wp-content/"] +pocketnow.com##script + div + style + div[class] +pocketnow.com##script + style + div[class] +pocketnow.com##style + style + div[class] +! ps4news.com +@@||ps4news.com^$script,~third-party +! purepc.pl +@@||purepc.pl^$generichide +purepc.pl##.cookiesinfo +purepc.pl##.fb-page +purepc.pl##.s_facebook +purepc.pl##.s_gplus +purepc.pl##.s_instagram +purepc.pl##.s_rss +purepc.pl##.s_twitter +purepc.pl##.s_youtube +! proclockers.com +@@||proclockers.com^$generichide +proclockers.com##.pane-follow-site +proclockers.com##a[href="http://twitter.com/share"] +! mallorcazeitung.es / diariodemallorca.es +@@||diariodemallorca.es/elementosWeb/js/ads.js +@@||diariodemallorca.es/servicios/ads/dfp.js +@@||mallorcazeitung.es/elementosWeb/js/ads.js +@@||mallorcazeitung.es/servicios/ads/dfp.js +! businessinsider.com (Will create dube in Enhanced trackers) +||tinypass.com^$domain=businessinsider.com +! linkneverdie.com +@@||linkneverdie.com/Assets/Js/ads.js +@@||linkneverdie.com^$generichide +@@||popclck.net/js/adv_out.js$domain=linkneverdie.com +! mundokodi.com +@@||mundokodi.com^$generichide +! geo.de +@@||geo.de^$generichide +@@||geo.de^*/advertisement.js +geo.de##.social-bar +! 1001tracklists.com +1001tracklists.com###cookieMessage +1001tracklists.com##.cookiePolicy +@@||1001tracklists.com^$generichide +! sms-receive.net +@@||sms-receive.net/advertisment.js +! handelsblatt.com +@@||handelsblatt.com^*/iqadcontroller.js +! bild.de +@@||sascdn.com/diff/$script,domain=bild.de +@@||smartadserver.com/diff/$script,domain=bild.de +! libelletv.nl +@@||libelletv.nl^$generichide +libelletv.nl##.social-share-buttons +libelletv.nl##.widget_sm-newsletter-widget +! thebatavian.com +@@||broadstreetads.com/init.js +! albtvhd.com +@@||albtvhd.com^$generichide +@@||blogspot.com^$image,domain=albtvhd.com +@@||goo.gl^$image,domain=albtvhd.com +! playrust.io +@@||g.doubleclick.net/gpt/pubads_impl*.js$domain=playrust.io +! marca.com +@@||marca.com^$generichide +! deadline.com +@@||deadline.com^$generichide +deadline.com##.fb-share-button +deadline.com##.social-links +deadline.com##.social-strip +! mirror.co.uk +@@||mirror.co.uk^$generichide +mirror.co.uk###social-follow +mirror.co.uk##.facebook.icon +mirror.co.uk##.gig-comment-shareLink +mirror.co.uk##.mod-cookiepolicy +mirror.co.uk##.sharebar +mirror.co.uk##.skinny-signup +mirror.co.uk##.social-links +mirror.co.uk##.twitter.icon +||tinypass.com^$domain=mirror.co.uk +! onecccam.com +@@.jpg#$image,domain=onecccam.com +@@||onecccam.com^$generichide +@@||pagead2.googlesyndication.com/pagead/js/*/show_ads_impl.js$domain=onecccam.com +@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$domain=onecccam.com +! gaijin.at +@@||gaijin.at/ads/advertising.js +! unfair.co +@@||unfair.co/advertisement.js +! nachrichten.at +@@||nachrichten.at^$generichide +! newz.dk +@@||newz.dk^$generichide +@@||pagead2.googlesyndication.com/pagead/js/*/show_ads_impl.js$domain=newz.dk +@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$domain=newz.dk +! standard.co.uk +@@||standard.co.uk^$generichide +standard.co.uk###cookie-warning +standard.co.uk##.email-signpost +standard.co.uk##.fb-like +standard.co.uk##.taboola +standard.co.uk##a[title="Facebook"] +standard.co.uk##a[title="Twitter"] +! abczdrowie.pl +@@||abczdrowie.pl^$generichide +@@||g.doubleclick.net/gpt/pubads_impl_*.js$domain=abczdrowie.pl +@@||imasdk.googleapis.com/js/sdkloader/ima3.js$domain=abczdrowie.pl +@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$domain=abczdrowie.pl +! indiatimes.com +@@||indiatimes.in^*/ads.js +@@||timesofindia.indiatimes.com/ad-$image +@@||timesofindia.indiatimes.com/ads_$subdocument +@@||timesofindia.indiatimes.com^$xmlhttprequest +timesofindia.indiatimes.com##.atfAdsLoading +! mlive.com +@@||mlive.com^$generichide +mlive.com###adv_network +mlive.com###social_mobile +mlive.com###social_top +mlive.com###taboola-below-article-thumbnails +mlive.com##.social_sidebar +! westeros.org +||sovrnlabs.net^$third-party +! hackintosh.zone / hackintosh.computer +@@|https://$image,third-party,domain=hackintosh.zone|hackintosh.computer +@@||adclixx.net^$script,domain=hackintosh.zone|hackintosh.computer +@@||adnetasia.com^$script,domain=hackintosh.zone|hackintosh.computer +@@||adtrackers.net^$script,domain=hackintosh.zone|hackintosh.computer +@@||amazon-adsystem.com^$script,domain=hackintosh.zone|hackintosh.computer +@@||bannertrack.net^$script,domain=hackintosh.zone|hackintosh.computer +@@||hackintosh.computer/wp-content/plugins/myownfunctions/adframe.js$domain=hackintosh.computer +@@||hackintosh.zone^*/ads.js +@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$domain=hackintosh.computer +hackintosh.zone,hackintosh.computer##iframe[width="300"] +hackintosh.zone,hackintosh.computer##iframe[width="728"] +! sofeminine.co.uk +@@||sofeminine.co.uk^$generichide +sofeminine.co.uk###af-cookie-policy +sofeminine.co.uk##.af-btn-fb +sofeminine.co.uk##.af-btn-googleplus +sofeminine.co.uk##.af-btn-pinterest +sofeminine.co.uk##.af-btn-twitter +sofeminine.co.uk##.af-photo > .af-pin-it-wrapper +sofeminine.co.uk##.af-social-btns +sofeminine.co.uk##.icon-pinterest +sofeminine.co.uk##.social-icon +! marmiton.org +@@||marmiton.org^$generichide +marmiton.org###m_bandeau_hipush +marmiton.org###m_cookie_popup +! moviefone.com +@@||moviefone.com^$generichide +moviefone.com###atwAdFrame1 +moviefone.com###leaderboard +moviefone.com##.aol-share-block +moviefone.com##div[style="display: block;"] +! dallasnews.com +@@||dallasnews.com^$generichide +@@||nbcdfw.com/includes/ads.js +dallasnews.com##.art-footer-band +dallasnews.com##.art-footer-newsletter-signup +dallasnews.com##.art-pre-body-facebook +dallasnews.com##.art-share +dallasnews.com##.crd-subscribe-cta +dallasnews.com##.fb-like +dallasnews.com##.feedback-button +dallasnews.com##.ftr-social +dallasnews.com##.hdr-ad +dallasnews.com##.hdr-social +dallasnews.com##.hm-rundown__ad +dallasnews.com##.OUTBRAIN +! autobytel.com +@@||autobytel.com^$generichide +autobytel.com##.bottom-docked +autobytel.com##.header-bar__social +autobytel.com##.i-social +! alphr.com +@@||alphr.com^$generichide +alphr.com###dennis-newsletter-newsletter-form +alphr.com##.block-dfp +alphr.com##.sharerich-buttons +! theweek.co.uk +@@||theweek.co.uk^$generichide +theweek.co.uk##.sharerich-buttons +! nj.com +@@||nj.com^$generichide +nj.com###adv_network +nj.com##.gig-share-bar-container +! oregonlive.com +@@||oregonlive.com^$generichide +oregonlive.com##.gig-share-bar-container +! playboy.de +@@||playboy.de^$generichide +playboy.de###block-socialshareblock +playboy.de##.social-menu +playboy.de##.social-sharing +! independent.co.uk +@@||independent.co.uk^$generichide +independent.co.uk###cookie-warning +independent.co.uk##.ad-leaderboard +independent.co.uk##.ad-mpu +independent.co.uk##.fb-like +independent.co.uk##.gig-comment-shareLink +independent.co.uk##a[title="Facebook"] +independent.co.uk##a[title="Twitter"] +! telegraph.co.uk +@@||telegraph.co.uk^*/ads.js +! car.com +@@||car.com^$generichide +! codeproject.com +@@||cloudfront.net^$script,domain=codeproject.com +@@||codeproject.com^$generichide +codeproject.com##.share-list +codeproject.com##a[href^="http://googleads.g.doubleclick.net/"] +codeproject.com##a[href^="https://googleads.g.doubleclick.net/"] +! aufeminin.com +@@||aufeminin.com^$generichide +aufeminin.com###af-cookie-policy +aufeminin.com##.af-btn +aufeminin.com##.af-social-btns +aufeminin.com##.af-social-share +aufeminin.com##.af-social-share-v2 +aufeminin.com##.social-icon +! enfemenino.com +@@||enfemenino.com^$generichide +enfemenino.com###af-cookie-policy +enfemenino.com##.af-btn +enfemenino.com##.af-social-btns +enfemenino.com##.af-social-share +enfemenino.com##.social-icon +! familyhandyman.com +@@||cloudfront.net^$script,domain=familyhandyman.com +@@||familyhandyman.com^$generichide +familyhandyman.com##.followusblock +familyhandyman.com##.footersocialicons +familyhandyman.com##.mainContent +familyhandyman.com##.rd_basic_block +familyhandyman.com##.socialshare +! goldderby.com +@@||goldderby.com^$generichide +! html.net +@@||html.net^$generichide +! itpro.co.uk +@@||itpro.co.uk^$generichide +itpro.co.uk###dennis-newsletter-newsletter-form +itpro.co.uk##.sharerich-wrapper +! mymotherlode.com +@@||budgetedbauer.com^$script,domain=mymotherlode.com +@@||mymotherlode.com^$generichide +mymotherlode.com##.mrect +mymotherlode.com##.top-spot +mymotherlode.com##a[href^="https://baloo.mymotherlode.com/"] +! realgm.com +@@||realgm.com^$generichide +realgm.com##.rrssb-buttons +||realgm.com/ads/sp.js +! wewomen.com +@@||wewomen.com^$generichide +wewomen.com###af-cookie-policy +wewomen.com##.af-btn +wewomen.com##.af-pin-it-wrapper +wewomen.com##.af-social-btns +wewomen.com##.af-social-share +wewomen.com##.af-social-share-v2 +wewomen.com##.social-icon +! wwd.com +@@||wwd.com^$generichide +wwd.com###in-focus-am-ad-unit-dfp +wwd.com##.hp-panel__newsletter-signup +wwd.com##.share-buttons +wwd.com##.subscriber-ad +wwd.com##.wwd-in-article-ad +! venturebeat.com +venturebeat.com#@#.adsbox +! geektime.co.il +@@||ads.cxadserving.com^$subdocument,domain=geektime.co.il +@@||googletagservices.com/tag/js/gpt.js$domain=geektime.co.il +@@||securepubads.g.doubleclick.net/gampad/ads$domain=geektime.co.il +@@||securepubads.g.doubleclick.net^$script,subdocument,domain=geektime.co.il +@@||tpc.googlesyndication.com/simgad/$domain=geektime.co.il +geektime.co.il##.bottom-sponsors +geektime.co.il##.sidebar > .widget:first-child +geektime.co.il##[id][title] +! worldfree4u.lol +@@||d3ncat0syb6rim.cloudfront.net^$script,domain=worldfree4u.lol +! usatoday.com +||global.ssl.fastly.net^$domain=usatoday.com +! business.dk +@@||business.dk/js/advertisement-$script +@@||business.dk^*/advertisement.js +! thevideo.me +@@||thevideo.me/*.js?ab$script +@@||thevideo.me/*ads_$script +! bibme.org +@@||cloudfront.net/doubleclick/openx.js$domain=bibme.org +@@||studybreakmedia.com^*/ads.js$domain=bibme.org +! whosampled.com +@@||doubleclick.net/gpt/pubads_impl_$script,domain=whosampled.com +@@||securepubads.g.doubleclick.net/gampad/ads?$script,domain=whosampled.com +@@||whosampled.com^$generichide +whosampled.com##.leadAd +whosampled.com##.shareButtons +whosampled.com##.socialMedia +! allmusic.com +@@||allmedia-d.openx.net^$domain=allmusic.com +@@||google-analytics.com/ga.js$domain=allmusic.com +@@||googlesyndication.com/pagead/js/rum.js$domain=allmusic.com +@@||googletagservices.com/tag/js/gpt.js$domain=allmusic.com +@@||openx.net^$script,domain=allmusic.com +@@||roguest.com^*/advert$domain=allmusic.com +@@||roguest.com^*/advert.js$domain=allmusic.com +@@||yldbt.com/js/yieldbot.intent.js$domain=allmusic.com +allmusic.com##.header-leaderboard +||complex.com/campaigns/$image,domain=allmusic.com +! genbird.com +@@.png#$image,domain=genbird.com +@@||genbird.com^$generichide +! kissanime.ru +@@||adsterra.com^$script,domain=kissanime.ru +@@||cpmstar.com^$script,domain=kissasian.com +! wired.com +@@||g.doubleclick.net/gampad/ads?$script,domain=wired.com +@@||sulidshyly.com^$domain=wired.com +@@||wired.com/assets/load?$script +wired.com##.advertisement__leaderboard +wired.com##.js-post-listing-rad +wired.com##div[id^="crown"] + .rad +! forbes.com +@@||forbes.com^$generichide +@@||g.doubleclick.net/gampad/ads?gdfp_req=1&$script,domain=forbes.com +forbes.com##.advoice +forbes.com##.expand-social +forbes.com##.level-up-mail +forbes.com##.social-expand-control +forbes.com##[id][data-google-query-id] +! cbs.com +@@||g.doubleclick.net/gampad/ads?$domain=cbs.com +@@||ifmnwi.club/ads.bmp$domain=cbs.com +! playonlinux.com +@@||pagead2.googlesyndication.com/pagead/*/show_ads_impl.js$domain=playonlinux.com +@@||pagead2.googlesyndication.com/pagead/show_ads.js$domain=playonlinux.com +playonlinux.com###ads +playonlinux.com##div[style*="text-align:center;"] +! theinquirer.net/v3.co.uk +@@||g.doubleclick.net/gpt/pubads_impl*.js$domain=v3.co.uk +v3.co.uk,theinquirer.net##div[id^="google_ads_iframe_"][style] +! myanimelist.net +myanimelist.net##.right_top_ad +myanimelist.net##div[style][data-height] +! pastebin +pastebin.com###abrpm +pastebin.com###abrpm2 +pastebin.com###notice +pastebin.com###paypal-overlay +! last.fm +last.fm##div[style*="visibility:"] +! techdracula.com +@@||techdracula.com^$generichide +techdracula.com##.apss-social-share +! techpowerup.com +/\.techpowerup\.com/.*[a-zA-Z0-9]{13}/$image +@@||techpowerup.com/forums/$image +techpowerup.com##A[href][rel$="external"][target="_blank"] +techpowerup.com##aside > article + section +! flightradar24.com +flightradar24.com###responsiveBottomPanel +flightradar24.com##.noads +! thefreedictionary.com / freethesaurus.com +/\.tfd\.com/.*[a-zA-Z0-9]{22}/$image +/\.thefreedictionary\.com/.*[a-zA-Z0-9]{22}/$image,script +dictionary.com###dcom-serp-a-mid-300x250 +dictionary.com###dcom-serp-a-top-300x250 +thefreedictionary.com,freethesaurus.com###sidebar > a#trans_link + [id] +thefreedictionary.com,freethesaurus.com###w1 > .w2 > div:first-child +! waaw.tv +@@||srcsmrtgs.com/js/ad.js +@@||vkcache.com/js/adv/show_ads.js +! http://urlex.org/ +@@||urlex.org^$generichide +! wired.it +@@||wired.it/static/js/cn-adv.js +! Various International sites +@@||blesk.cz^*/advertisment.js +@@||business.dk^$generichide +@@||cda.pl/*-adv.js +@@||cda.pl/ads/advertise.js +@@||comunio.de/scripts/advertising/adInit. +@@||ff14angler.com^$generichide +@@||fox.com.tr^$generichide +@@||gentecheesisterealmente.com^$generichide +@@||ispazio.net^$generichide +@@||mywrestling.com.pl^$generichide +@@||ouest-france.fr^*/adblock.js +@@||politiken.dk/ad-server.js +@@||pronpic.org/ads/$image +@@||sascdn.com^*/smart.js$domain=vz.lt +@@||satcesc.com^$generichide +@@||titulky.com^$generichide +@@||totaldebrid.org^$generichide +@@||tvinfo.net^*/adblocker.js +@@||vooxe.com/adframe.js +@@||webnews.bg/assets/js/ads.js +@@||zarabiajnaokazjach.pl^$generichide +@@||zive.cz^*/advertisment.js +! French +@@||advertising.leboncoin.fr/|$script,~third-party +@@||expansion.com^$generichide +@@||nicematin.com^*/ads.js +@@||prismamediadigital.com/js/advertisement.js +@@||securepubads.g.doubleclick.net/gpt/pubads_impl_*.js$domain=expansion.com +@@||skyyart.fr^$generichide +@@||tf1.fr^*/adframe.js +@@||tout-bon.com^$generichide +! German +@@||gutefrage.net^$generichide +@@||lustich.de^$generichide +@@||sport1.de/bundles/*ad$script +@@||wetteronline.de^*/showAds.js +@@||wiwo.de^*/iqadcontroller.js +! Israeli +@@||themarker.com/dclk/dfp/$xmlhttprequest,script +@@||themarker.com^$generichide +! Italian +@@||androidiani.com^$generichide +@@||archivio.corriere.it^$generichide +@@||calciomercato.com^$generichide +@@||dasolo.club*/adframe.js$script +@@||dasolo.co/advertisement.js +@@||dasolo.co^$generichide +@@||fkadb.bid/*ad$script,domain=calciomercato.com +@@||italyshare.club/ad*$script,domain=dasolo.co +@@||ivg.it/sponsorbanners/spcjs.js +@@||ivg.it^$generichide +@@||pagead2.googlesyndication.com/pagead/js/*/show_ads_impl.js$domain=zeusnews.it|faqmozilla.org +@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$domain=zeusnews.it|faqmozilla.org +@@||zeusnews.it^$generichide +! Japanese +@@||i-mobile.co.jp/script/ad$script +! +! Intl Specific elements hiding +business.dk##.article-social +business.dk##.cookiewarning +diariodenavarra.es###abMsgWrap +expansion.com##.newsletter +expansion.com##.OUTBRAIN +expansion.com##.social-media +expansion.com##.suscripcion +freetutorials.us##[data-ad-slot] +gentecheesisterealmente.com##.mashsb-container +ispazio.net##.fb-like +ispazio.net##.icon-facebook +ispazio.net##.icon-instagram +ispazio.net##.icon-rss +ispazio.net##.soc-twi +ispazio.net##.twitter-follow-button +themarker.com###art__tools_share +themarker.com###top_banners +themarker.com##.art__info +themarker.com##.promo +tout-bon.com##.fb-page +tout-bon.com##.social-links +tout-bon.com##.widget_taboola +tout-bon.com##.widget_wysija +tvregionalna24.pl##.diablo-placeholder +! +! Warnings +##.fc-pinned-message-container +##.fc-root +8muses.com##.top-warning +archived.moe##.cc_banner +citylab.com###blocker-msg-start +hdzog.com##.msg-adblock +maango.info##.fb-page +maango.info##.social-btn +medicalnewstoday.com###mnt_article_ad_1 +medicalnewstoday.com###mnt_header_ad +newatlas.com###NewatlasMessaging +pg3dhacks.com##.ztb-sb-widget-iframe +pg3dhacks.com##[data-ad-slot] +pornhub.com###abAlert +redtube.com###slidePanelContainerAB +vaughnlive.tv##.abvsDynamic +xkorean.net###inplayer +xkorean.net##.thr-rcol +xkorean.net##a[href*="&aff_id"] +! +! ---------- Whitelisting rules ---------- +! +! test filter for google/gpt +@@||googletagservices.com/tag/js/gpt.js$domain=whosampled.com|zdnet.com|thewrap.com|expansion.com|hardware.info|techrepublic.com|abczdrowie.pl|playrust.io|v3.co.uk|wired.com|ebaumsworld.com|pocketnow.com|cityam.com|computerworlduk.com|cwtv.com|forbes.com|independent.co.uk|techworld.com|my5.tv|ocregister.com|phoronix.com|realtor.com|seahawks.com|wwe.com +||googletagmanager.com/ns.html$third-party +||googletagservices.com/tag/js/gpt.js$third-party +! +! +@@/cdn-cgi/pe/bag2?*pagead2.googlesyndication.com$domain=forwardprogressives.com +@@/coremetrics.js$domain=odcdn.com|potterybarn.com|potterybarnkids.com|westelm.com|williams-sonoma.com +@@/mbox.js$domain=dianping.com|aol.com|dominos.com|hrblock.com|live.com|movieweb.com|rd.com|skypeassets.com|superpages.com|wdpromedia.com +@@/omniture.js$domain=qz.com|ae.com|apple.com|corbisimages.com|couponcabin.com|delvenetworks.com|gq.com|healthgrades.com|mlb.com|newyorker.com|nfl.com|pogo.com|seek.co.nz|seek.com.au|shop.puma.com|slacker.com|teenvogue.com|veer.com|zdnet.com +@@/ots_omniture_code.js$~third-party +@@/s-code-$domain=elgiganten.dk|elgiganten.se|elkjop.no|gigantti.fi|markantalo.fi +@@/s_code.$domain=inc.com|hostelworld.com|tmz.com|192.com|abc.go.com|abcnews.go.com|aetv.com|afl.com.au|americanexpress.com|anz.com|beatsbydre.com|blackberry.com|bodybuilding.com|boostmobile.com|canon.com.au|car2go.com|caranddriver.com|cbc.ca|cfnews13.com|channel4.com|cinemax.com|cio.com|countryliving.com|csoonline.com|debenhams.com|dhgate.com|dice.com|disneyinternational.com|diy.com|eonline.com|esquire.com|experian.com|fandango.com|fedex.com|filemaker.com|filmmagic.com|gatesnotes.com|goodhousekeeping.com|greenbot.com|hallmark.com|hasbro.com|hbogo.com|here.com|homedepot.com|infoworld.com|ingdirect.es|itworld.com|ksl.com|landsend.com|laptopmag.com|lg.com|macworld.com|madcatz.com|marieclaire.com|marthastewart.com|marthastewartweddings.com|move.com|msacademicverify.com|nba.com|nbc.com|nbcdfw.com|nbclosangeles.com|nbcmiami.com|networkworld.com|news12.com|nflcdn.com|nike.com|nintendo.com|nwolb.com|olivegarden.com|online.citibank.com|oreillyauto.com|overstock.com|pcworld.com|qz.com|randomhouse.com|redbookmag.com|rolandgarros.com|samsung.com|sephora.fr|sho.com|shop.puma.com|simyo.de|siriusxm.com|sonypictures.com|sprint.com|stamfordadvocate.com|staples.com|starz.com|style.com|syfy.com|symantec.com|techhive.com|teenvogue.com|telecom.co.nz|theglobeandmail.com|theweathernetwork.com|vendaria.com|verizonwireless.com|wdpromedia.com|welcome.ingdirect.com.au|wholeliving.com|wireimage.com|workingmother.com|yellow.co.nz|yellowpages.com.au|zdnet.com +@@/s_code_$domain=qatarairways.com|abc.go.com|adobe.com|apple.com|autodesk.com|beautyoftheweb.com|deseretnews.com|eonline.com|eweek.com|forbes.com|frontdoor.com|java.com|kaspersky.co.uk|kmart.com|lego.com|lenovo.com|lg.com|makemytrip.com|nflcdn.com|norton.com|nvidia.com|optimum.net|pepperidgefarm.com|resources.ea.com|restaurant.com|samsung.com|style.com|talx.com|virginmedia.com|walgreens.com|wiley.com +@@/thePlatform-omniture-core.js$~third-party +@@/webtrends.js$domain=canon.com|horizon-bcbsnj.com|kaiserpermanente.org|logitech.com|reuters.com|telegraph.co.uk|usps.com +@@||aarp.net/etc/aarp/statics/global/js/omniture*.js +@@||abcnews.com/assets/flash/kdp/omniturePlugin.swf +@@||adobe.com/uber/js/*s_code +@@||adobe.com/www.adobe.com/uber/js/pdc_s_code.js +@@||adziff.com/pcmag/images/zd_footer_logo.png$image,domain=extremetech.com +@@||akamai.net/*/www-origin.walmart.com/webanalytics/$domain=walmart.com +@@||akamai.net^*/hints.netflame.cc/$domain=annualcreditreport.com +@@||amd.com/*/scode_global.js +@@||amd.com/us/as/scode_$script +@@||apple.com/pages/omniture/js/util.js? +@@||apple.com^*/omniture_tracking.js +@@||arctichome.com/flex-mod/js/tracking/webtrends-*.js +@@||arstechnica.net/wp-content/themes/*/omniture/ +@@||arvest.com/common/urchin/urchin.js +@@||assets.pinterest.com/js/pinit.js$domain=mandatory.com +@@||automotive.com^*/omniture/ +@@||bankaholic.com/omniture/$script +@@||bankofamerica.com/pa/components/*/TouchClarity.js +@@||barclays.co.uk/js/sitecatalyst/$domain=bank.barclays.co.uk +@@||bbci.co.uk/bbcdotcom/*/omniture/siteCatalyst.js$domain=bbc.co.uk|bbc.com +@@||bigfishsites.com/*/global/javascript/webtrends_capi_$domain=bigfishgames.com +@@||bing.com/travel/scripts/sCode.js$~third-party +@@||bing.com^*/s_code.$script +@@||bissell.com/min.axd? +@@||bose.com/assets/js/site_catalyst_functions.js +@@||bt.com/static/includes/homepage/touchclarity/*/omtr_tc.js +@@||canada.com/js/global_s_code.js +@@||canadiantire.ca/content/canadian-tire/*.sitecatalyst. +@@||canadiantire.ca/etc/clientlibs/foundation/sitecatalyst/ +@@||canadiantire.ca/etc/cloudservices/*/mbox.js +@@||cartoonnetwork.com.au/include/omniture/s_code.php +@@||cartoonnetworkasia.com/include/omniture/s_code.php +@@||cbsistatic.com/fly/bundles/flyjs/js/libs/omniture.s-code*.js$domain=cbsnews.com +@@||cbsistatic.com/fly/bundles/flyjs/js/managers/omniture-tracking*.js$domain=cbsnews.com +@@||cdn.turner.com/nba/nba/.element/*/global/omniTrack.js$domain=nba.com +@@||cdnbrm.com/images/*/TouchClarity/images/ +@@||chron.com^*/omniture/$script +@@||cigna.com^*/webtrends/ +@@||cineworld.co.uk/cw/assets/javascript/webtrends*.js +@@||consumerist.com/mt.js +@@||content.idine.com^*/cmdatatagutils.js$domain=rewardsnetwork.com +@@||converse.com/handler/OmnitureHandler.ashx +@@||cycletrader.com/lwmvcjs/$script +@@||delvenetworks.com/player/common/scripts/delve-omniture-callback.js +@@||dice.com/assets/scripts/omniture/$script +@@||dicksmith.co.nz^*/site-tracker.js +@@||directline.com/etc/clientlibs/$script +@@||disney.go.com/globalelements/footer/comscore.txt +@@||ea.com/omniture/ +@@||ebaystatic.com^*_Omniture_$script +@@||eircomphonebook.ie/js/wt_capi.js +@@||eloqua.com^*/svrGP.aspx?$subdocument,domain=itworld.com +@@||encyclopedia.com/encyclopedia.axd/omniturejs/$script +@@||eonline.com/includes/js/sitecatalyst/s_all.jsp +@@||espncdn.com/combiner/c?$script +@@||espncdn.com/prod/scripts/mbox.20.r2.js +@@||ew.com^*/ew_com_omniture.js +@@||ew.com^*/ew_com_omniture_core.js +@@||fastcompany.com/assets/js/vendor/omniture/omniture-scode-prod.js +@@||fdlstatic.com^*/main.desktop-no-omniture.js$domain=cnet.com +@@||filmmagic.com/scripts/tracking/omniture-communicator-basic.js +@@||filmmagic.com/scripts/tracking/omniture-page-communicator.js +@@||fncstatic.com^*/omtr_code.js$domain=foxbusiness.com|foxnews.com +@@||focus.ti.com^*/hbx.js +@@||focus.ti.com^*/hbx_page_code.js +@@||foodnetwork.ca/UserControls/*/omnitureMedia.swf +@@||foxnews.com/js/omtr_code.js$domain=foxbusiness.com|foxnews.com +@@||foxtel.com.au/shop/packages-and-deals/static/js/os-omniture.js +@@||ft.com/regb/$xmlhttprequest +@@||gamasutra.com/checkauth.php? +@@||go.com/combiner/c?*.js,*/analytics/$script +@@||google-analytics.com/cx/api.js$domain=boingboing.net +@@||google-analytics.com/ga.js$domain=7digital.com|account.hirezstudios.com|aebn.net|aftonbladet.se|alatest.com|americanapparel.net|apps.facebook.com|asus.com|avast.com|babylon.com|bangbros.com|banshee.fm|billabong.com|billboard.com|bolha.com|bookadumpster.com|boostmobile.com|break.com|brobible.com|cinemassacre.com|comingsoon.net|comingsoon.neteverydayhealth.com|dailyfreegames.com|donanimhaber.com|ehow.com|eonline.com|filmweb.pl|fora.tv|fossil.com|foxsports.com.au|frequency.com|g4tv.com|gasbuddy.com|globaltv.com|google.com|gumtree.com.au|hoerzu.de|imageshack.us|intellicast.com|jetbrains.com|jobsite.co.uk|justjared.com|juxtapoz.com|kleinanzeigen.ebay.de|latimes.com|lemonfree.com|liptonicetea.com|logitech.com|lucasarts.com|mashable.com|maxcdn.com|medonet.pl|meetme.com|mevio.com|mommyish.com|newyorker.com|nme.com|nuts.co.uk|opendns.com|oyster.com|philips.com|photobucket.com|priceme.co.nz|priestville.org|salon.com|search.diy.com|seekingalpha.com|sundance.org|techbargains.com|tempe12.com|theblaze.com|thegrindstone.com|thevine.com.au|theweek.com|threatfire.com|timberland.com|tomshardware.com|tube8.com|tvunetworks.com|tweetgrid.com|umbro.com|weeworld.com|wonka.com|xda-developers.com|yellow.co.nz|youtube.com|zoo.org.au +@@||google-analytics.com/plugins/ua/ecommerce.js +@@||google-analytics.com/urchin.js$domain=expresspcparts.com.au|live.euroleague.net|roblox.com +@@||google.com/analytics/js/analytics.min.js$~third-party +@@||google.com/coop/cse/brand?form=searchbox_$script,domain=wellness.com +@@||gq.com/js/ecomfw.min.js +@@||greenbaypressgazette.com/odygel/lib/vendor/omniture/sitecatalyst.js +@@||guardianapps.co.uk/jwplayer/omniture-H.25.2d.js +@@||guim.co.uk/static/*/scripts/omniture- +@@||healthgrades.com/Consumer/scripts/omniture_settings.js +@@||hewitt.com^*/js/analytics/ +@@||hsbc.co.uk^*/html/hsbcukcommon/touchclarity/ +@@||hsn.com/coremetrics/cmcustom.js +@@||hulu.com/site-player/*?referrer= +@@||hyundaiusa.com/js/home/classes/HN.Omniture.js +@@||i.imedia.cz/javascript?*&referer= +@@||icbdr.com/common/js/SiteCatalystH243.js$domain=careerbuilder.com +@@||imagesbn.com/resources?*/coremetrics-$script,domain=barnesandnoble.com +@@||img.timeinc.net/tii/omniture/h/config/life.js$domain=life.com +@@||interest.com/content/plugins/bankrate-global/javascript/bglf-s_code.js +@@||interflora.co.uk/kernel/coremetrics/cmdatatagutils.js +@@||interflora.co.uk/kernel/coremetrics/eluminate.js +@@||iocdn.coremetrics.com^$domain=boscovs.com +@@||itworld.com/elqNow/$script +@@||js.nyt.com/js/app/analytics/wtbase.js$domain=nytimes.com +@@||jsonline.com/templates/Proxy.api? +@@||juniper.net/elqNow/$script +@@||kavanga.ru/exp?$domain=overclockers.ru +@@||kentucky.com/mistats/products/pubsys_s_code.js +@@||libs.coremetrics.com^$domain=boscovs.com +@@||marilyn.ca/jsHandler.aspx?*omniture +@@||media.richrelevance.com^$script,domain=samsung.com +@@||mfcreative.com^*/mbox.js +@@||microsoft.com/Areas/Global/Content/Omniture/ +@@||microsoft.com/Combined.js?*/Omniture/ +@@||microsofttranslator.com^*/SiteCatalyst.js +@@||miniusa.com/js/dcs_tag.js +@@||mlb.mlb.com/shared/flash/tracking/bamnet_omniture_as3.swf +@@||mnginteractive.com/live/js/omniture/OmnitureHelper.js +@@||mnginteractive.com/live/js/omniture/SiteCatalystCode_*.js +@@||mnginteractive.com/live/omniture/sccore.js +@@||msecnd.net/v-5/scripts/webtrends-$domain=cheapflights.co.uk|cheapflights.com +@@||msecnd.net^*/s_code.$script,domain=bing.com +@@||mycoke.com/js/tracking.js +@@||mycokerewards.com/flex-mod/js/tracking/webtrends- +@@||mycricket.com/js/hbx.js +@@||myrecipes.com/static/j/ext/omniture/ +@@||n-tv.de/stat/videoplayer/ +@@||nationalgeographic.com/stats/omniture_code.js +@@||nationalgeographic.com/wpf/sites/common/j/omniture_code.js +@@||nationaljournal.com/js/libs/omniture/core.js +@@||nba.com/tvc/script/tvc_omniture_code.js +@@||nbcphiladelphia.com/includes/customOmnitureData.js +@@||nedvang.nl/sites/all/*/PageView.js +@@||newegg.com/WebResource/Scripts/*eluminate.en.js +@@||news.sky.com/sky-news/app/*/swf/OmniturePlugin.swf +@@||newsday.com/build/nd_omniture.min.js +@@||newsday.com/js/s_nd_code.js +@@||nfl.com/yui/min2/index.php?*nfl-omniture.js +@@||nflcdn.com/static/site/*-omniture.js +@@||nflcdn.com/yui/min2/index.php?*-omniture.js +@@||nintendo.com/js/omniture-prod.js +@@||ntc-affinity-api.web.aol.com/affinity/?$script,domain=games.com +@@||nvidia.com/content/websidestory/omniture/$script +@@||nytimes.com/bi/js/analytics/nyt4/controller.js +@@||nzherald.co.nz/themes/*/s_code.min.js +@@||o.aolcdn.com^*&file=/aol/omniture.min.js +@@||omniture.com^$document,~third-party +@@||ooyala.com/3rdparty/comscore_other_$domain=marthastewart.com +@@||ooyala.com/3rdparty/omniture_module-$domain=bizjournals.com|telegraph.co.uk +@@||ooyala.com/3rdparty/omniture_other_$domain=bloomberg.com|businessweek.com|marthastewart.com|nintendo.com|thesun.co.uk +@@||optimum.net/js/omniture/external.js +@@||outbrain.com/nanoWidget/3rd/comScore/comScore.htm$domain=telegraph.co.uk|theinsider.com +@@||payback.de/script/s_code-*.js +@@||paypalobjects.com^*/site_catalyst/ +@@||pcworld.com/script/omniture/video.js +@@||pepsico.com/scripts/urchin.js +@@||performgroup.com/js/tsEplayerHtml5/js/Eplayer/js/omniture/$script +@@||performgroup.com/js/tsEplayerHtml5/js/Eplayer/js/services/$script +@@||pioneercu.org/includes/lib/js/coremetrics/eluminate.js +@@||player.qbrick.com^*/sitecatalyst.swf +@@||playserver1.com/SiteScript/Play/*/webtrends2.min.js +@@||pricegrabber.com/js/combine.js.php?*=s_code_h. +@@||pricegrabber.com/js/combine.js.php?*_js_code. +@@||quill.com/js/Omniture/quill_s_code.js? +@@||rentals.com/assets/*webtrends- +@@||rentals.com/javascripts/primedia-webtrends- +@@||rentals.com/javascripts/webtrends-bindings.js +@@||richrelevance.com^*/recsForPlacements?apiClientKey*placements= +@@||rightnow.com/javascript/omniture_variable_ +@@||rosettastone.co.uk^*/mbox.js +@@||s-msft.com/Combined.js?$script,domain=msdn.microsoft.com +@@||s.xe.com/*/js/webtrends.1.js +@@||screenname.aol.com/auth/getToken?*&referer$domain=reader.aol.com +@@||script.ioam.de/iam.js$domain=hoerzu.de|snacktv.de +@@||sears.com/etc/clientlibs/foundation/sitecatalyst/sitecatalyst.min.js +@@||seeingwithsound.com/ga.js +@@||shld.net^*/mbox_09.js$domain=sears.com +@@||shorte.st/js/packed/smeadvert-intermediate-ad.js$domain=sh.st +@@||simyo.de^*/simyo_s_code.js +@@||siriusxm.com/vendor/omniture/pageView.js +@@||sixflags.com/global/func/js/siteCatalyst.js +@@||sky.com/flash-video-player-*/OmniturePlugin.swf +@@||skypeassets.com/i/js/wanalytics/$domain=skype.com +@@||slkimg.com^*/slacker/util/adobe/s-code.js$domain=slacker.com +@@||space.ca/jsHandler.aspx?src=*.omniture.js +@@||standard.co.uk/sites/all/libraries/sitecatalyst/ +@@||startribune.com/includes/Omniture.H.24.js +@@||storage.ie6countdown.com/assets/*/ie6ct_s_code.js +@@||subscription-assets.ew.com/prod/assets/*/omniture/ +@@||subscription-assets.timeinc.com/prod/assets/*/omniture/ +@@||surfline.com/functions/page_tracker.cfm +@@||swfs.bimvid.com/omniture-*.swf +@@||symantec.com/script/omniture/om_code.js +@@||tampabay.com/universal/scripts/omniture/tb_code.js +@@||tapatalk.com/welcome_screen.php?$script,domain=vpsboard.com +@@||targetimg3.com^*/omniture/omniture_minified.js$domain=target.com +@@||thecomedynetwork.ca/jsHandler.ashx +@@||thestar.com^*/sitecatalyst/ +@@||ticketmaster.com^*/omniture_tracker.js +@@||timeinc.net/tii/omniture/$script +@@||topmarques.co.uk^*/tracking/module.omniture.js +@@||traderonline.com/javascript/master_s_code.js +@@||tvlistings.optimum.net/foresee/foresee-trigger.js +@@||unionbank.com/coremetrics/*/eluminate.js +@@||unionbank.com/coremetrics/cmdatatagutils.js +@@||ups.com/javascript/webtrends*.js +@@||usairways.com/en-US/Resources/javascript/omniture*.js +@@||verizon.com/content/contactus/includes/javascript/hbx.js +@@||victoriassecret.com/app/coremetrics/eluminate.js +@@||video.nbcuni.com/core/*/omniture_ +@@||videos.mediaite.com/embed/*?referrer=http +@@||washingtonpost.com/wpost/js/combo?token*/wp_omniture.js +@@||weather.com/clients/widgets/*?referrer=http +@@||wired.com/assets/load?$script +@@||wired.com/js/omniture/omniture_helpers.js +@@||wireimage.com/scripts/tracking/omniture-communicator-basic.js +@@||wireimage.com/scripts/tracking/omniture-page-communicator.js +@@||wurfl.io/wurfl.js$domain=smooth.com.au +@@||yimg.com^*/js/omniture-$script +@@||yp.ca/js/utag.loader.js?$domain=yellowpages.ca +@@||ytv.com/scripts.axd?$script +@@||ziffstatic.com/adchoices/adchoices.png$image,domain=extremetech.com +@@||zillowstatic.com/static/*/foresee-trigger.js$domain=zillow.com diff --git a/famlam-redundancychecker/changelog.html b/famlam-redundancychecker/changelog.html new file mode 100644 index 000000000..598a9b79d --- /dev/null +++ b/famlam-redundancychecker/changelog.html @@ -0,0 +1,230 @@ + + + + + + + Redundancy check - changelog + + + +

Changelog

+

This page lists the changes to the redundancy checker, if said changes had an effect on the behaviour of the check

+ +

May 23, 2015

+ + +

May 17, 2015

+ + +

March 9, 2015

+ + +

March 8, 2015

+ + +

January 5, 2015

+ + +

July 7, 2014:

+ + +

January 19, 2014:

+ + +

January 13, 2014:

+ + +

November 16, 2013:

+ + +

September 20, 2013:

+ + +

July 18, 2013:

+ + +

June 12, 2013:

+ + +

May 31, 2013:

+ + +

May 20, 2013:

+ + +

May 6, 2013:

+ + +

April 28, 2013:

+ + +

April 14, 2013:

+ + +

March 28, 2013:

+ + +

March 26, 2013:

+ + +

January 31, 2013:

+ + +

No changelog available before 2013.

+ + \ No newline at end of file diff --git a/famlam-redundancychecker/changelog.txt b/famlam-redundancychecker/changelog.txt new file mode 100644 index 000000000..301a9685f --- /dev/null +++ b/famlam-redundancychecker/changelog.txt @@ -0,0 +1,128 @@ +January 13, 2014: +-New: warn if ',$' is used to separate rules (example: $script,$domain=com) +-New: detect redundancies in hiding rules if a #@# rule excluded part of the rule (example: nl#@##ads and ###ads together with com##div#ads) +-Improved: all warnings for redundant domains now clearly state which domains can be removed +-Removed: warnings about domain redundancies with non-redundant subdomains (example: ~b.a in b.a,~c.b.a#@#ads and a,~b.a##ads) +-Fix: '/\|\|x/$document' and similar regex rules with $document or $elemhide no longer make '$domain=x' or 'x##y' redundant +-UI: in case a rule could be made redundant by two rules, and those rules are no redundancies of each other, the shortest rule is now displayed +-UI: tell the user to first check for redundancies again before using the tools, if they modify the contents of the text box +-UI: some changes in the warning messages of simplified syntax hiding rules + + +November 16, 2013: +-New: warning about $image,~image,popup, where $image,~image does nothing. ABP now drops unknown options, so those constructions are unneeded +-New: warning about $~match-case, since it's the default to be case insensitive (/ads.$~match-case) +-New: warn when pseudo-element selectors are present, since they cannot be used for hiding content (##::before) +-New: CSS selector identifiers containing escaped unicode at the end of the identifier may have a trailing space (##\32 >x is equal to ##\32>x) +-Improved: warning about redundant type options if the first type option is an excluded type ($~script,image,~image) +-Improved: specify the location of an unnecessary universal CSS selector in warning messages (only the first * in ##*.class > * ) +-Improved: more (all?) redundant sequences of complex tree selectors can now be detected (##a > div div > x and ##a > div div div > x) +-Fix: if A is made redundant by B and B is made redundant by a $document or $elemhide rule C, A must be redundant of C instead of B +-Fix: more warning messages in which the options were shown as lowercased and with all - replaced by _ +-Fix: incorrect warnings for $~elemhide and $~document (@@/ads.$~elemhide,document) +-Fix: crash of the redundancy checker if a hiding rule matched nothing and also contained an internal duplicate (##:not(*):not(*) ) +-Fix: rules with duplicates of :not(...) selectors and another comma-separated selector, acted as if ':not(...)' was '*' (##:not(a):not(a ),x ) +-Fix: CSS selectors with :lang(x-y) would skip the selector behind the :lang(...) selector (##:lang(en-gb)>ads) +-Modified: rewrite the way the the options of blocking rules are parsed +-Modified: rewrite the way how rules containing tree selectors (' ', >, +, ~) are matched +-UI: fix typo in warning message for :not(...) selectors that match every element (##:not(:nth-child(-4)) ) + + +September 20, 2013: +-Improved: 'same rule, different domains' tool is faster and finds more combinable rules +-Improved: better warning message for rules of the form '@@domain##rule' +-Improved: better error message for incorrectly excluded domains (abc$~domain=site.com) +-Fix: in the error message "unknown option 'X'", any '-' in the option was replaced by '_', and it was in lowercase (example: abc$First-Party) + + +July 18, 2013: +-Fix: 'same rule, different domains' tool suggested combining a##bar,baz and b##bar+baz +-Fix: rare case where the 'Check for redundant rules' button didn't get enabled + + +June 12, 2013: +-Fix: punycode-converted domains are considered valid now (xn----etbbchqbn2afauadx.xn--p1ai##.ads) + + +May 31, 2013: +-Fix: tool to find whitelists shouldn't report other whitelists that it matches (@@x/xml and @@/xml$image) +-Fix: tool to convert hiding into blocking reports wrong results for \= in the attribute name ( ##[src\=='hello'] ) +-Fix: tool to use a less strict matching method matched two characters that would both be matched by ^ ( &adType= and ?adType= ) +-Improved: code improvements + + +May 20, 2013: +-New: tool to find hiding rules that could potentially become blocking rules +-Fix: incorrect warning message for rules that start with '*@@': they should keep their preceeding wildcard +-Improved: matching of the :lang(...) selector + + +May 6, 2013: +-Improved: matching of first/last/nth/only-child and first/last/nth/only-of-type selectors + + +April 28, 2013: +-Fix: incorrect warning message: selectors that do not match anything, actually match everything when in a :not() selector (example: ##:not(:nth-child(-4)) ) +-Fix: pseudo-element CSS selectors are not allowed in :not() selectors in CSS3 (##:not(::before) ) +-Fix: combinations of CSS selectors are not allowed in :not() selectors in CSS3 (##:not(##div#ads) ) +-Fix: namespaces in CSS3 are only allowed in front of nodename selectors (##abc|#def) +-Fix: in an internal rule redundancy, the most restrictive part is the active part (##[a^="b"][a^="bcd"] and ##[a^="bc"] ) +-Fix: incorrect warning message for comma-separated hiding rules for which one part can't match anything (##div,:not(*) ) +-Fix: do not automatically assume case insensitivity for browser-specific pseudo selectors (##:moz-whatever(x) versus ##:moz-whatever(X) ) +-Modified: rules that match nothing (example: $image,~image) won't be made redundant by every other rule anymore; a warning is sufficient +-Modified: prefer the message that donottrack is depricated over one that the rule doesn't match anything +-Modified: rewrite the way hiding rules are parsed. This method should be more fail-proof. +-UI: fix typo in warning message + + +April 14, 2013: +- Modified: reworked the warnings 'management' system so that it always returns the most important warning instead of the last found warning per rule +- Improved: warnings about redundancies within a rule (example: ##[a="bcd"][a^="bc"]) +- Improved: up to 5% increase of speed +- Fix: incorrect warnings about redundancies within a rule if namespaces in attribute selectors were present (##[ns1|abc="def"][ns2|abc="def"]) +- Fix: disable warnings about selectors that cannot co-exist when a namespace selector is present (##a|#b[*|id^='b']), because I'm unsure about the validity of that warning +- Fix: incorrect 'broken selector' warning if a rule contains unicode characters 00A0 to 0177 +- UI: fix bad rule highlighting when a filter with a warning contained " and " (##*[ and $=" and "]) +- UI: warn when a browser lacks some functionality + + +March 28, 2013: +- Improved: up to 20% increase of speed + + +March 26, 2013: +- Fix: treat every line containing *[adblock*]* as comment +- Fix: hiding rules containing ##tag-or-class-or-id\::known-pseudoselector are valid CSS (example: ###mysite\::first-child) +- Fix: duplicate warning if an excluded domain in a hiding rule was also an included domain in a hiding whitelist rule (example: a,b,~b.a##x and a#@#x) +- Fix: hiding rules excluded by a #@# rule do not make other rules redundant anymore (###ads and foo.com#@##ads and foo.com###ads.banner) +- Fix: rules with included domains, excluded subdomains and included sub-subdomains weren't shown as redundant for the last subdomain (a,~b.a,c.b.a##x versus c.b.a##x.y) +- Fix: simplified hiding rules suggest the #id and .class syntax, instead of [id="the_id"] and [class~="the_class"] +- Fix: warnings involving the same rule twice were removed (##[id="x"] and ##[id="x"]) +- New: warn if you have an rule with only excluded domains and a rule with partially redundant included domains (~b.a##x vs z,c.b.a##x) +- New: if a hiding rule matches a parent element of another hiding rule, the latter is redundant (###foo versus ###foo > #bar) +- New: hiding rules may skip a tree depth if their selector allows so (###foo > bar > baz versus ###foo baz) +- New: warn if you have selectors that can't co-exist (###id1#id2, ##[a="b"][a="c"], ...) +- New: warn if comma-separated hiding rules make each other redundant (###ads,.xyz#ads) +- Improved: warn if you have multiple included domains and some of them match (example: foo,a.bar##a versus bar,baz##a) +- Improved: support for comma-separated hiding rules (domain.com###ads,#adv) +- UI: for errors reported (for broken rules, like "##rule]" ), an "!" was shown in front of the message +- UI: replace contact link with information link +- UI: disable spellchecking of the filter list input area + + +January 31, 2013: +- New: add several tools: + * A similar rules finder tool + * Tools to ignore domains and blocking options (replaces the checkbox) + * A tool to use a less strict matching algorithm + * A tool to find rules which have the same rule, but a different domain + * A tool to find the rules that make whitelisting rules necessary, which also displays if no rules could be found for a whitelisting rule +- New: ||x will now also be matched if both /x and .x are present +- Modified: depricate $donottrack, since it's removed from ABP too +- Fix: '//' isn't a regex +- Fix: ' !x' (with a whitespace in front of it) is a comment, not a blocking rule +- Fix: '*!x' and similar will no longer trigger 'unnecessary preceeding wildcard found' warnings, since it would become a comment without * +- Fix: '/\|\|x/' and similar regex rules no longer make ||x redundant + + +No changelog available before 2013. \ No newline at end of file diff --git a/famlam-redundancychecker/famlam.tar.gz b/famlam-redundancychecker/famlam.tar.gz new file mode 100644 index 000000000..6d2beeb46 Binary files /dev/null and b/famlam-redundancychecker/famlam.tar.gz differ diff --git a/famlam-redundancychecker/findWhitelistRules.js b/famlam-redundancychecker/findWhitelistRules.js new file mode 100644 index 000000000..f4aea6a36 --- /dev/null +++ b/famlam-redundancychecker/findWhitelistRules.js @@ -0,0 +1,67 @@ +/*! + This script searches for active whitelisting rules written in the Adblock Plus syntax, + documentated here: http://adblockplus.org/en/filters, and reports them. + Author: Famlam (fam.lam [at] live.nl) + + 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. +*/ +"use strict"; +var findWhitelistRules = function(lines) { + importScripts("redundant.js"); + + var ELEMHIDE = /^([^\/\*\|\@\"\!]*?)\#\s*(\@)?\s*\#([^\{\}]+)$/, /**/ + BLOCKING = /^(@@)?(.*?)(\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)?$/, /**/ + + i, j, + startWorkerResults = startWorker({filters: lines, modifiers: {matchWhitelist: true, loosely: true}}, false, true), + resultByWhitelist = {}, + resultByFilter = {}; + + // Show all whitelist rules, including the non-matching ones + lines = lines.split("\n"); + for (i=0; i=0; j--) { + if (splitted[j].match(BLOCKING)[1]) { + splitted.splice(i, 1); + } + } + } + resultByWhitelist[i] = resultByWhitelist[i].concat(splitted); + for (j=0; j foundRule.length) { + foundRule = previousFoundRule; + } + if (B_REGEX.test(foundRule)) { + foundRule = foundRule + "*"; + } else if (foundRule[0] === "!" || (foundRule[0] === "@" && foundRule[1] === "@")) { + foundRule = "*" + foundRule; + } + if (H_RELATIVEPATH.test(foundRule)) { + foundRule = foundRule.replace(H_RELATIVEPATH, "/"); + if (foundRule === "/") { + foundRule = previousFoundRule || ""; + } + } + } else { + priority = 6; + } + } + if (foundRule) { + result[line] = { + priority: priority, + newRule: (foundRule + (options.length ? "$" + options.sort().join(",") : "")).replace(WHITESPACE_G, "") + }; + } + }; + + lines = lines.split("\n"); + for (i=0; i + + + + + + Redundancy check - limitations + + + +

Limitations

+

This page lists the limitations of this redundancy checker, as far as known by the author

+

Known false positives

+
+ A false positive is a false alarm: a rule is reported as being redundant, while it actually isn't redundant. +
    +
  • There are currently no false positives known.
  • +
+
+ +

Known false negatives

+
+ A false negative is a rule that is redundant (and can be detected as such with the given input), but isn't reported +
    +
  • + The options $third-party and $domain=... are not linked
    + As a result, the redundancy checker won't find matches between rules of which one contains $third-party (or $~third-party) and the other one contains a domain that does match the third- or first-party requirement. Examples: +
      +
    • ||site.com/ads.$~third-party should have been made redundant by /ads.$domain=site.com as both only apply to domain site.com
    • +
    • ||site.com/ads.$domain=anothersite.com should have been made redundant by /ads.$third-party as both apply on domain anothersite.com
    • +
    • ||site.com^$domain=~site.com should have been made redundant by ||site.com^$third-party as both apply everywhere except for domain site.com
    • +
    + The cause is that it is not trivial to extract the top level domain. For example: in the case of subdomain.domain.com this would be com, but in case of subdomain.domain.co.uk this would be co.uk. +
  • +
  • + Complex regular expression rules are only checked one-way
    + As a result, you will not be notified when a regular expression has been made redundant by another rule. Examples: +
      +
    • /advert(isement)?/ should have been made redundant by /ad(v|s)/
    • +
    • /-advert-images?-/ should have been made redundant by -advert-
    • +
    + The cause is that it is almost impossible to rewrite complex expressions in such a form that it can be checked against all possibilities. For example, the simple regex /\w{3}/ matches every possible filter of at least three successive alphanumeric characters. The regex /ad(s+|v)?/ matches ad, adv, ads, adss, adsss, and so on. It is close to impossible to check this against a normal filter or another regex within the duration of a day computing time and without the need for very complex code. +
  • +
+
+ +

Ignored rules

+
+ Ignored rules are rules that the redundancy checker skips before even trying to find matches. Say, false negatives without the need for a second filter. +
    +
  • + Rules with syntax errors
    + Rules for which it cannot be determined how to interpret them, are ignored. When such a rule is found, an error will be shown. Examples: +
      +
    • ###.ads
    • +
    • /advert(ising/
    • +
    +
  • +
  • + Simplified hiding rules
    + The old, deprecated format of hiding rules is not supported by the tool. When such a rule is found, a warning will be shown telling you how to convert this type of rule to the CSS3 format, if possible. Examples: +
      +
    • #div
    • +
    • #div(ads)
    • +
    • #div(class=ads)
    • +
    +
  • +
  • + CSS4 hiding rules
    + CSS4 is still work-in-progress and is therefore subject to changes. Furthermore, at this moment most browsers don't fully support all functionality. For that reason, CSS4 selectors are not supported yet. Examples: +
      +
    • ##[name*="ads" i]
    • +
    • ##div! > #ads
    • +
    +
  • +
  • + Rules with unknown options
    + Rules with unknown options are usually the result of typos. However, it could also be an option that has been removed from or has recently been added to Adblock Plus. As it is unknown what the default status of those rules is ($third-party defaults to third- and first-party, while $popup defaults to disabled), those rules are skipped to prevent incorrect matches. A warning will be shown. Examples: +
      +
    • $first-party
    • +
    • $donottrack
    • +
    • $~domain=site.com
    • +
    • $domain=site.com,anothersite.com
    • +
    +
  • +
  • + Rules containing the $sitekey=... option
    + Rules containing the $sitekey= option are silently ignored. The behaviour of those rules is poorly documented, making it hard to determine the behaviour when this rule is combined with other options. Furthermore, there is only one filter list that uses them. Example: +
      +
    • @@$sitekey=abcdefghijklmnopqrstuvwxyz
    • +
    +
  • +
  • + Rules containing the $generichide or $genericblock options
    + Rules containing the $generichide or $genericblock options are silently ignored. These rules are not yet officially released and their behaviour may still change. Example: +
      +
    • @@$generichide
    • +
    +
  • +
  • + Rules with problematic domains
    + A rule will also be ignored if the domains of a rule are invalid or if a domain is included and excluded at the same time. Warnings are shown in those cases. Examples: +
      +
    • $domain=site.com|~site.com
    • +
    • $domain=site..com
    • +
    • $domain=site.com,domain=anothersite.com
    • +
    • site.com,,anothersite.com###ads
    • +
    • site.com/###ads
    • +
    • *.com###ads
    • +
    +
  • +
  • + Rules containing JavaScript object properties
    + Rules that contain JavaScript object properties may interfere with the code, thereby changing its behaviour. For that reason, those rules are silently ignored. Examples: +
      +
    • constructor##abc
    • +
    • $domain=~con.constructor
    • +
    • __proto__
    • +
    +
  • +
  • + Rules containing :nth-child(An+B), :nth-last-child(An+B), :nth-of-type(An+B) or :nth-last-of-type(An+B) with A or B very large
    + Due to rounding errors in JavaScript with large numbers, the values of A and B may differ from the values in the filter. You'll probably never use them anyway, so they are silently ignored. Examples: +
      +
    • ##:nth-child(590295810358705700001)
    • +
    • ##:nth-of-type(10000000000000000000000000n+4)
    • +
    +
  • +
  • + Rules containing [Adblock] or [Adblock *]
    + Filter lists have to start with a line containing [Adblock] or similar in order to be a valid filter list. As this redundancy checker should also be able to operate with multiple filter lists as input, it is not possible to only filter out the first line, as the second occurrence of this line can indicate the next filter list. Therefore, all rules of this type are silently ignored. Example: +
      +
    • [Adblock Plus 2.0]
    • +
    +
  • + +
  • + Rules that cannot match anything
    + If it can be determined on beforehand that a rule cannot match anything, then that rule will be ignored. Technically, those rules can be made redundant by every filter, but that would only be confusing, so a warning is thrown instead. Examples: +
      +
    • ##:nth-child(0n-6)
    • +
    • ##[class~="foo bar"]
    • +
    • ##[ID]:not([id])
    • +
    • ##:not(*)
    • +
    • ##::before
    • +
    • $image,~script,~image
    • +
    • $document
    • +
    • ||.foo.com^
    • +
    • |://foo.com^
    • +
    +
  • +
+
+ + \ No newline at end of file diff --git a/famlam-redundancychecker/onlyDomainDiffers.js b/famlam-redundancychecker/onlyDomainDiffers.js new file mode 100644 index 000000000..419dbe35b --- /dev/null +++ b/famlam-redundancychecker/onlyDomainDiffers.js @@ -0,0 +1,100 @@ +/*! + This script searches for identical rules with different domains written in the Adblock Plus syntax, + documentated here: http://adblockplus.org/en/filters, and reports them. + Author: Famlam (fam.lam [at] live.nl) + + 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. +*/ +"use strict"; +var onlyDomainDiffers = function(lines) { + importScripts("redundant.js"); + + var ELEMHIDE = /^([^\/\*\|\@\"\!]*?)\#\s*(\@)?\s*\#([^\{\}]+)$/, /**/ + BLOCKING = /^(@@)?(.*?)(\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)?$/, /**/ + B_DOMAINIS = /(?:\,|\$|^)domain\=([^\,]+)/, /**/ + STARTCOMMA = /^\,/, + + i, j, startWorkerResults, match, key, startWorkerResults2, betterRule, options, modifiedI, + result = {}, + linesWithDomains = lines.split("\n"); + + startWorker({filters: ""}, false, true); // import it's "globals" + + // Remove rules without domains/options + for (i=linesWithDomains.length-1; i>=0; i--) { + match = linesWithDomains[i].match(ELEMHIDE); + if (match && !match[1]) { + linesWithDomains.splice(i, 1); + } else if (!match) { + match = linesWithDomains[i].match(BLOCKING); + if (!match[3] || !B_DOMAINIS.test(match[3].toLowerCase())) { + linesWithDomains.splice(i, 1); + } + } + } + + startWorkerResults = startWorker({filters: linesWithDomains.join("\n"), modifiers: {ignoreDomains: true}}, false, true); + +top: + for (i in startWorkerResults.results) { + betterRule = startWorkerResults.results[i]; + for (j=0; j\#]+\/$/, + B_DOMAINIS = /(?:\,|\$|^)domain\=([^\,]+)/i, /**/ + WHITESPACE_G = /\s+/g, /**/ + WHITESPACE = /\s+/, + H_IDENTIFIER = /\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*/gi, + H_IDENTIFIERSTART = /^\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*/i, + H_IDENTIFIERENDSPACE = /^\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*\s$/i, + ESCAPEDSTAR_G = /\\\*/g, + ESCAPEDROOFTOP_G = /\\\^/g, + ESCAPEDROOFTOPSTART = /^(?:\\\|)?\\\^/, + ESCAPEDROOFTOPEND = /(?:\\\^)+\\\|$/, + B_TRIPLEROOFTOP_G = /\|\^\^\^\)/g, + B_USELESSWILDCARD_G = /^\.\*|\.\*$/g, + B_USELESSSTAR_G = /^\*|\*$/g, /**/ + ESCAPECHAR_G = /\W/g, + SUBDOMAIN = /^.+?(?:\.|$)/, /**/ + ONEESCAPEDPIPE = /^\\\|/, + TWOESCAPEDPIPES = /^\\\|\\\|/, + MANYSTARS_G = /\*{2,}/g, /**/ + TILDESTART = /^\~/, + ESCAPEDPIPEFINAL = /\\\|$/, + DASH_G = /\-/g, + CURLYBRACKETS = /\{|\}/, + DOTEND = /\.$/, /**/ + COMMAEND = /\,$/, + H_PROBABLYELEMHIDEEXCLUDE = /^(?:\@\@[^\#\@]*\#\@{0,2}|[^\#\@]*\#\@\@|[^\#\@]*\@\@?\#\@?)\#.+/, + B_BADFILTERSTART = /^\|\|[^a-z0-9_\-\.\~\%\!\$\&\'\(\)\+\,\;\=\:\@\[\*\u00DF-\u00F6\u00F8-\uFFFFFF]/i, + B_BADPROTOCOLSTART = /^\|([^a-z]|[a-z0-9\+\-\.]*[^a-z0-9\+\-\.\:\^\*])/i, + B_USELESSFILTERSTART = /^\|\*/, /**/ + B_USELESSFILTEREND = /(?:\*+|^)(?:\^+\|?|\|)$/, /**/ + H_BROWSERPSEUDOSELECTOR = /^\:?\-[a-z]+\-.+/, + OLDSTYLEHIDING = /^[^\/\*\|\@\"\!]*?\#(?:[\w\-]+|\*)(?:\([\w\-]+(?:[\$\^\*]?=[^\(\)\"]*)?\))*$/, + COMMENTLINE = /^\s*(?:\!|.*\[Adblock.*\]|\s+$)/i, /**/ + B_STARTWILDCARDPIPE_G = /^(?:\*|\.?\*\\)\|/g, /**/ + B_ENDWILDCARDPIPE_G = /\|\.?\*$/g, /**/ + H_ATTRSELECTORNOVALUE = /^\[\s*(\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*\||\*\||\|)?(\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*)\s*\]$/i, + H_ATTRDOUBLEQUOTESSELECTOR = /^\[\s*(\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*\||\*\||\|)?(\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*)\s*((\~|\^|\$|\*|\|)?\=\s*\"((?:\\.|[^\"\\])*?)\")\s*\]$/i, + H_ATTRSINGLEQUOTESSELECTOR = /^\[\s*(\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*\||\*\||\|)?(\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*)\s*((\~|\^|\$|\*|\|)?\=\s*\'((?:\\.|[^\'\\])*?)\')\s*\]$/i, + H_ATTRNOQUOTESSELECTOR = /^\[\s*(\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*\||\*\||\|)?(\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*)\s*((\~|\^|\$|\*|\|)?\=\s*(\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*))\s*\]$/i, + H_ATTRIDSELECTOR = /^\[id\=\'\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*\'\]$/i, + H_ATTRCLASSSELECTOR = /^\[class\~?\=\'\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*(?:\s+\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*)*\'\]$/i, + H_PSEUDOCLASSSELECTOR = /^\:(\:?\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*)(?:\((.+)\))?$/i, + H_LOOSEATTRIBUTEVALUESELECTOR = /^\[(\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*\||\*\||\|)?(\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*)((\~|\^|\$|\*|\|)?\=\'((?:\\.|[^\\])*?)\')\]$/i, + H_IDSELECTOR = /^\#\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*$/i, + H_CLASSSELECTOR = /^\.\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*$/i, + H_NODENAMESELECTOR = /^((?:\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*|\*)?\|)?((?:\*|\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*))$/i, /**/ + H_TREESELECTORCOMMASTART = /^\s*[\>\~\+\s\,]\s*/, + H_TREESELECTORCOMMA = /^\s*[\>\~\+\s\,]\s*$/, + H_NTHPSEUDOCONTENT = /^\s*((\-|\+)?\d*n(\s*(\-|\+)?\s*\d+)?|(\-|\+)?\d+|odd|even)\s*$/i, + H_LANGPSEUDOCONTENT = /^\s*\-?(?:[_a-z]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])(?:[\-_a-z0-9]|[^\u0000-\u009F]|\\[0-9a-f]{1,6}\s?|\\[^0-9a-f])*\s*$/i, + H_LANGPSEUDOCONTENTSPLITTER_G = /(?:^|\-)(?:\\.|[^\\\-])+/g, + VALIDDOMAIN = /^\~?((?:[a-z0-9\-_\u00DF-\u00F6\u00F8-\uFFFFFF]+|xn\-\-[a-z0-9\-_\u00DF-\u00F6\u00F8-\u00FF]+)\.)*(?:[a-z0-9\u00DF-\u00F6\u00F8-\uFFFFFF]+|xn\-\-[a-z0-9\-_\u00DF-\u00F6\u00F8-\u00FF]+)\.?$/i, + H_OLDSTYLEIDCLASS = /\(([^\=]+?)\)/, + H_OLDSTYLEATTRIBUTE_G = /\(([^\)\=]+?\=)([^\)]+?)\)/g, + B_OPTIONVALUE = /\=.+$/, + BACKSLASHEND = /\\+$/, + B_MATCHEVERYTHING = /^(?:\|\||\:|\||\|\*\:|\^|\|\*\^)?(?:\*\/|\*\^|\*\|)?$/, + B_HATSTAR_G = /\^|\*/g, + STAR_G = /\*/g, + AT_G = /\@/g, + WARNINGINSERTS = /\{(\d)\}/g, + B_ROOFTOPCHARACTERS = /[^\-\.\%a-zA-Z0-9_\|\*\u0080-\uFFFFFF\^]/, // excluding ^ itself + B_KEYCHARACTERS = /[\%a-z0-9\u0080-\uFFFFFF]/, + + // The blocking options + knownOptions = [ + "third_party", + "match_case", + "collapse", + "domain", + "sitekey" + ], + deprecated = { + background: "image", + dtd: "other", + ping: "other", + xbl: "other", + donottrack: "" + }, + Types = {ALL: 0}; + [ + "document", + "elemhide", + "font", + "genericblock", + "generichide", + "image", + "background", + "media", + "object", + "object_subrequest", + "other", + "dtd", + "ping", + "xbl", + "popup", + "script", + "stylesheet", + "subdocument", + "xmlhttprequest" + ].forEach(function(val) { + if (deprecated.hasOwnProperty(val)) { + Types[val] = Types[deprecated[val]]; // requires deprecated items after replacement items + } else { + Types[val] = Types.ALL + 1; + Types.MAX = Types.ALL + 1; + Types.ALL = Types.MAX * 2 - 1; + } + }); + + var status = { + OK: 1, + INVALID: 2, + IGNORE: 4, + DISCARD: 8 + }, + + syntax = { + hiding: 1, + blocking: 2 + }, + + // Objects containing the individual filters + h_global = [], + h_siteSpecific = [], + h_siteCollection = {}, + b_siteCollection = {}, + b_withoutkey = [], + b_withkey = [], + b_keyCollection = {}, + + // Reporting the progress + currentChecks = 0, + maxChecks = 0, + nextReport = 0, + reportProgress = function(n) { + if (secondTime) { + return; + } + currentChecks += n; + nextReport -= n; + if (nextReport < 1) { + nextReport = maxChecks / 200; + self.postMessage({progress: Math.round(currentChecks / nextReport) / 2}); + } + }; + + String.prototype.trimLeft = String.prototype.trimLeft || function() { // non-standard function + return this.replace(/^\s+/, ""); + }; + String.prototype.trimRight = String.prototype.trimRight || function() { // non-standard function + return this.replace(/\s+$/, ""); + }; + String.prototype.trim = function() { + // I don't want to trim 'foo\ ' to 'foo\' + var diff, + match = this.trimRight().match(BACKSLASHEND); + if (!match || match[0].length%2 === 0) { + return this.trimRight().trimLeft(); + } + diff = this.length - this.trimRight().length; + if (diff > 1) { + return this.substring(0, this.length - diff + 1).trimLeft(); + } + return this.trimLeft(); + }; + Array.prototype.contains = function(obj) { + return this.indexOf(obj) !== -1; + }; + String.prototype.contains = String.prototype.contains || Array.prototype.contains; // part of ES6 + String.prototype.startsWith = String.prototype.startsWith || function(obj) { // part of ES6 + return this.indexOf(obj) === 0; + }; + String.prototype.endsWith = String.prototype.endsWith || function(obj) { // part of ES6 + var position = this.length - obj.length; + return position > -1 && this.substring(position) === obj; + }; + Array.prototype.clone = function() { + return this.slice(0); + }; + Array.prototype.unique = function() { + var i, + l = this.length, + arr = []; + for (i=0; i Math.pow(2, 53); // IEEE 754 + }; + + // Remove exact duplicates and comments + var getLinesWithoutDuplicates = function() { + // Inputs: + // nothing + // Returns: + // array of strings + var i, line, + linesObj = {}, + lines = data.filters.split("\n"); + for (i=lines.length-1; i>=0; i--) { + line = lines[i]; + if (!line || COMMENTLINE.test(line) || isObjectProperty(line)) { + lines.removeAt(i); + } else if (linesObj.hasOwnProperty(line)) { + redundant[line] = line; + lines.removeAt(i); + } else { + linesObj[line] = true; // Object.hasOwnProperty is faster than Array.contains() + } + } + return lines; + }; + + var getWarningIndex = function(warningID) { + // Inputs: + // warningID: number + // Returns: + // number + var i; + for (i=0; i=0; i--) { + siteParts = included[i]; + isSubdomain=false; + while (SUBDOMAIN.test(siteParts)) { + if (excluded.contains(siteParts)) { + break; + } + if (!options.ignoreBroken && isObjectProperty(siteParts)) { + return {status: status.IGNORE}; + } + if (isSubdomain && included.contains(siteParts)) { + if (!options.ignoreBroken) { + if (options.isExclude) { + warn(52, line, siteParts); + } else { + warn(53, line, siteParts); + } + } + included.removeAt(i); + } else if (!isSubdomain && included.indexOf(siteParts) !== included.lastIndexOf(siteParts)) { + if (!options.ignoreBroken) { + if (options.isExclude) { + warn(48, line, siteParts); + } else { + warn(47, line, siteParts); + } + } + included.removeAt(i); + } + siteParts = siteParts.replace(SUBDOMAIN, ""); + isSubdomain = true; + } + } + if (excluded.length && !options.isExclude) { + excludedCheck = checkForBrokenDomains(excluded, line, {ignoreBroken: options.ignoreBroken, syntax: options.syntax, + isExclude: true, excludeOverride: included}); + if (excludedCheck.status !== status.OK) { + return {status: excludedCheck.status}; + } + excluded = excludedCheck.include; + if (included.length) { + for (j=excluded.length-1; j>=0; j--) { + hasCorrectInclude = false; + siteParts = excluded[j]; + while (SUBDOMAIN.test(siteParts)) { + if (included.contains(siteParts)) { + if (siteParts === excluded[j]) { + warn(4, line, siteParts); + return {status: status.IGNORE}; + } + hasCorrectInclude = true; + break; + } + siteParts = siteParts.replace(SUBDOMAIN, ""); + } + if (!hasCorrectInclude) { + if (!options.ignoreBroken) { + warn(39, line, excluded[j]); + } + excluded.removeAt(j); + } + } + } + return {include: included, exclude: excluded, status: status.OK}; + } + return {include: included, exclude: [], status: status.OK}; + }; + + + startWorker.parseCSSSelector = function(selector) { + // Inputs: + // selector: string + // Returns: + // array of array of array of strings + var current, match, + stringChar = "", + selectorIndex = 0, + bracketCount = 0, + bracketChar = "", + selectorParts = [], + depths = [], + selectors = [], + endOfSelectorPart = function() { + if (selectorIndex) { + selectorParts.push(selector.substring(0, selectorIndex)); + selector = selector.substring(selectorIndex); + selectorIndex = 0; + } + }, + endOfDepth = function() { + endOfSelectorPart(); + depths.unshift(selectorParts); + selectorParts = []; + }, + endOfSelector = function() { + endOfDepth(); + selector = selector.trim(); + selectors.push(depths); + depths = []; + }; + + selector = selector.trim(); + while (selector) { + if (selector.length <= selectorIndex) { + break; + } + current = selector[selectorIndex].replace(WHITESPACE, " "); + + // Strings between "" and '' + if (stringChar) { + switch (current) { + case stringChar: { + stringChar = ""; + break; + } + case "\\": { + selectorIndex++; + break; + } + } + selectorIndex++; + continue; + } + + // Content inside () and []; beginnings of strings + switch (current) { + case "'": case "\"": { + stringChar = current; + selectorIndex++; + continue; + } + case "(": case "[": { + if (bracketChar && bracketChar === current) { + bracketCount++; + } else if (!bracketChar) { + if (current === "[") { + endOfSelectorPart(); + } + bracketCount = 1; + bracketChar = current; + } + selectorIndex++; + continue; + } + case ")": case "]": { + if ((bracketChar === "(" && current === ")") || (bracketChar === "[" && current === "]")) { + bracketCount--; + if (bracketCount === 0) { + bracketChar = ""; + } + } + selectorIndex++; + continue; + } + default: { + if (bracketChar) { + selectorIndex++; + continue; + } + } + } + + // CSS identifiers + match = selector.substring(selectorIndex).match(H_IDENTIFIERSTART); + if (!match && current === "*") { + match = ["*"]; + } + if (match) { + selectorIndex += match[0].length; + if (WHITESPACE.test(match[0][match[0].length-1]) && H_IDENTIFIERENDSPACE.test(match[0])) { + selector = selector.substring(0, selectorIndex-1) + selector.substring(selectorIndex); + selectorIndex -= 1; + } + if (selector[selectorIndex] !== "(" && selector[selectorIndex] !== "|") { + endOfSelectorPart(); + } + continue; + } + + // ids, classes, pseudoclasses, pseudoselectors, treeselectors, combinators + switch (current) { + case "#": case ".": case ":": { + endOfSelectorPart(); + if (current === ":" && selector[selectorIndex+1] === ":") { + selectorIndex++; + } + selectorIndex++; + continue; + } + case " ": case ">": case "+": case "~": case ",": { + endOfSelectorPart(); + match = selector.match(H_TREESELECTORCOMMASTART); + selectorIndex += match[0].length; + if (match[0].trim() === ",") { + endOfSelector(); + } else { + endOfDepth(); + } + continue; + } + } + + selectorIndex++; + } + endOfSelector(); + return selectors; + }; + + // ======================================================================== // + // Searches for errors in the hiding rule. + // Parses the hiding rule into individual selectors + // ======================================================================== // + var generalizeCSSSelector = function(rule, is_notpseudoselector_content, line, noChangeSuggestions) { + // Inputs: + // rule: array of array of objects|strings + // is_notpseudoselector_content: boolean + // line: string + // noChangeSuggestions: boolean + // Returns: + // object {value: [[Array] or String], status: [status]} + var i, j, depth, current, match, next, hasNodeName, currentDepth, constValue, nValue, workerResults, + isGoodNotSelector, nSplit, otherSelector, bracketIndexI, lastPlusIndexI, redundantSelector, ruleSelector, + redundantParsed, ruleParsed, mutuallyRedundant, converted, + result = [], + indepthRedundancyFilter = function(item) { + return item !== "*" && item !== ">" && item !== "+" && item !== " " && item !== "~"; + }; + + if (is_notpseudoselector_content && rule.length !== 1) { + return {status: status.INVALID}; + } + for (depth=0; depth 1) { + return {status: status.INVALID}; + } + result[depth] = []; + + // Check the individual items + for (i=0; i 0 || (next && !H_TREESELECTORCOMMA.test(next))) { + warn(45, line, current); + } else { + warn(46, line, current); + } + } + break; + } + if (isGoodNotSelector.status === status.IGNORE) { + return {status: status.IGNORE}; + } + return {status: status.INVALID}; + } + + case "nth-of-type": case "nth-last-of-type": case "nth-child": case "nth-last-child": { + if (!match[2] || !H_NTHPSEUDOCONTENT.test(match[2])) { + return {status: status.INVALID}; + } + match[2] = match[2].replace(WHITESPACE_G, "").toLowerCase(); + if (match[2] === "odd") { + match[2] = "2n+1"; + } else if (match[2] === "even") { + match[2] = "2n"; + } + + nSplit = match[2].split("n"); + nValue = 0; + constValue = 0; + if (nSplit.length === 1) { + constValue = Number(match[2]); + } else { + if (nSplit[1]) { + constValue = Number(nSplit[1]); + } + if (!nSplit[0] || nSplit[0] === "+" || nSplit[0] === "-") { + nValue = Number(nSplit[0] + "1"); + } else { + nValue = Number(nSplit[0]); + } + } + + if (isInaccurateNumber(nValue) || isInaccurateNumber(constValue)) { + return {status: status.IGNORE}; + } + nValue = Number(nValue); + constValue = Number(constValue); + + if (nValue > 0 && constValue <= 0) { + while (constValue <= 0) { + constValue += nValue; + } + } else if (nValue < 0 && constValue > 0 && constValue + nValue <= 0) { + nValue = 0; + } else if (nValue <= 0 && constValue <= 0) { + return {status: status.DISCARD, value: current}; + } + + result[depth].push(":" + match[1] + "(" + nValue + "n+" + constValue + ")"); + break; + } + case "lang": { + if (!match[2] || !H_LANGPSEUDOCONTENT.test(match[2])) { + return {status: status.INVALID}; + } + match = match[2].trim().toLowerCase().match(H_LANGPSEUDOCONTENTSPLITTER_G); + for (j=0; j": case "~": case "+": { + if (i !== 0) { + result[depth].push(current); + break; + } + return {status: status.INVALID}; + } + case ",": { + if (i !== 0) { + break; + } + return {status: status.INVALID}; + } + default: { + match = current.match(H_NODENAMESELECTOR); + if (match && i === 0) { + hasNodeName = true; + if (current === "*|*") { + break; + } + if (current === "*" && !noChangeSuggestions && line && next && !H_TREESELECTORCOMMA.test(next)) { + warn(58, line, next); + } + if (!match[1]) { + result[depth].push(match[2].toLowerCase()); + result[depth].push("*|" + match[2].toLowerCase()); + if (match[2] !== "*") { + result[depth].push("*"); + } + } else { + result[depth].push(current.toLowerCase()); + if (match[2] !== "*") { + result[depth].push(match[1].toLowerCase() + "*"); + } + if (match[1] !== "*|") { + result[depth].push("*|" + match[2].toLowerCase()); + } + } + break; + } + return {status: status.INVALID}; + } + } + } + if (!hasNodeName) { + result[depth].push("*"); + } else { + hasNodeName = false; + } + + currentDepth.removeAt(currentDepth.indexOf("*|*")); + result[depth].removeAt(result[depth].indexOf("*|*")); + + // Check if :not(...) selectors make matching impossible + if (!secondTime) { + for (i=0; i 0 && constValue % nValue !== 0)) { + return {status: status.DISCARD, value: depth}; + } + } + } + } + } + + // Filter out the internal redundancies. Who needs them anyway? + if (!secondTime) { + workerResults = startWorker({filters: ("##" + currentDepth.filter(indepthRedundancyFilter).join("\n##"))}, true); + if (line && !noChangeSuggestions) { + for (i in workerResults) { + redundantSelector = workerResults[i].substring(2); + ruleSelector = i.substring(2); + redundantParsed = generalizeCSSSelector([[redundantSelector]], is_notpseudoselector_content, undefined, true).value[0]; + ruleParsed = generalizeCSSSelector([[ruleSelector]], is_notpseudoselector_content, undefined, true).value[0]; + mutuallyRedundant = redundantParsed.length === ruleParsed.length; + if (mutuallyRedundant) { + for (j=0; j 1 && !is_notpseudoselector_content && !secondTime) { + for (i=0; i=0; j--) { + joinedDepth += parsed[i][j].join(""); + } + if (i !== parsed.length-1) { + joinedDepth = joinedDepth.substring(0, joinedDepth.length - parsed[i][0][parsed[i][0].length-1].length); + } + joinedRules.push("##" + joinedDepth); + joinedDepth = ""; + } + do { + workerResults = startWorker({filters: joinedRules.join("\n")}, true); + for (i in workerResults) { + parsed.removeAt(joinedRules.indexOf(i)); + joinedRules.removeAt(joinedRules.indexOf(i)); + if (line && !noChangeSuggestions) { + warn(50, line, [i.substring(2), workerResults[i].substring(2)]); + } + } + } while (!startWorker.isEmptyObject(workerResults) && parsed.length > 1); + } + + for (i=0; i b ? 1 : -1; + } + return a.length > b.length ? 1 : -1; + } + return scoreA > scoreB ? -1 : 1; + }; + for (j=0; j 1 && !match[2]) { + for (r=0; r -1 && prepareBlockingOptions(options[i].substring(index), line, isWhitelistRule, true).status !== status.INVALID) { + if (prepareBlockingOptions("$" + options[i].substring(0, index - 1), line, isWhitelistRule, true).status === status.INVALID) { + warn(18, line, [options[i].substring(index + 1), options[i]]); + } else { + warn(21, line, "$"); + } + } + } + + currentOption = options[i].toLowerCase().replace(DASH_G, "_").replace(B_OPTIONVALUE, ""); + isInverse = currentOption[0] === "~"; + if (isInverse) { + currentOption = currentOption.substring(1); + } + + // Filter out invalid/unknown options + if (!Types.hasOwnProperty(currentOption) && !knownOptions.contains(currentOption) && !deprecated.hasOwnProperty(currentOption)) { + if (!noWarnings) { + warn(19, line, options[i]); + } + return {status: status.INVALID}; + } + + // Check if the option=value syntax is allowed or required + if (hasValue && !["domain", "sitekey"].contains(currentOption)) { + warn(11, line, currentOption); + return {status: status.INVALID}; + } + if (!hasValue && ["domain", "sitekey"].contains(currentOption)) { + if (!noWarnings) { + warn(10, line, currentOption); + } + return {status: status.INVALID}; + } + + // Check if the ~inverse is allowed + if (isInverse) { + if (["domain"].contains(currentOption)) { + if (!noWarnings) { + warn(12, line, currentOption); + } + return {status: status.DISCARD}; + } + if (["match_case"].contains(currentOption)) { + if (!noWarnings) { + warn(41, line, currentOption); + } + } else if (["sitekey"].contains(currentOption)) { + if (!noWarnings) { + warn(41, line, currentOption); + } + return {status: status.DISCARD}; + } + } + + // Check if the option is allowed or disallowed in whitelist rules + if (isWhitelistRule && ["collapse"].contains(currentOption)) { + if (!noWarnings) { + warn(43, line, currentOption); + } + continue; + } + if (!noWarnings && !isWhitelistRule && !isInverse && ["document", "elemhide"].contains(currentOption)) { + warn(38, line, currentOption); + } + + // Check for deprecated options + if (deprecated.hasOwnProperty(currentOption)) { + if (!deprecated[currentOption]) { + if (!noWarnings) { + warn(28, line, currentOption); + } + return {status: status.INVALID}; + } else if (!noWarnings) { + warn(44, line, [currentOption, deprecated[currentOption]]); + } + } + + normalizedOptions.push((isInverse ? "~" : "") + currentOption); + } + } + + for (i=0; i i) { + if (["domain", "sitekey"].contains(currentOption)) { + if (!noWarnings) { + warn(20, line, currentOption); + } + return {status: status.DISCARD}; + } + if (!noWarnings) { + warn(49, line, currentOption); + } + } + + // Warn about contradicting options + if (!noWarnings && knownOptions.contains(currentOption) && normalizedOptions.contains("~" + currentOption)) { + warn(27, line, currentOption); + } + + // Process the resource type options + if (Types.hasOwnProperty(currentOption.replace(TILDESTART, ""))) { + if (isInverse) { + if (allowedTypes === undefined) { + allowedTypes = Types.ALL & ~(Types.elemhide | Types.document | Types.popup); + } else if (normalizedOptions.indexOf(currentOption) === normalizedOptions.lastIndexOf(currentOption) + && !(allowedTypes & Types[currentOption.replace(TILDESTART, "")]) && !noWarnings) { + warn(40, line, currentOption); + } + allowedTypes &= ~Types[currentOption.replace(TILDESTART, "")]; + } else { + allowedTypes = allowedTypes || 0; + if (normalizedOptions.indexOf(currentOption) === normalizedOptions.lastIndexOf(currentOption) + && (allowedTypes & Types[currentOption]) && !noWarnings) { + warn(40, line, currentOption); + } + allowedTypes |= Types[currentOption]; + } + typeOptions.push(currentOption); + } + + ruleOptions[currentOption.replace(TILDESTART, "")] = (isInverse ? -1 : 1); + } + + // $document implies $elemhide + if (!isWhitelistRule && (allowedTypes & (Types.elemhide | Types.document))) { + allowedTypes = allowedTypes & ~(Types.elemhide | Types.document); + if (allowedTypes === 0) { + return {status: status.DISCARD}; + } + } else if (allowedTypes & Types.document) { + if (allowedTypes & Types.elemhide) { + if (!noWarnings) { + warn(40, line, "elemhide"); + } + } else { + if (!noWarnings && (typeOptions.indexOf("~elemhide") > 0 || (typeOptions.length === 1 && typeOptions[0] === "~elemhide"))) { + warn(40, line, "~elemhide"); + } + allowedTypes |= Types.elemhide; + } + } + + // If no types have been specified or all types have cancelled each other + if (allowedTypes === undefined) { + allowedTypes = Types.ALL & ~(Types.elemhide | Types.document | Types.popup); + } else if (allowedTypes === 0) { + if (!noWarnings) { + warn(15, line); + } + return {status: status.DISCARD}; + } + + // Find type options that cancel each other + if (!noWarnings) { + for (i=0; i= 4 && !isObjectProperty(key)) { + keys.push(key); + } + key = ""; + recording = true; + } + } + return keys; + }; + + blockingoptions = prepareBlockingOptions(match[3], line, match[1] === "@@"); + if (blockingoptions.status !== status.OK) { + return; + } + delete blockingoptions.status; + object = { + options: blockingoptions, + excludedDomains: [], + includedDomains: [], + isWhitelist: (match[1] || data.modifiers.matchWhitelist ? true : false), + isRegex: false, + string: "", + syntax: syntax.blocking, + filter: line, + domainstart: false + }; + + if (B_REGEX.test(match[2])) { + try { + object.rule = new RegExp(match[2].substring(1, match[2].length - 1), blockingoptions.ruleOptions.match_case === 1 ? "" : "i"); + } catch(ex) { + warn(2, line); + return; + } + if (PROBABLYNOTREGEX.test(match[2])) { + object.string = match[2].substring(1, match[2].length - 1); + } else { + object.isRegex = true; + } + } else { + firstlast = match[2][0] + match[2][match[2].length-1]; + match[2] = match[2] + .replace(MANYSTARS_G, "*") + .replace(B_USELESSFILTEREND, "*") + .replace(B_USELESSFILTERSTART, "*"); + object.rule = new RegExp(match[2] + .replace(ESCAPECHAR_G, escapeCharacter) + .replace(ESCAPEDSTAR_G, ".*") + .replace(ESCAPEDROOFTOPEND, function(match) { + return "[^\\-\\.\\%a-zA-Z0-9_\\*\\u0080-\\uFFFFFF]{0," + (match.length/2-1) + "}\\|"; + }) + .replace(ESCAPEDROOFTOPSTART, "[^\\-\\.\\%a-zA-Z0-9_\\|\\*\\u0080-\\uFFFFFF]") + .replace(ESCAPEDROOFTOP_G, "[^\\-\\.\\%a-zA-Z0-9_\\*\\u0080-\\uFFFFFF]") + .replace(B_TRIPLEROOFTOP_G, "|\\^)") + .replace(TWOESCAPEDPIPES, "\\|(?:[a-zA-Z0-9_\\-]+\\:\\/+|\\|)(?:[^\\.\\/\\^\\*]+\\.)*?") + .replace(ONEESCAPEDPIPE, data.modifiers.loosely ? "^\\|?" : "^\\|") + .replace(ESCAPEDPIPEFINAL, data.modifiers.loosely ? "(?:\\||\\^)?$" : "\\|$") + .replace(B_STARTWILDCARDPIPE_G, ".+\\|") + .replace(B_ENDWILDCARDPIPE_G, "|.+") + .replace(B_USELESSWILDCARD_G, "") + || ".*", blockingoptions.ruleOptions.match_case === 1 ? "" : "i"); + object.string = match[2] + .replace(B_STARTWILDCARDPIPE_G, "**|") + .replace(B_ENDWILDCARDPIPE_G, "|**") + .replace(B_USELESSSTAR_G, ""); + if (object.string.startsWith("||")) { + object.domainstart = { + dot: object.string.replace("||", "."), + slash: object.string.replace("||", "/") + }; + } + if (object.string && firstlast[0] === "*" && object.string[0] !== "*" && (firstlast === "**" || !B_REGEX.test(object.string)) + && !COMMENTLINE.test(object.string) && !(!object.isWhitelist && object.string[0] === "@" && object.string[1] === "@")) { + warn(59, line); + } else if (object.string && (firstlast[1] === "*" && object.string[object.string.length-1] !== "*" && !B_REGEX.test(object.string))) { + warn(62, line); + } + } + keys = (object.isRegex || data.modifiers.loosely) ? [] : getKeys(object.string); + if (keys.length) { + for (j=0; j 0) { + domainsWarnCanBeRemoved.sort(); + if (domainsWarnCanBeRemoved.length === 1) { + warn(31, [rule.filter, redRule.filter], [redRule.filter, domainsWarnCanBeRemoved[0]]); + } else { + warn(32, [rule.filter, redRule.filter], [redRule.filter, domainsWarnCanBeRemoved.join(", ")]); + } + } + return false; + }; + + // ======================================================================== // + // Check for whitelisted hiding, blocking of whitelisting rules + // ======================================================================== // + var matchExclusionRules = function() { + if (data.modifiers.ignoreOptions || data.modifiers.ignoreDomains) { + return; + } + + var i, j, k, alldomains, allFilters, domainset, currentDocumentElemhide, currentDomain, useDotVariant, dotIndependent, + documentelemhideRules = [], + hidingdomains = Object.keys(h_siteCollection); + alldomains = Object.keys(b_siteCollection).concat(hidingdomains).unique(); + allFilters = b_withkey.concat(b_withoutkey); + + for (i=0; i 1) { + if (!currentDocumentElemhide.isRegex) { + warn(35, [h_siteCollection[currentDomain][k].filter, currentDocumentElemhide.filter], currentDomain); + } else { + warn(37, h_siteCollection[currentDomain][k].filter, [currentDocumentElemhide.filter, currentDomain]); + } + } else { + if (!currentDocumentElemhide.isRegex) { + matchDomains(h_siteCollection[currentDomain][k], currentDocumentElemhide); + } else { + warn(36, h_siteCollection[currentDomain][k].filter, currentDocumentElemhide.filter); + } + } + } + } + if ((currentDocumentElemhide.options.allowed & Types.document) && b_siteCollection.hasOwnProperty(currentDomain)) { + for (k=0; k 1) { + if (!currentDocumentElemhide.isRegex) { + if (dotIndependent) { + warn(35, [b_siteCollection[currentDomain][k].filter, currentDocumentElemhide.filter], currentDomain); + } else { + warn(64, [b_siteCollection[currentDomain][k].filter, currentDocumentElemhide.filter], + useDotVariant ? [currentDomain + ".", currentDomain] : [currentDomain, currentDomain + "."]); + } + } else { + warn(37, b_siteCollection[currentDomain][k].filter, [currentDocumentElemhide.filter, currentDomain]); + } + } else { + if (!currentDocumentElemhide.isRegex) { + if (dotIndependent) { + matchDomains(b_siteCollection[currentDomain][k], currentDocumentElemhide); + } else { + warn(65, [b_siteCollection[currentDomain][k].filter, currentDocumentElemhide.filter], + useDotVariant ? [currentDomain + ".", currentDomain] : [currentDomain, currentDomain + "."]); + } + } else { + warn(36, b_siteCollection[currentDomain][k].filter, currentDocumentElemhide.filter); + } + } + } + } + } + + if (!currentDocumentElemhide.isRegex && currentDocumentElemhide.string.length < 6 && B_MATCHEVERYTHING.test(currentDocumentElemhide.string)) { + for (k=0; k redRule_literal.length) { + return false; + } + for (i=0; i redRule_attr[j].value.length) { + continue; + } + switch (rule_attr[i].operator) { + case "=": case "undefined": { + break; + } + case "^": { + if ((redRule_attr[j].operator === "=" || redRule_attr[j].operator === "^" || redRule_attr[j].operator === "|") + && redRule_attr[j].value.startsWith(rule_attr[i].value)) { + attributeMatched = true; + break top; + } + break; + } + case "$": { + if ((redRule_attr[j].operator === "=" || redRule_attr[j].operator === "$") && redRule_attr[j].value.endsWith(rule_attr[i].value)) { + attributeMatched = true; + break top; + } + break; + } + case "*": { + if (redRule_attr[j].value.contains(rule_attr[i].value)) { + attributeMatched = true; + break top; + } + break; + } + case "|": { + if (((redRule_attr[j].operator === "=" || redRule_attr[j].operator === "|") && redRule_attr[j].value === rule_attr[i].value) + || ((redRule_attr[j].operator === "=" || redRule_attr[j].operator === "^" || redRule_attr[j].operator === "|") + && redRule_attr[j].value.startsWith(rule_attr[i].value + "-"))) { + attributeMatched = true; + break top; + } + break; + } + case "~": { + if (redRule_attr[j].operator === "=" + && (" " + redRule_attr[j].value.replace(WHITESPACE_G, " ") + " ").contains(" " + rule_attr[i].value + " ")) { + attributeMatched = true; + break top; + } + if ((redRule_attr[j].operator === "^" || redRule_attr[j].operator === "|") + && (" " + redRule_attr[j].value.replace(WHITESPACE_G, " ")).contains(" " + rule_attr[i].value + " ")) { + attributeMatched = true; + break top; + } + if (redRule_attr[j].operator === "$" + && (redRule_attr[j].value.replace(WHITESPACE_G, " ") + " ").contains(" " + rule_attr[i].value + " ")) { + attributeMatched = true; + break top; + } + if (redRule_attr[j].operator === "*" + && redRule_attr[j].value.replace(WHITESPACE_G, " ").contains(" " + rule_attr[i].value + " ")) { + attributeMatched = true; + break top; + } + break; + } + } + } + if (!attributeMatched) { + return false; + } + } + + // Match :nth-* selectors + for (i=0; i 0) { + continue; + } + if (redRule_nth[j].constValue > rule_nth[i].constValue) { + continue; + } + } else { + if (redRule_nth[j].nValue >= 0 && redRule_nth[j].constValue < rule_nth[i].constValue) { + continue; + } + if (redRule_nth[j].nValue < 0 && (redRule_nth[j].constValue % redRule_nth[j].nValue || -1 * redRule_nth[j].nValue) < rule_nth[j].constValue) { + continue; + } + } + attributeMatched = true; + break; + } + if (!attributeMatched) { + return false; + } + } + + // match :not() selectors against other :not() selectors + for (i=0; i sI.selectors.tree.length) { + return; + } + + if (sI.selectors.tree.length === 0) { + if (!isMatchInHidingDepth(sI.selectors, sJ.selectors, 0, 0)) { + return; + } + } else { + sI_tree = sI.selectors.tree.clone(); + sJ_tree = sJ.selectors.tree.clone(); + sI_tree.unshift("end"); + sJ_tree.unshift("end"); + possible_pathways = insertNull([sJ_tree], sI_tree.length - sJ_tree.length); + for (i=0; i=0; j--) { + switch (possible_pathways[j][i]) { + case "end": { + if (sItreeI !== "end" && sItreeI !== ">" && sItreeI !== " ") { + mustSplice = true; + } + break; + } + case ">": { + if (sItreeI !== ">") { + mustSplice = true; + } + break; + } + case "+": { + if (sItreeI !== "+") { + mustSplice = true; + } + break; + } + case " ": { + if (sItreeI !== ">" && sItreeI !== " ") { + mustSplice = true; + } + break; + } + case "~": { + if (sItreeI !== "+" && sItreeI !== "~") { + mustSplice = true; + } + break; + } + } + if (mustSplice) { + possible_pathways.removeAt(j); + mustSplice = false; + } + } + } + if (possible_pathways.length === 0) { + return; + } + + for (j=possible_pathways.length-1; j>=0; j--) { + currentPath=possible_pathways[j]; + for (i=currentPath.indexOf("end")+1; i" || currentPath[i] === "~") { + possibleRedundantPart = sI_tree.slice(firstNullIndex, i + 1); // note: slice(1,4) returns indexes 1,2,3 + vert = 0; + for (k=0; k") { + vert += 1; + if (vert > 1) { + break; + } + } else if (possibleRedundantPart[k] === " ") { + vert = Infinity; + break; + } + } + if (vert > 1 || (vert === 1 && currentPath[i] === "~")) { + mustSplice = true; + } + } + if (mustSplice) { + possible_pathways.removeAt(j); + mustSplice = false; + break; + } + } else if (currentPath[i] === null && currentPath[i-1] !== null) { + firstNullIndex = i; + } + } + } + if (possible_pathways.length === 0) { + return; + } + + // The selector must match directly before the tree selector + for (i=0; i=0; j--) { + if (!possible_pathways[j][i]) { + continue; + } + nullcount = 0; + for (k=0; k 2 * sI.string.length) { + return; + } + if (sI.isRegex) { + return; + } + if (!sJ.rule.test(sI.string)) { + if (sI.domainstart) { + switch (sJ.string[0]) { + case ".": { + if (sI.domainstart.hasOwnProperty("dot") && sJ.rule.test(sI.domainstart.dot)) { + alsotest = "dot"; + } + break; + } + case "/": case "^": case ":": { + if (sI.domainstart.hasOwnProperty("slash") && ((sJ.rule.test(":" + sI.domainstart.slash) && sJ.rule.test(":///" + sI.domainstart.slash)) + || (data.modifiers.loosely && sJ.rule.test(":/" + sI.domainstart.slash)))) { + alsotest = "slash"; + } + } + } + if (alsotest) { + if (!testProperties(sJ, sI)) { + return; + } + if (!matchDomains(sI, sJ, true)) { + return; + } + delete sI.domainstart[alsotest]; + if (data.modifiers.loosely) { + matchDomains(sI, sJ); + } else if (sI.domainstart.hasOwnProperty("other")) { + warn(14, sI.filter, [sJ.filter, sI.domainstart.other].sort()); + sI.domainstart = false; + } else { + sI.domainstart.other = sJ.filter; + } + } + } + return; + } + if (!testProperties(sJ, sI)) { + return; + } + if (sJ.isRegex) { + // Regex can check for literal ||, |, ^ or * + if (sI.string.substring(0, 2) === "||") { + alsotest = ["|http:/", "|x-yz:///", ".", "|q://r.s."]; + for (i=0; i el.index) { + continue; // higher index (lower priority) can never make higher priority redundant + } + if (warningContainsRedundantRules(warnings[j])) { + continue; // other rule will be discarded + } + if (warnings[j].rules.length >= el.rules.length) { + allPresent = true; + for (k=0; k span { + border: 1px solid #777; + display: inline-block; + padding: 3px 10px; + margin: 0px -1px -1px 0px; + font-size: medium; +} +#tab_titles .activeTab { + background-color: #ccc; + cursor: default; +} +#tab_titles > span:not(.activeTab):hover { + background-color: #ccc; + cursor: pointer; +} +#tab_contents { + border: 1px solid #777; + padding: 20px; + font-size: 13px; + min-height: 80px; + white-space: nowrap; +} +#tab_contents > div { + display: none; +} +#tab_contents > .activeTab { + display: block; +} +#tab_contents p { + font-weight: bold; + font-style: italic; +} +#tab_contents pre { + margin-left: 20px; +} +#helplink { + font-size: small; + position: absolute; + right: 10px; + top: 10px; +} +#filters { + width: 100%; + min-width: 640px; + box-sizing: border-box; + display: block; + margin-bottom: 4px; +} +#percent { + margin-left: 30px; + display: inline-block; + width: 200px; + vertical-align: middle; +} +#progressindicator { + display: inline-block; + width: 200px; + font-size: 10px; + text-align: center; + margin-left: -200px; + cursor: default; +} +#toolsdescription { + font-style: normal !important; + font-weight: normal !important; + margin: 1px; + min-height: 48px; + max-width: 100%; +} +#tab_Tools * { + white-space: normal !important; +} +#tab_Tools > input { + min-width: 432px; + text-align: left; + vertical-align: middle; + height: 26px; + background-color: #FFF; + border: 1px solid #777; + padding: 3px 10px; + margin: 0 0 -1px 0; +} +#tab_Tools > input:first-of-type { + border-top-left-radius: 8px; + border-top-right-radius: 8px; +} +#tab_Tools > input:last-of-type { + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; +} +#tab_Tools > input:hover { + background-color: #CCC; + border-width: 2px; + padding: 1px 9px; +} +#domainCheckProgress { + margin: 0px 2px 0px 10px; + width: 150px; +} +.minorwarning, .toolsTab, .passedDomainCheck, .pendingDomainCheck, .cancelledDomainCheck { + color: gray; +} +.majorwarning { + color: red; +} +.failedDomainCheck { + color: red; + font-weight: bold; +} +.priority6 { + color: #A0A0A0; +} +.priority7 { + color: #787878; +} +.priority8 { + color: #505050; +} +.priority9 { + color: #282828; +} +.priority10 { + color: #000000; +} +.toolsResults strong { + cursor: pointer; + display: block; + width: 75%; + font-family: monospace; +} +.toolsResults em { + cursor: pointer; + font-family: monospace; + font-size: 12px; +} +.toolsResults .filterCell { + font-family: monospace; + white-space: pre; +} +.toolsResults td[data-indent] { + padding-left: 51px; +} +.toolsResults td[data-indent]::before { + content: "▸"; +} +.toolsResults td[data-indent="1"] { + padding-left: 5px; +} +.toolsResults td[data-indent="2"] { + padding-left: 15px; +} +.toolsResults td[data-indent="3"] { + padding-left: 25px; +} +.toolsResults td[data-indent="4"] { + padding-left: 35px; +} +.toolsResults tr:not([data-parent]) { + border-top: 1px solid gray; +} +.toolsResults tbody > .emptynotifier:not(:only-child) { + display: none; +} +.toolsResults pre { + margin-top: 2px; +} +.workerUnsupported { + position: fixed; + top: 0px; + left: 0px; + width: 100%; + background-color: yellow; + border-bottom: 1px solid black; + font-size: 15px; + font-weight: bold; + color: #DD0000; + text-align: center; + z-index: 100000; + white-space: normal; +} +#information { + padding: 12px; + min-width: 500px; + min-height: 250px; + overflow-y: auto; + border: 1px solid black; + border-radius: 8px; + opacity: 0.9; + background: white; + z-index: 1000; + position: absolute; + left: 20%; + top: 20%; + right: 20%; + bottom: 20%; + box-shadow: 1px 1px black; +} +#information ul > li { + margin-bottom: 3px; + font-size: 14px; +} +#topmsg { + margin-top: 0px; + font-size: 14px; +} +.hidden { + display: none !important; +} + +/* changelog & limitations */ +h4 { + color: #777; + margin: 24px 0px 0px 0px; +} +#changelog ul, #limitations ul { + margin-top: 2px; + font-size: 14px; +} + +/* changelog */ +#changelog li > b { + margin-right: 4px; +} + +/* limitations */ +#limitations div > ul > li { + margin-top: 6px; +} +#limitations div { + font-size: 14px; +} +abbr { + cursor: help; + border-bottom: 1px dotted #777; +} \ No newline at end of file diff --git a/famlam-redundancychecker/redundantRuleChecker.html b/famlam-redundancychecker/redundantRuleChecker.html new file mode 100644 index 000000000..f024a87e1 --- /dev/null +++ b/famlam-redundancychecker/redundantRuleChecker.html @@ -0,0 +1,41 @@ + + + + + + + Redundancy check + + + + + + +

Redundancy check for Adblock Plus rules

+

This script checks if there are any redundant rules in your Adblock Plus filter list. A rule is redundant if the content it blocks, hides or excludes is also blocked, hidden or excluded by another rule.
For example, ||somesite.com/ads/ has been made redundant by /ads/*. All calculations are performed on your computer, no data is send to the server.

+ + + + + + + + \ No newline at end of file diff --git a/famlam-redundancychecker/redundantRuleChecker.js b/famlam-redundancychecker/redundantRuleChecker.js new file mode 100644 index 000000000..4d3b73b44 --- /dev/null +++ b/famlam-redundancychecker/redundantRuleChecker.js @@ -0,0 +1,797 @@ +"use strict"; +var toolsFile; +var createText = function(text, appendTo) { + var el = document.createTextNode(text.replace(/\ {2,}|\ $|^\ /g, function(m) { + return new Array(m.length + 1).join("\u00A0"); + })); + if (appendTo) { + appendTo.appendChild(el); + } + return el; +}; + +var createTag = function(tagname, attributes, properties, appendTo) { + var i, el = document.createElement(tagname); + if (attributes) { + for (i in attributes) { + el.setAttribute(i, attributes[i]); + } + } + if (properties) { + for (i in properties) { + if (i === "textContent") { + createText(properties[i], el); + } else { + el[i] = properties[i]; + } + } + } + if (appendTo) { + appendTo.appendChild(el); + } + return el; +}; + +var switchTab = function(e) { + var i, currentActive = document.querySelectorAll(".activeTab"); + for (i=0; i index) { + tabtitlebar.insertBefore(title, tabtitlebar.children[index]); + } else { + tabtitlebar.appendChild(title); + } + content.id = "tab_" + id; + document.getElementById("tab_contents").appendChild(content); +}; + +var removeTabs = function(id) { + var i, tabIds = id ? [document.getElementById("tabtitle_" + id)] : document.querySelectorAll("[id^='tabtitle_']"); + for (i=0; i results[b].priority ? -1 : 1; + } + return a > b ? -1 : 1; + }); + for (i=0; i b ? 1 : -1; + } + return results[a].length > results[b].length ? -1 : 1; + }); + for (i=0; i -1; +}; +var chromeListener = function(msg) { + var el, i, tr = document.querySelector("tr.pendingDomainCheck[data-domain='" + msg.domain + "']"), top; + if (msg.installed) { + el = document.querySelector(".extensionMissing"); + if (msg.incognito) { + el.parentElement.removeChild(el); + } else { + el.textContent = "You need to provide the extension access to incognito pages for it to function correctly. The extension uses incognito pages to determine whether an URL is live, so that no unwanted websites will end up in your search history or leave cookies behind. Furthermore, this way it can fully disable plugins on the websites it opens to prevent security issues, without comprimising your normal browsing on regular tabs. Please visit about://extensions and check the box to allow the extension access to " + (isOpera() ? "private" : "incognito") + " mode. "; + var a = createTag("a", {href: "#", title: "Retry!"}, {textContent: "Retry!"}, el); + a.addEventListener("click", function(e) { + e.preventDefault(); + chromeConnect(chromeConnect.maxIndent, true); + }, false); + } + } else if (msg.cancelled) { + tr = document.querySelectorAll("tr.pendingDomainCheck"); + for (i=0; i 0) { + els = document.querySelectorAll("tr.pendingDomainCheck > td[data-indent='" + maxIndent + "']"); + } else if (maxIndent === 0) { + els = document.querySelectorAll("tr.pendingDomainCheck > td:first-child"); + } else { + document.getElementById("domainCheckProgress").classList.add("hidden"); + return; + } + for (j=0; j 0) { + tline = createTag("tr", {"data-domain": subdomains[0], "data-parent": results[subdomains[0]].parentDomain, "class": "pendingDomainCheck"}, {}); + var parentRow = ttype.querySelector("tr[data-domain='" + results[subdomains[0]].parentDomain + "']"); + parentRow.parentNode.insertBefore(tline, parentRow.nextSibling); + subdomains = subdomains.concat(results[subdomains[0]].subdomains.reverse()); + createTag("td", {"data-indent": Number(parentRow.firstChild.dataset.indent || 0) + 1}, {textContent: subdomains[0]}, tline); + maxIndent = Math.max(Number(parentRow.firstChild.dataset.indent || 0) + 1, maxIndent); + createTag("td", {}, {textContent: "pending..."}, tline); + createTag("td", {"class": "filterCell"}, {textContent: results[subdomains[0]].filters.join("\n")}, tline); + subdomains.shift(); + } + + var trs = ttype.querySelectorAll("tr"), topDomain; + for (i=0; i " + errors[i]; + } + output += "\n\n\n! Involved filters:\n\n" + filters.sort().filter(function(elem, i, arr) {return elem !== arr[i+1]}).join("\n"); + } else { + output = document.querySelector("#tab_Domaincheck .toolsResults .emptynotifier").textContent; + } + window.open("data:text/plain;charset=utf-8," + encodeURIComponent("! Redundancy check domain check results:\n" + output).replace(/\'/g, "%27")); + }, false); + }); +}; + + +var startToolWhitelists = function() { + if (document.getElementById("tab_WhitelistsPerRule")) { + switchTab("WhitelistsPerRule"); + return; + } + startWorker("findWhitelistRules.js", {filters: toolsFile}, function(e) { + var i, results = e.resultByFilter; + var tabTitle = createTag("span", {"class": "toolsTab"}, {textContent: "whitelists per rule"}); + var tabContent = createTag("div"); + createTag("p", {}, {textContent: "The following rules have one or more matching whitelists"}, tabContent); + createTag("em", {}, {textContent: "Please note: this is only an indication! If the rule isn't litterally included in the whitelist, it won't be found!"}, tabContent); + createTag("br", {}, {}, tabContent); + var div = createTag("div", {"class": "toolsResults"}, {}, tabContent); + var b, j, pre; + var clickhandler = function() { + this.nextElementSibling.classList.toggle("hidden"); + }; + var keys = Object.keys(results); + keys.sort(function(a, b) { + if (results[a].length === results[b].length) { + return a > b ? 1 : -1; + } + return results[a].length > results[b].length ? -1 : 1; + }); + for (i=0; i b ? 1 : -1; + } + return results[a].length > results[b].length ? -1 : 1; + }); + for (i=0; i 1) { + p = createTag("p", {}, {}, tabContent); + createText("The following " + warnings.length + " ", p); + createTag("span", {"class": "majorwarning"}, {"textContent": "errors"}, p); + createText(", warnings or ", p); + createTag("span", {"class": "minorwarning"}, {"textContent": "optimalizations"}, p); + createText(" were encountered while checking the rules:", p); + } else if (warnings.length === 1) { + p = createTag("p", {}, {}, tabContent); + createText("The following ", p); + createTag("span", {"class": "majorwarning"}, {"textContent": "error"}, p); + createText(", warning or ", p); + createTag("span", {"class": "minorwarning"}, {"textContent": "optimalization"}, p); + createText(" was encountered while checking the rules:", p); + } else { + createTag("p", {}, {textContent: "No errors or warnings were encountered while checking the rules"}, tabContent); + } + major = createTag("span", {"class": "majorwarning"}, {}, tabContent); + minor = createTag("span", {"class": "minorwarning"}, {}); + for (i=0; i\+\~\,]\s*|./gi, + WHITESPACE_G = /\s+/g, /**/ + B_REGEX = /^\/.+\/$/, /**/ + B_BLOCKINGKEYS = /^\|\||\%[0-9a-f]{2}|[a-z]+|[0-9]+|[^\*\^]|\^\*/g, + + cat_elemhide = {}, + cat_block = {}, + + currentChecks = 0, + maxChecks = 0, + nextReport = 0, + reportProgress = function(n) { + currentChecks += n; + nextReport -= n; + if (nextReport < 1) { + nextReport = maxChecks; + self.postMessage({progress: Math.round(currentChecks / maxChecks) / 2}); + } + }; + + var isEmptyObject = function(obj) { + var i; + for (i in obj) { + return false; + } + return true; + }; + + var get_keys_block = function(line) { + var newLine, i, j, + match = line.replace(WHITESPACE_G, "").match(BLOCKING), + keys = [], + singlekeys = []; + if (B_REGEX.test(match[2])) { + match[2] = match[2].substring(1, match[2].length - 1); + } else { + match[2] = match[2] + .replace(MANYSTARS_G, "*") + .replace(B_USELESSFILTEREND, "*") + .replace(B_USELESSFILTERSTART, "*"); + match[2] = match[2] + .replace(B_STARTWILDCARDPIPE_G, "**|") + .replace(B_ENDWILDCARDPIPE_G, "|**") + .replace(B_USELESSSTAR_G, ""); + } + newLine = (match[1] || "") + (match[2] || "") + (match[3] ? "$" : ""); + if (match[1]) { + keys.push("@@"); + } + if (match[2]) { + singlekeys = match[2].toLowerCase().match(B_BLOCKINGKEYS); + for (i=0; ii; j--) { + keys.push(singlekeys.slice(i, j).join("")); + } + } + } + if (match[3]) { + keys.push("$"); + singlekeys = match[3].substring(1).split(","); + for (i=0; i b ? 1 : -1; + } + return b.length-a.length < 0 ? -1 : 1; + }); + }; + var get_keys_hide = function(line) { + var singlekeys, i, j, + match = line.match(ELEMHIDE), + keys = []; + match[1] = match[1].replace(WHITESPACE_G, "").toLowerCase(); + match[2] = match[2] ? "#@#" : "##"; + if (match[1]) { + keys.push(match[1]); + } + keys.push(match[2]); + singlekeys = match[3].trim().match(H_HIDINGKEYGROUPS); + + for (i=0; ii; j--) { + keys.push(singlekeys.slice(i, j).join("")); + } + } + return keys.sort(function(a, b) { + if (a.length === b.length) { + return a > b ? 1 : -1; + } + return b.length-a.length < 0 ? -1 : 1; + }); + }; + + var tresholdcache = [9, 9, 9, 9, 9, 4, 5, 5, 6, 6]; + var get_treshold = function(length) { + if (tresholdcache.length > length) { + return tresholdcache[length]; + } + var i, sqrt; + for (i=tresholdcache.length; i 0 && rule[i] === rule[i-1]) { + equal += prevScore; // prevScore <= 0 + continue; + } + prevScore = 0; + if (!similarRule.contains(rule[i])) { + equal -= 1; + prevScore = -1; + if (equal < treshold) { + return 0; + } + } + } + equal = equal/rule.length; + return equal >= 0.6 ? equal : 0; + }; + + for (i=0; i + + + +Ohai! + + +

Modify me.

+ + diff --git a/fanboy-cookiemonster.txt.temp b/fanboy-cookiemonster.txt.temp new file mode 100644 index 000000000..d1cfb60b5 --- /dev/null +++ b/fanboy-cookiemonster.txt.temp @@ -0,0 +1,366 @@ +[Adblock Plus 2.0] +! Checksum: FwWMlzXT/+2xtFsHlHAmXw +! Title: Fanboy's Cookiemonster List +! Updated: 3 Mar 2018 +! This list expires after 4 days +! License: http://creativecommons.org/licenses/by/3.0/ +! Homepage: http://www.fanboy.co.nz/ +! Reporting Issues: https://github.com/ryanbr/fanboy-adblock/issues +! +! Legal stuff. (T&C's) +! In no event shall Fanboy List, or the list author be liable for any indirect, direct, punitive, special, incidental, or consequential damages whatsoever. +! By downloading or viewing, or using this list, you are accepting these terms and the license. +! +! +! Cookie Messages +-agree-cookies/ +-cookie-banner- +-cookie-cnil. +-cookie-consent. +-cookie-filter/$script +-cookie-law-popup. +-cookie-law.$script +-cookie-law/$script +-cookie-message.js +-cookie-msg-bar. +-cookie-notice. +-cookie-policy. +-cookie-popup/ +-cookieconsent- +-CookieInfo. +-cookiePolicy. +-cookies-bar/ +-cookies-notice/ +-cookies-policy. +-eu-cookies/$script +-eucookie. +-privacy-cookie- +.consent-cookie. +.cookie-law.$script +.cookie-policy. +.cookie_law. +.cookieconsent. +.cookiecuttr. +.cookieinfo2. +.cookielaw.js +.cookienotice. +.cookiepolicy. +.cookiesdirective_ +.cookiesmessage. +.cookiesPolicy. +.divascookies- +.EuCookieCompliance. +.fscookieconsent. +/__cookie_js.php +/ac_cookiesvalidation/* +/accept-cookie. +/accept-cookies. +/acceptCookies. +/alertcookie. +/alertcookies. +/amCookieApproval. +/angular-cookies- +/asesor-cookies-$~image +/avisCookies. +/aws-cookie/* +/bandeaucookie. +/bauer.cookies. +/bCookiesMessage. +/bgon-cookies- +/cdcookie/* +/checkCookie? +/cipr-cookie-opt-out/* +/cnil-cookies_ +/cnil.js +/coCookiesDisclaimer. +/cookie-accept.js +/cookie-alert. +/cookie-bandeau. +/cookie-banner +/cookie-bar- +/cookie-bar. +/cookie-check.js +/cookie-compliance. +/cookie-consent. +/cookie-consent/* +/cookie-control. +/cookie-disclaimer. +/cookie-disclaimer/* +/cookie-eu/* +/cookie-footer- +/cookie-info. +/cookie-law-$~script +/cookie-law.js +/cookie-manager.min.js +/cookie-master.js +/cookie-message. +/cookie-notice- +/cookie-notice. +/cookie-notice/*$~stylesheet +/cookie-notif. +/cookie-notification +/cookie-policy- +/cookie-policy.js +/cookie-policy.min. +/cookie-policy/* +/Cookie-popup- +/cookie-popup. +/cookie-prompt. +/cookie-reglement. +/cookie-richtlinie. +/cookie-terms. +/cookie-warning. +/cookie.policy. +/cookie.response. +/cookie/hi- +/cookie/policy- +/cookie/require- +/cookie/support- +/cookie_acceptance_ +/cookie_alert*.js +/cookie_banner- +/cookie_banner. +/cookie_bar. +/cookie_consent. +/cookie_consent/* +/cookie_consent_ +/cookie_hint. +/cookie_info.css +/cookie_info.js +/cookie_information_$script +/cookie_law.js +/cookie_law/* +/cookie_legal_$script +/cookie_msg.js +/cookie_notice. +/cookie_notification- +/cookie_notifier/* +/cookie_policy. +/cookie_policy_ +/cookie_solution/* +/cookie_sticky_ +/cookie_ws. +/cookie_ws/* +/CookieAccept/* +/cookieacceptance. +/cookiealert. +/CookieAlertBootStrapper. +/cookiebadge. +/cookiebadge_ +/cookiebanner. +/cookieBanner/* +/cookiebar- +/cookiebar. +/CookieBar/* +/cookiebox. +/cookiec.json +/cookiechecker/* +/cookiechoice.js +/cookiechoices- +/cookiechoices. +/cookieCompliance.js +/cookiecompliance/*$script +/cookiecompliancy. +/cookieConsent- +/cookieconsent. +/cookieconsent/* +/cookieconsent_ +/cookiecontrol- +/cookiecontrol.js +/cookiecontroller.js +/cookiecu. +/cookiecutter.js +/cookied.js +/cookiedirective*.js +/cookiedisclaimer. +/CookieDisclaimerUI. +/cookiedisclosure. +/cookieGatekeeper.$~script +/cookiehint. +/CookieInfo. +/cookieInformerBooklet_ +/cookiejar/* +/cookielaw.$~stylesheet +/cookielawinfo.$~script +/cookielex/* +/cookiemanagement.js +/cookieMention. +/cookiemessage. +/cookiemessage_ +/cookieMetie. +/cookiemonster.mg +/cookieMonster.min.js +/cookiemsg. +/cookienotice. +/cookienotice/*$script +/cookienotif. +/cookieNotification. +/CookieNotification/* +/cookieok.js +/cookiepolicy. +/cookiepolicy/* +/cookiepolicy_ +/CookiePolicyAlert_ +/cookiepolicybanner. +/cookiepolicydisclaimer. +/cookiePolicyEN. +/cookiePolicyEUPopin_ +/cookiepopup? +/CookiePrompter- +/CookieReportsDisclaimer. +/cookies-banner +/cookies-compliant. +/cookies-directive. +/cookies-disclaimer. +/cookies-enabler. +/cookies-footer- +/cookies-info.$~xmlhttprequest +/cookies-legal- +/cookies-monster.js +/cookies-monster/*$script +/cookies-notice. +/cookies-notice/* +/cookies-notification. +/cookies-overlay. +/cookies-policy- +/cookies-policy.js +/cookies-policy/* +/cookies/popup. +/cookies_acceptance. +/cookies_auto- +/cookies_bar.js +/cookies_directive. +/cookies_komunikat. +/cookies_loading.php? +/cookies_policy.js +/Cookies_Pro/* +/CookiesAgreement/* +/cookiesbanner/* +/cookiesConsent. +/cookiescontrol- +/cookiesdisclaimer. +/cookieser. +/CookieSettingsManager? +/cookieslegal. +/cookiesLegales. +/cookiespolicy. +/cookiesPopup. +/cookiesWidget/* +/cookiewarning*.js +/cookiewarning. +/cookiewarning? +/cookiewet. +/divascookies_ +/dotbandeaucookie/* +/ecookie_check/* +/ee-cookies-min. +/emea-cookie- +/eprivacy-cookie. +/eu-cookie- +/eu-cookie. +/eu-cookie/* +/EU-cookielaw. +/eu-notice.js +/eu_cookie_$script,stylesheet +/eu_cookies. +/eu_privacy.js +/eu_rp_cookie. +/euc_cookie.js +/eucookie. +/eucookiecompliance. +/eucookiecompliance/* +/EUCookieDirective. +/eucookielaw. +/eucookienotice. +/eucookienotice_ +/eucookies. +/eucookiesk. +/eucookieslaw/*$script +/EUCookieUtility. +/eurocookie. +/fp_cookie. +/g4cookies. +/GestionCookiesCNILPlugin/* +/header.cookies. +/hi-cookie- +/icit-cookie-law/* +/ico_cookies. +/icocookies. +/implied-consent. +/implied-consent/* +/impresacookiepolicy/* +/InfoCookies. +/intser_cookies.js +/iubenda_cs. +/jbcookies. +/jjp_eucookie_ +/jquery.cookie.js$domain=password-decryptor.com +/jqueryCookieGuard. +/js-cookie-master/*$script +/js/cookiePolicy? +/layer-cookienotice. +/legal/cookies/? +/legalcookie. +/lma-cookie. +/mod_cookiesaccept/* +/mod_jbcookies/* +/mweb.cookie/*$script +/newprivacypolicy. +/ocgcookie? +/oupcookiepolicy_ +/plugin_cookie/* +/plugins/cookie-muncher/* +/plugins/CookieInfo/* +/plugins/EuCookie/* +/privacy-cookies.js +/privacycookie/* +/rbicookiepolicy. +/rtiCookieLaw. +/script_cookies.js +/scripts/cookie- +/SetConsentCookie. +/SetCookieBanner. +/sni_cookie_privacy/* +/tm.cookie.js +/toucanCookie. +/trackingProtection/* +/ttgcookieconsent- +/TWCCookies/* +/twitter_cookies. +/type-cookies. +/ubmcookieconsent- +/usecookies.js +/usocookies. +/w034CookieDirective.js +/warnCookies. +/widgets/cookies- +/wkp_cookies.js +/wp-cookie-allow/*$script,stylesheet +/wpmaster-cookie/* +_alert_cookie/ +_cookie_bar/ +_cookie_cnil. +_cookie_compliance. +_cookie_consent/ +_Cookie_Directive- +_cookie_law.js +_cookie_notice- +_cookie_notice. +_cookie_policy. +_cookie_policy_ +_cookiebar_ +_cookieCgu. +_cookielaw_mip. +_cookieMsgBox/ +_cookieNotice. +_CookiePolicy. +_cookies_disclosure/ +_cookiesbar. +_cookieschecker. +_cookiewarn. +_eu_cookie_ +_eucookie_compliance_ +_europecookielaw. +_js__cookie_functions. +_site_cookie_ +! Cookie,privacy,legal Messages