diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fc700cb --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +* text=auto eol=lf +*.png binary +*.gif binary +# Upstream snapshots are kept byte-exact so their recorded sha256 stays valid. +filters/upstream/*.txt -text linguist-vendored diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 30ee526..e87195c 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,52 +1,44 @@ -# SilentBlock — AI Coding Instructions - -## Project Overview -SilentBlock is a free, cross-browser (Chrome, Edge, Firefox, Opera) ad-blocking extension built on Manifest V3. - -## Architecture -- **Manifest V3** with `declarativeNetRequest` for efficient network-level blocking -- **Cosmetic CSS filtering** to hide ad containers the network layer can't catch -- **Content script** with MutationObserver for dynamic ad removal, popup blocking, and anti-adblock countermeasures -- **Background service worker** handling global/per-site toggle state -- **Cross-browser API alias**: `const api = typeof browser !== 'undefined' ? browser : chrome;` — always use `api.*`, never `chrome.*` directly - -## Key Files -| File | Purpose | -|---|---| -| `manifest.json` | Extension manifest — permissions, content scripts, declarativeNetRequest rules | -| `background.js` | Service worker — toggle logic, badge updates, dynamic rule management | -| `rules/rules.json` | Static blocking rules (domain-based and URL-pattern-based) | -| `content/cosmetic.css` | CSS selectors that hide known ad elements | -| `content/content.js` | Dynamic ad hiding, popup blocker, anti-adblock bait | -| `popup/popup.html` | Extension popup UI | -| `popup/popup.css` | Popup styles (dark theme) | -| `popup/popup.js` | Popup logic — reads/writes toggle state via messages to background.js | - -## Conventions -- All JS files use `'use strict'` at the top -- Use `api.*` instead of `chrome.*` or `browser.*` for cross-browser compatibility -- Rule IDs in `rules.json` must be unique integers starting from 1 -- CSS selectors in `cosmetic.css` use `!important` to override inline styles -- Version is tracked in `manifest.json` → `"version"` field — use the bump script to increment - -## Version Bumping -Run `version-bump.ps1` with `-Part patch|minor|major` to bump the version in `manifest.json`. -The script updates the version, commits, and creates a git tag. - -## Adding Blocking Rules -1. Add new entries to `rules/rules.json` with a unique `id` (increment from last) -2. Use `requestDomains` for domain-based blocking, `urlFilter` for URL patterns -3. Always specify `resourceTypes` array -4. After editing, reload the extension in the browser - -## Browser Support -- Chrome 88+ (MV3 base support) -- Edge 88+ (Chromium-based, same as Chrome) -- Firefox 128+ (MV3 + declarativeNetRequest) -- Opera 74+ (Chromium-based) - -## Do NOT -- Add subscription/payment/nag features — this is free forever -- Add telemetry, analytics, or any data collection -- Add remote rule fetching — all rules are local -- Use `chrome.*` directly — always use the `api` alias +# SilentBlock: notes for AI coding assistants + +SilentBlock is a Chrome MV3 ad blocker. Filter lists are compiled at build time into +declarativeNetRequest rulesets, cosmetic data files and MAIN-world scriptlet buckets. +Read README.md first; this file is the short list of things that bite. + +## Rules +- Never fetch filters or code at runtime. Lists are committed snapshots in `filters/upstream/`. +- No telemetry, analytics or remote calls of any kind. Keep it free, with no nags or upsells. +- On ordinary sites SilentBlock must not patch page APIs. Anything that runs in the page's + MAIN world goes through a scriptlet that a filter targets at specific hosts. +- Hide, never remove, page elements in anything heuristic (`src/shared/unwall-core.js`). +- Use `chrome.*` promise APIs (Firefox supports them too). No `browser` alias, no callbacks. +- Build output lives in `dist/`. Never edit it by hand, and never commit it. + +## Traps +- A single `regexFilter` Chrome rejects stops the ENTIRE extension loading, and + `--load-extension` fails silently. Run the full build (it validates regexes with + `declarativeNetRequest.isRegexSupported`) and `node scripts/verify-load.mjs`, which + prints Chrome's real error. +- One invalid selector voids a whole grouped CSS rule; the build validates selectors in Chromium. +- `||host^` means "host and subdomains" (becomes `requestDomains`); `||host` without `^` + does not, and must stay a `urlFilter`. +- Entity domains (`example.*`) cannot be expressed; filters using only entities are + dropped, never widened to generic. +- Priorities: block 10, redirect 11, list exception 20, `$important` 30, user pause 1000, + security block 2000 (beats a pause), security "continue anyway" session rule 3000. +- The service worker can die at any time. State lives in `chrome.storage`; `apply.js` + must stay idempotent. All listeners are registered synchronously at top level. +- Settings changes must come from extension pages (`sender.url` is ours). Content scripts + may only send `tokens` and `wall`, neither of which changes settings. +- Chrome writes `_metadata/` into a loaded unpacked folder; `package.mjs` skips `_` paths. +- Anything that must happen before a tab-under's redirect (popup opener registration, the + last committed URL) is done synchronously at the top of the listener, before any await. +- Security page URLs (~36k) live in `security/urls.json` and are checked by the worker; + as DNR rules they would blow the 30k guarantee. +- Icons are generated: edit `scripts/icons.mjs` and run it, never hand-edit the PNGs. + +## Tests +- `npm test` for the compiler and settings; `npm run test:e2e` for the real build in Chromium. +- `filters/silentblock-selftest.txt` targets reserved `.test` hosts and drives the e2e tests. +- Headless Chromium maps every host to the local fixture server + (`--host-resolver-rules`). Use `.test` hosts in fixtures; real Google hosts are + HSTS-preloaded and will not load over http. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..5550426 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,37 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + - run: npm ci + - run: npx playwright install --with-deps chromium + - name: Build (validates selectors and regexes in Chromium) + run: npm run build + - run: npm test + - name: Chrome accepts the build + run: node scripts/verify-load.mjs chrome + - run: npm run test:e2e + - run: npm run package + - uses: actions/upload-artifact@v4 + with: + name: silentblock-${{ github.sha }} + path: | + release/*.zip + dist/build-report.json + - uses: actions/upload-artifact@v4 + if: failure() + with: + name: playwright-traces + path: test-results/ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..36ca22f --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,42 @@ +name: Release + +on: + push: + tags: ['v*'] + +permissions: + contents: write + +jobs: + release: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + - run: npm ci + - run: npx playwright install --with-deps chromium + - name: Tag matches package.json + run: test "v$(node -p 'require("./package.json").version')" = "$GITHUB_REF_NAME" + - run: npm run build + - run: npm test + - run: node scripts/verify-load.mjs chrome + - run: npm run test:e2e + - run: npm run package + - name: Release notes from CHANGELOG + run: | + node -e ' + const v = process.env.GITHUB_REF_NAME.slice(1); + const cl = require("fs").readFileSync("CHANGELOG.md", "utf8"); + const start = cl.indexOf(`## [${v}]`); + if (start === -1) { console.error(`No CHANGELOG entry for ${v}`); process.exit(1); } + const next = cl.indexOf("\n## [", start + 1); + require("fs").writeFileSync("notes.md", cl.slice(cl.indexOf("\n", start) + 1, next === -1 ? undefined : next).trim() + "\n"); + ' + - name: Publish + env: + GH_TOKEN: ${{ github.token }} + run: gh release create "$GITHUB_REF_NAME" release/*.zip --title "SilentBlock ${GITHUB_REF_NAME#v}" --notes-file notes.md diff --git a/.github/workflows/update-lists.yml b/.github/workflows/update-lists.yml new file mode 100644 index 0000000..d43c035 --- /dev/null +++ b/.github/workflows/update-lists.yml @@ -0,0 +1,48 @@ +name: Update filter lists + +# Weekly refresh of filters/upstream/. Opens a PR only if the build and every test pass +# with the new lists, so a bad upstream change never lands silently. +on: + schedule: + - cron: '0 20 * * 0' # Sunday 20:00 UTC = Monday morning in Sydney + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + update: + runs-on: ubuntu-latest + timeout-minutes: 25 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + - run: npm ci + - run: npx playwright install --with-deps chromium + - run: npm run lists:update + - name: Anything changed? + id: diff + run: | + if git diff --quiet -- filters/upstream; then echo "changed=false" >> "$GITHUB_OUTPUT"; else echo "changed=true" >> "$GITHUB_OUTPUT"; fi + - if: steps.diff.outputs.changed == 'true' + run: npm run build + - if: steps.diff.outputs.changed == 'true' + run: npm test && node scripts/verify-load.mjs chrome && npm run test:e2e + - if: steps.diff.outputs.changed == 'true' + name: Open PR + env: + GH_TOKEN: ${{ github.token }} + run: | + branch="lists/$(date -u +%Y-%m-%d)" + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git checkout -b "$branch" + git add filters/upstream + git commit -m "Update filter lists $(date -u +%Y-%m-%d)" + git push -u origin "$branch" + node -e 'const r=require("./dist/build-report.json").meta.rulesets; console.log("| ruleset | rules | regex | domains |\n|---|---|---|---|\n"+Object.entries(r).map(([k,v])=>`| ${k} | ${v.rules} | ${v.regex} | ${v.domains} |`).join("\n"))' > body.md + gh pr create --title "Update filter lists $(date -u +%Y-%m-%d)" --body-file body.md diff --git a/.gitignore b/.gitignore index a69a884..a692221 100644 --- a/.gitignore +++ b/.gitignore @@ -8,11 +8,18 @@ Desktop.ini !.vscode/settings.json *.code-workspace -# Build / packaging +# Dependencies +node_modules/ + +# Build output +dist/ +release/ +test-results/ +playwright-report/ *.zip *.xpi *.crx -archive/ +*.pem # Chrome extension metadata (generated when loaded unpacked) _metadata/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..cf741f9 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,76 @@ +# Changelog + +## [Unreleased] + +## [2.0.0] - 2026-09-28 + +A rebuild. The 1.x engine (a hand-written list of ~226 domains plus global page patches) +is replaced by the real filter lists compiled into Chrome's native blocker. + +### Added +- EasyList, EasyPrivacy, uBlock filters (main, quick fixes, unbreak, privacy, cookie + notices) and EasyList Cookie List, compiled at build time to ~20,700 DNR rules. Nothing + is fetched at runtime. +- Generic cosmetic filtering that injects only the selectors matching the page's own class + and id names, plus site-specific hiding and `:style()` rules for ~28,000 hostnames. All as + user-origin CSS that pages cannot see or override. +- 33 uBO-compatible scriptlets running site-specific anti-adblock fixes in the page before + its scripts (~8,200 filters). +- Redirect stubs for GPT, AdSense, analytics.js, ga.js, gtag/GTM, apstag, comScore and + noop files, so pages that wait on ad or analytics callbacks keep working. +- Popup and tab-under blocking from the lists' 3,000 `$popup` filters, which DNR cannot + express: new tabs a page opens are followed for their first hops and closed if they land + on an ad host; a tab sent to an ad right after opening itself in a new tab is sent back + and the copy closed. Tabs opened from webmail and ad consoles are never closed. +- Malware and scam protection (new "Malware & scams" category): uBO Badware, URLhaus, + the Phishing URL Blocklist and DurableNapkin's scam list. ~46,000 hosts are blocked by + DNR above list exceptions and above a paused site; ~36,000 page URLs (too many for DNR) + are checked on each navigation. Listed pages show a warning page with "Back to safety" + and "Continue anyway" (allowed until the browser closes). No API keys, no lookups. +- Toolbar icon shows the page's status: slate blue (nothing to block), green (ads and + trackers blocked), amber (pop-up, tab-under or nag wall dealt with), red (malware or + scam host blocked), grey (paused or off). Counts are live, from read-only request + watching. Can be turned off in settings. +- New icon: the Tidewater shield, with the finger cut through so the toolbar shows through it. +- Popup: per-page blocked-request count, "Kill nag wall", "Always on this site", reload + prompt, clear paused state (including when a parent domain is paused). +- Options page: filter categories, paused and nag-wall site lists, badge count, settings + export and import, list provenance and licences. +- Exceptions so Google Ads, GA4, GTM and Tag Assistant, Meta, LinkedIn and Microsoft + consoles, and tracker vendors' own dashboards work. +- Build validates every selector and regex in real Chromium (one rejected regex stops + Chrome loading the extension at all), and fails past 30,000 static rules. +- Unit tests, and Playwright end-to-end tests against the real build. +- Firefox build (`dist/firefox`), lint-clean but untested. + +### Fixed +- Settings were wiped on every extension update and every Chrome update. Paused sites now + persist, and 1.x settings (`disabledSites`) are migrated. +- Any page could switch SilentBlock off by dispatching the `__sb_disable` event. Paused + sites are now excluded when scripts are registered, so there is no switch to find. +- Per-site pause left the cosmetic CSS running. Pausing now removes every layer. +- The update check never ran (its alarm was recreated, and so reset, on every worker wake). + The checker is gone: the repo is private and updates come through releases. +- The anti-adblock bait was hidden by SilentBlock's own CSS, which advertised the blocker. + Generic bait is gone; detection is handled by site-specific scriptlets. +- Ad counter was overwritten by whichever iframe reported last and counted its own bait. + It now counts network blocks for the current page. +- Facebook sponsored-post hiding re-scanned every span with a layout read on every + mutation, every 2 seconds and every scroll. It now judges each new post once. + +### Changed +- Network rules only apply to third parties unless the list says otherwise, so vendors' + own sites keep working. +- No page API is patched on ordinary sites: `fetch`, XHR, `sendBeacon`, `Image`, + `window.open`, `classList.add` and `style.filter` stay native. 1.x blocked all blur, + forced `overflow:auto` on every page and deleted any overlay mentioning "whitelist". +- Dropped rules that broke real functionality: Chargebee (checkout), Piano, TinyPass, + Pelcro and Poool (subscriber logins), AMP, the IMA SDK, Branch deep links, consent + platforms, and error monitoring. +- Permissions: removed `tabs`, `notifications`, `alarms`, `activeTab` and + `declarativeNetRequestFeedback`; added `scripting`, `webNavigation` and `webRequest` + (read-only, for live counts). +- Repository moved to `ClickClickMedia/SilentBlock`. + +## [1.6.0] - 2026-03-30 +Last release of the 1.x line. See the git history for earlier versions. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..b21d16d --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +@.github/copilot-instructions.md diff --git a/README.md b/README.md index 1d66157..4536fe1 100644 --- a/README.md +++ b/README.md @@ -1,101 +1,153 @@ # SilentBlock -Free, silent ad blocker. No ads, no nags, no subscriptions. **Ever.** +Free, silent ad blocker for Chrome (Manifest V3). No ads, no nags, no subscriptions. -## What it blocks +SilentBlock 2.0 compiles EasyList, EasyPrivacy, the uBlock Origin filter lists and the +EasyList Cookie List into Chrome's native blocking engine at build time. It ships them with +the extension and never downloads rules at runtime. -- **Ad networks** — Google Ads, DoubleClick, AdSense, Amazon Ads, Criteo, Taboola, Outbrain, and 150+ more ad-serving domains -- **Tracking & analytics** — Google Analytics, Hotjar, CrazyEgg, FullStory, ScoreCardResearch, and dozens more -- **Popups & popunders** — Blocks non-user-initiated `window.open()` calls -- **Cookie consent banners** — Hides GDPR/cookie nag overlays -- **Newsletter/signup popups** — OptinMonster, Sumo, Sleeknote, etc. -- **Push notification prompts** — OneSignal, PushCrew, etc. -- **Paywall overlays** — Piano, TinyPass, and similar nag screens -- **Chat widgets** — Intercom, Drift, HubSpot, Tawk (optional — edit the CSS if you want these back) +## What it does -## How it works +| Layer | How | +|---|---| +| **Network blocking** | ~21,700 `declarativeNetRequest` rules (from ~120,000 filters; the ~100,000 plain `\|\|domain^` filters fold into a few dozen rules). Chrome enforces them itself, so no page script runs until it has been checked. | +| **Stand-ins** | Blocked Google Analytics, Tag Manager, gtag, GPT and AdSense scripts are swapped for local stubs, so "track the click, then navigate" links and anti-flicker snippets still work. | +| **Generic hiding** | The page reports its class and id names, and the service worker injects CSS for the ~27,500 generic ad and cookie-banner selectors that match. Nothing is parsed per frame for the rest. | +| **Site-specific hiding** | ~28,000 hostnames with their own hide and restyle rules, injected per frame as it loads. | +| **Anti-adblock** | ~8,200 site-specific scriptlets (uBO semantics: `set-constant`, `abort-on-property-read`, `prevent-setTimeout`, `json-prune` and 30 others), run in the page before its own scripts, only on the sites listed. | +| **Pop-ups and tab-unders** | New tabs a page opens are followed for their first few hops and closed if they land on one of ~3,000 `$popup` hosts. A tab sent to an ad right after the page reopened itself in a new tab is put back. | +| **Malware and scams** | uBO Badware, URLhaus, the Phishing URL Blocklist and DurableNapkin's scam list: ~46,000 hosts blocked outright, plus ~36,000 individual phishing and malware page URLs checked on every navigation. A listed page gets a warning with "Back to safety" and "Continue anyway". This layer stays on for paused sites. No API keys and no lookups: every check is local. | +| **Nag walls** | "Kill nag wall" in the popup removes an anti-adblock overlay on demand, or on every visit with "Always on this site". | + +Every piece of CSS is injected as a *user* stylesheet: pages cannot see it, override it or +block it with CSP. On ordinary sites SilentBlock patches no page APIs at all. + +## Using it -| Layer | Mechanism | +The toolbar icon's colour tells you what happened on the page in front of you: + +| Colour | Meaning | |---|---| -| **Network blocking** | The browser's `declarativeNetRequest` API blocks requests to 150+ known ad/tracking domains before they even load | -| **Cosmetic filtering** | CSS hides common ad containers, banners, overlays, and annoyances | -| **Dynamic filtering** | Content script watches for dynamically inserted ads and hides them in real-time | -| **Anti-adblock** | Plants a bait element so sites think ads loaded successfully | +| Slate blue | Nothing on this page needed blocking (also the brand colour) | +| Green | Protected: ads and trackers blocked | +| Amber | Pushy site: a pop-up, tab-under or nag wall was dealt with | +| Red | A known malware, phishing or scam host was blocked | +| Grey | Paused on this site, or protection is off | + +The popup explains the colour and shows a live count. Settings can keep the icon plain blue. + +- **Protection** turns everything on or off. +- **Block on this site** pauses SilentBlock on the current site and its subdomains. This is + also the fix when a site breaks: paused sites get no rules, no CSS and no scripts. +- **Settings** has the filter categories (ads, trackers, cookie banners), the paused and + nag-wall site lists, the blocked-count badge, and settings export/import. + +Pausing a site also covers tag debugging: pause the client site to let GTM preview and Tag +Assistant load there. The Google Ads, GA4, GTM, Meta, LinkedIn and Microsoft consoles, and +vendor dashboards such as Hotjar and Sentry, are excepted in `filters/silentblock-core.txt` +so they work out of the box. ## Install -### Chrome / Edge / Brave / Opera - -1. Open your browser and go to: - - **Chrome**: `chrome://extensions` - - **Edge**: `edge://extensions` - - **Opera**: `opera://extensions` - - **Brave**: `brave://extensions` -2. Turn on **Developer mode** (toggle in the top-right) -3. Click **Load unpacked** -4. Select the `SilentBlock` folder -5. Done. The green shield icon appears in your toolbar. - -### Firefox - -1. Open Firefox and go to `about:debugging#/runtime/this-firefox` -2. Click **Load Temporary Add-on...** -3. Select the `manifest.json` file inside the `SilentBlock` folder -4. Done. The green shield appears in your toolbar. - -> **Firefox note:** Temporary add-ons are removed when Firefox restarts. For a permanent install, -> package the extension as a `.xpi` file and sign it via [addons.mozilla.org](https://addons.mozilla.org), -> or set `xpinstall.signatures.required` to `false` in `about:config` (Firefox Developer/Nightly only). - -## Usage - -- **Green shield + "ON" badge** = protection active -- Click the icon to open the popup: - - **Protection** toggle — global on/off - - **Block on this site** toggle — whitelist a specific site -- That's it. No settings pages, no accounts, no upsells. - -## Adding more domains - -Edit `rules/rules.json` and add new entries. Each rule follows this format: - -```json -{ - "id": 31, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": ["example-ad-network.com"], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } -} +1. Download `SilentBlock--chrome.zip` from the latest + [release](https://github.com/ClickClickMedia/SilentBlock/releases) and unzip it somewhere + permanent, or build it yourself (below) and use `dist/chrome`. +2. Open `chrome://extensions`, turn on **Developer mode**, click **Load unpacked** and pick + the folder. +3. If you had SilentBlock 1.x loaded from another folder, remove it. Chrome gives each + unpacked folder its own extension id, so the two would both run. Settings do not carry + across folders, so re-add any paused sites. + +Chrome 120 or later. A Firefox build (`dist/firefox`) is produced and passes `web-ext lint`, +but only the Chrome build is tested. + +## Development + +Requires Node 22.2+. The checkout must live on a local disk, not Google Drive (npm writes +zero-byte files there). + +```sh +npm install +npx playwright install chromium # used by the build to validate selectors and regexes +npm run build # -> dist/chrome, dist/firefox, dist/build-report.json +npm test # unit tests (compiler, settings) +npm run test:e2e # Playwright: the real build in headless Chromium +node scripts/verify-load.mjs # load dist/chrome over CDP and report Chrome's own error +npm run check # all of the above +npm run package # -> release/SilentBlock--{chrome,firefox}.zip +``` + +`npm run build:fast` skips the browser validation. Only use it while iterating: Chrome +refuses to load the whole extension if a single regex rule is one it rejects, and the full +build is what catches those. + +### Layout + +``` +filters/ + lists.json list registry: id, category, file, upstream URL, licence + upstream/*.txt committed snapshots of the upstream lists (npm run lists:update) + silentblock-*.txt SilentBlock's own filters (core exceptions, extras, self-test) +scripts/ + build.mjs lists -> DNR rulesets, cosmetic data, scriptlet buckets, manifests + lib/ parser, network/cosmetic/scriptlet compilers, validation +src/ + manifest.json base manifest (version and rulesets are filled in by the build) + background/ service worker: state, apply (reconcile), cosmetic injection + content/ token reporter, Facebook sponsored posts, nag-wall remover + scriptlets/library.js MAIN-world scriptlets, embedded into each bucket by the build + resources/ redirect stubs (GPT, gtag/GTM, analytics.js, noop files) + icons/ toolbar icons per state, rendered by scripts/icons.mjs from assets/icons/ + popup/, options/, warning/, shared/ +test/unit, test/e2e, test/fixtures ``` -After editing, reload the extension: -- **Chrome/Edge/Opera/Brave**: go to `chrome://extensions` and click the refresh icon on SilentBlock -- **Firefox**: go to `about:debugging#/runtime/this-firefox` and click **Reload** +### How settings apply + +`src/background/apply.js` reconciles the browser with the saved settings: which rulesets are +enabled, one dynamic `allowAllRequests` rule for paused sites, and every registered content +script, each with `excludeMatches` built from the paused list. It runs on install, update, +browser start and after each settings change. Settings are never reset on update, and 1.x +settings are migrated. -## File structure +### Updating the filter lists +```sh +npm run lists:update # refresh filters/upstream/*.txt (keeps the old snapshot if a download looks wrong) +npm run check ``` -SilentBlock/ -├── manifest.json # Extension manifest (MV3) -├── background.js # Service worker — toggle logic -├── rules/ -│ └── rules.json # declarativeNetRequest blocking rules -├── content/ -│ ├── cosmetic.css # CSS to hide ad elements -│ └── content.js # Dynamic ad hiding + popup blocker -├── popup/ -│ ├── popup.html # Popup UI -│ ├── popup.css # Popup styles -│ └── popup.js # Popup logic -└── icons/ - ├── icon16.png - ├── icon48.png - └── icon128.png + +Review the build report's rule counts before committing. The build fails if the total goes +past the 30,000 static rules Chrome guarantees every extension. + +### Adding SilentBlock's own filters + +Use ABP/uBO syntax in `filters/silentblock-*.txt`. Network rules should be `$third-party` +unless there's a reason not to be. `filters/silentblock-selftest.txt` only targets the +reserved `.test` TLD and drives the end-to-end tests. Leave it in. + +## Releasing + +```sh +npm run bump -- minor # or patch / major / x.y.z; updates package.json + CHANGELOG +npm run check && npm run package +git add package.json package-lock.json CHANGELOG.md +git commit -m "Release vX.Y.Z" && git tag vX.Y.Z && git push --follow-tags ``` -## License +Pushing the tag runs `.github/workflows/release.yml`, which builds, tests and attaches both +zips to a GitHub release. -Do whatever you want with it. No restrictions. +## Filter lists and licences + +| List | Licence | +|---|---| +| EasyList, EasyPrivacy, EasyList Cookie List | GPL-3.0 or CC BY-SA 3.0 | +| uBlock filters (main, quick fixes, unbreak, privacy, cookie notices, badware) | GPL-3.0 | +| Malicious URL Blocklist (URLhaus data) | CC0 / MIT | +| Phishing URL Blocklist | CC BY-SA 4.0 (sources: OpenPhish, PhishTank, IPThreat) | +| Scam Blocklist by DurableNapkin | MIT | + +The lists are bundled as data in their original terms. Publishing SilentBlock outside CCM +(for example on the public Chrome Web Store) means distributing GPL-3.0 material, so check +the licence position first. diff --git a/assets/icons/caution.svg b/assets/icons/caution.svg new file mode 100644 index 0000000..3ef0938 --- /dev/null +++ b/assets/icons/caution.svg @@ -0,0 +1 @@ +SilentBlock: Pushy site: pop-under, tab-under or nag wall dealt with (amber) diff --git a/assets/icons/danger.svg b/assets/icons/danger.svg new file mode 100644 index 0000000..385a94f --- /dev/null +++ b/assets/icons/danger.svg @@ -0,0 +1 @@ +SilentBlock: Known malware, phishing or scam host (garnet) diff --git a/assets/icons/idle.svg b/assets/icons/idle.svg new file mode 100644 index 0000000..8771bad --- /dev/null +++ b/assets/icons/idle.svg @@ -0,0 +1 @@ +SilentBlock: Idle, or nothing on this page needed blocking (slate blue) diff --git a/assets/icons/paused.svg b/assets/icons/paused.svg new file mode 100644 index 0000000..f3a92c7 --- /dev/null +++ b/assets/icons/paused.svg @@ -0,0 +1 @@ +SilentBlock: Paused on this site, or protection off (grey) diff --git a/assets/icons/protected.svg b/assets/icons/protected.svg new file mode 100644 index 0000000..54b041e --- /dev/null +++ b/assets/icons/protected.svg @@ -0,0 +1 @@ +SilentBlock: Ads or trackers blocked (jade) diff --git a/silentblock.png b/assets/silentblock.png similarity index 100% rename from silentblock.png rename to assets/silentblock.png diff --git a/silentblock_on.png b/assets/silentblock_on.png similarity index 100% rename from silentblock_on.png rename to assets/silentblock_on.png diff --git a/background.js b/background.js deleted file mode 100644 index 2005499..0000000 --- a/background.js +++ /dev/null @@ -1,248 +0,0 @@ -'use strict'; - -// SilentBlock — Background Service Worker -// Cross-browser: Firefox uses `browser`, Chromium uses `chrome` -const api = typeof browser !== 'undefined' ? browser : chrome; - -// ============================================= -// UPDATE CHECKER -// ============================================= -const UPDATE_CHECK_URL = 'https://api.github.com/repos/ccmrik/SilentBlock/releases/latest'; -const UPDATE_CHECK_INTERVAL = 6 * 60 * 60 * 1000; // 6 hours -const RELEASES_URL = 'https://github.com/ccmrik/SilentBlock/releases/latest'; - -function getCurrentVersion() { - return api.runtime.getManifest().version; -} - -function compareVersions(remote, local) { - const r = remote.replace(/^v/, '').split('.').map(Number); - const l = local.split('.').map(Number); - for (let i = 0; i < 3; i++) { - if ((r[i] || 0) > (l[i] || 0)) return 1; - if ((r[i] || 0) < (l[i] || 0)) return -1; - } - return 0; -} - -async function checkForUpdate() { - try { - const resp = await fetch(UPDATE_CHECK_URL, { - headers: { 'Accept': 'application/vnd.github.v3+json' }, - cache: 'no-cache' - }); - if (!resp.ok) return; - - const data = await resp.json(); - const remoteVersion = (data.tag_name || '').replace(/^v/, ''); - const localVersion = getCurrentVersion(); - - if (!remoteVersion) return; - - if (compareVersions(remoteVersion, localVersion) > 0) { - // New version available — store it and notify - api.storage.local.set({ - updateAvailable: remoteVersion, - updateUrl: RELEASES_URL - }); - - // Show browser notification - api.notifications.create('silentblock-update', { - type: 'basic', - iconUrl: 'icons/icon-on-128.png', - title: 'SilentBlock Update Available', - message: `Version ${remoteVersion} is available (you have ${localVersion}). Click the SilentBlock icon to update.` - }); - } else { - // Up to date — clear any stale update info - api.storage.local.remove(['updateAvailable', 'updateUrl']); - } - } catch (_) { - // Network error — silently ignore - } -} - -// Click notification → open releases page -api.notifications.onClicked.addListener((id) => { - if (id === 'silentblock-update') { - api.tabs.create({ url: RELEASES_URL }); - } -}); - -// Schedule periodic update checks -api.alarms.create('updateCheck', { periodInMinutes: 360 }); // 6 hours -api.alarms.onAlarm.addListener((alarm) => { - if (alarm.name === 'updateCheck') { - checkForUpdate(); - } -}); - -// ============================================= -// TAB NAVIGATION TRACKING (for per-page ad counts) -// ============================================= - -// Track when each tab navigates so we count only current-page blocks -api.tabs.onUpdated.addListener((tabId, changeInfo) => { - if (changeInfo.status === 'loading') { - api.storage.session.set({ - ['navTime_' + tabId]: Date.now(), - ['adCount_' + tabId]: 0 - }); - } -}); - -// Clean up when tabs close -api.tabs.onRemoved.addListener((tabId) => { - api.storage.session.remove(['adCount_' + tabId, 'navTime_' + tabId]); -}); - -// ============================================= -// CORE LOGIC -// ============================================= - -// Generate a stable numeric ID from a domain string for dynamic rules -function domainToId(domain) { - let hash = 0; - for (let i = 0; i < domain.length; i++) { - hash = ((hash << 5) - hash + domain.charCodeAt(i)) | 0; - } - return (Math.abs(hash) % 900000) + 100000; -} - -function setIcon(enabled) { - const state = enabled ? 'on' : 'off'; - api.action.setIcon({ - path: { - 16: `icons/icon-${state}-16.png`, - 48: `icons/icon-${state}-48.png`, - 128: `icons/icon-${state}-128.png` - } - }); -} - -api.runtime.onInstalled.addListener(() => { - api.storage.local.set({ - enabled: true, - disabledSites: [] - }); - setIcon(true); - - // Check for updates on install/update - checkForUpdate(); -}); - -// Set correct icon on service worker startup -api.storage.local.get('enabled', (data) => { - setIcon(data.enabled !== false); -}); - -api.runtime.onMessage.addListener((message, sender, sendResponse) => { - if (message.type === 'getState') { - api.tabs.query({ active: true, currentWindow: true }, (tabs) => { - if (!tabs[0] || !tabs[0].url) { - sendResponse({ enabled: true, siteDisabled: false, hostname: '' }); - return; - } - try { - const url = new URL(tabs[0].url); - const hostname = url.hostname; - api.storage.local.get(['enabled', 'disabledSites', 'updateAvailable', 'updateUrl'], (data) => { - const disabledSites = data.disabledSites || []; - sendResponse({ - enabled: data.enabled !== false, - siteDisabled: disabledSites.includes(hostname), - hostname, - updateAvailable: data.updateAvailable || null, - updateUrl: data.updateUrl || null - }); - }); - } catch { - sendResponse({ enabled: true, siteDisabled: false, hostname: '' }); - } - }); - return true; - } - - if (message.type === 'toggleSite') { - const { hostname, disable } = message; - api.storage.local.get(['disabledSites'], (data) => { - let disabledSites = data.disabledSites || []; - const ruleId = domainToId(hostname); - - if (disable) { - if (!disabledSites.includes(hostname)) { - disabledSites.push(hostname); - } - api.declarativeNetRequest.updateDynamicRules({ - removeRuleIds: [ruleId], - addRules: [{ - id: ruleId, - priority: 2, - action: { type: 'allowAllRequests' }, - condition: { - requestDomains: [hostname], - resourceTypes: ['main_frame', 'sub_frame'] - } - }] - }); - } else { - disabledSites = disabledSites.filter(s => s !== hostname); - api.declarativeNetRequest.updateDynamicRules({ - removeRuleIds: [ruleId] - }); - } - - api.storage.local.set({ disabledSites }); - sendResponse({ success: true }); - }); - return true; - } - - if (message.type === 'toggleGlobal') { - const { enabled } = message; - if (enabled) { - api.declarativeNetRequest.updateEnabledRulesets({ - enableRulesetIds: ['rules'] - }); - } else { - api.declarativeNetRequest.updateEnabledRulesets({ - disableRulesetIds: ['rules'] - }); - } - setIcon(enabled); - api.storage.local.set({ enabled }); - sendResponse({ success: true }); - return true; - } - - if (message.type === 'adCount') { - // Store per-tab ad count from content script - if (sender.tab) { - api.storage.session.set({ ['adCount_' + sender.tab.id]: message.count }); - } - return false; - } - - if (message.type === 'getAdCount') { - api.tabs.query({ active: true, currentWindow: true }, (tabs) => { - if (!tabs[0]) { sendResponse({ count: 0 }); return; } - const tabId = tabs[0].id; - api.storage.session.get(['adCount_' + tabId, 'navTime_' + tabId], (data) => { - const cosmeticCount = data['adCount_' + tabId] || 0; - const navTime = data['navTime_' + tabId] || 0; - - // Get network-level blocked count from declarativeNetRequest - // Works with activeTab permission (granted when popup opens) - api.declarativeNetRequest.getMatchedRules({ tabId, minTimeStamp: navTime }) - .then((result) => { - const networkCount = result.rulesMatchedInfo ? result.rulesMatchedInfo.length : 0; - sendResponse({ count: cosmeticCount + networkCount }); - }) - .catch(() => { - sendResponse({ count: cosmeticCount }); - }); - }); - }); - return true; - } -}); diff --git a/content/content.js b/content/content.js deleted file mode 100644 index 189ed13..0000000 --- a/content/content.js +++ /dev/null @@ -1,562 +0,0 @@ -'use strict'; - -// SilentBlock — Content Script -// Cosmetic filtering, popup prevention, and anti-adblock countermeasures - -(function () { - // Note: Popup blocker is in spoof.js (MAIN world) to intercept page-initiated popups. - - // ============================================= - // ANTI-ADBLOCK COUNTERMEASURES - // ============================================= - - // --- Bait elements --- - // Plant multiple fake ad elements so detection scripts think ads loaded - function plantBait() { - if (!document.body) return; - - const baits = [ - { tag: 'div', id: 'ad_unit', className: 'ad_unit ad-unit textAd text-ad text_ad pub_300x250 pub_300x250m pub_728x90 text-ad textAd text_ads text-ads adsBox ad-placeholder' }, - { tag: 'ins', id: '', className: 'adsbygoogle', attrs: { 'data-ad-client': 'ca-pub-0000000000000000', 'data-ad-slot': '0000000000' } }, - { tag: 'div', id: 'google_ads_frame1', className: 'google-ad' }, - { tag: 'div', id: 'div-gpt-ad-1234567890', className: 'ad-slot' }, - { tag: 'div', id: '', className: 'ad-banner banner_ad adsense adUnit' }, - ]; - - for (const b of baits) { - const el = document.createElement(b.tag); - if (b.id) el.id = b.id; - el.className = b.className; - // Must have non-zero computed size for detection scripts - el.style.cssText = 'position:absolute!important;left:-9999px!important;top:-9999px!important;width:1px!important;height:1px!important;opacity:0.01!important;pointer-events:none!important;'; - if (b.attrs) { - for (const [k, v] of Object.entries(b.attrs)) { - el.setAttribute(k, v); - } - } - document.body.appendChild(el); - } - } - - // Note: Ad detection spoofing (neutralizeDetectors) is now in spoof.js - // which runs in MAIN world to avoid CSP inline-script violations. - - // --- Detect and destroy anti-adblock overlays and modals --- - const ANTI_ADBLOCK_TEXT = [ - 'ad blocker', 'adblocker', 'ad-blocker', - 'ads aren\'t being displayed', 'ads are blocked', - 'ad blocking', 'adblocking', 'ad-blocking', - 'disable your ad', 'turn off your ad', 'deactivate your ad', - 'whitelist', 'white list', 'white-list', - 'allow ads', 'enable ads', 'show ads', - 'ad blocker detected', 'adblock detected', - 'we noticed', 'we\'ve detected', 'we have detected', - 'please disable', 'please turn off', 'please deactivate', - 'support us by', 'support this site', - 'advertising helps', 'ads help keep', - 'ad-free experience', 'go ad-free', - 'subscribe to remove', 'premium ad-free', - ]; - - function textMatchesAntiAdblock(text) { - const lower = text.toLowerCase(); - return ANTI_ADBLOCK_TEXT.some(phrase => lower.includes(phrase)); - } - - function isOverlayLike(el) { - const style = getComputedStyle(el); - const pos = style.position; - const zIndex = parseInt(style.zIndex, 10) || 0; - return ( - (pos === 'fixed' || pos === 'absolute') && - zIndex > 100 - ); - } - - function findAndDestroyAntiAdblockOverlays() { - // Strategy 0: Remove anti-adblock elements (Valnet sites use dialog.adblock with ::backdrop blur) - const adblockDialogs = document.querySelectorAll('dialog.adblock, dialog[class*="adblock"], dialog[data-promotion-zone]'); - for (const dlg of adblockDialogs) { - if (dlg.open) dlg.close(); - dlg.remove(); - } - - // Strategy 1: Find modals/overlays by position + z-index containing anti-adblock text - const allEls = document.querySelectorAll('div, section, aside, dialog, [role="dialog"], [role="alertdialog"]'); - for (const el of allEls) { - if (el.offsetWidth === 0 && el.offsetHeight === 0) continue; - if (!isOverlayLike(el)) continue; - - const text = el.innerText || el.textContent || ''; - if (text.length > 5000) continue; // skip huge containers - if (textMatchesAntiAdblock(text)) { - el.remove(); - } - } - - // Strategy 2: Find backdrop/overlay divs (full-screen, semi-transparent) - const candidates = document.querySelectorAll('div[style], div[class]'); - for (const el of candidates) { - const style = getComputedStyle(el); - if (style.position !== 'fixed') continue; - const w = el.offsetWidth; - const h = el.offsetHeight; - const winW = window.innerWidth; - const winH = window.innerHeight; - if (w >= winW * 0.9 && h >= winH * 0.9) { - const bg = style.backgroundColor; - const opacity = parseFloat(style.opacity); - // Semi-transparent overlay backdrop - if (bg.includes('rgba') || (opacity > 0 && opacity < 1)) { - // Check if it or a sibling has anti-adblock text - const parent = el.parentElement; - if (parent) { - const parentText = parent.innerText || ''; - if (textMatchesAntiAdblock(parentText)) { - el.remove(); - } - } - } - } - } - - restoreScroll(); - } - - // --- Facebook sponsored ad blocking --- - const isFacebook = location.hostname === 'www.facebook.com' || location.hostname === 'web.facebook.com' || location.hostname === 'm.facebook.com'; - - // Strip zero-width/invisible Unicode chars that Facebook injects to break text matching - function stripFbObfuscation(str) { - // Remove zero-width characters, soft hyphens, direction marks, joiners, etc. - return str.replace(/[\u200B\u200C\u200D\u200E\u200F\uFEFF\u00AD\u034F\u061C\u2060-\u2064\u206A-\u206F\u2800\u180E\u3164\uFFA0\u115F\u1160\u3000]/g, ''); - } - - function hideFacebookSponsoredPosts() { - if (!isFacebook) return; - let newCount = 0; - - // APPROACH: Walk ALL text nodes in the page using TreeWalker. - // Find any text node that, after stripping invisible chars, contains "Sponsored". - // Then walk up from that text node to find the enclosing post container and hide it. - const walker = document.createTreeWalker( - document.body, - NodeFilter.SHOW_TEXT, - null - ); - - const sponsoredNodes = []; - let textNode; - while ((textNode = walker.nextNode())) { - const raw = textNode.nodeValue || ''; - // Quick pre-filter: must have at least an 'S' and a 'p' - if (raw.indexOf('S') === -1 && raw.indexOf('s') === -1) continue; - const clean = stripFbObfuscation(raw).trim(); - if (clean === 'Sponsored' || clean === 'sponsored') { - sponsoredNodes.push(textNode); - } - } - - // For each "Sponsored" text node found, find & hide the post container - for (const node of sponsoredNodes) { - const post = findFbPostContainer(node.parentElement); - if (post && !post.dataset.sbFbHidden) { - post.dataset.sbFbHidden = '1'; - post.style.setProperty('display', 'none', 'important'); - newCount++; - } - } - - // FALLBACK 1: Check elements linking to /ads/about/ - const adLinks = document.querySelectorAll('a[href*="/ads/about"], a[href*="ads/about"], a[href*="/ad_center/"]'); - for (const link of adLinks) { - const post = findFbPostContainer(link); - if (post && !post.dataset.sbFbHidden) { - post.dataset.sbFbHidden = '1'; - post.style.setProperty('display', 'none', 'important'); - newCount++; - } - } - - // FALLBACK 2: Check aria-label="Sponsored" on any element - const ariaSponsored = document.querySelectorAll('[aria-label="Sponsored"], [aria-label="sponsored"]'); - for (const el of ariaSponsored) { - const post = findFbPostContainer(el); - if (post && !post.dataset.sbFbHidden) { - post.dataset.sbFbHidden = '1'; - post.style.setProperty('display', 'none', 'important'); - newCount++; - } - } - - // FALLBACK 3: Check assembled text from parent spans - // Facebook sometimes splits "Sponsored" across child elements with no direct text node - // e.g. Spo... - const allSpans = document.querySelectorAll('span'); - for (const span of allSpans) { - if (span.dataset.sbChecked) continue; - // Only check small spans that could be the label - const rect = span.getBoundingClientRect(); - if (rect.width === 0 || rect.height === 0) continue; - if (rect.width > 250 || rect.height > 40) continue; - // Get innerText (respects visibility) and check - const visible = stripFbObfuscation(span.innerText || '').replace(/\s+/g, '').trim(); - if (visible === 'Sponsored' || visible === 'sponsored') { - span.dataset.sbChecked = '1'; - const post = findFbPostContainer(span); - if (post && !post.dataset.sbFbHidden) { - post.dataset.sbFbHidden = '1'; - post.style.setProperty('display', 'none', 'important'); - newCount++; - } - } - } - - if (newCount > 0) { - adsBlocked += newCount; - try { - const api = typeof browser !== 'undefined' ? browser : chrome; - api.runtime.sendMessage({ type: 'adCount', count: adsBlocked }); - } catch (_) {} - } - } - - function findFbPostContainer(el) { - // Walk up from an element to find the Facebook post container. - // ONLY return elements with a definitive structural marker. - // Never use a vague fallback — that risks hiding the entire page. - let node = el; - let depth = 0; - - while (node && node !== document.body && depth < 30) { - if (node.nodeType === 1) { // Element node - // Check data-pagelet attribute (e.g. "FeedUnit_123", "StorySomething") - const pagelet = node.getAttribute('data-pagelet') || ''; - if (pagelet.includes('FeedUnit') || pagelet.includes('Story')) return node; - - // Check role="article" - if (node.getAttribute('role') === 'article') return node; - - // Check if this is a direct child of [role="feed"] - const parent = node.parentElement; - if (parent) { - const parentRole = parent.getAttribute && parent.getAttribute('role'); - if (parentRole === 'feed') return node; - const parentPagelet = parent.getAttribute && (parent.getAttribute('data-pagelet') || ''); - if (parentPagelet === 'Feed' || parentPagelet === 'feed') return node; - } - } - node = node.parentElement; - depth++; - } - - // No structural marker found — do NOT hide anything - return null; - } - - // --- Dynamic cosmetic filtering --- - const AD_SELECTORS = [ - 'ins.adsbygoogle', - '[id^="google_ads_"]', - '[id^="div-gpt-ad"]', - '[id^="taboola-"]', - '.taboola-widget', - '.trc_related_container', - '.OUTBRAIN', - '.ob-widget', - '[data-google-query-id]', - '[data-ad-slot]', - '[data-ad-client]', - '[data-native-ad]', - '[class*="sponsored-banner"]', - '.ad-overlay', - '.popup-ad', - '.interstitial-ad', - '.ad-interstitial', - ]; - - // --- GTG (Google Tag Gateway) script detection --- - // Detect and remove ", condition, html-load.com) +! Advergame Technologies Pvt. Ltd. +||html-load.com^$script,xhr,domain=astrozop.com|criczop.com|feedzop.com|gamezop.com|gamezop.io|quizzop.com|umogames.com +astrozop.com,criczop.com,feedzop.com,gamezop.com,gamezop.io,quizzop.com,umogames.com##+js(trusted-replace-argument, Element.prototype.setAttribute, 1, , condition, '/error-report|new Promise|;await new|:\[?window|&&window,|void 0\]|location\.href|void 0\|\|window|,window,|void 0,window|,window\]|\)\.join\(String\.fromCharCode|adShieldError/') +! App-Mind +||html-load.com^$script,xhr,domain=fmradiofree.com|internetradio-horen.de|radio-australia.org|radio-danmark.dk|radio-hrvatska.com|radio-norge.org|radio-osterreich.at +fmradiofree.com,internetradio-horen.de,radio-australia.org,radio-danmark.dk,radio-hrvatska.com,radio-norge.org,radio-osterreich.at##+js(trusted-replace-argument, Element.prototype.setAttribute, 1, , condition, '/error-report|new Promise|;await new|:\[?window|&&window,|void 0\]|location\.href|void 0\|\|window|,window,|void 0,window|,window\]|\)\.join\(String\.fromCharCode|adShieldError/') +! Notebookcheck +||html-load.com^$script,xhr,domain=notebookcheck.*|notebookcheck.biz|notebookcheck.com|notebookcheck.info|notebookcheck.it|notebookcheck.net|notebookcheck.nl|notebookcheck.org|notebookcheck.pl|notebookcheck.se|notebookcheck-cn.com|notebookcheck-hu.com|notebookcheck-ru.com|notebookcheck-tr.com +notebookcheck.*,notebookcheck-cn.com,notebookcheck-hu.com,notebookcheck-ru.com,notebookcheck-tr.com##+js(trusted-replace-argument, Element.prototype.setAttribute, 1, , condition, '/error-report|new Promise|;await new|:\[?window|&&window,|void 0\]|location\.href|void 0\|\|window|,window,|void 0,window|,window\]|\)\.join\(String\.fromCharCode|adShieldError/') +! Coolmath Network +coolmath4kids.com,coolmath4parents.com,coolmath4teachers.com,coolmathgames.com##+js(json-edit, .scriptLoader.*[?.id=="ad_stack_split_provider"]) +! Newsquest Media Group +alloaadvertiser.com,andoveradvertiser.co.uk,ardrossanherald.com,asianimage.co.uk,ayradvertiser.com,ayrshire-today.co.uk,barkinganddagenhampost.co.uk,barrheadnews.com,barryanddistrictnews.co.uk,basingstokegazette.co.uk,becclesandbungayjournal.co.uk,bicesteradvertiser.net,birmingham-now.co.uk,bordercountiesadvertizer.co.uk,bordertelegraph.com,borehamwoodtimes.co.uk,bournemouthecho.co.uk,bracknellnews.co.uk,braintreeandwithamtimes.co.uk,brentwoodlive.co.uk,bridgwatermercury.co.uk,bridportnews.co.uk,bromsgroveadvertiser.co.uk,bucksfreepress.co.uk,burnhamandhighbridgeweeklynews.co.uk,burymercury.co.uk,burytimes.co.uk,cambstimes.co.uk,celticway.co.uk,centralfifetimes.com,chardandilminsternews.co.uk,chelmsfordweeklynews.co.uk,cheshirelife.co.uk,chesterstandard.co.uk,clactonandfrintongazette.co.uk,clydebankpost.co.uk,cornwalllife.co.uk,cotswoldjournal.co.uk,cotswoldlife.co.uk,countypress.co.uk,countytimes.co.uk,cravenherald.co.uk,cumbrialife.co.uk,cumnockchronicle.com,dailyecho.co.uk,darlingtonandstocktontimes.co.uk,denbighshirefreepress.co.uk,derbyshirelife.co.uk,derehamtimes.co.uk,devonlife.co.uk,dissmercury.co.uk,dorsetecho.co.uk,dorsetmagazine.co.uk,dudleynews.co.uk,dumbartonreporter.co.uk,dumfriesandgallowaylife.co.uk,dunfermlinepress.com,dunmowbroadcast.co.uk,eadt.co.uk,ealingtimes.co.uk,eastlondonadvertiser.co.uk,eastlothiancourier.com,echo-news.co.uk,edp24.co.uk,elystandard.co.uk,enfieldindependent.co.uk,eppingforestguardian.co.uk,essexcountynews.co.uk,essexlifemag.co.uk,eveningnews24.co.uk,eveshamjournal.co.uk,exchangeandmart.co.uk,exmouthjournal.co.uk,fakenhamtimes.co.uk,falmouthpacket.co.uk,forestryjournal.co.uk,freepressseries.co.uk,gazette-news.co.uk,gazetteandherald.co.uk,gazetteherald.co.uk,gazetteseries.co.uk,glasgowtimes.co.uk,greatbritishlife.co.uk,greatyarmouthmercury.co.uk,greenocktelegraph.co.uk,guardian-series.co.uk,hackneygazette.co.uk,halesowennews.co.uk,halsteadgazette.co.uk,hamhigh.co.uk,hampshire-life.co.uk,hampshirechronicle.co.uk,harrowtimes.co.uk,harwichandmanningtreestandard.co.uk,heartsstandard.co.uk,helensburghadvertiser.co.uk,heraldscotland.com,heraldseries.co.uk,herefordtimes.com,hertsad.co.uk,hexham-courant.co.uk,hibsobserver.co.uk,hillingdontimes.co.uk,huntspost.co.uk,ilfordrecorder.co.uk,ilkleygazette.co.uk,impartialreporter.com,in-cumbria.com,ipswichstar.co.uk,irvinetimes.com,islingtongazette.co.uk,keighleynews.co.uk,kent-life.co.uk,kidderminstershuttle.co.uk,kilburntimes.co.uk,knutsfordguardian.co.uk,lancashirelife.co.uk,lancashiretelegraph.co.uk,largsandmillportnews.com,leaderlive.co.uk,ledburyreporter.co.uk,leighjournal.co.uk,living-magazines.co.uk,london-now.co.uk,lowestoftjournal.co.uk,ludlowadvertiser.co.uk,maldonandburnhamstandard.co.uk,malverngazette.co.uk,messengernewspapers.co.uk,midweekherald.co.uk,milfordmercury.co.uk,newhamrecorder.co.uk,newsandstar.co.uk,newsshopper.co.uk,norfolkmag.co.uk,northernfarmer.co.uk,northnorfolknews.co.uk,northsomersettimes.co.uk,northwaleschronicle.co.uk,northwalespioneer.co.uk,northwichguardian.co.uk,nwemail.co.uk,oxfordmail.co.uk,peeblesshirenews.com,penarthtimes.co.uk,peterboroughmatters.co.uk,pinkun.com,rangersreview.co.uk,readingchronicle.co.uk,redditchadvertiser.co.uk,redhillandreigatelife.co.uk,rhyljournal.co.uk,richmondandtwickenhamtimes.co.uk,romfordrecorder.co.uk,royston-crow.co.uk,runcornandwidnesworld.co.uk,saffronwaldenreporter.co.uk,salisburyjournal.co.uk,scotlandrugbynews.com,sidmouthherald.co.uk,sloughobserver.co.uk,somerset-life.co.uk,somersetcountygazette.co.uk,southendstandard.co.uk,southwalesargus.co.uk,southwalesguardian.co.uk,southwestfarmer.co.uk,sthelensstar.co.uk,stirlingnews.co.uk,stourbridgenews.co.uk,stowmarketmercury.co.uk,stroudnewsandjournal.co.uk,sudburymercury.co.uk,suffolkmag.co.uk,surreycomet.co.uk,sussexlife.co.uk,swindonadvertiser.co.uk,the-gazette.co.uk,theargus.co.uk,theboltonnews.co.uk,thecomet.net,thenational.scot,thenorthernecho.co.uk,theoldhamtimes.co.uk,theresident.co.uk,thescottishfarmer.co.uk,thetelegraphandargus.co.uk,theterrace.scot,thetfordandbrandontimes.co.uk,thetottenhamindependent.co.uk,thewestmorlandgazette.co.uk,thewestonmercury.co.uk,thisisoxfordshire.co.uk,thisiswiltshire.co.uk,thurrockgazette.co.uk,times-series.co.uk,timesandstar.co.uk,tivysideadvertiser.co.uk,walesfarmer.co.uk,wandsworthguardian.co.uk,warringtonguardian.co.uk,watfordobserver.co.uk,wattonandswaffhamtimes.co.uk,wearesunderland.com,wearevoice.co.uk,westerntelegraph.co.uk,wharfedaleobserver.co.uk,whitchurchherald.co.uk,whitehavennews.co.uk,whtimes.co.uk,wiltsglosstandard.co.uk,wiltshiretimes.co.uk,wimbledonguardian.co.uk,wirralglobe.co.uk,wisbechstandard.co.uk,witneygazette.co.uk,worcesternews.co.uk,wymondhamandattleboroughmercury.co.uk,yeovilexpress.co.uk,yorkpress.co.uk,yorkshirelife.co.uk,yourlocalguardian.co.uk##+js(set, adLight, true) +! Mediavague +||html-load.com^$script,xhr,domain=bike-news.jp|egolf.jp|kuruma-news.jp|lasisa.net|magmix.jp|merkmal-biz.jp|otonanswer.jp|trafficnews.jp|vague.style +bike-news.jp,egolf.jp,kuruma-news.jp,lasisa.net,magmix.jp,merkmal-biz.jp,otonanswer.jp,trafficnews.jp,vague.style##+js(trusted-replace-argument, Element.prototype.setAttribute, 1, , condition, '/error-report|new Promise|;await new|:\[?window|&&window,|void 0\]|location\.href|void 0\|\|window|,window,|void 0,window|,window\]|\)\.join\(String\.fromCharCode|adShieldError/') +! AllGear Digital +||html-load.com^$script,xhr,domain=bikerumor.com|explorersweb.com|gearjunkie.com|irunfar.com|packhacker.com|switchbacktravel.com|theinertia.com|wildsnow.com +bikerumor.com,explorersweb.com,gearjunkie.com,irunfar.com,packhacker.com,switchbacktravel.com,theinertia.com,wildsnow.com##+js(ra, onerror, script[id][onerror], asap stay) +bikerumor.com,explorersweb.com,gearjunkie.com,irunfar.com,packhacker.com,switchbacktravel.com,theinertia.com,wildsnow.com##+js(trusted-replace-argument, Element.prototype.setAttribute, 1, , condition, '/error-report|new Promise|;await new|:\[?window|&&window,|void 0\]|location\.href|void 0\|\|window|,window,|void 0,window|,window\]|\)\.join\(String\.fromCharCode|adShieldError/') +! MV3 wildcard issue +!#if ext_ubol +||html-load.com^$script,xhr,domain=babla.cn|babla.co.id|babla.co.th|babla.gr|babla.no|babla.ru|babla.vn|fxstreet.com|fxstreet.com.tr|fxstreet.de.com|fxstreet.es|fxstreet.fr|fxstreet.hk|fxstreet.hu|fxstreet.it|fxstreet.ru.com|gentside.co.uk|gentside.com|gentside.de|ohmymag.co.uk|ohmymag.com|ohmymag.de|wieistmeineip.at|wieistmeineip.ch|wieistmeineip.de|willyweather.co.uk|willyweather.com|willyweather.com.au|woxikon.bg|woxikon.co|woxikon.co.uk|woxikon.com|woxikon.com.br|woxikon.cl|woxikon.dk|woxikon.de|woxikon.fr|woxikon.es|woxikon.it|woxikon.mx|woxikon.nl|woxikon.pl|woxikon.pt|woxikon.ru|woxikon.se +!#endif +||css-load.com^$domain=ygosu.com|loawa.com|bamgosu.site +||css-load.com^$redirect=noopjs,domain=honkailab.com +||07c225f3.online^$domain=economist.co.kr|hometownstation.com|sportalkorea.com|edaily.co.kr|isplus.com|tenasia.hankyung.com|etoday.co.kr +||html-load.com^$redirect=noopjs,domain=raenonx.cc|indiatimes.com|missyusa.com +||a.fsdn.com/con/js/sftheme/vendor/bizx-prebid.js?$script,domain=sourceforge.net +||whykindlyoofword.com/sdk.js$script,domain=gutefrage.net +gutefrage.net##+js(nosiif, 0x) +||abeagle-public.buzzfeed.com/*-AdShield- +raenonx.cc,indiatimes.com,missyusa.com##+js(nostif, error-report.com) +indiatimes.com##+js(set, objAd.loadAdShield, noopFunc) +netzwelt.de##+js(set, window.myAd.runAd, noopFunc) +huffpost.com##+js(json-prune, RT-1562-AdShield-script-on-Huffpost) +!#if env_mobile +m.etoday.co.kr##+js(rpnt, script, var googletag =, '/*start*/(function(){let link=document.createElement("link");link.rel="stylesheet";link.href="/common/css/m_default.css";document.head.appendChild(link)})();document.currentScript.textContent=document.currentScript.textContent.replace(/\/\*start\*\/(.*)\/\*end\*\//g,"");/*end*/var googletag =') +isplus.com##+js(rpnt, script, $(document).ready, '/*start*/(function(){let link=document.createElement("link");link.rel="stylesheet";link.href="/css_renew/m/m_common.css";document.head.appendChild(link)})();document.currentScript.textContent=document.currentScript.textContent.replace(/\/\*start\*\/(.*)\/\*end\*\//g,"");/*end*/$(document).ready', sedCount, 1) +!#else +etoday.co.kr##+js(rpnt, script, window.googletag =, '/*start*/(function(){let link=document.createElement("link");link.rel="stylesheet";link.href="/common/css/etoday.css";document.head.appendChild(link)})();document.currentScript.textContent=document.currentScript.textContent.replace(/\/\*start\*\/(.*)\/\*end\*\//g,"");/*end*/window.googletag =') +isplus.com##+js(rpnt, script, window.dataLayer =, '/*start*/(function(){let link=document.createElement("link");link.rel="stylesheet";link.href="/css_renew/pc/common.css";document.head.appendChild(link)})();document.currentScript.textContent=document.currentScript.textContent.replace(/\/\*start\*\/(.*)\/\*end\*\//g,"");/*end*/window.dataLayer =') +!#endif +ygosu.com,bamgosu.site##+js(trusted-replace-argument, Element.prototype.setAttribute, 1, {"value": "(function(){let link=document.createElement('link');link.rel='stylesheet';link.href='//image.ygosu.com/style/main.css';document.head.appendChild(link)})()"}, condition, error-report) +loawa.com##+js(trusted-replace-argument, Element.prototype.setAttribute, 1, {"value": "(function(){let link=document.createElement('link');link.rel='stylesheet';link.href='https://loawa.com/assets/css/loawa.min.css';document.head.appendChild(link)})()"}, condition, error-report) +economist.co.kr##+js(rpnt, script, _paq.push, '/*start*/(function(){let link=document.createElement("link");link.rel="stylesheet";link.href="/css/pc/ecn_common.min.css";document.head.appendChild(link)})();document.currentScript.textContent=document.currentScript.textContent.replace(/\/\*start\*\/(.*)\/\*end\*\//g,"");/*end*/_paq.push') +hometownstation.com##+js(rpnt, script, window.dataLayer =, '/*start*/(function(){let link=document.createElement("link");link.rel="stylesheet";link.href="/wp-content/themes/hts_v2/style.css";document.head.appendChild(link)})();document.currentScript.textContent=document.currentScript.textContent.replace(/\/\*start\*\/(.*)\/\*end\*\//g,"");/*end*/window.dataLayer =') +sportalkorea.com##+js(rpnt, script, window.dataLayer =, '/*start*/(function(){let link=document.createElement("link");link.rel="stylesheet";link.href="/_css/css.css";document.head.appendChild(link)})();document.currentScript.textContent=document.currentScript.textContent.replace(/\/\*start\*\/(.*)\/\*end\*\//g,"");/*end*/window.dataLayer =') +m.edaily.co.kr##+js(rpnt, script, var _paq =, '/*start*/(function(){let link=document.createElement("link");link.rel="stylesheet";link.href="/Content/css/style.css";document.head.appendChild(link)})();document.currentScript.textContent=document.currentScript.textContent.replace(/\/\*start\*\/(.*)\/\*end\*\//g,"");/*end*/var _paq =', sedCount, 1) +honkailab.com##+js(rpnt, script, var localize =, '/*start*/(function(){document.querySelectorAll("script[wp-data]").forEach(element=>{const html=new DOMParser().parseFromString(atob(element.getAttribute("wp-data")),"text/html");html.querySelectorAll("link:not([as])").forEach(linkEl=>{element.after(linkEl)});element.parentElement.removeChild(element);})})();document.currentScript.textContent=document.currentScript.textContent.replace(/\/\*start\*\/(.*)\/\*end\*\//g,"");/*end*/var localize =', sedCount, 1) +honkailab.com##body:style(background-color: #2D2D2D;) +lifehacker.jp##+js(rpnt, script, /^.+/gms, '!function(){var e=Object.getOwnPropertyDescriptor(Element.prototype,"innerHTML").set;Object.defineProperty(Element.prototype,"innerHTML",{set:function(t){return t.includes("html-load.com")?e.call(this,""):e.call(this,t)}})}();', condition, html-load.com) +a-ha.io,cboard.net,joongdo.co.kr,viva100.com##+js(noeval-if, /content-loader\.com|css-load\.com|html-load\.com/) +automobile-catalog.com,baseballchannel.jp,forum.mobilism.me,freeairpump.com,gbatemp.net,gentosha-go.com,hoyme.jp,kezdo5.hu,krepsinis.net,motorbikecatalog.com,sharemods.com,wisevoter.com##+js(rmnt, script, error-report.com) +divinedaolibrary.com,jaysbrickblog.com,mp1st.com,oricon.co.jp,uranai.nosv.org,yakkun.com##+js(rmnt, script, html-load.com) +oricon.co.jp##+js(rmnt, script, /\(async\(\)=>\{try\{(const|var)/) +chloeting.com##+js(prevent-innerHTML, script, html-load.com) +9gag.com,adrenaline.com.br,and-more.co,animalia.bio,astro-seek.com,augustacrime.com,autofrage.net,automobile-catalog.com,bab.la,babla.*,base64decode.org,boardingarea.com,buchstaben.com,businessua.com,calculatorsoup.com,canuckaudiomart.com,chloeting.com,collinsdictionary.com,computerfrage.net,convertcase.net,costcoinsider.com,crosswordsolver.com,culturequizz.com,daily.co.jp,daveockop.com,dict.cc,dictionary.cambridge.org,dictionnaire.lerobert.com,dnevnik.hr,doviz.com,egitim.net.tr,elnacional.cat,euronews.com,exceljet.net,fandom.com,finanzfrage.net,football-ukraine.com,fossbytes.com,freemcserver.net,game8.jp,gamewith.jp,gerbeaud.com,gesundheitsfrage.net,gezondnu.nl,girlschannel.net,glianec.com,greenwichmeantime.com,gutefrage.net,happyinshape.com,helpdeskgeek.com,higherorlowergame.com,hk01.com,hna.de,hochi.news,hollywoodlife.com,houseandgarden.co,index.hr,infinityfree.com,inverse.com,itavisen.no,km77.com,kreuzwortraetsel.de,kurashiru.com,ldoceonline.com,leckerschmecker.me,lejdd.fr,lettersolver.com,liveandletsfly.com,livescience.com,looopings.nl,lootlemon.com,mamastar.jp,merinfo.se,moin.de,motorbikecatalog.com,motorradfrage.net,motscroises.fr,mrexcel.com,namemc.com,natalie.mu,nemzetisport.hu,neoseeker.com,netflixlife.com,newatlas.com,nextchessmove.com,nikkansports.com,nouvelobs.com,oeffnungszeitenbuch.de,omnicalculator.com,onlineradiobox.com,onemileatatime.com,oraridiapertura24.it,oricon.co.jp,oxfordlearnersdictionaries.com,pakkotoisto.com,perezhilton.com,picrew.me,pinterpoin.com,pons.com,popdaily.com.tw,reisefrage.net,rotowire.com,saita-puls.com,scribd.com,singjupost.com,skinmc.net,slideshare.net,sms24.me,songfacts.com,sourceforge.net,sportlerfrage.net,the-crossword-solver.com,thefirearmblog.com,thelayoff.com,thetorquereport.com,thetruthaboutcars.com,thingiverse.com,timeful.app,torontosun.com,toyokeizai.net,travelingformiles.com,trilltrill.jp,tunebat.com,tvtv.ca,tvtv.us,ukaudiomart.com,upgradedhome.com,urbandictionary.com,urldecoder.org,usaudiomart.com,watchdocumentaries.com,weatherzone.com.au,welt.de,willyweather.*,winfuture.de,winteriscoming.net,word-grabber.com,wordshake.com,worldjournal.com,woxikon.de##+js(trusted-replace-argument, Element.prototype.setAttribute, 1, , condition, '/error-report|new Promise|;await new|:\[?window|&&window,|void 0\]|location\.href|void 0\|\|window|,window,|void 0,window|,window\]|\)\.join\(String\.fromCharCode|adShieldError/') +9gag.com,automobile-catalog.com,base64decode.org,calculatorsoup.com,culturequizz.com,euronews.com,fandom.com,hb-nippon.com,index.hr,motorbikecatalog.com,scribd.com,sms24.me,urldecoder.org,welt.de,worldjournal.com##+js(ra, onerror, script[id][onerror], asap stay) +akinator.com##+js(trusted-replace-argument, Element.prototype.setAttribute, 1, `json:"setTimeout((()=>{if(!location.pathname.startsWith('/game'))return;const t=document.getElementById('question-label');t&&(window.animation=lottie.loadAnimation({container:t,renderer:'svg',loop:!0,autoplay:!1,path:'/assets/animationsLottielab/gameDots.json'}))}),1e3);"`, condition, '/error-report|new Promise|;await new|:\[?window|&&window,|void 0\]|location\.href|void 0\|\|window|,window,|void 0,window|,window\]|\)\.join\(String\.fromCharCode|adShieldError/') +akinator.com##+js(set, __cfRLUnblockHandlers, true) +huffpost.com##+js(set, disableAdShield, true) +walesonline.co.uk##+js(rmnt, script, nowprocket, excludes, self.__next) +animalia.bio##.s-ad-banner-horizontal +base64decode.org,urldecoder.org##.column.img_header_box +base64decode.org,urldecoder.org##.column.img_right_top_box +base64decode.org,urldecoder.org##.column.img_right_bottom_box +base64decode.org,urldecoder.org##.column.img_left_box +dictionnaire.lerobert.com##.gymglish-fr-2.gymglish +neowin.net,newatlas.com,razzball.com,tz.de##+js(nostif, [native code], 500) +majorleaguepickleball.co,pickleball.com,pickleballclubs.com,pickleballleagues.com,pickleballteamleagues.com,pickleballtournaments.com##+js(trusted-replace-argument, document.getElementById, 0, json:"freestar-bootstrap", condition, /^[A-Z][a-z]+_$/) +majorleaguepickleball.co,pickleball.com,pickleballclubs.com,pickleballleagues.com,pickleballteamleagues.com,pickleballtournaments.com,ppatour.com##+js(trusted-replace-argument, Element.prototype.setAttribute, 1, , condition, '/error-report|new Promise|;await new|:\[?window|&&window,|void 0\]|location\.href|void 0\|\|window|,window,|void 0,window|,window\]|\)\.join\(String\.fromCharCode|adShieldError/') +!#if cap_html_filtering +interfootball.co.kr,a-ha.io,cboard.net,joongdo.co.kr,viva100.com,maketecheasier.com,tweaksforgeeks.com,m.inven.co.kr,mlbpark.donga.com##^script:has-text(KCgpPT57bGV0IGU) +9gag.com,akinator.com,and-more.co,astro-seek.com,autofrage.net,bab.la,babla.*,badmouth1.com,boardingarea.com,businessua.com,canuckaudiomart.com,collinsdictionary.com,computerfrage.net,dict.cc,dictionnaire.lerobert.com,dictionary.cambridge.org,dnevnik.hr,doviz.com,egitim.net.tr,eurointegration.com.ua,exceljet.net,finanzfrage.net,flatpanelshd.com,football-ukraine.com,footballtransfer.com.ua,footballtransfer.ru,fossbytes.com,freemcserver.net,gadgets360.com,gazetaprawna.pl,gesundheitsfrage.net,gezondnu.nl,girlschannel.net,glianec.com,gutefrage.net,happyinshape.com,helpdeskgeek.com,hoyme.jp,houseandgarden.co,infinityfree.com,issuya.com,iusm.co.kr,lamire.jp,ldoceonline.com,leckerschmecker.me,liveandletsfly.com,logicieleducatif.fr,lootlemon.com,missyusa.com,mamastar.jp,moin.de,motorradfrage.net,motscroises.fr,neoseeker.com,neowin.net,newatlas.com,nextchessmove.com,onlinegdb.com,oxfordlearnersdictionaries.com,palabr.as,perezhilton.com,picrew.me,pinterpoin.com,pons.com,pravda.com.ua,pressian.com,razzball.com,reisefrage.net,reportera.co.kr,rotowire.com,sinemalar.com,singjupost.com,sportanalytic.com,sportlerfrage.net,sportsrec.com,sportsseoul.com,text-compare.com,the-crossword-solver.com,thelayoff.com,torontosun.com,toyokeizai.net,travelingformiles.com,tweaksforgeeks.com,tz.de,ukaudiomart.com,usaudiomart.com,w.grapps.me,watchdocumentaries.com,welt.de,wfmz.com,winfuture.de,worldhistory.org##^script[onload*="error-report.com"] +9gag.com,adrenaline.com.br,animalia.bio,augustacrime.com,automobile-catalog.com,base64decode.org,buchstaben.com,calculatorsoup.com,culturequizz.com,daveockop.com,doviz.com,euronews.com,fandom.com,freemcserver.net,game8.jp,gamewith.jp,gerbeaud.com,greenwichmeantime.com,higherorlowergame.com,hna.de,index.hr,itavisen.no,km77.com,livescience.com,looopings.nl,mamastar.jp,merinfo.se,motorbikecatalog.com,mrexcel.com,namemc.com,nemzetisport.hu,nikkansports.com,onemileatatime.com,onlineradiobox.com,pakkotoisto.com,ppatour.com,scribd.com,skinmc.net,sms24.me,thetorquereport.com,thingiverse.com,timeful.app,tvtv.ca,tvtv.us,urbandictionary.com,urldecoder.org,welt.de,willyweather.*,wordshake.com,worldjournal.com##^script[src*="html-load.com"] +crosswordsolver.com,gutefrage.net,kreuzwortraetsel.de,motscroises.fr,oeffnungszeitenbuch.de,oraridiapertura24.it,word-grabber.com,wort-suchen.de##^script[src*="://loader."] +automobile-catalog.com,motorbikecatalog.com##^script:is([src$="/app.js"],[src$="/core.js"]) +bleepingcomputer.com,pravda.com.ua##^script:has-text(Ad-Shield) +ap7am.com,cinema.com.my,dolldivine.com,giornalone.it,iplocation.net,jamaicajawapos.com,jutarnji.hr,kompasiana.com,mediaindonesia.com,niice-woker.com,pep.ph,slobodnadalmacija.hr,upmedia.mg##^script:has-text(adrecover.com) +wetter.com##^script:has-text(/wcomAdBlock|error-report\.com/) +neowin.net,newatlas.com,nextchessmove.com,razzball.com##^script:has-text(head.appendChild.bind) +9gag.com,adrenaline.com.br,akinator.com,and-more.co,animalia.bio,astro-seek.com,augustacrime.com,automobile-catalog.com,bab.la,babla.*,base64decode.org,boardingarea.com,buchstaben.com,calculatorsoup.com,canuckaudiomart.com,collinsdictionary.com,crosswordsolver.com,culturequizz.com,daveockop.com,dict.cc,dictionary.cambridge.org,dictionnaire.lerobert.com,divinedaolibrary.com,doviz.com,egitim.net.tr,euronews.com,exceljet.net,fandom.com,fossbytes.com,freemcserver.net,game8.jp,gamewith.jp,gerbeaud.com,gezondnu.nl,girlschannel.net,happyinshape.com,helpdeskgeek.com,higherorlowergame.com,hna.de,hochi.news,hollywoodlife.com,houseandgarden.co,index.hr,itavisen.no,km77.com,kreuzwortraetsel.de,ldoceonline.com,lejdd.fr,livescience.com,looopings.nl,lootlemon.com,mamastar.jp,merinfo.se,motorbikecatalog.com,motscroises.fr,mrexcel.com,namemc.com,nemzetisport.hu,neoseeker.com,neowin.net,newatlas.com,nikkansports.com,oeffnungszeitenbuch.de,onemileatatime.com,onlineradiobox.com,oraridiapertura24.it,oxfordlearnersdictionaries.com,pakkotoisto.com,perezhilton.com,pinterpoin.com,pons.com,ppatour.com,razzball.com,rotowire.com,saita-puls.com,scribd.com,sinemalar.com,skinmc.net,slideshare.net,sms24.me,songfacts.com,the-crossword-solver.com,thelayoff.com,thetorquereport.com,thingiverse.com,timeful.app,torontosun.com,toyokeizai.net,travelingformiles.com,trilltrill.jp,tunebat.com,tvtv.ca,tvtv.us,ukaudiomart.com,urbandictionary.com,urldecoder.org,usaudiomart.com,watchdocumentaries.com,welt.de,willyweather.*,word-grabber.com,wordshake.com,wort-suchen.de##^script[data-cfasync="false"][nowprocket] +dnevnik.hr,neowin.net,newatlas.com,razzball.com##^script:has-text(/^\(async\(\)=>\{function.{1,200}\.head.{1,100}\.bind.{1,900}location\.href.{1,100}\}\)\(\);$/) +divinedaolibrary.com,lejdd.fr,scribd.com,slideshare.net,songfacts.com,tips-and-tricks.co##^script:has-text(/\(async\s*\(\)\s*=>\s*\{\s*try\s*\{\s*(const|var)/) +si.com##^script:has-text('"https://html-load.com/loader.min.js"') +akinator.com,and-more.co,astro-seek.com,autofrage.net,bab.la,babla.*,boardingarea.com,collinsdictionary.com,computerfrage.net,dictionary.cambridge.org,dictionnaire.lerobert.com,dnevnik.hr,doviz.com,egitim.net.tr,exceljet.net,finanzfrage.net,freemcserver.net,gesundheitsfrage.net,gezondnu.nl,gutefrage.net,happyinshape.com,houseandgarden.co,infinityfree.com,ldoceonline.com,liveandletsfly.com,mamastar.jp,motorradfrage.net,neoseeker.com,newatlas.com,oxfordlearnersdictionaries.com,pinterpoin.com,pons.com,reisefrage.net,sinemalar.com,sportlerfrage.net,torontosun.com,toyokeizai.net,travelingformiles.com,usaudiomart.com,welt.de##^script:has-text(await eval) +9gag.com,augustacrime.com,base64decode.org,calculatorsoup.com,canuckaudiomart.com,costcoinsider.com,crosswordsolver.com,dict.cc,elnacional.cat,girlschannel.net,itavisen.no,kreuzwortraetsel.de,livescience.com,lootlemon.com,merinfo.se,motscroises.fr,mrexcel.com,nemzetisport.hu,oeffnungszeitenbuch.de,oraridiapertura24.it,pinterpoin.com,ppatour.com,rotowire.com,the-crossword-solver.com,tvtv.ca,tvtv.us,ukaudiomart.com,urldecoder.org,watchdocumentaries.com,word-grabber.com,wort-suchen.de##^script:has-text(()=>eval) +buchstaben.com,nemzetisport.hu##^script:has-text(() => eval) +9gag.com,adrenaline.com.br,automobile-catalog.com,calculatorsoup.com,culturequizz.com,euronews.com,fandom.com,game8.jp,gerbeaud.com,gutefrage.net,motorbikecatalog.com,namemc.com,nikkansports.com,onemileatatime.com,thetorquereport.com,urbandictionary.com,welt.de,wordshake.com##^script:has-text(/:\[?window,/) +mamastar.jp##^script:has-text(: window,) +km77.com##^script:has-text(await new Promise) +km77.com,onlineradiobox.com,timeful.app,willyweather.*##^script:has-text(&&window,) +automobile-catalog.com,hna.de,index.hr,motorbikecatalog.com,skinmc.net##^script:has-text(,window]) +9gag.com,animalia.bio,daveockop.com,doviz.com,looopings.nl,pakkotoisto.com,worldjournal.com##^script:has-text(void 0||window,) +greenwichmeantime.com,higherorlowergame.com##^script:has-text(void 0 || window,) +freemcserver.net##^script:has-text(window,void 0) +base64decode.org,fandom.com,gamewith.jp,sms24.me,urldecoder.org##^script:has-text(').join(String.fromCharCode') +singjupost.com##^script:has-text(domain=?eventId=&error=) +sparkchess.com##^script:has-text(html-load.cc) +brawlytix.com##^script:has-text(nowprocket) +savvytime.com##^script:has-text('"nowprocket"') +scribd.com##^script:has-text(adShieldError) +fossbytes.com,helpdeskgeek.com,perezhilton.com##^script:has-text(';confirm(') +savvytime.com##^script#savvytime-adshield-light +1geki.jp,373news.com,50states.com,actugaming.net,aerotrader.com,alc.co.jp,altarofgaming.com,anagram-solver.io,areaconnect.com,as-web.jp,atvtrader.com,aucfree.com,autoby.jp,autoc-one.jp,autofrage.net,automobile-catalog.com,bab.la,babla.*,baseballchannel.jp,buchstaben.com,cadryskitchen.com,cafedelites.com,calculatorsoup.com,carscoops.com,campsitephotos.com,canarystreetcrafts.com,celebritynetworth.com,cesoirtv.com,chanto.jp.net,chef-in-training.com,chocolatecoveredkatie.com,cinetrafic.fr,collinsdictionary.com,commercialtrucktrader.com,computerfrage.net,convertcase.net,costcoinsider.com,crosswordsolver.com,culturequizz.com,curbsideclassic.com,cycletrader.com,dallashoopsjournal.com,dayspedia.com,dexerto.com,dict.cc,dictionary.cambridge.org,dictionnaire.lerobert.com,dnevno.hr,donbalon.com,driveteslacanada.ca,dropgame.jp,ecranlarge.com,eigachannel.jp,equipmenttrader.com,ev-times.com,finanzfrage.net,fixthecfaa.com,flagle.io,footballchannel.jp,freeconvert.com,freemcserver.net,freeride.com,futabanet.jp,futabasha-change.com,fxstreet-id.com,fxstreet-vn.com,fxstreet.*,game8.jp,games.arkadium.com,gamewith.jp,gazetaprawna.pl,geogridgame.com,geoguessr.com,gerbeaud.com,gesundheitsfrage.net,gifu-np.co.jp,gigafile.nu,globalrph.com,golf-live.at,grapee.jp,gutefrage.net,hang.hu,happymoments.lol,harmonikum.co,hb-nippon.com,heureka.cz,hochi.news,horairesdouverture24.fr,hotcopper.co.nz,hotcopper.com.au,hvac-talk.com,ib-game.jp,idokep.hu,indianhealthyrecipes.com,indiatimes.com,infor.pl,insider-gaming.com,invoice-generator.com,iphoneincanada.ca,iza.ne.jp,j-cast.com,j-town.net,j7p.jp,jablickar.cz,javatpoint.com,jigsawexplorer.com,jiji.com,jikayosha.jp,jocjapantravel.com,judgehype.com,kinmaweb.jp,km77.com,kobe-journal.com,krepsinis.net,kreuzwortraetsel.de,kstp.com,kurashinista.jp,kyoteibiyori.com,lacuarta.com,lacuarta.com,laleggepertutti.it,langenscheidt.com,laposte.net,laughingsquid.com,lawyersgunsmoneyblog.com,ldoceonline.com,lessdebt.com,lettersolver.com,liliputing.com,listentotaxman.com,livenewschat.eu,logicieleducatif.fr,luremaga.jp,mafab.hu,mahjongchest.com,mainichi.jp,majorleaguepickleball.co,maketecheasier.com,malaymail.com,mamastar.jp,marineinsight.com,mathplayzone.com,meteo60.fr,midhudsonnews.com,minesweeperquest.com,minkou.jp,modhub.us,modsbase.com,modsfire.com,moin.de,motor-fan.jp,motorbikecatalog.com,motorradfrage.net,motscroises.fr,movie-locations.com,muragon.com,mykoreankitchen.com,namemc.com,nana-press.com,natalie.mu,nationaltoday.com,nbadraft.net,newatlas.com,news.zerkalo.io,newsinlevels.com,newsweekjapan.jp,newsyou.info,niketalk.com,nintendoeverything.com,nlab.itmedia.co.jp,noorderland.nl,nouvelobs.com,nyitvatartas24.hu,oeffnungszeitenbuch.de,onlineradiobox.com,operawire.com,optionsprofitcalculator.com,oraridiapertura24.it,overclock.net,oxfordlearnersdictionaries.com,palabr.as,pashplus.jp,percentagecalculator.net,persoenlich.com,petitfute.com,petitrobert.fr,play-games.com,pllive.xmediaeg.com,pons.com,popdaily.com.tw,powerpyx.com,pptvhd36.com,profitline.hu,puzzlegarage.com,pwctrader.com,quefaire.be,raetsel-hilfe.de,raider.io,ranking.net,rarethief.com,references.be,reisefrage.net,relevantmagazine.com,reptilesmagazine.com,resproleplayer.me,rostercon.com,russianmachineneverbreaks.com,rvtrader.com,samsungmagazine.eu,sankei.com,sanspo.com,scribens.com,scribens.fr,siennachat.com,skyandtelescope.org,slashdot.org,snowmobiletrader.com,soccerdigestweb.com,solitairehut.com,sourceforge.net,southhemitv.com,soxprospects.com,spaghetti-interactive.it,speisekarte.de,spendwithpennies.com,sportalkorea.com,sportlerfrage.net,statecollege.com,stayglam.com,steamidfinder.com,stocktwits.com,sudokutable.com,superhonda.com,syosetu.com,szamoldki.hu,talkwithstranger.com,tastesbetterfromscratch.com,tbs.co.jp,techdico.com,the-crossword-solver.com,thecelticblog.com,thedigestweb.com,thefirearmblog.com,traicy.com,transparentcalifornia.com,transparentnevada.com,trilltrill.jp,tunebat.com,tvtv.ca,tvtv.us,tweaktown.com,twn.hu,tyda.se,ufret.jp,universalis.fr,uptodown.com,uscreditcardguide.com,v8sleuth.com.au,verkaufsoffener-sonntag.com,videocelts.com,vimm.net,wallpapers.com,wamgame.jp,wanderworthy.com,watchdocumentaries.com,wattedoen.be,wdwnt.com,wdwnt.jp,webdesignledger.com,weldingweb.com,welt.de,wetteronline.de,wfmz.com,whec.com,wieistmeineip.*,wielerflits.be,wielerflits.nl,winbuzzer.com,winfuture.de,word-grabber.com,wordfinderx.com,wordhippo.com,worldjournal.com,worldle.teuteuf.fr,wort-suchen.de,woxikon.*,young-machine.com,yugioh-starlight.com,yutura.net,zagreb.info,zakzak.co.jp##^script:has-text(html-load.com) +! livedoor-sites +2chblog.jp,2monkeys.jp,46matome.net,akb48glabo.com,akb48matomemory.com,alfalfalfa.com,all-nationz.com,anihatsu.com,aqua2ch.net,blog.esuteru.com,blog.livedoor.jp,blog.jp,blogo.jp,chaos2ch.com,choco0202.work,crx7601.com,danseisama.com,dareda.net,digital-thread.com,doorblog.jp,exawarosu.net,fgochaldeas.com,football-2ch.com,gekiyaku.com,golog.jp,hacchaka.net,heartlife-matome.com,liblo.jp,fesoku.net,fiveslot777.com,gamejksokuhou.com,girlsreport.net,girlsvip-matome.com,grasoku.com,gundamlog.com,honyaku-channel.net,ikarishintou.com,imas-cg.net,imihu.net,inutomo11.com,itainews.com,itaishinja.com,jin115.com,jisaka.com,jnews1.com,jumpsokuhou.com,jyoseisama.com,keyakizaka46matomemory.net,kidan-m.com,kijoden.com,kijolariat.net,kijolifehack.com,kijomatomelog.com,kijyokatu.com,kijyomatome.com,kijyomatome-ch.com,kijyomita.com,kirarafan.com,kitimama-matome.net,kitizawa.com,konoyubitomare.jp,kotaro269.com,kyousoku.net,ldblog.jp,livedoor.biz,livedoor.blog,majikichi.com,matacoco.com,matomeblade.com,matomelotte.com,matometemitatta.com,mojomojo-licarca.com,morikinoko.com,nandemo-uketori.com,netatama.net,news-buzz1.com,news30over.com,nishinippon.co.jp,nmb48-mtm.com,norisoku.com,npb-news.com,ocsoku.com,okusama-kijyo.com,onecall2ch.com,onihimechan.com,orusoku.com,otakomu.jp,otoko-honne.com,oumaga-times.com,outdoormatome.com,pachinkopachisro.com,paranormal-ch.com,recosoku.com,s2-log.com,saikyo-jump.com,shuraba-matome.com,ske48matome.net,squallchannel.com,sukattojapan.com,sumaburayasan.com,sutekinakijo.com,usi32.com,uwakich.com,uwakitaiken.com,vault76.info,vipnews.jp,vippers.jp,vipsister23.com,vtubernews.jp,watarukiti.com,world-fusigi.net,zakuzaku911.com,zch-vip.com##^script:has-text(html-load.com) +! CultivateWP sites +amindfullmom.com,choosingchia.com,creativecanning.com,downshiftology.com,gardeninthekitchen.com,heygrillhey.com,loveinmyoven.com,modernhoney.com,mrmakeithappen.com,plainchicken.com,practicalselfreliance.com,sipandfeast.com,stellanspice.com,thecookierookie.com,thefoodcharlatan.com,tutti-dolci.com##^script:has-text(html-load.com) +! Minute Media +12thmanrising.com,allucanheat.com,aroundthefoghorn.com,arrowheadaddict.com,badgerofhonor.com,bamahammer.com,beargoggleson.com,beyondtheflag.com,birdswatcher.com,blackandteal.com,blogredmachine.com,bluemanhoop.com,boltbeat.com,bosoxinjection.com,buffalowdown.com,caneswarning.com,catcrave.com,chopchat.com,climbingtalshill.com,cubbiescrib.com,dailyknicks.com,dairylandexpress.com,dawgpounddaily.com,dawindycity.com,dawnofthedawg.com,detroitjockcity.com,dodgersway.com,ebonybird.com,fansided.com,flywareagle.com,gbmwolverine.com,gigemgazette.com,gmenhq.com,hailfloridahail.com,halohangout.com,hardwoodhoudini.com,horseshoeheroes.com,housethathankbuilt.com,huskercorner.com,insidetheiggles.com,jaysjournal.com,justblogbaby.com,kckingdom.com,kingjamesgospel.com,kingsofkauffman.com,lakeshowlife.com,lombardiave.com,mentalfloss.com,motorcitybengals.com,musketfire.com,nflspinzone.com,ninernoise.com,nugglove.com,onechicagocenter.com,phinphanatic.com,pistonpowered.com,predominantlyorange.com,ramblinfan.com,redbirdrants.com,reviewingthebrew.com,riggosrag.com,ripcityproject.com,risingapple.com,rumbunter.com,scarletandgame.com,section215.com,sidelionreport.com,slapthesign.com,sodomojo.com,southsideshowdown.com,stillcurtain.com,stormininnorman.com,stripehype.com,thatballsouttahere.com,thecelticbhoys.com,thejetpress.com,thelandryhat.com,thepewterplank.com,thesmokingcuban.com,thevikingage.com,thunderousintentions.com,undeadwalking.com,valleyofthesuns.com,whodatdish.com,winteriscoming.net,yanksgoyard.com##^script:has-text('"data-sdk"') +! PMC sites +ampav.com,artforum.com,artnews.com,atxtv.co,bgr.com,billboard.com,deadline.com,dickclark.com,footwearnews.com,goldderby.com,hollywoodreporter.com,indiewire.com,la3c.com,lifeisbeautiful.com,luminatedata.com,robbreport.com,rollingstone.com,shemedia.com,sourcingjournal.com,sportico.com,spy.com,sxsw.com,tvline.com,variety.com,vibe.com,wwd.com##^script[data-cfasync="false"][nowprocket] +ampav.com,artforum.com,artnews.com,atxtv.co,bgr.com,billboard.com,deadline.com,dickclark.com,footwearnews.com,goldderby.com,hollywoodreporter.com,indiewire.com,la3c.com,lifeisbeautiful.com,luminatedata.com,robbreport.com,rollingstone.com,shemedia.com,sourcingjournal.com,sportico.com,spy.com,sxsw.com,tvline.com,variety.com,vibe.com,wwd.com##^script[src*="html-load.com"] +ampav.com,artforum.com,artnews.com,atxtv.co,bgr.com,billboard.com,deadline.com,dickclark.com,footwearnews.com,goldderby.com,hollywoodreporter.com,indiewire.com,la3c.com,lifeisbeautiful.com,luminatedata.com,robbreport.com,rollingstone.com,shemedia.com,sourcingjournal.com,sportico.com,spy.com,sxsw.com,tvline.com,variety.com,vibe.com,wwd.com##^script:has-text(').join(String.fromCharCode') +! gutefrage.net sites +autofrage.net,computerfrage.net,finanzfrage.net,gesundheitsfrage.net,gutefrage.net,motorradfrage.net,reisefrage.net,sportlerfrage.net##^script[data-cfasync="false"][nowprocket] +! Bild group sites +autobild.de,bild.de,bz-berlin.de,computerbild.de,fitbook.de,fitbook-magazine.com,myhomebook.de,myhomebook-magazine.com,petbook.de,petbook-magazine.com,stylebook.de,techbook.de,techbook-magazine.com,travelbook.de,travelbook-magazine.com##^script:has-text(/\(\)=>eval|html-load\.com|await eval|:\[?window,/) +autobild.de,bild.de,bz-berlin.de,computerbild.de,fitbook.de,fitbook-magazine.com,myhomebook.de,myhomebook-magazine.com,petbook.de,petbook-magazine.com,stylebook.de,techbook.de,techbook-magazine.com,travelbook.de,travelbook-magazine.com##^script[onload*="error-report.com"] +autobild.de,bild.de,bz-berlin.de,computerbild.de,fitbook.de,fitbook-magazine.com,myhomebook.de,myhomebook-magazine.com,petbook.de,petbook-magazine.com,stylebook.de,techbook.de,techbook-magazine.com,travelbook.de,travelbook-magazine.com##^script[data-cfasync="false"][nowprocket] +! Postmedia group +calgaryherald.com,calgarysun.com,canada.com,canoe.com,driving.ca,edmontonjournal.com,edmontonsun.com,financialpost.com,intelligencer.ca,leaderpost.com,lfpress.com,montrealgazette.com,nationalpost.com,ontariofarmer.com,ottawacitizen.com,ottawasun.com,pembrokeobserver.com,standard-freeholder.com,thegrowthop.com,theprovince.com,thestarphoenix.com,thewhig.com,tj.news,torontosun.com,vancouversun.com,windsorstar.com,winnipegsun.com##^script:has-text(/\(\)=>eval|html-load\.com|await eval|:window/) +calgaryherald.com,calgarysun.com,canada.com,canoe.com,driving.ca,edmontonjournal.com,edmontonsun.com,financialpost.com,intelligencer.ca,leaderpost.com,lfpress.com,montrealgazette.com,nationalpost.com,ontariofarmer.com,ottawacitizen.com,ottawasun.com,pembrokeobserver.com,standard-freeholder.com,thegrowthop.com,theprovince.com,thestarphoenix.com,thewhig.com,tj.news,torontosun.com,vancouversun.com,windsorstar.com,winnipegsun.com##^script[onload*="error-report.com"] +calgaryherald.com,calgarysun.com,canada.com,canoe.com,driving.ca,edmontonjournal.com,edmontonsun.com,financialpost.com,intelligencer.ca,leaderpost.com,lfpress.com,montrealgazette.com,nationalpost.com,ontariofarmer.com,ottawacitizen.com,ottawasun.com,pembrokeobserver.com,standard-freeholder.com,thegrowthop.com,theprovince.com,thestarphoenix.com,thewhig.com,tj.news,torontosun.com,vancouversun.com,windsorstar.com,winnipegsun.com##^script[data-cfasync="false"][nowprocket] +! Prisma Media sites +caminteresse.fr,capital.fr,cotemaison.fr,croq-kilos.com,cuisineaz.com,deco.fr,femmeactuelle.fr,fourchette-et-bikini.fr,gamesider.com,geo.fr,harpersbazaar.fr,hbrfrance.fr,meteocity.com,passeportsante.net,programme.tv,programme-tv.net,turbo.fr,uppercutmma.com,voici.fr##^script[src*="html-load.com"] +caminteresse.fr,capital.fr,cotemaison.fr,croq-kilos.com,cuisineaz.com,deco.fr,femmeactuelle.fr,fourchette-et-bikini.fr,gamesider.com,geo.fr,harpersbazaar.fr,hbrfrance.fr,meteocity.com,passeportsante.net,programme.tv,programme-tv.net,turbo.fr,uppercutmma.com,voici.fr##^script:has-text(/\(\)=>eval|&&window\}/) +caminteresse.fr,capital.fr,cotemaison.fr,croq-kilos.com,cuisineaz.com,deco.fr,femmeactuelle.fr,fourchette-et-bikini.fr,gamesider.com,geo.fr,harpersbazaar.fr,hbrfrance.fr,meteocity.com,passeportsante.net,programme.tv,programme-tv.net,turbo.fr,uppercutmma.com,voici.fr##^script[data-cfasync="false"][nowprocket] +! Famed&Bound Media sites +gentside.*,maxisciences.com,ohmymag.*##^script[src*="html-load.com"] +gentside.*,maxisciences.com,ohmymag.*##^script:has-text(()=>eval) +gentside.*,maxisciences.com,ohmymag.*##^script[data-cfasync="false"] +! Iconic Media Group +3addedminutes.com,anguscountyworld.co.uk,banburyguardian.co.uk,bedfordtoday.co.uk,biggleswadetoday.co.uk,birminghamworld.uk,blackpoolgazette.co.uk,bristolworld.com,bucksherald.co.uk,burnleyexpress.net,buxtonadvertiser.co.uk,chad.co.uk,daventryexpress.co.uk,derbyshiretimes.co.uk,derbyworld.co.uk,derryjournal.com,dewsburyreporter.co.uk,dirtbikerider.com,doncasterfreepress.co.uk,donegallive.ie,expressandstar.com,falkirkherald.co.uk,farminglife.com,fifetoday.co.uk,glasgowworld.com,halifaxcourier.co.uk,harboroughmail.co.uk,harrogateadvertiser.co.uk,hartlepoolmail.co.uk,hemeltoday.co.uk,hucknalldispatch.co.uk,lancasterguardian.co.uk,leightonbuzzardonline.co.uk,lep.co.uk,limerickleader.ie,lincolnshireworld.com,liverpoolworld.uk,londonworld.com,lutontoday.co.uk,manchesterworld.uk,meltontimes.co.uk,miltonkeynes.co.uk,nationalworld.com,newcastleworld.com,newryreporter.com,newsletter.co.uk,northamptonchron.co.uk,northantstelegraph.co.uk,northdevongazette.co.uk,northernirelandworld.com,northumberlandgazette.co.uk,nottinghamworld.com,peterboroughtoday.co.uk,petersfieldpost.co.uk,portsmouth.co.uk,rotherhamadvertiser.co.uk,scotsman.com,shieldsgazette.com,shropshirestar.com,stornowaygazette.co.uk,sunderlandecho.com,surreyworld.co.uk,sussexexpress.co.uk,thescarboroughnews.co.uk,thesouthernreporter.co.uk,thestar.co.uk,totallysnookered.com,wakefieldexpress.co.uk,warwickshireworld.com,wigantoday.net,worksopguardian.co.uk,yorkshireeveningpost.co.uk,yorkshirepost.co.uk##^script[onload*="error-report.com"] +3addedminutes.com,anguscountyworld.co.uk,banburyguardian.co.uk,bedfordtoday.co.uk,biggleswadetoday.co.uk,birminghamworld.uk,blackpoolgazette.co.uk,bristolworld.com,bucksherald.co.uk,burnleyexpress.net,buxtonadvertiser.co.uk,chad.co.uk,daventryexpress.co.uk,derbyshiretimes.co.uk,derbyworld.co.uk,derryjournal.com,dewsburyreporter.co.uk,dirtbikerider.com,doncasterfreepress.co.uk,donegallive.ie,expressandstar.com,falkirkherald.co.uk,farminglife.com,fifetoday.co.uk,glasgowworld.com,halifaxcourier.co.uk,harboroughmail.co.uk,harrogateadvertiser.co.uk,hartlepoolmail.co.uk,hemeltoday.co.uk,hucknalldispatch.co.uk,lancasterguardian.co.uk,leightonbuzzardonline.co.uk,lep.co.uk,limerickleader.ie,lincolnshireworld.com,liverpoolworld.uk,londonworld.com,lutontoday.co.uk,manchesterworld.uk,meltontimes.co.uk,miltonkeynes.co.uk,nationalworld.com,newcastleworld.com,newryreporter.com,newsletter.co.uk,northamptonchron.co.uk,northantstelegraph.co.uk,northdevongazette.co.uk,northernirelandworld.com,northumberlandgazette.co.uk,nottinghamworld.com,peterboroughtoday.co.uk,petersfieldpost.co.uk,portsmouth.co.uk,rotherhamadvertiser.co.uk,scotsman.com,shieldsgazette.com,shropshirestar.com,stornowaygazette.co.uk,sunderlandecho.com,surreyworld.co.uk,sussexexpress.co.uk,thescarboroughnews.co.uk,thesouthernreporter.co.uk,thestar.co.uk,totallysnookered.com,wakefieldexpress.co.uk,warwickshireworld.com,wigantoday.net,worksopguardian.co.uk,yorkshireeveningpost.co.uk,yorkshirepost.co.uk##^script[data-cfasync="false"][nowprocket] +3addedminutes.com,anguscountyworld.co.uk,banburyguardian.co.uk,bedfordtoday.co.uk,biggleswadetoday.co.uk,birminghamworld.uk,blackpoolgazette.co.uk,bristolworld.com,bucksherald.co.uk,burnleyexpress.net,buxtonadvertiser.co.uk,chad.co.uk,daventryexpress.co.uk,derbyshiretimes.co.uk,derbyworld.co.uk,derryjournal.com,dewsburyreporter.co.uk,dirtbikerider.com,doncasterfreepress.co.uk,donegallive.ie,expressandstar.com,falkirkherald.co.uk,farminglife.com,fifetoday.co.uk,glasgowworld.com,halifaxcourier.co.uk,harboroughmail.co.uk,harrogateadvertiser.co.uk,hartlepoolmail.co.uk,hemeltoday.co.uk,hucknalldispatch.co.uk,lancasterguardian.co.uk,leightonbuzzardonline.co.uk,lep.co.uk,limerickleader.ie,lincolnshireworld.com,liverpoolworld.uk,londonworld.com,lutontoday.co.uk,manchesterworld.uk,meltontimes.co.uk,miltonkeynes.co.uk,nationalworld.com,newcastleworld.com,newryreporter.com,newsletter.co.uk,northamptonchron.co.uk,northantstelegraph.co.uk,northdevongazette.co.uk,northernirelandworld.com,northumberlandgazette.co.uk,nottinghamworld.com,peterboroughtoday.co.uk,petersfieldpost.co.uk,portsmouth.co.uk,rotherhamadvertiser.co.uk,scotsman.com,shieldsgazette.com,shropshirestar.com,stornowaygazette.co.uk,sunderlandecho.com,surreyworld.co.uk,sussexexpress.co.uk,thescarboroughnews.co.uk,thesouthernreporter.co.uk,thestar.co.uk,totallysnookered.com,wakefieldexpress.co.uk,warwickshireworld.com,wigantoday.net,worksopguardian.co.uk,yorkshireeveningpost.co.uk,yorkshirepost.co.uk##^script:has-text(await eval) +! Cars forums sites +4runner6g.com,bronco6g.com,broncosportforum.com,camaro7g.com,cayenneevforum.com,civicxi.com,cybertruckownersclub.com,dakotaforums.com,ev3forums.com,f150gen14.com,f150lightningforum.com,integraforums.com,jeepgladiatorforum.com,jeepreconforum.com,jlwranglerforums.com,macanevowners.com,macheforum.com,mavericktruckclub.com,mustang6g.com,mustang7g.com,nissanzclub.com,rancheroforum.com,ranger5g.com,ranger6g.com,rivianforums.com,scoutevforum.com,slateforums.com,supramkv.com,tacoma4g.com,taycanforum.com,xterraforum.com##^script[src*="html-load.com"] +4runner6g.com,bronco6g.com,broncosportforum.com,camaro7g.com,cayenneevforum.com,civicxi.com,cybertruckownersclub.com,dakotaforums.com,ev3forums.com,f150gen14.com,f150lightningforum.com,integraforums.com,jeepgladiatorforum.com,jeepreconforum.com,jlwranglerforums.com,macanevowners.com,macheforum.com,mavericktruckclub.com,mustang6g.com,mustang7g.com,nissanzclub.com,rancheroforum.com,ranger5g.com,ranger6g.com,rivianforums.com,scoutevforum.com,slateforums.com,supramkv.com,tacoma4g.com,taycanforum.com,xterraforum.com##^script:has-text(/:window,|\)\.join\(String\.fromCharCode/) +4runner6g.com,bronco6g.com,broncosportforum.com,camaro7g.com,cayenneevforum.com,civicxi.com,cybertruckownersclub.com,dakotaforums.com,ev3forums.com,f150gen14.com,f150lightningforum.com,integraforums.com,jeepgladiatorforum.com,jeepreconforum.com,jlwranglerforums.com,macanevowners.com,macheforum.com,mavericktruckclub.com,mustang6g.com,mustang7g.com,nissanzclub.com,rancheroforum.com,ranger5g.com,ranger6g.com,rivianforums.com,scoutevforum.com,slateforums.com,supramkv.com,tacoma4g.com,taycanforum.com,xterraforum.com##^script[data-cfasync="false"][nowprocket] +! .lt sites +aina.lt,alfa.lt,alkas.lt,alytusplius.lt,anyksta.lt,befa.lt,bilis.lt,etaplius.lt,manonamai.lt,mmm.lt,raskakcija.lt,ublika.lt,sekunde.lt,tv3.lt##^script:has-text(html-load.com) +! Network N Media sites +pcgamebenchmark.com,pcgamesn.com,pockettactics.com,wargamer.com##^script[src*="html-load.com"] +pcgamebenchmark.com,pcgamesn.com,pockettactics.com,wargamer.com##^script:has-text(()=>eval) +pcgamebenchmark.com,pcgamesn.com,pockettactics.com,wargamer.com##^script[data-cfasync="false"][nowprocket] +! Medium Large Sports Media +dodgerblue.com##^script:has-text(error-report.com) +! Future PLC sites +advnture.com,androidcentral.com,avnetwork.com,bikeperfect.com,cinemablend.com,countrylife.co.uk,creativebloq.com,cyclingnews.com,cyclingweekly.com,decanter.com,digitalcameraworld.com,discover.futureplc.com,fitandwell.com,fourfourtwo.com,gamesradar.com,gardeningknowhow.com,golfmonthly.com,goodto.com,guitarplayer.com,guitarworld.com,homebuilding.co.uk,homesandgardens.com,idealhome.co.uk,imore.com,itpro.com,kiplinger.com,laptopmag.com,livescience.com,livingetc.com,loudersound.com,marieclaire.co.uk,marieclaire.com,moneyweek.com,musicradar.com,nexttv.com,pcgamer.com,realhomes.com,shortlist.com,space.com,t3.com,techlearning.com,techradar.com,theweek.com,tomsguide.com,tomshardware.com,toptenreviews.com,tvtechnology.com,wallpaper.com,whathifi.com,whattowatch.com,whowhatwear.com,windowscentral.com,womanandhome.com##^script:has-text(html-load.com) +! Mexican Lottery sites +melaterevancha.com,resultadostris.com##^script[onload*="error-report.com"] +melaterevancha.com,resultadostris.com##^script:has-text(await eval) +melaterevancha.com,resultadostris.com##^script[data-cfasync="false"][nowprocket] +! Motorsport network / Kotsu Times Sha Co. +automesseweb.jp,autosport.com,insideevs.com,motor1.com,motorsport.com,motorsportjobs.com,motorsportstats.com,powerwatch.jp,rideapart.com,webcartop.jp##^script:has-text(html-load.com) +! Pijper Media +faitsfizzle.fr,fizzlefacts.com,fizzlefakten.de,hechosfizzle.com##^script[onload*="error-report.com"] +faitsfizzle.fr,fizzlefacts.com,fizzlefakten.de,hechosfizzle.com##^script[data-cfasync="false"][nowprocket] +faitsfizzle.fr,fizzlefacts.com,fizzlefakten.de,hechosfizzle.com##^script:has-text(await eval) +consejosytrucos.co,conselhosetruques.com,consiglietrucchi.com,poradyiwskazowki.pl,tippsundtricks.co,tips-and-tricks.co,tipsandtricksarab.com,tipsandtricksjapan.com,tipsandtrickskorea.com,tipsenweetjes.nl,trucs-et-astuces.co##^script[onload*="error-report.com"] +consejosytrucos.co,conselhosetruques.com,consiglietrucchi.com,poradyiwskazowki.pl,tippsundtricks.co,tips-and-tricks.co,tipsandtricksarab.com,tipsandtricksjapan.com,tipsandtrickskorea.com,tipsenweetjes.nl,trucs-et-astuces.co##^script[data-cfasync="false"][nowprocket] +consejosytrucos.co,conselhosetruques.com,consiglietrucchi.com,poradyiwskazowki.pl,tippsundtricks.co,tips-and-tricks.co,tipsandtricksarab.com,tipsandtricksjapan.com,tipsandtrickskorea.com,tipsenweetjes.nl,trucs-et-astuces.co##^script:has-text(await eval) +! Infoplaza +buienalarm.be,buienalarm.nl,meteoradar.co.uk,meteox.com,niederschlagsradar.de,sat24.com,weerplaza.nl,weerslag.nl##^script[src*="html-load.com"] +buienalarm.be,buienalarm.nl,meteoradar.co.uk,meteox.com,niederschlagsradar.de,sat24.com,weerplaza.nl,weerslag.nl##^script[data-cfasync="false"][nowprocket] +buienalarm.be,buienalarm.nl,meteoradar.co.uk,meteox.com,niederschlagsradar.de,sat24.com,weerslag.nl##^script:has-text(/\)\.join\(String\.fromCharCode|siteActivateScripts/) +weerplaza.nl##^script:has-text(/:\[?window,/) +! AppMind +fmradiofree.com,internetradio-horen.de,radio-australia.org,radio-danmark.dk,radio-hrvatska.com,radio-norge.org,radio-osterreich.at##^script[src*="html-load.com"] +fmradiofree.com,internetradio-horen.de,radio-australia.org,radio-danmark.dk,radio-hrvatska.com,radio-norge.org,radio-osterreich.at##^script[data-cfasync="false"][nowprocket] +fmradiofree.com,internetradio-horen.de,radio-australia.org,radio-danmark.dk,radio-hrvatska.com,radio-norge.org,radio-osterreich.at##^script:has-text(/\)\.join\(String\.fromCharCode|html-load\.com/) +! LADbible group +gamingbible.com,ladbible.com,sportbible.com,thecontentbible.com,tyla.com,unilad.com##^script:has-text('"nowprocket"') +! Notebookcheck +notebookcheck.*,notebookcheck-cn.com,notebookcheck-hu.com,notebookcheck-ru.com,notebookcheck-tr.com##^script[data-cfasync="false"][nowprocket] +notebookcheck.*,notebookcheck-cn.com,notebookcheck-hu.com,notebookcheck-ru.com,notebookcheck-tr.com##^script[src*="html-load.com"] +notebookcheck.*,notebookcheck-cn.com,notebookcheck-hu.com,notebookcheck-ru.com,notebookcheck-tr.com##^script:has-text(&&window,) +! Mediavague +bike-news.jp,egolf.jp,kuruma-news.jp,lasisa.net,magmix.jp,merkmal-biz.jp,otonanswer.jp,trafficnews.jp,vague.style##^script[src*="html-load.com"] +bike-news.jp,egolf.jp,kuruma-news.jp,lasisa.net,magmix.jp,merkmal-biz.jp,otonanswer.jp,trafficnews.jp,vague.style##^script[data-cfasync="false"][nowprocket] +bike-news.jp,egolf.jp,kuruma-news.jp,lasisa.net,magmix.jp,merkmal-biz.jp,otonanswer.jp,trafficnews.jp,vague.style##^script:has-text(').join(String.fromCharCode') +! AllGear Digital +bikerumor.com,explorersweb.com,gearjunkie.com,irunfar.com,packhacker.com,switchbacktravel.com,theinertia.com,wildsnow.com##^script[src*="html-load.com"] +bikerumor.com,explorersweb.com,gearjunkie.com,irunfar.com,packhacker.com,switchbacktravel.com,theinertia.com,wildsnow.com##^script[data-cfasync="false"][nowprocket] +bikerumor.com,explorersweb.com,gearjunkie.com,irunfar.com,packhacker.com,switchbacktravel.com,theinertia.com,wildsnow.com##^script:has-text(').join(String.fromCharCode') +!#else +interfootball.co.kr,a-ha.io,cboard.net,joongdo.co.kr,viva100.com,maketecheasier.com,tweaksforgeeks.com,m.inven.co.kr,mlbpark.donga.com##+js(rmnt, script, KCgpPT57bGV0IGU) +bleepingcomputer.com,pravda.com.ua##+js(rmnt, script, Ad-Shield) +ap7am.com,cinema.com.my,dolldivine.com,giornalone.it,iplocation.net,jamaicajawapos.com,jutarnji.hr,kompasiana.com,mediaindonesia.com,niice-woker.com,pep.ph,slobodnadalmacija.hr,upmedia.mg##+js(rmnt, script, adrecover.com) +cinema.com.my##+js(trusted-suppress-native-method, Element.prototype.setAttribute, '"data-sdk"', abort) +winfuture.de##+js(aeld, load, error-report.com) +wetter.com##+js(rmnt, script, /wcomAdBlock|error-report\.com/) +neowin.net,newatlas.com,nextchessmove.com,razzball.com##+js(rmnt, script, head.appendChild.bind) +dnevnik.hr,neowin.net,newatlas.com,razzball.com##+js(rmnt, script, '/^\(async\(\)=>\{function.{1,200}head.{1,100}\.bind.{1,900}location\.href.{1,100}\}\)\(\);$/') +deadline.com,divinedaolibrary.com,doviz.com,hollywoodlife.com,lejdd.fr,scribd.com,slideshare.net,songfacts.com,thelayoff.com,tips-and-tricks.co,wwd.com##+js(rmnt, script, /\(async\s*\(\)\s*=>\s*\{\s*try\s*\{\s*(const|var)/) +si.com##+js(rmnt, script, '"https://html-load.com/loader.min.js"') +akinator.com,and-more.co,astro-seek.com,autofrage.net,bab.la,babla.*,boardingarea.com,collinsdictionary.com,conselhosetruques.com,computerfrage.net,dictionary.cambridge.org,dictionnaire.lerobert.com,dnevnik.hr,egitim.net.tr,exceljet.net,finanzfrage.net,freemcserver.net,gesundheitsfrage.net,gezondnu.nl,gutefrage.net,happyinshape.com,houseandgarden.co,infinityfree.com,ldoceonline.com,liveandletsfly.com,mamastar.jp,motorradfrage.net,neoseeker.com,newatlas.com,oxfordlearnersdictionaries.com,pinterpoin.com,pons.com,reisefrage.net,sinemalar.com,sportlerfrage.net,torontosun.com,toyokeizai.net,travelingformiles.com,usaudiomart.com,welt.de##+js(rmnt, script, await eval) +9gag.com,augustacrime.com,base64decode.org,calculatorsoup.com,canuckaudiomart.com,costcoinsider.com,crosswordsolver.com,dict.cc,elnacional.cat,girlschannel.net,itavisen.no,kreuzwortraetsel.de,lettersolver.com,livescience.com,lootlemon.com,merinfo.se,motscroises.fr,mrexcel.com,nemzetisport.hu,oeffnungszeitenbuch.de,oraridiapertura24.it,pinterpoin.com,ppatour.com,rotowire.com,the-crossword-solver.com,tvtv.ca,tvtv.us,ukaudiomart.com,urldecoder.org,watchdocumentaries.com,word-grabber.com,wort-suchen.de##+js(rmnt, script, ()=>eval) +buchstaben.com,nemzetisport.hu##+js(rmnt, script, () => eval) +9gag.com,adrenaline.com.br,automobile-catalog.com,calculatorsoup.com,culturequizz.com,euronews.com,fandom.com,game8.jp,gerbeaud.com,gutefrage.net,motorbikecatalog.com,namemc.com,nikkansports.com,onemileatatime.com,thetorquereport.com,urbandictionary.com,welt.de,wordshake.com##+js(rmnt, script, '/:\[?window,/') +mamastar.jp##+js(rmnt, script, : window\,) +km77.com##+js(rmnt, script, await new Promise) +km77.com,onlineradiobox.com,timeful.app,willyweather.*##+js(rmnt, script, &&window\,) +automobile-catalog.com,hna.de,index.hr,motorbikecatalog.com,skinmc.net##+js(rmnt, script, \,window]) +9gag.com,animalia.bio,daveockop.com,doviz.com,looopings.nl,pakkotoisto.com,worldjournal.com##+js(rmnt, script, void 0||window\,) +greenwichmeantime.com,higherorlowergame.com##+js(rmnt, script, void 0 || window\,) +freemcserver.net##+js(rmnt, script, window\,void 0) +base64decode.org,fandom.com,gamewith.jp,sms24.me,urldecoder.org##+js(rmnt, script, ').join(String.fromCharCode') +singjupost.com##+js(rmnt, script, domain=?eventId=&error=) +helpdeskgeek.com##+js(rmnt, script, ;confirm() +thingiverse.com##+js(rmnt, script, /:\"length\"\}\);$/) +sparkchess.com##+js(rmnt, script, html-load.cc) +brawlytix.com##+js(rmnt, script, nowprocket) +savvytime.com##+js(rmnt, script, '"nowprocket"') +scribd.com##+js(rmnt, script, adShieldError) +1geki.jp,373news.com,50states.com,actugaming.net,aerotrader.com,alc.co.jp,altarofgaming.com,anagram-solver.io,areaconnect.com,as-web.jp,atvtrader.com,aucfree.com,autoby.jp,autoc-one.jp,autofrage.net,automobile-catalog.com,bab.la,babla.*,baseballchannel.jp,buchstaben.com,cadryskitchen.com,cafedelites.com,calculatorsoup.com,carscoops.com,campsitephotos.com,canarystreetcrafts.com,celebritynetworth.com,cesoirtv.com,chanto.jp.net,chef-in-training.com,chocolatecoveredkatie.com,cinetrafic.fr,collinsdictionary.com,commercialtrucktrader.com,computerfrage.net,convertcase.net,crosswordsolver.com,culturequizz.com,curbsideclassic.com,cycletrader.com,dallashoopsjournal.com,dayspedia.com,dexerto.com,dict.cc,dictionary.cambridge.org,dictionnaire.lerobert.com,dnevno.hr,donbalon.com,driveteslacanada.ca,dropgame.jp,ecranlarge.com,eigachannel.jp,equipmenttrader.com,ev-times.com,finanzfrage.net,fixthecfaa.com,flagle.io,footballchannel.jp,freeconvert.com,freemcserver.net,freeride.com,futabanet.jp,futabasha-change.com,fxstreet-id.com,fxstreet-vn.com,fxstreet.*,game8.jp,games.arkadium.com,gamewith.jp,gazetaprawna.pl,geogridgame.com,geoguessr.com,gerbeaud.com,gesundheitsfrage.net,gifu-np.co.jp,gigafile.nu,globalrph.com,golf-live.at,grapee.jp,gutefrage.net,hang.hu,happymoments.lol,harmonikum.co,hb-nippon.com,heureka.cz,hochi.news,horairesdouverture24.fr,hotcopper.co.nz,hotcopper.com.au,hvac-talk.com,ib-game.jp,idokep.hu,indianhealthyrecipes.com,indiatimes.com,infor.pl,insider-gaming.com,invoice-generator.com,iphoneincanada.ca,iza.ne.jp,j-cast.com,j-town.net,j7p.jp,jablickar.cz,javatpoint.com,jigsawexplorer.com,jiji.com,jikayosha.jp,jocjapantravel.com,judgehype.com,kinmaweb.jp,km77.com,kobe-journal.com,krepsinis.net,kreuzwortraetsel.de,kstp.com,kurashinista.jp,kyoteibiyori.com,lacuarta.com,lacuarta.com,laleggepertutti.it,langenscheidt.com,laposte.net,laughingsquid.com,lawyersgunsmoneyblog.com,ldoceonline.com,lessdebt.com,lettersolver.com,liliputing.com,listentotaxman.com,livenewschat.eu,logicieleducatif.fr,luremaga.jp,mafab.hu,mahjongchest.com,mainichi.jp,majorleaguepickleball.co,maketecheasier.com,malaymail.com,mamastar.jp,marineinsight.com,mathplayzone.com,meteo60.fr,midhudsonnews.com,minesweeperquest.com,minkou.jp,modhub.us,modsbase.com,modsfire.com,moin.de,motor-fan.jp,motorbikecatalog.com,motorradfrage.net,motscroises.fr,movie-locations.com,muragon.com,mykoreankitchen.com,namemc.com,nana-press.com,natalie.mu,nationaltoday.com,nbadraft.net,newatlas.com,news.zerkalo.io,newsinlevels.com,newsweekjapan.jp,newsyou.info,niketalk.com,nintendoeverything.com,nlab.itmedia.co.jp,noorderland.nl,nouvelobs.com,nyitvatartas24.hu,oeffnungszeitenbuch.de,onlineradiobox.com,operawire.com,optionsprofitcalculator.com,oraridiapertura24.it,overclock.net,oxfordlearnersdictionaries.com,palabr.as,pashplus.jp,percentagecalculator.net,persoenlich.com,petitfute.com,petitrobert.fr,play-games.com,pllive.xmediaeg.com,pons.com,popdaily.com.tw,powerpyx.com,pptvhd36.com,profitline.hu,puzzlegarage.com,pwctrader.com,quefaire.be,raetsel-hilfe.de,raider.io,ranking.net,rarethief.com,references.be,reisefrage.net,relevantmagazine.com,reptilesmagazine.com,roleplayer.me,rostercon.com,russianmachineneverbreaks.com,rvtrader.com,samsungmagazine.eu,sankei.com,sanspo.com,scribens.com,scribens.fr,siennachat.com,skyandtelescope.org,slashdot.org,snowmobiletrader.com,soccerdigestweb.com,solitairehut.com,sourceforge.net,southhemitv.com,soxprospects.com,spaghetti-interactive.it,speisekarte.de,spendwithpennies.com,sportalkorea.com,sportlerfrage.net,statecollege.com,stayglam.com,steamidfinder.com,stocktwits.com,sudokutable.com,superhonda.com,syosetu.com,szamoldki.hu,talkwithstranger.com,tastesbetterfromscratch.com,tbs.co.jp,techdico.com,the-crossword-solver.com,thecelticblog.com,thedigestweb.com,thefirearmblog.com,traicy.com,transparentcalifornia.com,transparentnevada.com,trilltrill.jp,tunebat.com,tvtv.ca,tvtv.us,tweaktown.com,twn.hu,tyda.se,ufret.jp,universalis.fr,uptodown.com,uscreditcardguide.com,v8sleuth.com.au,verkaufsoffener-sonntag.com,videocelts.com,vimm.net,wallpapers.com,wamgame.jp,wanderworthy.com,watchdocumentaries.com,wattedoen.be,wdwnt.com,wdwnt.jp,webdesignledger.com,weldingweb.com,welt.de,wetteronline.de,wfmz.com,whec.com,wieistmeineip.*,wielerflits.be,wielerflits.nl,winbuzzer.com,winfuture.de,word-grabber.com,wordfinderx.com,wordhippo.com,worldjournal.com,worldle.teuteuf.fr,wort-suchen.de,woxikon.*,young-machine.com,yugioh-starlight.com,yutura.net,zagreb.info,zakzak.co.jp##+js(rmnt, script, html-load.com) +! livedoor-sites +2chblog.jp,2monkeys.jp,46matome.net,akb48glabo.com,akb48matomemory.com,alfalfalfa.com,all-nationz.com,anihatsu.com,aqua2ch.net,blog.esuteru.com,blog.livedoor.jp,blog.jp,blogo.jp,chaos2ch.com,choco0202.work,crx7601.com,danseisama.com,dareda.net,digital-thread.com,doorblog.jp,exawarosu.net,fgochaldeas.com,football-2ch.com,gekiyaku.com,golog.jp,hacchaka.net,heartlife-matome.com,liblo.jp,fesoku.net,fiveslot777.com,gamejksokuhou.com,girlsreport.net,girlsvip-matome.com,grasoku.com,gundamlog.com,honyaku-channel.net,ikarishintou.com,imas-cg.net,imihu.net,inutomo11.com,itainews.com,itaishinja.com,jin115.com,jisaka.com,jnews1.com,jumpsokuhou.com,jyoseisama.com,keyakizaka46matomemory.net,kidan-m.com,kijoden.com,kijolariat.net,kijolifehack.com,kijomatomelog.com,kijyokatu.com,kijyomatome.com,kijyomatome-ch.com,kijyomita.com,kirarafan.com,kitimama-matome.net,kitizawa.com,konoyubitomare.jp,kotaro269.com,kyousoku.net,ldblog.jp,livedoor.biz,livedoor.blog,majikichi.com,matacoco.com,matomeblade.com,matomelotte.com,matometemitatta.com,mojomojo-licarca.com,morikinoko.com,nandemo-uketori.com,netatama.net,news-buzz1.com,news30over.com,nishinippon.co.jp,nmb48-mtm.com,norisoku.com,npb-news.com,ocsoku.com,okusama-kijyo.com,onecall2ch.com,onihimechan.com,orusoku.com,otakomu.jp,otoko-honne.com,oumaga-times.com,outdoormatome.com,pachinkopachisro.com,paranormal-ch.com,recosoku.com,s2-log.com,saikyo-jump.com,shuraba-matome.com,ske48matome.net,squallchannel.com,sukattojapan.com,sumaburayasan.com,sutekinakijo.com,usi32.com,uwakich.com,uwakitaiken.com,vault76.info,vipnews.jp,vippers.jp,vipsister23.com,vtubernews.jp,watarukiti.com,world-fusigi.net,zakuzaku911.com,zch-vip.com##+js(rmnt, script, html-load.com) +! CultivateWP sites +amindfullmom.com,choosingchia.com,creativecanning.com,downshiftology.com,gardeninthekitchen.com,heygrillhey.com,loveinmyoven.com,modernhoney.com,mrmakeithappen.com,plainchicken.com,practicalselfreliance.com,sipandfeast.com,stellanspice.com,thecookierookie.com,thefoodcharlatan.com,tutti-dolci.com##+js(rmnt, script, html-load.com) +! Minute Media +12thmanrising.com,allucanheat.com,aroundthefoghorn.com,arrowheadaddict.com,badgerofhonor.com,bamahammer.com,beargoggleson.com,beyondtheflag.com,birdswatcher.com,blackandteal.com,blogredmachine.com,bluemanhoop.com,boltbeat.com,bosoxinjection.com,buffalowdown.com,caneswarning.com,catcrave.com,chopchat.com,climbingtalshill.com,cubbiescrib.com,dailyknicks.com,dairylandexpress.com,dawgpounddaily.com,dawindycity.com,dawnofthedawg.com,detroitjockcity.com,dodgersway.com,ebonybird.com,fansided.com,flywareagle.com,gbmwolverine.com,gigemgazette.com,gmenhq.com,hailfloridahail.com,halohangout.com,hardwoodhoudini.com,horseshoeheroes.com,housethathankbuilt.com,huskercorner.com,insidetheiggles.com,jaysjournal.com,justblogbaby.com,kckingdom.com,kingjamesgospel.com,kingsofkauffman.com,lakeshowlife.com,lombardiave.com,mentalfloss.com,motorcitybengals.com,musketfire.com,nflspinzone.com,ninernoise.com,nugglove.com,onechicagocenter.com,phinphanatic.com,pistonpowered.com,predominantlyorange.com,ramblinfan.com,redbirdrants.com,reviewingthebrew.com,riggosrag.com,ripcityproject.com,risingapple.com,rumbunter.com,scarletandgame.com,section215.com,sidelionreport.com,slapthesign.com,sodomojo.com,southsideshowdown.com,stillcurtain.com,stormininnorman.com,stripehype.com,thatballsouttahere.com,thecelticbhoys.com,thejetpress.com,thelandryhat.com,thepewterplank.com,thesmokingcuban.com,thevikingage.com,thunderousintentions.com,undeadwalking.com,valleyofthesuns.com,whodatdish.com,winteriscoming.net,yanksgoyard.com##+js(rmnt, script, '"data-sdk"') +! PMC sites +ampav.com,artforum.com,artnews.com,atxtv.co,bgr.com,billboard.com,deadline.com,dickclark.com,footwearnews.com,goldderby.com,hollywoodreporter.com,indiewire.com,la3c.com,lifeisbeautiful.com,luminatedata.com,robbreport.com,rollingstone.com,shemedia.com,sourcingjournal.com,sportico.com,spy.com,sxsw.com,tvline.com,variety.com,vibe.com,wwd.com##+js(rmnt, script, ').join(String.fromCharCode') +! Medium Large Sports Media +dodgerblue.com##+js(rmnt, script, error-report.com) +||azerion.com^ +||restomp-excity.online^ +! Bild group sites +autobild.de,bild.de,bz-berlin.de,computerbild.de,fitbook.de,fitbook-magazine.com,myhomebook.de,myhomebook-magazine.com,petbook.de,petbook-magazine.com,stylebook.de,techbook.de,techbook-magazine.com,travelbook.de,travelbook-magazine.com##+js(rmnt, script, '/\(\)=>eval|html-load\.com|await eval|:\[?window,/') +! Postmedia group +calgaryherald.com,calgarysun.com,canada.com,canoe.com,driving.ca,edmontonjournal.com,edmontonsun.com,financialpost.com,intelligencer.ca,leaderpost.com,lfpress.com,montrealgazette.com,nationalpost.com,ontariofarmer.com,ottawacitizen.com,ottawasun.com,pembrokeobserver.com,standard-freeholder.com,thegrowthop.com,theprovince.com,thestarphoenix.com,thewhig.com,tj.news,torontosun.com,vancouversun.com,windsorstar.com,winnipegsun.com##+js(rmnt, script, /\(\)=>eval|html-load\.com|await eval|:window/) +! Prisma Media sites +caminteresse.fr,capital.fr,cotemaison.fr,croq-kilos.com,cuisineaz.com,deco.fr,femmeactuelle.fr,fourchette-et-bikini.fr,gamesider.com,geo.fr,harpersbazaar.fr,hbrfrance.fr,meteocity.com,passeportsante.net,programme.tv,programme-tv.net,turbo.fr,uppercutmma.com,voici.fr##+js(rmnt, script, /\(\)=>eval|&&window\}/) +! Famed&Bound Media sites +gentside.*,maxisciences.com,ohmymag.*##+js(rmnt, script, ()=>eval) +! Iconic Media Group +3addedminutes.com,anguscountyworld.co.uk,banburyguardian.co.uk,bedfordtoday.co.uk,biggleswadetoday.co.uk,birminghamworld.uk,blackpoolgazette.co.uk,bristolworld.com,bucksherald.co.uk,burnleyexpress.net,buxtonadvertiser.co.uk,chad.co.uk,daventryexpress.co.uk,derbyshiretimes.co.uk,derbyworld.co.uk,derryjournal.com,dewsburyreporter.co.uk,dirtbikerider.com,doncasterfreepress.co.uk,donegallive.ie,expressandstar.com,falkirkherald.co.uk,farminglife.com,fifetoday.co.uk,glasgowworld.com,halifaxcourier.co.uk,harboroughmail.co.uk,harrogateadvertiser.co.uk,hartlepoolmail.co.uk,hemeltoday.co.uk,hucknalldispatch.co.uk,lancasterguardian.co.uk,leightonbuzzardonline.co.uk,lep.co.uk,limerickleader.ie,lincolnshireworld.com,liverpoolworld.uk,londonworld.com,lutontoday.co.uk,manchesterworld.uk,meltontimes.co.uk,miltonkeynes.co.uk,nationalworld.com,newcastleworld.com,newryreporter.com,newsletter.co.uk,northamptonchron.co.uk,northantstelegraph.co.uk,northdevongazette.co.uk,northernirelandworld.com,northumberlandgazette.co.uk,nottinghamworld.com,peterboroughtoday.co.uk,petersfieldpost.co.uk,portsmouth.co.uk,rotherhamadvertiser.co.uk,scotsman.com,shieldsgazette.com,shropshirestar.com,stornowaygazette.co.uk,sunderlandecho.com,surreyworld.co.uk,sussexexpress.co.uk,thescarboroughnews.co.uk,thesouthernreporter.co.uk,thestar.co.uk,totallysnookered.com,wakefieldexpress.co.uk,warwickshireworld.com,wigantoday.net,worksopguardian.co.uk,yorkshireeveningpost.co.uk,yorkshirepost.co.uk##+js(rmnt, script, await eval) +! Cars forums sites +4runner6g.com,bronco6g.com,broncosportforum.com,camaro7g.com,cayenneevforum.com,civicxi.com,cybertruckownersclub.com,dakotaforums.com,ev3forums.com,f150gen14.com,f150lightningforum.com,integraforums.com,jeepgladiatorforum.com,jeepreconforum.com,jlwranglerforums.com,macanevowners.com,macheforum.com,mavericktruckclub.com,mustang6g.com,mustang7g.com,nissanzclub.com,rancheroforum.com,ranger5g.com,ranger6g.com,rivianforums.com,scoutevforum.com,slateforums.com,supramkv.com,tacoma4g.com,taycanforum.com,xterraforum.com##+js(rmnt, script, '/:window,|\)\.join\(String\.fromCharCode/') +! .lt sites +aina.lt,alfa.lt,alkas.lt,alytusplius.lt,anyksta.lt,befa.lt,bilis.lt,etaplius.lt,manonamai.lt,mmm.lt,raskakcija.lt,respublika.lt,sekunde.lt,tv3.lt##+js(rmnt, script, html-load.com) +! Network N Media sites +pcgamebenchmark.com,pcgamesn.com,pockettactics.com,wargamer.com##+js(rmnt, script, ()=>eval) +! Future PLC sites +advnture.com,androidcentral.com,avnetwork.com,bikeperfect.com,cinemablend.com,countrylife.co.uk,creativebloq.com,cyclingnews.com,cyclingweekly.com,decanter.com,digitalcameraworld.com,discover.futureplc.com,fitandwell.com,fourfourtwo.com,gamesradar.com,gardeningknowhow.com,golfmonthly.com,goodto.com,guitarplayer.com,guitarworld.com,homebuilding.co.uk,homesandgardens.com,idealhome.co.uk,imore.com,itpro.com,kiplinger.com,laptopmag.com,livescience.com,livingetc.com,loudersound.com,marieclaire.co.uk,marieclaire.com,moneyweek.com,musicradar.com,nexttv.com,pcgamer.com,realhomes.com,shortlist.com,space.com,t3.com,techlearning.com,techradar.com,theweek.com,tomsguide.com,tomshardware.com,toptenreviews.com,tvtechnology.com,wallpaper.com,whathifi.com,whattowatch.com,whowhatwear.com,windowscentral.com,womanandhome.com##+js(rmnt, script, html-load.com) +! Mexican Lottery sites +melaterevancha.com,resultadostris.com##+js(rmnt, script, await eval) +! Motorsport network / Kotsu Times Sha Co. +automesseweb.jp,autosport.com,insideevs.com,motor1.com,motorsport.com,motorsportjobs.com,motorsportstats.com,powerwatch.jp,rideapart.com,webcartop.jp##+js(rmnt, script, html-load.com) +! Pijper Media +faitsfizzle.fr,fizzlefacts.com,fizzlefakten.de,hechosfizzle.com##+js(rmnt, script, await eval) +consejosytrucos.co,conselhosetruques.com,consiglietrucchi.com,poradyiwskazowki.pl,tippsundtricks.co,tips-and-tricks.co,tipsandtricksarab.com,tipsandtricksjapan.com,tipsandtrickskorea.com,tipsenweetjes.nl,trucs-et-astuces.co##+js(rmnt, script, await eval) +! Infoplaza +buienalarm.be,buienalarm.nl,meteoradar.co.uk,meteox.com,niederschlagsradar.de,sat24.com,weerslag.nl##+js(rmnt, script, /\)\.join\(String\.fromCharCode|siteActivateScripts/) +weerplaza.nl##+js(rmnt, script, '/:\[?window,/') +! AppMind +fmradiofree.com,internetradio-horen.de,radio-australia.org,radio-danmark.dk,radio-hrvatska.com,radio-norge.org,radio-osterreich.at##+js(rmnt, script, /\)\.join\(String\.fromCharCode|html-load\.com/) +! LADbible group +gamingbible.com,ladbible.com,sportbible.com,thecontentbible.com,tyla.com,unilad.com##+js(rmnt, script, '"nowprocket"') +! Notebookcheck +notebookcheck.*,notebookcheck-cn.com,notebookcheck-hu.com,notebookcheck-ru.com,notebookcheck-tr.com##+js(rmnt, script, &&window\,) +! Mediavague +bike-news.jp,egolf.jp,kuruma-news.jp,lasisa.net,magmix.jp,merkmal-biz.jp,otonanswer.jp,trafficnews.jp,vague.style##+js(rmnt, script, ').join(String.fromCharCode') +! AllGear Digital +bikerumor.com,explorersweb.com,gearjunkie.com,irunfar.com,packhacker.com,switchbacktravel.com,theinertia.com,wildsnow.com##+js(rmnt, script, ').join(String.fromCharCode') +!#endif +! Minute Media +12thmanrising.com,allucanheat.com,aroundthefoghorn.com,arrowheadaddict.com,badgerofhonor.com,bamahammer.com,beargoggleson.com,beyondtheflag.com,birdswatcher.com,blackandteal.com,blogredmachine.com,bluemanhoop.com,boltbeat.com,bosoxinjection.com,buffalowdown.com,caneswarning.com,catcrave.com,chopchat.com,climbingtalshill.com,cubbiescrib.com,dailyknicks.com,dairylandexpress.com,dawgpounddaily.com,dawindycity.com,dawnofthedawg.com,detroitjockcity.com,dodgersway.com,ebonybird.com,fansided.com,flywareagle.com,gbmwolverine.com,gigemgazette.com,gmenhq.com,hailfloridahail.com,halohangout.com,hardwoodhoudini.com,horseshoeheroes.com,housethathankbuilt.com,huskercorner.com,insidetheiggles.com,jaysjournal.com,justblogbaby.com,kckingdom.com,kingjamesgospel.com,kingsofkauffman.com,lakeshowlife.com,lombardiave.com,mentalfloss.com,motorcitybengals.com,musketfire.com,nflspinzone.com,ninernoise.com,nugglove.com,onechicagocenter.com,phinphanatic.com,pistonpowered.com,predominantlyorange.com,ramblinfan.com,redbirdrants.com,reviewingthebrew.com,riggosrag.com,ripcityproject.com,risingapple.com,rumbunter.com,scarletandgame.com,section215.com,sidelionreport.com,slapthesign.com,sodomojo.com,southsideshowdown.com,stillcurtain.com,stormininnorman.com,stripehype.com,thatballsouttahere.com,thecelticbhoys.com,thejetpress.com,thelandryhat.com,thepewterplank.com,thesmokingcuban.com,thevikingage.com,thunderousintentions.com,undeadwalking.com,valleyofthesuns.com,whodatdish.com,winteriscoming.net,yanksgoyard.com##+js(nostif, [native code], 500) +12thmanrising.com,allucanheat.com,aroundthefoghorn.com,arrowheadaddict.com,badgerofhonor.com,bamahammer.com,beargoggleson.com,beyondtheflag.com,birdswatcher.com,blackandteal.com,blogredmachine.com,bluemanhoop.com,boltbeat.com,bosoxinjection.com,buffalowdown.com,caneswarning.com,catcrave.com,chopchat.com,climbingtalshill.com,cubbiescrib.com,dailyknicks.com,dairylandexpress.com,dawgpounddaily.com,dawindycity.com,dawnofthedawg.com,detroitjockcity.com,dodgersway.com,ebonybird.com,fansided.com,flywareagle.com,gbmwolverine.com,gigemgazette.com,gmenhq.com,hailfloridahail.com,halohangout.com,hardwoodhoudini.com,horseshoeheroes.com,housethathankbuilt.com,huskercorner.com,insidetheiggles.com,jaysjournal.com,justblogbaby.com,kckingdom.com,kingjamesgospel.com,kingsofkauffman.com,lakeshowlife.com,lombardiave.com,mentalfloss.com,motorcitybengals.com,musketfire.com,nflspinzone.com,ninernoise.com,nugglove.com,onechicagocenter.com,phinphanatic.com,pistonpowered.com,predominantlyorange.com,ramblinfan.com,redbirdrants.com,reviewingthebrew.com,riggosrag.com,ripcityproject.com,risingapple.com,rumbunter.com,scarletandgame.com,section215.com,sidelionreport.com,slapthesign.com,sodomojo.com,southsideshowdown.com,stillcurtain.com,stormininnorman.com,stripehype.com,thatballsouttahere.com,thecelticbhoys.com,thejetpress.com,thelandryhat.com,thepewterplank.com,thesmokingcuban.com,thevikingage.com,thunderousintentions.com,undeadwalking.com,valleyofthesuns.com,whodatdish.com,winteriscoming.net,yanksgoyard.com##+js(trusted-replace-argument, Element.prototype.setAttribute, 1, , condition, '/error-report|new Promise|;await new|:\[?window|&&window,|void 0\]|location\.href|void 0\|\|window|,window,|void 0,window|,window\]|\)\.join\(String\.fromCharCode|adShieldError/') +||asset.ad-shield.cc/images$image,3p,redirect=32x32.png +ameblo.jp,auone.jp,biblegateway.com,blogmura.com,cpu-monkey.com,deckshop.pro,dic.pixiv.net,gamewith.jp,gruene-zitate.de,jmty.jp,kr-weathernews.com,laposte.net,motor-talk.de,myforecast.com,newser.com,nicovideo.jp,picks.my,reneweconomy.com.au,signupgenius.com,slickdeals.net,smithsonianmag.com,thefreebieguy.com,worldhistory.org,zerogpt.com##+js(acs, document.createElement, abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=) +filmibeat.com,goodreturns.in,mykhel.com##+js(set, detectAdBlock, noopFunc) +gumtree.com##+js(json-prune, features.ad02 features.adshield) +/scripts/delayed.js|$script,1p,domain=~lilly.com +! Others +nextchessmove.com,reneweconomy.com.au##+js(rmnt, script, HTMLIFrameElement) +/^https:\/\/[a-z]{12,20}\.com\/script\/[a-zA-Z0-9]+_[a-zA-Z0-9]+\.js$/$script,3p,match-case,to=com,from=nextchessmove.com|reneweconomy.com.au +gamebanana.com##+js(rmnt, script, /admiral|adshield/) +!#if env_safari +/^https:\/\/[a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z]?[a-z]?[a-z]?[a-z]?[a-z]?[a-z]?[a-z]?[a-z]?\.com\/script\/[a-zA-Z0-9]+_[a-zA-Z0-9]+\.js$/$script,3p,match-case,domain=nextchessmove.com|reneweconomy.com.au +!#endif +! fora software +saabcentral.com##+js(acs, document.createElement, abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=) +alkas.lt###stpd-tablet-1 +alkas.lt##.vc_hidden-xs.vc_hidden-sm.vc_hidden-md.vc_col-sm-12.vc_column_container.wpb_column +wordfinderx.com##section.svelte-w32ki7.mb-6:has(.ad-slot) +wordfinderx.com##.svelte-w32ki7.mt-6:has(.ad-slot) +cults3d.com##.cultszone--centered +cults3d.com##a[href^="https://urlr.me/"] +||adsinteractive.com^ +||dbloader.leboncoin.info^ +||loader.horairesdouverture24.fr^ +||minecraftskins.com/miscjs/as*.js +worldhistory.org##+js(set, AHE.is_member, 1) +/loader.min.js|$domain=worldhistory.org +welt.de##+js(no-fetch-if, -load.com/script/, length:101) +welt.de##+js(nostif, )](this\,..., 3000-6000) +/shadow/*adshield$domain=mail.yahoo.com +/ybar/mail.yahoo.com/*adshield$domain=mail.yahoo.com +/ybar/mail.yahoo.com/_t/aHR0c*$xhr,3p,domain=mail.yahoo.com +mail.yahoo.com##+js(set, AppBootstrapData.config.adshieldAdblockRecovery, false) +mail.yahoo.com##+js(set, AppBootstrapData.config.adshieldAdblockRecovery, false, runAt, interactive) +mail.yahoo.com##+js(set, AppBootstrapData.config.adshieldNativeAdRecovery, false) +mail.yahoo.com##+js(set, AppBootstrapData.config.adshieldNativeAdRecovery, false, runAt, interactive) +mail.yahoo.com##+js(set, AppBootstrapData.__initializeFeatures__.adshieldAdblockRecovery.enabled, false) +mail.yahoo.com##+js(set, AppBootstrapData.__initializeFeatures__.adshieldAdblockRecovery.enabled, false, runAt, interactive) +mail.yahoo.com##+js(set, AppState.reduxState.features.adshieldAdblockRecovery, false) +mail.yahoo.com##+js(set, AppState.reduxState.features.adshieldAdblockRecovery, false, runAt, interactive) +mail.yahoo.com##+js(trusted-json-edit-xhr-response, ..adshieldAdblockRecovery=false, propsToMatch, /fetchappbootstrapdata) +mail.yahoo.com##+js(trusted-json-edit-xhr-response, ..adshieldAdblockRecovery.enabled=false, propsToMatch, /fetchappbootstrapdata) +www.yahoo.com##+js(prevent-innerHTML, script, /error-report|nowprocket/) +finance.yahoo.com##+js(rmnt, script, loadRecoveryScripts, excludes, self.__next) +fantasysports.yahoo.com,sports.yahoo.com##+js(prevent-innerHTML, script, loadRecoveryScripts) +fantasysports.yahoo.com,sports.yahoo.com##+js(json-prune, autoRecovery) +scrumpoker-online.org##+js(set, Object.prototype._adShieldLoaded, true) +rome2rio.com##+js(json-edit-fetch-response, .featureFlags.*[?.featureName=="AdShield"], propsToMatch, /configs) +mandiner.hu##+js(set, Object.prototype.htmlLoadScriptService.loadScript, noopFunc) +||adopsboost.com^$3p +||d222yr38kqru7v.cloudfront.net^ +soxprospects.com##.auto-style228 +soxprospects.com##td[style="border: 1px solid #000000; padding: 4px; font-family: Arial, Helvetica, sans-serif; font-size: 11pt; background-color: #FFFFFF; text-align: center;"] +soxprospects.com##td[style="border: 1px solid #000000; font-family: Arial, Helvetica, sans-serif; font-size: 9pt; background-color: #FFFFFF; text-align: center; padding-left: 6px; padding-top: 6px; padding-bottom: 6px;"] +kio.ac##+js(set, HTMLScriptElement.prototype.onload, undefined) +kio.ac##.ad-slot:style(visibility: collapse !important) +inverse.com#@#.adWrapper +inverse.com##article .adWrapper +neoseeker.com##.section-vu:has(> div[data-ad-unit-id]) +neoseeker.com###page_top_content +||fokstatic.nl/fp/global/*adshield.js +athlonsports.com,autoblog.com,bikemag.com,dengarden.com,mensfitness.com,mensjournal.com,parade.com,paradehomeandgarden.com,paradepets.com,pethelpful.com,powder.com,shophq.com,surfer.com,thespun.com,thestreet.com,travelhost.com##+js(trusted-json-edit, ..AdShield.isEnabled=false) +||web-kit.io^$script,redirect=noopjs +||mopo.de/*/adshield.js +! NOTE: Adthrive sites +1000logos.net,100daysofrealfood.com,100directions.com,100layercake.com,101cookbooks.com,101cookingfortwo.com,101dogbreeds.com,101planners.com,104homestead.com,10beasts.com,10fragrances.com,10scopes.com,11magnolialane.com,123atc.com,123homeschool4me.com,12minuteathlete.com,1500days.com,15minutebeauty.com,15worksheets.com,16powers.com,17apart.com,180sx.club,1dogwoof.com,1lumen.com,1plus1plus1equals1.net,21dayhero.com,23jumpmanstreet.com,247tempo.com,247wallst.com,24bite.com,2foodtrippers.com,2sistersmixitup.com,2sistersrecipes.com,2xkofire.com,30seconds.com,31daily.com,320sycamoreblog.com,365cincinnati.com,365daysofbakingandmore.com,365daysofcrockpot.com,368chickens.com,3boysandadog.com,3dinosaurs.com,3dprinterly.com,3dsourced.com,40plusstyle.com,411mania.com,42droids.co.uk,48daysworkout.com,4filming.com,4lessbyjess.com,4pics1-word.com,4wdlife.com,50isnotold.com,52kitchenadventures.com,5boysbaker.com,5itemsorless.com,5letterwords.org,5thwheelforums.com,604now.com,6theory.com,6thgenaccord.com,7-min.com,7173mustangs.com,730sagestreet.com,7daysofplay.com,7gents.com,7yearolds.com,8020automotive.com,919thebend.ca,976-tuna.com,99boulders.com,99sounds.org##+js(rmnt, script, /__adblocker|html-load/) +a-love-of-rottweilers.com,abakingjourney.com,abcdeelearning.com,abcsofliteracy.com,abeautifulmess.com,aberdeenskitchen.com,abnormalreturns.com,aboderie.co.uk,aboutamom.com,abowlfulloflemons.net,abraskitchen.com,abroadwithash.com,abrotherabroad.com,abudhabitravelplanner.com,ac3filter.net,accidentalhappybaker.com,accordingtoelle.com,accountantforums.com,accuplacerpracticetest.com,acedarspoon.com,acharmingescape.com,aconsciousrethink.com,acooknamedmatt.com,acouplecooks.com,acousticbridge.com,acozykitchen.com,acraftedpassion.com,acraftyconcept.com,acrochetedsimplicity.com,acrylgiessen.com,acrylicpouring.com,activeweekender.com,activewild.com,actuallygoodteamnames.com,acultivatednest.com,acurazdxforum.com,adabofgluewilldo.com,adamantkitchen.com,adamtheautomator.com,adayinourshoes.com,adayinthekitchen.com,addapinch.com,addicted2decorating.com,addicted2diy.com,addictedtodates.com,addictedtovacation.com,addisonswonderland.com,addsaltandserve.com,adebtfreestressfreelife.com,adimesaved.com,adishofdailylife.com,advanced-astrology.com,adventourbegins.com,adventureinyou.com,adventuresbylana.com,adventuresofmel.com,adviceonlyfinancial.com,aeclectic.net,aerocorner.com,aestheticsmilereconstruction.com,afamuche.com,afarmgirlsdabbles.com,afewshortcuts.com,afk.global,aflavorfulbite.com,aflavorjournal.com,afrugalchick.com,againstallgrain.com,agirlandagluegun.com,aglassofbovino.com,agoudalife.com,agratefulmeal.com,agrillforallseasons.com,ahaparenting.com,aheadofthyme.com,ahnfiredigital.com,ahoramismo.com,aimlief.com,ainttooproudtomeg.com,aircondlounge.com,airforums.com,airfried.com,airfryerfanatics.com,airfryerlove.com,airfryermom.com,airfryerworld.com,airfryeryum.com,airfryingfoodie.com,airhostacademy.com,airoomplanner.com,aisleofshame.com,alandacraft.com,alattefood.com,aldireviewer.com,alecooks.com,alekasgettogether.com,alexandracooks.com,alexjessicamills.com,alexroblesmd.com,alexwongcopywriting.com,alicedias.com,alidaskitchen.com,aline-made.com,alisononfoot.com,alittleandalot.com,alittlebitofeverythingblog.com,alittleinsanity.com,alittlepinchofperfect.com,allaboutami.com,allaboutjazz.com,allaboutparrots.com,allaboutplanners.com.au,allabouttattoo.com,allaccordingtoplann.com,allairfryerrecipes.com,allcakeprices.com,alldayidreamaboutfood.com,allears.net,alleydog.com,allfortheboys.com,allhomerobotics.com,alliannaskitchen.com,alliecarte.com,allkpop.com,allmycravings.com,allnurses.com,allnutritious.com,allourway.com,allpurposeveggies.com,allsalonprices.com,allsides.com,allsoundlab.net,allthedifferences.com,allthehealthythings.com,allthenoodles.com,allthenourishingthings.com,allthepartyideas.com,allthesvgs.com,allthings.how,allthingsdogs.com,allthingsjewelryy.com,allthingsmamma.com,allthingstarget.com,allthingswithpurpose.com,alltopeverything.com,alluringsoul.com,allwaysdelicious.com,allwritealright.com,allyscooking.com,allyskitchen.com,allysonvanhouten.com,almanac.com,almarsguides.com,alonelylife.com,alphafoodie.com,alphahistory.com,alphamom.com,alphr.com,alpineella.com,alsothecrumbsplease.com,altarofgaming.com,altdriver.com,alternativedish.com,alwayseatdessert.com,alwaysfromscratch.com,alwaysusebutter.com,alxnow.com,amandacooksandstyles.com,amandascookin.com,amarcoplumbing.com,amateurprochef.com,amazingcharcuterieboards.com,amazingclassiccars.com,amazingfoodmadeeasy.com,amazingribs.com,ambereverywhere.com,amberskitchencooks.com,ambitiouskitchen.com,ambotv.com,american-rails.com,americanoceans.org,americanwx.com,amiablefoods.com,amindfullmom.com,amiraspantry.com,amish365.com,amishamerica.com,amodernhomestead.com,amomsimpression.com,amortization.org,amtraktrains.com,amybakesbread.com,amycakesbakes.com,amyinthekitchen.com,amylattacreations.com,amynewnostalgia.com,amytreasure.com,ana-white.com,anagrammer.com,ancestral-nutrition.com,andersonandgrant.com,andhereweare.net,andiemitchell.com,andreasnotebook.com,andrewzimmern.com,androidheadlines.com,anerdcooks.com,anestwithayard.com,anewwayforward.org,angelicalbalance.com,angrybbq.com,anightowlblog.com,anikasdiylife.com,animalcrossingworld.com,animalnerdz.com,animalspot.net,animated-teeth.com,anitalianinmykitchen.com,anniedesigncrochet.com,anoffgridlife.com,anorcadianabroad.com,anoregoncottage.com,anothercocktailblog.com,antennaland.com,antimaximalist.com,antique-bottles.net,antiqueradios.com,anysoftwaretools.com,anythingtranslate.com,anytimecocktails.com,apaigeofpositivity.com,apeachyplate.com,apetogentleman.com,apexbikes.com,apieceofrainbow.com,apieceoftravel.com,apistogramma.com,aplinsinthealps.com,appellationmountain.net,applegreencottage.com,appletoolbox.com,appliancerepairforums.com,appunwrapper.com,apracticalwedding.com,aprettylifeinthesuburbs.com,apumpkinandaprincess.com,aquariadise.com,aquariumadvice.com,aquariumgenius.com,aquariumsource.com,aquariumsphere.com,aquariustraveller.com,aquatic-eden.com,aquietrefuge.com,aquiltinglife.com,arabahjoy.com,arayofsunlight.com,arboristsite.com,arcaneeye.com,architecturelab.net,archtoolbox.com,areinventedmom.com,areweranked.com,areyouscreening.com,arizonasportsfans.com,arlnow.com,aroundthenook.com,aroundtheworldpluskids.com.au,arrestyourdebt.com,arrmaforum.com,artandthekitchen.com,artbarblog.com,artfrommytable.com,artfulhomemaking.com,artofmemory.com,artprojectsforkids.org,artsandclassy.com,artsy-traveler.com,artsychicksrule.com,artsyfartsymama.com,artsymomma.com,artycraftykids.com,arzyelbuilds.com,ascensionlogs.gg,aseaofred.com,aseasyasapplepie.com,ash-eats.com,ashadeofteal.com,ashandpri.com,ashbaber.com,ashcroftfamilytable.com,ashevilletrails.com,asianacircus.com,asimplepalate.com,asimplepantry.com,askannamoseley.com,askmormongirl.com,askpython.com,aslobcomesclean.com,asouthernsoul.com,aspdotnethelp.com,aspicyperspective.com,aspiringwinos.com,asprinklingofcayenne.com,assessmentcentrehq.com,astrology-seek.com,astrologyking.com,astrostyle.com,astyleset.com,asvabpracticetests.com,aswbpracticeexam.com,asweetalternative.com,asweetpeachef.com,at-my-table.com,at4forum.com,atablefullofjoy.com,atastefortravel.ca,atastykitchen.com,athletelunchbox.com,athomebyheather.com,athomewiththebarkers.com,athoughtfulplaceblog.com,atlantablackstar.com,atlantatrails.com,atlasandboots.com,atqa005.com,atraditionallife.com,atshq.org,atsloanestable.com,attagirlsays.com,attainable-sustainable.net,atthepicketfence.com,attractiondiary.com,attractionsmagazine.com,aturtleslifeforme.com,aubreyskitchen.com,audio-forums.com,audioassemble.com,audiolgy.com,audiotips.com,audreyslittlefarm.com,aussiegreenthumb.com,aussiehomebrewer.com,aussiepythons.com,authenticfoodquest.com,authority.pub,authoritytattoo.com,autismforums.com,automatedhome.com,automatelife.net,automaticwasher.org,automoblog.net,averagesocialite.com,averiecooks.com,avforums.com,aviationa2z.com,aviatorinsider.com,avidgamer.gg,avirtualvegan.com,avirtuouswoman.org,avocadopesto.com,avocadoskillet.com,avpcentral.com,awarenessdays.com,awaytothecity.com,awealthofcommonsense.com,awellstyledlife.com,awfulannouncing.com,awickedwhisk.com,awinterescape.com,awortheyread.com,axleandchassis.com,ayunaconlaura.com,ayurvedawithrebecca.com,az900practicetest.com,azlinamin.com,azmind.com,azurelessons.com##+js(rmnt, script, /__adblocker|html-load/, excludes, self.__next) +b-inspiredmama.com,babaganosh.org,baby-chick.com,babyfoode.com,babygearessentials.com,backdoorsurvival.com,backforseconds.com,backpacksandbubbly.com,backtoourroots.net,backyarddigs.com,backyardknoxville.com,badbatchbaking.com,bahaiforums.com,bakeandbacon.com,bakeatmidnite.com,bakedambrosia.com,bakedbree.com,bakedbroiledandbasted.com,bakedbyrachel.com,bakedcollective.com,bakedlean.com,bakefromscratch.com,bakeitwithlove.com,bakemeacookie.com,bakemesomesugar.com,bakeorbreak.com,bakeplaysmile.com,bakerbynature.com,bakerita.com,bakersroyale.com,bakerstable.net,bakerstreetsociety.com,bakesbybrownsugar.com,baketobefit.com,bakewithjamie.com,baking-forums.com,baking-sense.com,baking4happiness.com,bakingamoment.com,bakingbeauty.net,bakingbites.com,bakingforfriends.com,bakinghermann.com,bakinghow.com,bakinglikeachef.com,bakingmehungry.com,bakingupmemories.com,bakingwithgranny.co.uk,balancingeverything.com,balancingmotherhood.com,baldandhappy.com,ball-pythons.net,ballershoesdb.com,ballexclusives.com,baptistboard.com,barbarabakes.com,barchart.com,barefeetinthekitchen.com,barefootinthepines.com,bargainbabe.com,bargpt.app,barkingroyalty.com,barleyandbirch.com,barleyandsage.com,barrescueupdates.com,baseballrumors.me,baseballtrainingworld.com,basic-mathematics.com,basicswithbails.com,basketballbuckets.com,basketballhistory.org,basketballnoise.com,bassisthq.com,bassmagazine.com,batesfamilyblog.com,batteryequivalents.com,bballrumors.com,bbqdryrubs.com,bbqingwiththenolands.com,beanrecipes.com,beardeddragonforum.com,bearfoottheory.com,beastlyenergy.com,beatofhawaii.com,beatriceryandesigns.com,beatsperminuteonline.com,beatthebudget.com,beautifulwithbrains.com,beautyandbedlam.com,beautyandthebenchpress.com,beautycrafter.com,beautygab.com,beautymasterlist.com,beautymone.com,beautymunsta.com,beautyofbirds.com,beautysided.com,beautythroughimperfection.com,beautytidbits.com,becomeawritertoday.com,becomebetty.com,becoming.is,becomingunbusy.com,bedbuglawyer.org,bedbugsinsider.com,bedroomproducersblog.com,beehivehero.com,beekeepingforum.co.uk,beerconnoisseur.com,beerintheevening.com,beesandroses.com,beeyondcereal.com,begindot.com,behindthevoiceactors.com,beingpatient.com,believeinabudget.com,believeintherun.com,bellacococrochet.com,belletag.com,bellflowerlifestyle.com,bellybelly.com.au,bellyfull.net,belquistwist.com,bemorewithless.com,benandme.com,beneathmyheart.net,benidormandbeyond.com,bensabaconlovers.com,benzinga.com,berlyskitchen.com,berriesandbarnacles.com,best-minecraft-servers.co,bestappetizers.com,bestbeginnermotorcycles.com,bestboatreport.com,bestchristmasdesserts.com,bestdesserts.com,bestfriendsforfrosting.com,bestgamingtips.com,bestiefy.com,bestjobdescriptions.com,bestmenscolognes.com,bestofmachinery.com,bestofvegan.com,bestplants.com,bestrecipebox.com,bethbryan.com,bethebudget.com,bettacarefishguide.com,bettasource.com,betterfoodguru.com,betterhealthwhileaging.net,bettermindbodysoul.com,betterwander.com,betweencarpools.com,betweennapsontheporch.net,beupp.com,bevcooks.com,beyerbeware.net,beyondcruise.com,beyondfrosting.com,beyondkimchee.com,beyondmeresustenance.com,beyondthebutter.com,bftactics.com,bgfg.co.uk,bgr.com,bhookedcrochet.com,biancazapatka.com,bible-knowledge.com,biblemoneymatters.com,bibliolifestyle.com,bicycle-guider.com,biddytarot.com,bigbearswife.com,bigdeliciouslife.com,biggerbolderbaking.com,biggestuscities.com,bigheartlittlestar.com,bigislanditineraries.com,bigoven.com,bigsmallscreen.com,bigsoccer.com,bigtimer.net,bikeexif.com,bikemunk.com,bikergirllife.com,bikeride.com,bikersrights.com,bikesmarts.com,biketestreviews.com,billyparisi.com,binkysculinarycarnival.com,biplaneforum.com,birdforum.net,birdnature.com,birdsphere.com,birdwatchingdaily.com,birdwatchinghq.com,birdwatchingusa.org,birdzilla.com,biscuitsandburlap.com,biteontheside.com,bitesbybianca.com,bitesofberi.com,bitesofwellness.com,bittbox.com,bitzngiggles.com,bizapedia.com,bjjdoc.com,bjpenn.com,blackbeltwiki.com,blackberrybabe.com,blackcitadelrpg.com,blackcrossword.com,blackgirlnerds.com,blacksmithtalk.com,blackweightlosssuccess.com,blankcalendarpages.com,blendtw.com,blesserhouse.com,blessherheartyall.com,blessthismeal.com,blessthismessplease.com,blifaloo.com,blissfulbasil.com,blissfullylowcarb.com,blissonly.com,blogghetti.com,blogilates.com,blogmickey.com,blogofdoom.com,blondelish.com,bloominghomestead.com,bluearchive.gg,bluebowlrecipes.com,bluecinetech.co.uk,bluestarcrochet.com,bluetracker.gg,boardgamequest.com,boardoftheworld.com,boatbasincafe.com,boatdriving.org,boatsafe.com,bobbyberk.com,bocadailynews.com,bodyketosis.com,bogglewizard.net,bogoten.com,bojongourmet.com,boldappetite.com,bolde.com,boldjourney.com,bombshellbling.com,bonappeteach.com,bonnibakery.com,bonvoyagewithkids.com,booboosbakery.com,boogieforum.com,bookanalysis.com,bookishgoblin.com,booknotification.com,bookroo.com,bookseries.org,boomhavenfarms.com,boothfindernyc.com,bootsandhooveshomestead.com,bootspy.com,bootstrapbee.com,boozyburbs.com,boraboraphotos.com,boredpanda.com,borrowedbites.com,bostonterriersociety.com,botanicalinterests.com,bottledprices.com,bottleraiders.com,boundlessroads.com,bowerpowerblog.com,bowl-me-over.com,bowlsarethenewplates.com,boxentriq.com,boxing247.com,boxingdaily.com,boxingschedule.co,boxofpuns.com,boxthislap.org,boxycolonial.com,boysahoy.com,braidhairstyles.com,brainmass.com,bramblewinecottage.com,brandeating.com,brasshero.com,braveryandbelonging.com,braziliankitchenabroad.com,breadboozebacon.com,breaddad.com,breadsandsweets.com,breakingbourbon.com,breastfeedingplace.com,breederbest.com,breedingbusiness.com,breezynetworks.co.za,brendid.com,brewerfanatic.com,briana-thomas.com,brianakdesigns.com,brianlagerstrom.com,bricksandlogic.co.uk,brighteyedbaker.com,brightgreendoor.com,brightgreenrecipes.com,brightrockmedia.com,brightsprouts.com,brilliantmaps.com,brisbanekids.com.au,britannica.com,britneybreaksbread.com,brobible.com,broccyourbody.com,brokenovenbaking.com,bromabakery.com,bromefields.com,broncoraptorforum.com,broncozone.com,brooklynlimestone.com,browneyedbaker.com,brownsnation.com,brownsnationforum.com,brownthumbmama.com,bsugarmama.com,bubbapie.com,bucketlisttummy.com,buckinghamshirelandscapegardeners.com,budgetbytes.com,budgetsavvydiva.com,budgettravel.com,budgettravelbuff.com,buellxb.com,buggyandbuddy.com,build-basic.com,buildabreak.co.uk,buildgreennh.com,buildingelements.com,buildingwithkinfolk.com,buildyourbite.com,builtlean.com,bulbagarden.net,bullion.forum,bunnylady.com,bunnymuffins.lol,bunsenburnerbakery.com,bunsinmyoven.com,burncitysports.com,burntpelletbbq.com,burtonavenue.com,busbysbakery.com,business-opportunities.biz,businesschronicler.com,businesstechplanet.com,businesswritingblog.com,busycooks.com,busydaydinners.com,busyfamilyrecipes.com,busylittlekiddies.com,busytoddler.com,butfirstwebrunch.com,butterandbaggage.com,butterandbliss.net,butterbeready.com,butterflyidentification.com,butterhand.com,butterloveandsalt.com,buttermilkbysam.com,butternutbakeryblog.com,butternutrition.com,buythiscookthat.com,bwillcreative.com,by-pink.com,bydeannyd.com,bykelseysmith.com,bylisafonde.com,bytheforkful.com##+js(rmnt, script, /"__adblocker"|"data-sdk"/) +caabcrochet.com,cadryskitchen.com,cafedelites.com,cafehailee.com,cake-babe.com,cakebycourtney.com,cakemehometonight.com,cakenknife.com,cakesbymk.com,cakescottage.com,cakesprices.com,cakewhiz.com,calculateme.com,calculatemyroof.com,calculator.academy,calendarkart.com,calfkicker.com,californiathroughmylens.com,caloriesburnedhq.com,cambreabakes.com,camillestyles.com,caminoadventures.com,campaddict.com,camperreport.com,campersmarts.com,campgrilleat.com,campingforfoodies.com,campsitephotos.com,canarystreetcrafts.com,cancerrehabpt.com,caninejournal.com,canonrumors.com,capitalizemytitle.com,caralynmirand.com,cararac.com,card-codex.com,cardcollector.co.uk,cardsayings.net,careeralley.com,careercontessa.com,caribbeanpot.com,carlaaston.com,carlmurawski.com,carlocao.com,caroha.com,carolbeecooks.com,carolinahoneybees.com,carolinaroad.com,carolinescooking.com,carolinevencil.com,carriebradshawlied.com,carriecarvalho.com,carrotsandcookies.com,carrowaycrochet.com,carseatsmom.com,carshtuff.com,carwindshields.info,casadecrews.com,casamiacooking.com,caseihforum.com,cassiescroggins.com,castandspear.com,castironforum.com,castironketo.net,castironrecipes.com,castleinthemountains.com,casualepicure.com,casualfoodist.com,casualgeographical.com,cat-world.com,catchmyparty.com,cathydiep.com,catological.com,cats.com,catster.com,cattitudedaily.com,cattletoday.com,catvills.com,cavaliersnation.com,cavsdaily.com,cavsnation.com,ccmapracticetests.com,cedarhillfarmhouse.com,celebitchy.com,celebrateanddecorate.com,celebratednest.com,celebratingsimply.com,celebritynetworth.com,celebschitchat.com,celebsuburb.com,cellocentral.com,cellphones.ca,centreofexcellence.com,centsationalstyle.com,centslessdeals.com,cfb.fan,cgdirector.com,chachingonashoestring.com,chachingqueen.com,chainsawtalk.com,chalkacademy.com,chalkbucket.com,challengerforum.com,chambanamoms.com,chamberofcommerce.com,chamberofcommerce.uk,champsorchumps.us,charactercounter.com,charlottefashionplate.com,chartmasters.org,chascrazycreations.com,chasingoursimple.com,chattanoogafishingforum.com,chazhound.com,cheatcc.com,cheatsheet.com,cheerfulchoices.com,cheerfulcook.com,chef-in-training.com,chefalli.com,chefani.com,chefdehome.com,chefdenise.com,chefjacooks.com,chefjar.com,chefjonwatts.com,cheflindseyfarr.com,chefnotrequired.com,chefsavvy.com,chefspencil.com,chelseadamon.com,chelseasmessyapron.com,chelsweets.com,chemicalaid.com,chemistrylearner.com,cheneetoday.com,cherryonmysundae.com,chevronlemon.com,chevycobaltforum.com,chevyequinoxforum.com,chevytrucks.org,chevyzr2.com,chewoutloud.com,chickensandmore.com,chiefsreport.com,childhoodmagic.com,chilesandsmoke.com,chilimath.com,chilitochoc.com,chinasichuanfood.com,chindeep.com,chins-n-hedgies.com,chiselandfork.com,chocolatecoveredkatie.com,chocolatesandchai.com,chocolatewithgrace.com,chooseveganism.org,choosingchia.com,choosingnutrition.com,chopstickchronicles.com,chordsworld.com,chrislovesjulia.com,christinamariablog.com,christinascucina.com,christmasonadime.com,chrono.quest,chumplady.com,chunkbase.com,chunkyinkentucky.com,ciaochowbambina.com,ciaoflorentina.com,cillacrochets.com,cincyshopper.com,cindermint.com,cinderstravels.com,cindyhattersleydesign.com,cinemablind.com,cinenerdle2.app,cinnamonsnail.com,circuitsforum.com,citefast.com,city-guide.london,civicsquestions.com,cjeatsrecipes.com,cjls.com,cjponyparts.com,ck5.com,cladright.com,clashdaddy.com,clashguideswithdusk.net,classbforum.com,classic-armory.org,classiccasualhome.com,classiccountrymusic.com,classicnerd.com,classicparker.com,classicrockforums.com,classicrockhistory.com,classpop.com,classyclutter.net,classyyettrendy.com,claudiastable.com,cleananddelicious.com,cleanandscentsible.com,cleaneatingveggiegirl.com,cleaneatingwithkids.com,cleanerstalk.com,cleanfoodcrush.com,cleangreensimple.com,cleanmama.com,cleanplatemama.com,cleantheair.org,clearlycoffee.com,clevelanddaily.com,clevercreations.org,clevergirlfinance.com,cleverjourney.com,cleverlyinspired.com,cleverlysimple.com,clock.zone,closetcooking.com,closetfulofclothes.com,cloudykitchen.com,cloudynights.com,clovermeadowsbeef.com,clubthrifty.com,clubtraderjoes.com,cluckclucksew.com,clutchpoints.com,clutterkeeper.com,cmbarndominium.com,cncsourced.com,cnevpost.com,coachrallyrus.com,coastalwandering.com,cocinadominicana.com,cocinarepublic.com,cocinarodriguez.com,cockroachfacts.com,cockroachsavvy.com,cockroachzone.com,cocktailsandappetizers.com,cocoandash.com,coconutsandkettlebells.com,code9media.com,codeshack.io,codewordsolver.com,codex.gg,codycrosssolutions.com,coffeeandcarpool.com,coffeeatthree.com,coffeecopycat.com,coffeeforums.com,coffeelevels.com,coldsorescured.com,coleycooks.com,collective.world,collectorfreaks.com,collegefootball.gg,collegefootballnetwork.com,collegegazette.com,collegelifemadeeasy.com,collegetransitions.com,color-meanings.com,coloredhaircare.com,coloringpageshq.com,colorkit.co,colormadehappy.com,colorpsychology.org,colorxs.com,columbusnavigator.com,combotarot.com,comestayawhile.com,comfortablefood.com,comfyliving.net,comicbasics.com,comicsands.com,comicyears.com,commandersnation.com,commonsensehome.com,competitionplus.com,completelydelicious.com,computeruser.com,computerzilla.com,conanfanatics.com,conceptartempire.com,concertarchives.org,condolencemessages.com,confessionsofabakingqueen.com,confessionsofafitfoodie.com,confessionsofagroceryaddict.com,confessionsofaserialdiyer.com,confettiandbliss.com,confettidaydreams.com,confidencemeetsparenting.com,coniferousforest.com,connections.run,conniekresin.com,connoisseurusveg.com,conscioushacker.io,conservationinstitute.org,conserve-energy-future.com,constellation-guide.com,construct101.com,consumerboomer.com,contextures.com,contexturesblog.com,continuousroamer.com,controlbooth.com,convertbinary.com,cookathomemom.com,cookdinnertonight.com,cookeatgo.com,cookeatlivelove.com,cookeatpaleo.com,cookedandloved.com,cookedbyjulie.com,cookerofdeliciousness.com,cookeryspace.com,cookieandkate.com,cookiedoughandovenmitt.com,cookierun.gg,cookiesandcups.com,cookiesfordays.com,cookilicious.com,cookincanuck.com,cooking-therapy.com,cookingandme.com,cookingbride.com,cookingcarnival.com,cookingclassy.com,cookingforkeeps.com,cookingforpeanuts.com,cookinginmygenes.com,cookinginthekeys.com,cookingintheyard.com,cookingkatielady.com,cookingmadehealthy.com,cookingmaniac.com,cookingmydreams.com,cookingontheweekends.com,cookingorgeous.com,cookingperfected.com,cookingupmemories.com,cookingwithayeh.com,cookingwithbliss.com,cookingwithcarlee.com,cookingwithclaudy.com,cookingwithcocktailrings.com,cookingwithcoit.com,cookingwithgenius.com,cookingwithkarli.com,cookingwithkatiecross.com,cookingwithlei.com,cookingwithmammac.com,cookingwithnart.com,cookingwithparita.com,cookingwithria.com,cookinwithmima.com,cookitrealgood.com,cookitwithtim.com,cookprimalgourmet.com,cookrepublic.com,cooksdream.com,cooksimply.co.uk,cookthestory.com,cooktoria.com,cookwithdana.com,cookwithkushi.com,cookwithmanali.com,cookwithnabeela.com,coolcrafts.com,coopcancook.com,copycatchic.com,copykat.com,copykatchat.com,cordcuttingreport.com,cornercoffeestore.com,corvsport.com,cosascaseras.com,cosmetologyguru.com,cosmicdeity.com,cosplayadvice.com,costaricavibes.com,costcontessa.com,cottageandvine.net,cottageatthecrossroads.com,cottageonbunkerhill.com,cottercrunch.com,counterstats.net,country94.ca,countrydiaries.com,countryguess.com,countrylifedreams.com,countrylivinginacariboovalley.com,countrymusicfamily.com,countrymusicnation.com,countryrebel.com,countryroadssourdough.com,countrythangdaily.com,couponcravings.com,couponingfor4.net,couponingtodisney.com,couponsandfreebiesmom.com,courtneyssweets.com,cowboysnews.com,cowboyszone.com,cozinhalegal.com.br,cozycornercharm.com,cozydiyhome.com,cozylittlehouse.com,cozymeal.com,cozypeachkitchen.com,crabbet.com,crackberry.com,craftaholicsanonymous.net,craftbeering.com,craftberrybush.com,craftinessisnotoptional.com,craftingagreenworld.com,craftinghappiness.com,craftingjeannie.com,craftionary.net,craftknights.com,craftsbyamanda.com,craftsonsea.co.uk,craftsyhacks.com,craftyartideas.com,craftycookbook.com,craftylittlegnome.com,craftymorning.com,craftyourhappyplace.com,cravethegood.com,cravetheplanet.com,cravinghomecooked.com,cravingsofalunatic.com,cravingsomecreativity.com,cravingsomethinghealthy.com,cravingtasty.com,crayonsandcravings.com,crazybusymama.com,crazyforcrust.com,crazylaura.com,crazylittleprojects.com,crazymonkeygames.com,crazytogether.com,crazyvegankitchen.com,cre8tioncrochet.com,creamofthecropcrochet.com,createandfind.com,createcraftprint.com,createlet.com,createmindfully.com,createprintables.com,createyum.com,creatingreallyawesomefunthings.com,creative-culinary.com,creativecaincabin.com,creativecanning.com,creativecertificates.com,creativecolorlab.com,creativehealthyfamily.com,creativehomekeeper.com,creeklinehouse.com,creepycatalog.com,crinacle.com,crinkledcookbook.com,crisslecrossle.com,criticalhit.net,crochet-patterns-free.com,crochet365knittoo.com,crochetconcupiscence.com,crochething.com,crochetncrafts.com,crochettoplay.com,crochetwithcarrie.com,crockpotladies.com,crockpotsandflipflops.com,crohnsforum.com,crossplaygames.com,crossword-explorer.net,crosswordanswers911.net,crosswordbuzz.com,crosswordjam.net,crosswordmasterhelp.com,crowdedkitchen.com,crowdworknews.com,crowsurvival.com,cruisegalore.com,cruisehive.com,cruisemummy.co.uk,cruiseradio.net,cruisersforum.com,cruisingfreedom.com,cruisingkids.co.uk,crunchtimekitchen.com,crunchycreamysweet.com,cryptoprofitcalculator.com,cryptoquoteanswer.com,crystalandcomp.com,crystaldigest.com,crystalmathlabs.com,cubesnjuliennes.com,cubscoutideas.com,cucinabyelena.com,cuckoo4design.com,cuddlystitchescraft.com,culinaryginger.com,culinaryhill.com,culinaryshades.com,culturedtable.com,culturedvoyages.com,culturedvultures.com,cupcakesandcutlery.com,cupcakesandkalechips.com,cupcakesavvyskitchen.com,cupfulofkale.com,cupofflour.org,cupofjo.com,cupofzest.com,curbingcarbs.com,curbly.com,curbsideclassic.com,curlsbot.com,curlygirlkitchen.com,curlynikki.com,currytrail.in,cushyspa.com,customcalendarmaker.com,customonesixth.com,cutegirlshairstyles.com,cutnmakecrafts.com,cwbchicago.com,cwfeats.com,cycletraveloverload.com,cyclingabout.com,cyndispivey.com,czn.gg##+js(rmnt, script, /"__adblocker"|"data-sdk"/) +dabblesandbabbles.com,dadcooksdinner.com,dadsguidetowdw.com,daenskitchen.com,dagmarbleasdale.com,daigasikfaan.co,dailyactor.com,dailycaring.com,dailycommutercrossword.com,dailycrypticle.com,dailydish.co.uk,dailydishrecipes.com,dailydiylife.com,dailynous.com,dailysoapdish.com,dailyveganmeal.com,dailywritingtips.com,dailyyum.com,daisiesandpie.co.uk,damndelicious.net,damneasyrecipes.com,danaberez.com,dancearoundthekitchen.com,daniellewalker.com,danielsplate.com,danishealthyeats.com,danny-cph.com,danslelakehouse.com,daringgourmet.com,darlingcelebrations.com,darlingquote.com,darngoodveggies.com,dashboardwarninglights.com,dashofjazz.com,dashofsanity.com,dashofting.com,databasefaqs.com,dateyourspouse.com,dayhikesneardenver.com,daysofjay.com,dcurbanmom.com,dcworldscollide.gg,dealmama.com,dealntech.com,dearcrissy.com,dearlilliestudio.com,dearwendy.com,debraklein.com,debsdailydish.com,debtfreefamily.co.uk,decoholic.org,deedeedoes.com,deepfriedhoney.com,deeplysouthernhome.com,deesweets.com,defendersxs.com,dehydratorliving.com,deliacreates.com,deliciouslyorganic.net,deliciouslyrushed.com,deliciouslyseasoned.com,deliciouslysprinkled.com,deliciousmeetshealthy.com,deliciousonadime.com,delicioustable.com,delightfuladventures.com,delightfulmomfood.com,delightfulplate.com,delightfultravelnotes.com,delishdlites.com,delishknowledge.com,delscookingtwist.com,deltadigital.co,deltiasgaming.com,denversportsradio.com,derelictplaces.co.uk,derrickriches.com,desertblossomcrafts.com,desertislanddishes.co,desertnaturals.me,designeatrepeat.com,designerappliances.com,designertrapped.com,designmom.com,designorate.com,designthusiasm.com,desireerd.com,desotocountynews.com,dessertfortwo.com,dessertnowdinnerlater.com,dessertsanddrinks.com,dessertsonadime.com,dessertswithbenefits.com,destguides.com,destinationsanddesserts.com,destiny2zone.com,destinyislands.com,detoxinista.com,detroitsportsforum.com,developgoodhabits.com,devotedgrandma.com,devour.asia,devx.com,dfarq.homeip.net,dgcoursereview.com,diabetesselfmanagement.com,diablo4.gg,diablofans.com,diamondcentric.net,diamondlobby.com,diaryofafitmommy.com,diaryofaquilter.com,dicecitysports.com,dicecove.com,dieseliq.com,diethood.com,dietmenus.com,diffen.com,differentiatedkindergarten.com,digitalcitizen.life,dimensionofstuff.com,dimitrasdishes.com,dimplesandtangles.com,dimsimlim.com,dinersdriveinsdiveslocations.com,dinner-mom.com,dinneratthezoo.com,dinnerin321.com,dinnersdishesanddesserts.com,dinnersdonequick.com,dinnerthendessert.com,dirtbikeplanet.com,dirtydiaperlaundry.com,disabledveterans.org,discordtemplates.me,discoveringmontana.com,discoverpods.com,discovertheburgh.com,discoverzermatt.com,discusscooking.com,discussfastpitch.com,discussingfilm.net,disfordisney.com,dishbydish.net,dishedbykate.com,dishesdelish.com,disheswithdad.com,dishingdelish.com,dishingupthedirt.com,dishnthekitchen.com,dishytech.com,disneydining.com,disneydreamer.com,disneyfanatic.com,disneyfoodblog.com,disneynews.us,disneytips.com,disneytouristblog.com,displacedhousewife.com,distanceparent.org,distiller.com,divaliciousrecipes.com,divascancook.com,divorceandfinance.org,dixiedelightsonline.com,diy-forums.com,diyandfun.com,diybunker.com,diycandy.com,diydecormom.com,diygarden.co.uk,diyhandymom.com,diyinspired.com,diynatural.com,diypete.com,diyshowoff.com,diysmarthomehub.com,diyswank.com,djcliq.com,djsaviation.net,dk894953543.com,docstips.com,doctorsofrunning.com,dododsondesigns.com,doesitreallywork.org,dogfoodsmart.com,doggysaurus.com,dogingtonpost.com,dogsbestlife.com,dogscatspets.org,dogsnet.com,dogsonplanes.com,dogster.com,dogtrainingadvicetips.com,dogvills.com,doityourselfdivas.com,doityourselfrv.com,dollarstorecrafts.com,dollartimes.com,dollforums.com,dollopofdough.com,dolphinnation.com,dolphinstalk.com,domcooks.com,domestically-designed.com,domestically-speaking.com,domesticatedtom.com,domesticdreamboat.com,domesticheights.com,domesticsuperhero.com,dominicancooking.com,donnadundas.co.uk,dontgobaconmyheart.co.uk,dontmesswithmama.com,dontsweattherecipe.com,dontwastethecrumbs.com,dontworkanotherday.com,doodledoods.com,dormroomcook.com,dotafire.com,dotgg.gg,downhomeinspiration.com,downredbuddrive.com,downshiftology.com,downsizingdinner.com,dpreview.com,draftlegame.com,draftleunlimited.com,draftmag.com,draftsim.com,dragonball.gg,dragonball.guru,dralpana.com,dramabeans.com,dreamalittlebigger.com,dreamdictionary.org,dreamhomebasedwork.com,dreaminterpretation.info,dreaminterpretation.org,dreamspiritual.org,dreamystays.com,dressedformyday.com,drifted.com,drinkswithdanica.com,drivemehungry.com,drivenbydecor.com,drivenwheels.com,driverbase.com,driveteslacanada.ca,drivinggeeks.com,drizzleanddip.com,drizzlemeskinny.com,drkarenslee.com,drmonicabravo.com,droidgamers.com,droidviews.com,dronexl.co,dronezon.com,drpsychmom.com,drugstoredivas.net,drumhelper.com,drummagazine.com,drummerworld.com,drumspy.com,drumstrive.com,drveganblog.com,dryscalpgone.com,dsmtuners.com,dubaitravelplanner.com,dubsdaily.com,ducatiforum.com,ducatihyper.com,ducttapeanddenim.com,due.com,duggarfamilyblog.com,dukesavenue.com,dumblittleman.com,dunkorthree.com,duoplanet.com,dutchmenowners.org,dwellbymichelle.com##+js(rmnt, script, /"__adblocker"|"data-sdk"/) +eandpcrochet.com,earth911.com,earthly-provisions.com,earthsfriends.com,earthsky.org,eastcoastcreativeblog.com,easybudgetrecipes.com,easycheesyvegetarian.com,easychickenrecipes.com,easydessertrecipes.com,easydinnerrecipes.com,easydrawingguides.com,easyfamilyrecipes.com,easygayoven.com,easygoodideas.com,easyhomemadelife.com,easyhomemaderecipes.ca,easylowsodiumrecipes.com,easynotecards.com,easyrecipedepot.com,easyrecipesfromhome.com,easysalads.com,easysoutherndesserts.com,easythingstosew.com,easytravelpoints.com,easyweeknightrecipes.com,eatathomecooks.com,eatatmaudes.com,eatbetterrecipes.com,eatcookbake.com,eatdrinkpure.com,eatfigsnotpigs.com,eating-made-easy.com,eatingbirdfood.com,eatingbyelaine.com,eatingeuropean.com,eatinginstantly.com,eatingonadime.com,eatingwitherica.com,eatingwithzion.com,eatlikebourdain.com,eatlittlebird.com,eatliverun.com,eatmovemake.com,eatortoss.com,eatpicks.com,eatplant-based.com,eatplayshae.com,eatsomethingvegan.com,eatthebite.com,eatthegains.com,eatwellspendsmart.com,eatwithcarmen.com,eatwithclarity.com,eatyourselfskinny.com,eazygrub.com,eazypeazymealz.com,ebicycles.com,ecoconsumerguide.com,ecoenergygeek.com,economicshelp.org,economicsonline.co.uk,ecstatichappiness.com,edelwyn.com,edeneats.com,edibleperspective.com,educationaltechnology.net,educationlibrary.org,effortlessfoodie.com,effortlessgent.com,eggsallways.com,egpu.io,eighteen25.com,eightforestlane.com,elavegan.com,electricbluefood.com,electricianforum.co.uk,electricians.forum,electricmommy.com,electricteeth.com,electrikjam.com,electronicdrumadvisor.com,electronicshub.org,eleganceandenchantment.com,eleganceechoes.com,eletric-vehicles.com,elicitfolio.com,elisabethmcknight.com,eliserosecrochet.com,eliteprospects.com,elizabethrider.com,elkstudiohandcraftedcrochetdesigns.com,ellaclaireinspired.com,elleandpear.com,ellieandco.co.uk,elliott.org,elmundoeats.com,elmundoeats.es,embracingsimpleblog.com,emergencyprepguy.com,emfcaution.com,emilieeats.com,emilyaclark.com,emilybites.com,emilyfabulous.com,emilykylenutrition.com,emilylaurae.com,emiraforum.com,emissions.org,emmacruises.com,emmymade.com,emojiflashcards.com,emojikeyboard.io,employmentlawhandbook.com,empressofdirt.net,emptyeasel.com,enchartedcook.com,encouragingmomsathome.com,encyclopedia-titanica.org,encyclopedia.com,endfield.gg,endomondo.com,endurancely.com,energydrinkhub.com,engineerboards.com,engineeryourfinances.com,enginepatrol.com,english-grammar-lessons.com,englishbulldognews.com,englishlinx.com,enjoysharepoint.com,enoki.nz,entertainingdiva.com,entertainingwithbeth.com,entertainmentnow.com,entirelyelizabeth.com,entoin.com,enzasquailhollowkitchen.com,epawaweather.com,epicdope.com,epicgardening.com,episodehive.com,equippinggodlywomen.com,eregulations.com,erinliveswhole.com,erinobrien.life,erinscozykitchen.com,erinspain.com,erinstraveltips.com,errenskitchen.com,errorfixer.co,erynwhalenonline.com,escapeforum.org,esportstales.com,essenparadies.com,essentialketo.com,ethanchlebowski.com,etiquetteschoolofamerica.com,etkjokken.com,euphoriazine.com,eurasiareview.com,eurocheapo.com,eutawstreetreport.com,eva-darling.com,eventstocelebrate.net,evergreenkitchen.ca,everyday-reading.com,everydayannie.com,everydaycheapskate.com,everydaydishes.com,everydayeileen.com,everydayelizabeth.com,everydayessentialist.com,everydayfamilycooking.com,everydayfamilyeats.com,everydaymaven.com,everydaynourishingfoods.com,everydaythrifty.com,everylastbite.com,everylittlecrumb.com,everylittlename.com,everything-delish.com,everythingairfryer.com,everythingbackyard.net,everythingfishkeeping.com,everythinglabradors.com,everythingmarina.com,everythingtrivia.com,everywherewithclaire.com,evolutionofstyleblog.com,evolvingtable.com,exactlywhatistime.com,excelchamps.com,exceldemy.com,excelsemipro.com,exceltrick.com,exclusivepumping.com,expedition33.gg,expeditionforum.com,expertworldtravel.com,exploreessaouira.com,exploringvegan.com,exrx.net,extinctanimals.org,extraordinarybbq.com,extraordinarychaos.com,extrapetite.com,extremehowto.com,extremeweatherwatch.com##+js(rmnt, script, /__adblocker|html-load/) +f4wonline.com,fabeveryday.com,fabtcg.gg,fabulesslyfrugal.com,facilycasero.com,factsinstitute.com,factsjustforkids.com,fadeawayworld.net,fairygardendiy.com,fakeginger.com,falasteenifoodie.com,familiesgotravel.com,familyaroundthetable.com,familyfelicity.com,familyroadtrip.co,familysavvy.com,familyspice.com,familystylefood.com,familytravel-middleeast.com,familytreemagazine.com,familyvacationdesign.com,famivita.com,famivita.com.br,fanbuzz.com,fannetasticfood.com,fansfocus.com,fantabulosity.com,fantasticfunandlearning.com,fantasycalc.com,fantasydata.com,fantasyfootballcalculator.com,fantasyfootballranker.com,fantasyfootballreports.com,farmergrows.com,farmersalmanac.com,farmgirlgourmet.com,farmingbase.com,farmingshelter.com,farmlifediy.com,farmwifecooks.com,farmwifedrinks.com,fashionablefoods.com,fashionbeans.com,fastandslowcooking.com,fastfoodmenuprices.com,fastingwithlaura.com,fatcalc.com,fatforweightloss.com.au,fatgirlhedonist.com,fatherandus.com,fathermag.com,fatimacooks.net,fatimafarmer.com,fauxsho.org,favfamilyrecipes.com,favoritepaintcolorsblog.com,fearlessdining.com,feastandwest.com,feastforafraction.com,feastgood.com,feastingathome.com,feastingnotfasting.com,feastingonfruit.com,fedandfit.com,feedgrump.com,feedingourflamingos.com,feedingthefrasers.com,feedingtinybellies.com,feedmephoebe.com,feedthepudge.com,feelgoodfoodie.net,feelinfabulouswithkayla.com,feelingfoodish.com,feelslikehomeblog.com,femalefoodie.com,fermentingforfoodies.com,festivalguidesandreviews.com,ffxnow.com,fiatforum.com,fiberfluxblog.com,fiberglassrv.com,fictionhorizon.com,fictionlit.com,fierceboard.com,fifteenspatulas.com,fillingandfabulous.com,fillmyrecipebook.com,filmcolossus.com,filosofashion.com,financebuzz.com,financeformulas.net,financestrategists.com,financesuperhero.com,financialbestlife.com,financialpanther.com,financialsamurai.com,financillustrations.com,findcatnames.com,findingouradventure.com,findingseaturtles.com,findingtimetofly.com,findmyguitar.com,findtherun.com,finearttutorials.com,finishedwithsalt.com,finmasters.com,finurah.com,firefighterinsider.com,firefliesandmudpies.com,firstdayofhome.com,firstdown.studio,firstforwomen.com,firsthomelovelife.com,firstquarterfinance.com,firstsportz.com,firststepeurope.com,fishedthat.com,fisheries.co.uk,fishforums.net,fishlab.com,fishonfirst.com,fishtankreport.com,fitandfabliving.com,fitasamamabear.com,fitbottomedgirls.com,fitibility.com,fitmamarealfood.com,fitmittenkitchen.com,fitnessfooddiva.com,fitnessista.com,fitrays.com,fittoservegroup.com,fivebarks.com,fivehearthome.com,fixthisbuildthat.com,fjrforum.com,flabfix.com,flaggle.net,flagle-game.com,flamingotoes.com,flavcity.com,flavorfulife.com,flavormosaic.com,flawlessfood.co.uk,fliesonly.com,flightaware.com,flighthacks.com.au,flippedupsidedown.com,flipsimu.com,floandgrace.com,floorcritics.com,flooringforum.com,floralapron.com,florgeous.com,floridapanhandle.com,floridatravelwithkids.com,flouronmyfingers.com,flowerglossary.com,fluentin3months.com,fluentincoffee.com,fluxingwell.com,fmbrotherhood.com,fnafinsider.com,fnfmods.net,focusdailynews.com,fodmapeveryday.com,foldnfly.com,fontsforpeas.com,food-bites.com,foodal.com,foodandjourneys.net,foodbanjo.com,foodbloggersofcanada.com,foodbymaria.com,foodbymars.com,foodcrumbles.com,fooddoodles.com,foodess.com,foodfaithfitness.com,foodfolksandfun.net,foodforfitness.co.uk,foodforlifegarden.com,foodie.com,foodieaholic.com,foodieandwine.com,foodiecrush.com,foodiefiasco.com,foodieholly.com,foodiesterminal.com,foodiewithfamily.com,foodmetamorphosis.com,foodnetworkgossip.com,foodnouveau.com,foodnutters.com,foodologygeek.com,foodpleasureandhealth.com,foodrenegade.com,foodrepublic.com,foodsguy.com,foodsharingvegan.com,foodsharkmarfa.com,foodstoragemoms.com,foodstruct.com,foodtasia.com,foodtasticmom.com,foodtruckempire.com,foodwineandlove.com,foodwithfeeling.com,foolproofliving.com,footballgamingzone.com,footballrumors.me,footprinthero.com,foragersofhappiness.com,forbusybees.com,fordauthority.com,fordfullsize.com,fordraptor2.com,fordraptorforum.com,fordtremor.com,fordtruckfanatics.com,forensicfilesnow.com,forestriverforums.com,forevermillennials.com,forevertwentysomethings.com,foreverwingman.com,forgetfulmomma.com,forgetsugarfriday.com,forkinthekitchen.com,forkknifeswoon.com,forktospoon.com,formatlibrary.com,forscubadivers.com,forthefamily.org,forthefrills.com,forthepleasureofeating.com,fortniteinsider.com,fortressofsolitude.co.za,fortunly.com,forzafire.com,fosbasdesigns.com,fouraroundtheworld.com,fourwheeltrends.com,foxandbriar.com,foxandpinestitches.com,foxeslovelemons.com,foxestalk.co.uk,foxfarmhome.com,foxhollowcottage.com,foxyfolksy.com,fpl.team,fpsindex.com,fptrack.com,fractuslearning.com,fragrancereview.com,fragrancetoday.com,fraicheliving.com,framedcooks.com,frameratetest.com,franceadventurer.com,francevoyager.com,frearbroslabs.com,free-n8n-templates.com,freeairpump.com,freecrochettutorials.com,freedomcardboard.com,freedomresidence.com,freehomeschooldeals.com,freemonogrammaker.com,freeorganizingprintables.com,freeprettythingsforyou.com,freeride.com,freescrapbookfonts.com,freeslp.com,freestyletravelers.com,freethankyounotes.com,freetoursbyfoot.com,freezeit.co.uk,freezerfit.com,freezermeals101.com,freightcourse.com,frenchbulldogowner.com,frenchcountrycottage.net,freshaprilflours.com,freshapron.com,freshbeanbakery.com,freshcoasteats.com,freshoffthegrid.com,fridasofiaeats.com,fridaywereinlove.com,friendshipbreadkitchen.com,fromabcstoacts.com,fromachefskitchen.com,fromhousetohome.com,fromicecreamtosteak.com,frommybowl.com,fromscratchdaily.com,fromtheangels.com,fromthiskitchentable.com,fromvalerieskitchen.com,frondtech.com,front-porch-ideas-and-more.com,frontporchlifemagazine.com,frontrangefed.com,frugalcouponliving.com,frugalfanatic.com,frugalfarmwife.com,frugalforless.com,frugalfun4boys.com,frugalginger.com,frugallivingmom.com,frugallyblonde.com,frugalmomeh.com,frugalreality.com,frugalrules.com,frugalyabundante.com,frvr.com,fuelly.com,fufuskitchen.com,fullcoffeeroast.com,fullofplants.com,fullydriven.com,fun-a-day.com,fun-squared.com,funattic.com,funcheaporfree.com,funclothcrafts.com,funcraftskids.com,funfinderclub.com,funfoodfrolic.com,funhandprintartblog.com,funinfairfaxva.com,funinfirst.com,funintheyard.com,funktionalhome.com,funkyjunkinteriors.net,funlearningforkids.com,funmoneymom.com,funny-jokes.com,funthingsinhouston.com,funwithmama.com,funwithoutfodmaps.com,futmind.com,fynesdesigns.com##+js(rmnt, script, /"__adblocker"|"data-sdk"/) +gadgetreview.com,gadgetsandwearables.com,galonamission.com,gameanswer.net,gameclubz.com,gamedayculture.com,gamedayeats.com,gamerdiscovery.com,gamerempire.net,gamerhour.net,gameriv.com,gameslikefinder.com,gamesolver.net,gamespew.com,gamestouse.com,gamezebo.com,gaming-fans.com,gamingsmart.com,gardenandbloom.com,gardenersoasis.com,gardenerspath.com,gardenersyards.com,gardenforindoor.com,gardenholic.com,gardening-forums.com,gardeningchannel.com,gardeningelsa.com,gardeningproductsreview.com,gardeninthekitchen.com,gardenmyths.com,gardenpondforum.com,gardentherapy.ca,gardenzeus.com,garlicandzest.com,garlicsaltandlime.com,garminrumors.com,garnishandglaze.com,garnishwithlemon.com,gatechecked.com,gatherednutrition.com,gatherforbread.com,gatherlemons.com,gatorenvy.com,gcaptain.com,gearpatrol.com,gearthhacks.com,gedpracticequestions.com,gedpracticetest.net,geeksofcolor.co,geekspin.co,genealogyexplained.com,generationacresfarm.com,generatorgrid.com,genevieveogleman.ca,gentlemansgazette.com,gentlenursery.com,gentletummy.com,genxfinance.com,geographyrealm.com,germanyfootsteps.com,getarazor.com,getbusygardening.com,getinspiredeveryday.com,getmeonacruise.com,getmorevocab.com,getonmyplate.com,getonmysaladplate.com,gettystewart.com,gfactorliving.com,gforgadget.com,giadzy.com,giangiskitchen.com,giftofcuriosity.com,giftofhospitality.com,giftrabbit.com,gigashock.com,gimmedelicious.com,gimmesomeoven.com,gimmethegoodstuff.org,gina-michele.com,ginabnutrition.com,ginaccreates.com,gingerdivine.com,gingerhomemaking.com,gingersnapsbakingaffairs.com,ginghamgardens.com,girlcarnivore.com,girlgonegourmet.com,girlscangrill.com,girlversusdough.com,girlwiththeironcast.com,girlwiththepassport.com,gislounge.com,gitnux.org,giveagirlaspoon.com,givemehistory.com,giverecipe.com,gladly.io,glam.com,glamournglow.com,glamperlife.com,global-view.com,globalmousetravels.com,globle.fun,glorioustreats.com,glow-diaries.com,glueandglitter.com,gluedtomycraftsblog.com,gluesticksblog.com,gluesticksgumdrops.com,glutenfreeguidehq.com,glutenfreeonashoestring.com,glutenfreepalate.com,gmauthority.com,gmsquarebody.com,gmt400.com,gmt800.com,gnom-gnom.com,gocomics.com,gocurrycracker.com,godairyfree.org,godandman.com,godownsize.com,goingawesomeplaces.com,goingconcern.com,gokartguide.com,goldendoodleadvice.com,goldengracekitchen.com,goldenlucycrafts.com,goldrefiningforum.com,golfcartgo.com,golfcartreport.com,golfergeeks.com,golfsidekick.com,golfspan.com,golfworkoutprogram.com,gonnawantseconds.com,gonomad.com,good.is,goodcarbadcar.net,gooddinnermom.com,goodenessgracious.com,goodenoughmoming.com,goodfooddiscoveries.com,goodfoodpittsburgh.com,goodgourds.com,goodhomeautomation.com,goodinthesimple.com,goodlivingguide.com,goodlookingtan.com,goodmorningquote.com,goodnessavenue.com,gopests.com,gopherhole.com,gopresstimes.com,gossitup.com,gotechtor.com,gotechug.com,gotula.net,govalleykids.com,govexplained.co.uk,govfacts.org,gps-forums.com,grabcraft.com,graceelkus.com,gracefullittlehoneybee.com,gracelikerainblog.com,gradecalculator.com,grainfreetable.com,grammarist.com,grandbaby-cakes.com,grannysinthekitchen.com,grannysquare.me,grantbakes.com,grantourismotravels.com,grassfedgirl.com,grayingwithgrace.com,grazedandenthused.com,greatergood.com,greaterlongisland.com,greatgrubdelicioustreats.com,greatholidayrecipes.com,greatschools.org,greatwithoutgluten.com,greedygirlgourmet.com,greedygourmet.com,greenbeautymama.com,greenchildmagazine.com,greencoast.org,greenesportszone.com,greenhealthycooking.com,greenlitebites.com,greensnchocolate.com,greenvalleykitchen.com,greenweddingshoes.com,greetingcardpoet.com,grilledcheesesocial.com,grillinwithdad.com,grillo-designs.com,grillonadime.com,gritdaily.com,gritsandgouda.com,gritsandpinecones.com,grkids.com,groomshaper.com,groovypost.com,grosgrainfab.com,groundbeefrecipes.com,groupdiy.com,growagoodlife.com,growforagecookferment.com,growfully.com,growingajeweledrose.com,growingdawn.com,growinghandsonkids.com,growingplay.com,growingslower.com,grownandflown.com,growtomato.com,grumpyrecipes.com,grunge.com,gsowners.com,gta-xtreme.com,gtaboom.com,guardiansnation.com,guide2free.com,guided.news,guidetodetailing.com,guidingtech.com,guild-demo.com,guineapig101.com,guitaradvise.com,guitarchalk.com,guitarcommand.com,guitarlobby.com,guitarnick.com,guitarstrive.com,gulfcoastjourneys.com,gundamcard.gg,gurlgonegreen.com,gwens-nest.com,gymnastics-now.com,gymnaverse.com##+js(rmnt, script, /"__adblocker"|"data-sdk"/) +hacksaholic.com,hairbuddha.net,hairstylesfeed.com,haleiwatown.com,halfbakedharvest.com,halfmarathons.net,halfwayanywhere.com,halicopteraway.com,hamstersinfo.com,handsonaswegrow.com,handsthatbless.com,handylittleme.com,hanjancrochet.com,hannahmageerd.com,hapanom.com,happierhuman.com,happihomemade.com,happilyeverafteretc.com,happilyevermom.com,happilyevertravels.com,happilyunprocessed.com,happity.co.uk,happy-mothering.com,happybalancedwellness.com,happydiyhome.com,happyfamilyrecipes.com,happyfoodhealthylife.com,happyhealthyeaters.com,happyhealthymama.com,happyheartyhome.com,happyhomefairy.com,happyhomeschoolnest.com,happyhoneykitchen.com,happyhooligans.ca,happyhourprojects.com,happymoneysaver.com,happyorganizedlife.com,happysimpleliving.com,happytoddlerplaytime.com,happytummy702.com,happyveggiekitchen.com,happyyouhappyfamily.com,harbourbreezehome.com,hardlinecrawlers.com,hardrockforums.com,hardwaresecrets.com,harryknowsball.com,hashtaginvesting.com,hative.com,hauntedplaces.org,hausandhand.com,hauteandhealthyliving.com,have-clothes-will-travel.com,hawaii-guide.com,hawaii.com,haylskitchen.com,hazyandhoppy.com,hdontap.com,headbangerskitchen.com,headfonia.com,healingtomato.com,healthbeet.org,healthdigest.com,healthecooks.com,healthfulblondie.com,healthiersteps.com,healthtoempower.com,healthy-delicious.com,healthyambitions.co,healthyelizabeth.com,healthyfitnessmeals.com,healthyfloflo.com,healthyfoodiegirl.com,healthygffamily.com,healthygirlkitchen.com,healthygreenkitchen.com,healthyhappysmart.com,healthyheartyrecipes.com,healthyhelperkaila.com,healthykitchen.com,healthykitchen101.com,healthylifetrainer.com,healthylittlefoodies.com,healthylittlepeach.com,healthylittlevittles.com,healthylivingjames.co.uk,healthynibblesandbits.com,healthyrecipes101.com,healthyrecipesblogs.com,healyeatsreal.com,heandsheeatclean.com,heartandsoulhomeschooling.com,heartfullofmom.com,hearthandvine.com,hearthookhome.com,hearthpwn.com,heartifb.com,heartscontentfarmhouse.com,heatherchristo.com,heatherednest.com,heatherlikesfood.com,heatnation.com,heavenlyhomemakers.com,heavenlyspiced.com,heavy.com,hecktictravels.com,heightcomparison.com,hellocreativefamily.com,hellohoneycomb.blog,hellolovelystudio.com,hellopharmacist.com,hellosewing.com,helpdeskgeek.com,helpfixthat.com,henricocitizen.com,hepper.com,herepup.com,heresyourdinner.com,heretocook.com,hermanathome.com,hermitcrabanswers.com,heroesfire.com,heroichollywood.com,herpackinglist.com,herpaperroute.com,hertoolbelt.com,herviewfromhome.com,hesipracticetest.com,heydonna.com,heygrillhey.com,heyimreading.com,heyitsfree.net,heymichigan.com,heynutritionlady.com,heyorlando.com,hezzi-dsbooksandcooks.com,hiddensandiego.com,hifiplus.com,highchairchronicles.com,highheelsandabackpack.com,highheelsandgrills.com,highlysensitiverefuge.com,highschooltestprep.com,hildaskitchenblog.com,hilltoprecipes.com,hilotrailerforum.com,hiphipgourmet.com,hiphomeschoolmoms.com,hiride.com,hisetpracticetest.org,histordle.com,historic-uk.com,history-computer.com,hisugarplum.com,hitherandthither.net,hobbyhelp.com,hobbyinsider.net,hockeyanswered.com,hockeystats.com,hockeywilderness.com,hogwarts.cafe,holajalapeno.com,holidaycalendar.io,holidayexpert.com,holidayscalendar.com,holisticfoodie.com,holistichealthherbalist.com,holisticsquid.com,hollywoodhomestead.com,holycowvegan.net,homanathome.com,homeairadvisor.com,homeautomation.forum,homebodyeats.com,homebrewtalk.com,homebuiltairplanes.com,homecookedroots.com,homecookingadventure.com,homecookingcollective.com,homecookingmemories.com,homecrux.com,homefortheharvest.com,homegrail.com,homegrounds.co,homegrownhappiness.com,homemade-gifts-made-easy.com,homemade-modern.com,homemadeandyummy.com,homemadebycarmona.com,homemadeforelle.com,homemadeheather.com,homemadehome.com,homemadehooplah.com,homemadeinterest.com,homemadelovely.com,homemaking.com,homemindset.com,homemodelenginemachinist.com,homenization.com,homeoomph.com,homeschool.com,homeschoolhappiness.com,homeschoolof1.com,homeschoolpreschool.net,homesicktexan.com,homesoftherich.net,homesteadandchill.com,homesteadhow-to.com,homesteadingfamily.com,homesthetics.net,homestoriesatoz.com,hometheateracademy.com,hometheaterreview.com,hometips.com,homeworthy.com,homeyohmy.com,honestandtruly.com,honestcooking.com,honestgolfers.com,honestlyadhd.com,honeyandlime.co,honeybearlane.com,honeybuilthome.com,honeyname.com,honeywerehome.com,honeywhatscooking.com,honkai.gg,hookedonhouses.net,hoosierhomemade.com,horseracingsense.com,hortonbarbell.com,hostthetoast.com,hot-thai-kitchen.com,hotbeautyhealth.com,hotcountry1035.ca,hotcouponworld.com,hotelgyms.com,hotelswithhottubinroom.club,hotforfoodblog.com,hothardware.com,hotpankitchen.com,hotsalty.com,hotvehs.com,houndgames.com,housebyhoff.com,housedigest.com,housedpet.com,housefur.com,housekeen.com,housemixblog.com,houseofdebt.org,houseofhawthornes.com,houseofhepworths.com,houseofnasheats.com,houseofroseblog.com,houseofturquoise.com,houseplantsexpert.com,houseplantsinfo.com,houserepairtalk.com,housewifehowtos.com,housingaforest.com,houstonherald.com,how2doketo.com,howchoo.com,howewelive.com,howmuchisin.com,howsweeteats.com,howthingscompare.com,howtobearedhead.com,howtobuildit.org,howtocook.recipes,howtodisney.com,howtodispose.info,howtofeedaloon.com,howtohomeschoolforfree.com,howtoisolve.com,howtomakedinner.com,howtomakewreaths.com,howtomurderpests.com,howtonestforless.com,howtorefinishfurniture.com,howtotipsntricks.com,howtotypeanything.com,html.cafe,htowndaily.com,hubbardbroadcasting.com,huddle.today,huddlegame.com,hugsandcookiesxoxo.com,humblerise.com,hummingbirdhigh.com,hummusapien.com,humorliving.com,humoroushomemaking.com,hundredpushups.com,hungryenoughtoeatsix.com,hungryforinspiration.com,hungryhappens.net,hungryhealthyhappy.com,hungryinthailand.com,hungrypaprikas.com,hungryrunnergirl.com,hunker.com,husaberg.org,huskermax.com,hvac.forum,hvacptcharts.com##+js(rmnt, script, /"__adblocker"|"data-sdk"/) +iambaker.net,iamhomesteader.com,iamneverfull.com,iankewks.com,ibreatheimhungry.com,icancrochetthat.com,icanteachmychild.com,iclarified.com,idealme.com,ideasfornames.com,identicalrecipes.com,idleontoolbox.com,idonthavetimeforthat.com,idontknowwhatiknow.com,idownloadblog.com,idrlabs.com,ifanzine.com,ifoodreal.com,igamemom.com,ih8mud.com,ihackeddiabetes.com,ihcubcadet.com,iheartartsncrafts.com,iheartcraftythings.com,ihearteating.com,iheartnaptime.net,iheartorganizing.com,iheartrecipes.com,iheartumami.com,iheartvegetables.com,ihorror.com,ikneadtoeat.com,ikream.com,illinoisloyalty.com,iloveclassicrock.com,imafoodie.com.au,imaginacres.com,imaginationsoup.net,imaging-resource.com,imamother.com,imightbefunny.com,immigrantstable.com,immotherofthebride.com,imodeler.com,imperfecthomemaker.com,imperfectlyhappy.com,improvephotography.com,improvesailing.com,in2013dollars.com,inbloombakery.com,inchcalculator.com,incomera-doo.com,indianhealthyrecipes.com,indianveggiedelight.com,indiepanda.net,indoorplaygroundforkids.com,indulgenteats.com,indywithkids.com,infarrantlycreative.net,infinitcloset.com,infinite-fusion.net,inflatableblast.com,inflightfeed.com,infoinspired.com,injennieskitchen.com,inkatrinaskitchen.com,inkdecks.com,inklink.news,inkristaskitchen.com,inmamamaggieskitchen.com,inmyownstyle.com,inquiringchef.com,insearchofyummyness.com,insider-gaming.com,insidethemagic.net,insidetherustickitchen.com,insidetheupgrade.com,insideuniversal.net,insimoneskitchen.com,inspiralized.com,inspirationmadesimple.com,inspiredbycharm.com,inspiredtaste.net,inspiremore.com,inspiringmomlife.com,inspiringtips.com,instafreshmeals.com,instantloss.com,instantpoteats.com,instantramen.com,instantstreetview.com,insteading.com,instrupix.com,intentionalhospitality.com,intentionallyeat.com,interestingengineering.com,interestingliterature.com,internet-access-guide.com,interstaterestareas.com,interviewpenguin.com,intjsecrets.com,intlwaters.com,intmath.com,intoindiegames.com,intoxicatedonlife.com,introvertdear.com,investedwallet.com,iowagirleats.com,iphoneforums.net,iphoneincanada.ca,ireadlabelsforyou.com,irelandbeforeyoudie.com,irishamericanmom.com,irreverentgent.com,irunfar.com,irv2.com,isabeleats.com,isabelledias.com,isavea2z.com,ishouldbemoppingthefloor.com,ishouldhavesaid.net,isitpacked.com,isixsigma.com,islands.com,isoldmyhouse.com,ispyfabulous.com,italianchef.com,itallstartedwithpaint.com,itdoesnttastelikechicken.com,iteachtoo.com,itechguides.com,itemlevel.net,ithinkwecouldbefriends.com,itinyhouses.com,itisakeeper.com,itrwrestling.com,itsalwaysautumn.com,itsavegworldafterall.com,itslivb.com,itsnotcomplicatedrecipes.com,itstartswithgoodfood.com,itsybitsyfun.com,itsyummi.com,izzycooking.com##+js(rmnt, script, /"__adblocker"|"data-sdk"/) +jackfruitful.com,jamaicanfoodsandrecipes.com,jamesandcatrin.com,jamhands.net,jamiecooksitup.net,jamieotis.com,jamjarkitchen.com,jamonkey.com,janellerohner.com,japanese-names.info,japanesecooking101.com,jaroflemons.com,jasminealley.com,javabeat.net,jawnsicooked.com,jaycoowners.com,jaylynnlittle.com,jaysbrickblog.com,jayscentre.com,jayscustomcreations.com,jazznearyou.com,jazztimes.com,jcookingodyssey.com,jeanelleats.com,jeanetteshealthyliving.com,jeep392.com,jeepkj.com,jeepwagoneer.forum,jellymemos.com,jenhayescreations.com,jenhdao.com,jennaburger.com,jennasuedesign.com,jenneatsgoood.com,jenniferallwoodhome.com,jenniferbanz.com,jenniferrizzo.com,jenontherun.com,jenwoodhouse.com,jerasjamboree.co.uk,jerkyholic.com,jerseydigs.com,jesshuff.com,jessicaautumn.com,jessicadimas.com,jessicagavin.com,jessicalynnwrites.com,jessicanturner.com,jessieathome.com,jessifearon.com,jetdrift.com,jetpunk.com,jetsetchristina.com,jetsxfactor.com,jewelryshoppingguide.com,jigcraft.com,jigsawexplorer.com,jillbjarvis.com,jillcataldo.com,jillianharris.com,jiujitsucraft.com,joannaoverly.com,jobdescriptionswiki.com,jobsinfootball.com,jocjapantravel.com,jocooks.com,johnnyjet.com,joinmeinthekitchen.com,joinyourlife4u.com,jolenesrecipejournal.com,jolynneshane.com,jomygosh.com,jonathanzaragoza.com,jordanjetsets.com,josephwriteranderson.com,joshuaweissman.com,josieandnina.com,jototheworld.com,joujoutravels.com,journalbuddies.com,journeytosahm.com,joybauer.com,joybileefarm.com,joyfilledeats.com,joyfoodsunshine.com,joyfulabode.com,joyfulhealthyeats.com,joyfullymad.com,joyfulmesses.com,joyfulmomma.com,joyfulmommaskitchen.com,joyofmotioncrochet.com,joyousapron.com,joythebaker.com,joyusgarden.com,jugglingactmama.com,juliapacheco.com,juliasalbum.com,juliemarieeats.com,juliescafebakery.com,jumbleanswer.com,jungler.gg,juniperandoakes.com,junky-traveler.com,junkyardmob.com,jupiter.recipes,justagirlandherblog.com,justagirlblog.com,justamumnz.com,justapinch.com,justataste.com,justbcrafty.com,justbrightideas.com,justfreshkicks.com,justinesnacks.com,justinweather.com,justisafourletterword.com,justonecookbook.com,justplaincooking.ca,justpostedblog.com,justslowcooker-recipes.com,justsotasty.com,justweather.org,jz-eats.com##+js(rmnt, script, /__adblocker|html-load/) +k9ofmine.com,kaaltv.com,kanji.tools,karacarrero.com,kateable.com,kateandmeri.com,katerinafaith.com,katesbestrecipes.com,katheats.com,kathleenscravings.com,kathrynskitchenblog.com,katiebirdbakes.com,katieleekitchen.com,katiescucina.com,kawalingpinoy.com,kayakanglermag.com,kayakhelp.com,kch-ent.com,kdnuggets.com,keeperofthehome.org,keepingitrelle.com,keepingitsimpleblog.com,keepingitsimplecrafts.com,keepingitsimpleitalian.com,keepingthepeas.com,keepingupchangs.com,keepinspiring.me,keepthescore.com,keeptradecut.com,kelleynan.com,kellyelko.com,kellyleighcreates.com,kellyscleankitchen.com,kellythekitchenkop.com,kelseyinlondon.com,kelseysfoodreviews.com,kenarry.com,ketoasap.com,ketoconnect.net,ketocookingchristian.com,ketokarma.com,ketovale.com,kevinandamanda.com,keviniscooking.com,keyboardforums.com,keynotesupport.com,keystoneforums.com,keytomylime.com,kicking-carbs.com,kiddingaroundcharlotte.com,kiddingaroundcolumbia.com,kiddingaroundgreenville.com,kidfriendlythingstodo.com,kidgredients.com.au,kidsactivitiesblog.com,kidzcraftcorner.com,kikifoodies.com,killingthyme.net,kimberdawnco.com,kimchimari.com,kimscravings.com,kimspireddiy.com,kindercraze.com,kindergartenworks.com,kindergartenworksheetsandgames.com,kindlyunspoken.com,kingofthegym.com,kingshotcalculator.com,kingshotdata.com,kingshotguides.com,kingshotoptimizer.com,kinsta.cloud,kirbiecravings.com,kirstenhollowaydesigns.com,kissmysmoke.com,kitchen335co.com,kitchenathoskins.com,kitchencents.com,kitchenconfidante.com,kitchendivas.com,kitchenfunwithmy3sons.com,kitchenhabit.com,kitchenknifeforums.com,kitchenlaughter.com,kitchennightmaresupdates.com,kitchennostalgia.com,kitchensanctuary.com,kitchensanity.com,kitchenseer.com,kitchenserf.com,kitchenstewardship.com,kitchenswagger.com,kitchentableclassroom.com,kitchentreaty.com,kitchenwhisperers.com,kitchinsider.com,kittiaroundtheworld.com,kiwifamilies.co.nz,kneadsomesweets.com,knickoftime.net,knicksnation.com,knicksxfactor.com,knifeandsoul.com,knifeinformer.com,knitcrochetcreate.co.uk,knitfarious.com,knitterknotter.com,knitting-news.com,knittingwithchopsticks.com,knotions.com,knowing-jesus.com,knownothingnomads.com,knowyourmobile.com,knowyourproduce.com,kob.com,kojo-designs.com,kommandotech.com,korrashay.com,kosheronabudget.com,kosmofoto.com,kowalskimountain.com,kpople.net,kpreps.com,kr4m.com,krissysoverthemountaincrochet.com,kristendukephotography.com,kristineinbetween.com,krogerkrazy.com,krollskorner.com,kstp.com,kubotaforum.com,kwokspots.com,kyleecooks.com,kylieminteriors.ca,kzookids.com##+js(rmnt, script, /__adblocker|html-load/) +labornursemama.com,ladypeartree.com,ladysavings.com,lakelandmom.com,lakemchenryscanner.com,lakersdaily.com,lakersnews.com,lakewizard.com,lalymom.com,lambertslately.com,lanascooking.com,landcruiserforum.com,landlister.co.uk,landocspe.com,landroverworld.org,laneandgreyfare.com,lanebakery.com,laptop-forums.com,laraclevenger.com,largefamilytable.com,largescaleforums.com,lastwar.wiki,lastweekilearned.com,lasvegasrestaurants.com,lateralmovements.com,laughingplace.com,laughingroostereats.com,laughingspatula.com,laughingsquid.com,laurafuentes.com,laurelberninteriors.com,laurenfromscratch.com,laurenmcbrideblog.com,laurenscravings.com,laurenslatest.com,laurenslighthouse.com,lavenderandmacarons.com,lavidanomad.com,lavieongrand.com,lawandcrime.com,lawnmodel.com,lawnmowerforum.com,laylita.com,lazyadmin.nl,lazycatkitchen.com,lazymanandmoney.com,lcarecipes.com,leaderconnectingleaders.com,leafyjournal.com,leafyplace.com,leaguefeed.net,leagueofgraphs.com,leaguetips.gg,leahingram.com,leanproteinqueen.com,learnaboutnature.com,learneditfrommymom.com,learnenglish.com,learningjquery.com,learnmetrics.com,leasehackr.com,leathercraftforum.com,leatherskill.com,leavingtherut.com,lebernard.ca,lechefswife.com,lecremedelacrumb.com,ledgernote.com,leelalicious.com,leftbraincraftbrain.com,leftinknots.com,legacy-wow.com,legacy.hockey,legallyhealthyblonde.com,legendplayz.com,legendsofamerica.com,legendsofkansas.com,legendsofz.com,legiongolife.com,leitesculinaria.com,lemonbin.com,lemonblossoms.com,lemonlimeadventures.com,lemonsandlattes.com,lemonsandzest.com,lemonslavenderandlaundry.com,lenaskitchenblog.com,leoduq.com,lesswithlaur.com,letsdiyitall.com,letslassothemoon.com,letsrv.com,letstraveltocancun.com,letstraveltomexico.com,letterboxedanswers.com,letthebakingbegin.com,letthemeatgfcake.com,levelsanswers.com,lexiscleankitchen.com,lexusgxforum.com,life-in-the-lofthouse.com,life-with-confidence.com,lifearoundthetable.ca,lifeasastrawberry.com,lifeasmama.com,lifebyleanna.com,lifecurrentsblog.com,lifehealthhq.com,lifeinmini.com,lifeinourcorner.com,lifeinruralfrance.com,lifeisaparty.ca,lifeismessyandbrilliant.com,lifeissweeterbydesign.com,lifeloveandgoodfood.com,lifeloveandsugar.com,lifemadefull.com,lifemadeketo.com,lifemadesimplebakes.com,lifemadesweeter.com,lifemeasure.com,lifeofsailing.com,lifeonsummerhill.com,lifeonvirginiastreet.com,lifeovercs.com,lifepathdoc.com,lifesambrosia.com,lifestyleforreallife.com,lifestylefortress.com,lifestyleofafoodie.com,lifewithdogs.tv,lifewithgremlins.com,lifewiththecrustcutoff.com,lifexperimentblog.com,lifeyourway.net,liftbigeatbig.com,liftvault.com,likehotketo.com,likewhereyouregoing.com,lilaloa.com,lilblueboo.com,liliputing.com,lillieeatsandtells.com,lilluna.com,lillychilders.com,lilvienna.com,lilyloutay.com,lilypcrumbs.com,lindsayannbakes.com,lindsaypleskot.com,lindseyeatsla.com,lingalot.com,linsfood.com,linuxgenie.net,linuxize.com,linuxsimply.com,listcaboodle.com,listendata.com,listverse.com,littlebinsbricks.com,littlebinsforlittlehands.com,littlebitsof.com,littleblackskillet.com,littlechefwithin.com,littlecoffeefox.com,littleferrarokitchen.com,littleflowercottage.com,littlehaloj.com,littlehealthybites.com,littlehousebigalaska.com,littlehouseliving.com,littlehouseoffour.com,littlelearningclub.com,littlelearningcorner.com,littleloucooks.com,littlemissmomma.com,littlenonni.com,littleredpiano.com,littlespicejar.com,littlespoonfarm.com,littlesugarsnaps.com,littlesunnykitchen.com,littlesweetbaker.com,littleworldofwhimsy.com,liveboldandbloom.com,livecrafteat.com,liveeatlearn.com,liveforlivemusic.com,livelaughrowe.com,livelovefruit.com,liverate.com,livesimply.me,living-vegan.com,livingandstilllearning.com,livingchirpy.com,livingcost.org,livinghealthywithchocolate.com,livinginashoebox.com,livinglifeandlearning.com,livingmyveglife.com,livingonadime.com,livingrichwithcoupons.com,livingthegourmet.com,livingwellforseniors.com,livingwellmom.com,lizmarieblog.com,lmld.org,lnn.co,loaids.com,logcabinhub.com,logicalharmony.net,logicprohelp.com,lolababykusina.com,lollyjane.com,lomaculinaria.com,longbournfarm.com,longrangehunting.com,lookslikecandy.com,lorcana.gg,lorcanaplayer.com,loremipsum.io,lostarkfire.com,lostatsay.com,lostsword.gg,lotterycritic.com,lotteryusa.com,louisianacookin.com,louisianawomanblog.com,lovableloops.com,loveablelemons.com,loveandgoodstuff.com,loveandlemons.com,loveandmarriageblog.com,loveandotherspices.com,loveandrenovations.com,lovefilipinofood.com,lovefromtheoven.com,loveincmag.com,loveinmyoven.com,lovelifeyarn.com,loveloveloveblog.com,lovelovething.com,lovelydelites.com,lovelygreens.com,lovelyplanner.com,lovemeow.com,loveourreallife.com,loveyourcat.com,low-offset.com,lowcalicious.com,lowcarb-ology.com,lowcarbingamongfriends.com,lowcarbinspirations.com,lowcarblove.com,lowcarbquick.com,lowcarbsimplified.com,lowcarbspark.com,lowkickmma.com,lsathacks.com,lsd.law,luciddreamsociety.com,luckybelly.com,lucykatecrochet.com,luv2garden.com,luxaterra.com,luxe.digital,luxeluminous.com,luxurylaunches.com,lydioutloud.com,lynnswayoflife.com,lyricle.app##+js(rmnt, script, /__adblocker|html-load/) +maangchi.com,macexpertguide.com,machinelearningmastery.com,machiningdoctor.com,machow2.com,macrameforbeginners.com,macreports.com,macrumors.com,madaboutcruises.com,madaboutfood.co,madaboutmacarons.com,madden-school.com,maddysavenue.com,madebybarb.com,madebygootie.com,madeitateitlovedit.com,madetobeamomma.com,madewithlau.com,madhuseverydayindian.com,madincrafts.com,maebells.com,maesmenu.com,magicalclan.com,magicalguides.com,magnet-fishing.com,mailboxlocate.com,mainelysubarus.com,maisieandruth.com,maisondecinq.com,maisondepax.com,majasrecipes.com,makeanddocrew.com,makeandtakes.com,makefunprintables.com,makehealthyrecipes.com,makeit-loveit.com,makeitcrochet.com,makeitdairyfree.com,makeitdough.com,makelifelovely.com,makelyhome.com,makenstitch.com,maketecheasier.com,makethebestofeverything.com,makinghomebase.com,makingitinthemountains.com,makinglemonadeblog.com,makingsenseofcents.com,makingthymeforhealth.com,makylacreates.com,malaysianchinesekitchen.com,mallorynikolaus.com,mallorythedietitian.com,mamacheaps.com,mamagourmand.com,mamainastitch.com,mamainstincts.com,mamakatslosinit.com,mamaknowsglutenfree.com,mamalovesfood.com,mamanatural.com,mamaneedscake.com,mamaofminis.com,mamashire.com,mamaslaundrytalk.com,mamaslearningcorner.com,mamasonabudget.com,mamavation.com,mandysrecipeboxblog.com,manforhimself.com,mangiawithmichele.com,mangoful.com,manhaircuts.com,manhattan-nest.com,manteligencia.com,mantelligence.com,manusmenu.com,mapcrunch.com,maphappy.org,maple.kitchen,mapleandthyme.com,maplejubilee.com,mapleleafshotstove.com,mapmaster.io,mapofus.org,marathonhandbook.com,marcandangel.com,marcellinaincucina.com,marialuceydietitian.com,mariasbluecrayon.com,mariashriver.com,mariashriversundaypaper.com,maricruzavalos.com,marijuanamoment.net,marineinsight.com,marinmamacooks.com,marketingaccesspass.com,marlameridith.com,marlybird.com,martinloganowners.com,martysmusings.net,marvel.church,marvelousdogs.com,marvelrivals.gg,marvelsnap.pro,marvelsnapzone.com,maryse.net,maryswholelife.com,maryvancenc.com,masalaandchai.com,masalaherb.com,mashed.com,mashtips.com,masonfit.com,masonjarcraftslove.com,masstime.us,masteringruneterra.com,matchbuilt.com,matchsimulator.com,matchthememory.com,matermea.com,math-forums.com,math-salamanders.com,mathcracker.com,mathgeekmama.com,mathhelpforum.com,mathlearnit.com,mathler.com,mathmonks.com,mathsathome.com,mathswithmum.com,mathwarehouse.com,mattadlard.com,mattsfitchef.com,maureenabood.com,mavsnation.com,maximumridesharingprofits.com,mayihavethatrecipe.com,maytheray.com,mbreviews.com,mccooltravel.com,mealplanningmommies.com,mealplanpros.com,mealprepify.com,mealprepmanual.com,meaningfuleats.com,meaningfulmama.com,meanttobemade.com,meanwhileinireland.com,measuringstuff.com,meateatingmilitaryman.com,meatified.com,meatloafandmelodrama.com,meatrabbits.org,meaww.com,mech9.com,mechanicbase.com,mechanicguides.com,mediaite.com,mediatakeout.com,medicalhero.com,medievalists.net,mediterraneanliving.com,meetmeindepartures.com,meetways.com,meganstarr.com,meganvskitchen.com,meghanmakesdo.com,megmadewithlove.com,meladorascreations.com,melaniecooks.com,melissaknorris.com,melissassouthernstylekitchen.com,mellysews.com,melskitchencafe.com,menhairstylesworld.com,menhairstylist.com,menshairstylestoday.com,mentalfoodchain.com,merakilane.com,mercedesmedic.com,merriam-webster.com,merricksart.com,merrillfotonews.com,messforless.net,messylittlemonster.com,meta-chart.com,metal-building-homes.com,metemgee.com,mexicanfoodjournal.com,mexicanmademeatless.com,mexicocassie.com,mexicoenmicocina.com,mexicoinmykitchen.com,mexicotravelsecrets.com,mezzoguild.com,mgevs.com,miakouppa.com,miamitake.com,micechat.com,michaelfairmantv.com,michaelsaves.com,michellemorfett.com,mickeyvisit.com,micocinadominicana.com,midgetmomma.com,midwesternholidays.com,midwesternhomelife.com,midwesternmoms.com,midwestfoodieblog.com,midwestlifeandstyle.com,midwexican.com,mikebakesnyc.com,miketabor.com,mikhaeats.com,milabubeautyreview.com,milehighhappyhour.com,mileswithmcconkey.com,militarybases.com,militarydisneytips.com,militarytimechart.com,milkglasshome.com,millennial-grind.com,millennialboss.com,millennialships.com,mimisorganiceats.com,minaelleskitchen.ca,mindfulmocktail.com,mindfulzen.co,minecraftbuildinginc.com,minecraftforum.net,minecraftmaps.com,minecraftstation.com,miniaturehorsetalk.com,minimalistbaker.com,ministryofcurry.com,minitravellers.co.uk,minoomakesstuff.com,mintnotion.com,mirlandraskitchen.com,missallieskitchen.com,missdecarbo.com,misshomemade.com,missinformationblog.com,missinthekitchen.com,mississippivegan.com,missmustardseed.com,mittengirl.com,mixandmatchmama.com,mixop.net,mjandhungryman.com,mjsoffthehookdesigns.com,mmo-champion.com,mobafire.com,mobile-cuisine.com,mobilesuitarena.com,mochimommy.com,moco.gg,mocoshow.com,modandmood.com,modernfarmer.com,modernfarmhouseeats.com,modernhoney.com,modernmoh.com,modernmrsdarcy.com,modernsurvivalonline.com,modestfish.com,modpodgerocksblog.com,modsella.com,mofluid.com,mom4real.com,momables.com,mombrite.com,momcrieff.com,momcurls.com,momdoesreviews.com,momendeavors.com,momfessionals.com,momfoodie.com,momlifemadeeasy.com,momlifetoday.com,momlovesbaking.com,momlovesbest.com,momluck.com,mommafitlyndsey.com,mommalew.com,mommybearmedia.com,mommyhatescooking.com,mommylabornurse.com,mommymusings.com,mommyneedschocolate.com,mommyonpurpose.com,mommyoverwork.com,mommypotamus.com,mommysfabulousfinds.com,mommyshomecooking.com,mommyshorts.com,mommythrives.com,momof6.com,momontimeout.com,momooze.com,momscravings.com,momsdinner.net,momsdish.com,momsneedtoknow.com,momsoftweensandteens.com,momsrecipecollection.com,momswhothink.com,momswithcrockpots.com,momswithmouseears.com,monarchbutterflygarden.net,moneymakingmommy.com,moneyning.com,moneysavingmom.com,moneywehave.com,moneywise.com,moneyzine.com,monkeyandmekitchenadventures.com,monologueblogger.com,monopolyland.com,monpetitfour.com,monsterhunterhq.com,montanaowners.com,moodymixologist.com,mooglyblog.com,moolasavingmom.com,moonandspoonandyum.com,moralfibres.co.uk,morereptiles.com,morethankyounotes.com,morethanmeatandpotatoes.com,moritzfinedesigns.com,morningchores.com,mortadellahead.com,moscatomom.com,mossdigitalpublishing.com,mossword.com,mostcraft.com,mostlovelythings.com,mostlyhomemademom.com,motherearthtravel.com,motorandwheels.com,motorbiscuit.com,motorcyclelegalfoundation.com,motorhomefaqs.com,motorious.com,motormatchup.com,mountainmamacooks.com,mountainmodernlife.com,mozielife.com,mp1st.com,mpgbuddy.com,mrandmrshowe.com,mrishtanna.com,mrmakeithappen.com,mrshappyhomemaker.com,mrsjoneskitchen.com,mrsmerry.com,msfsaddons.com,mspoweruser.com,msshiandmrhe.com,mtgarena.pro,mtgazone.com,mtgdecks.net,mtgsalvation.com,mturbogamer.com,muaythai.com,mudrunguide.com,muminthemadhouse.com,mumsmakelists.com,munchiesbymallory.com,munchingwithmariyah.com,munchinwithmaddie.blog,munchygoddess.com,murphybedhq.com,murphysmultiverse.com,musclecarclub.com,muscleevo.net,musicalmum.com,musicaltheatreresources.com,musiccoder.com,musiccritic.com,musicpiechart.com,musicstrive.com,musingsofamuse.com,musthavemom.com,mut.gg,muybuenoblog.com,muydelish.com,muzzleloadingforum.com,my-island-jamaica.com,my-travelmonkey.com,myadventuresacrosstheworld.com,myairfryerkitchen.com,myamortizationchart.com,mybakingaddiction.com,myballard.com,mybartender.com,mybeautybunny.com,myblahblahblahg.com,myblessedlife.net,mybmwi3.com,mycaliforniatravels.com,mycasualpantry.com,mychemicalfreehouse.net,mychicobsession.com,mychoiceschools.com.au,mycolombianrecipes.com,mycookingjourney.com,mycrazygoodlife.com,mydarlingvegan.com,mydesignchic.com,mydinner.co.uk,mydogsname.com,mydominicankitchen.com,myelearningworld.com,myeverydaytable.com,myexcelonline.com,myfearlesskitchen.com,myfederalretirement.com,myfocuselectric.com,myfooddata.com,myfoodstory.com,myfrugaladventures.com,myfrugalhome.com,myglobalviewpoint.com,mygluten-freekitchen.com,mygolfspy.com,mygoodfoodworld.com,mygorgeousrecipes.com,mygrandrv.com,myheartbeets.com,myheavenlyrecipes.com,myhomemaderoots.com,myhomemyglobe.com,myincrediblerecipes.com,myjoyfilledlife.com,myketoplate.com,mykidslickthebowl.com,mykindofmeeple.com,mykitchenescapades.com,mykitchenserenity.com,mykoreankitchen.com,mylatinatable.com,mylifeandkids.com,mylifeelsewhere.com,mylistoflists.com,mymessykitchenn.com,myminichefs.com,mymocktailforest.com,mymodernmet.com,mymorningespresso.com,mymundaneandmiraculouslife.com,mynameissnickerdoodle.com,mynaturalfamily.com,mynewhairstyles.net,mynissanleaf.com,myorganizedchaos.net,myoutlanderphev.com,mypaycalculator.co.uk,mypetsname.com,myplaniq.com,myplantbasedplan.com,myplantifulcooking.com,myquietkitchen.com,myradkitchen.com,myrepurposedlife.com,myriadrecipes.com,mysaucerecipes.com,mysavings.com,myspicetrunk.com,mysuburbankitchen.com,mysweetketo.com,mysweetsavannah.com,myswissalps.com,mytastycurry.com,myteenguide.com,mytennishq.com,mythinkbiglife.com,mythologysource.com,mytopspotify.io,mytrailco.com,myvegetarianroots.com,myvwegolf.com,mywinston-salem.com,mywordgames.com##+js(rmnt, script, /__adblocker|html-load/, excludes, self.__next) +nailsalonsnearme.com,namesnerd.com,namesonwheel.com,nanascraftyhome.com,naomicakes.com,narcissisms.com,nashvillegab.com,nashvillevoyager.com,nashvillewife.com,natashalh.com,natashashome.com,natashaskitchen.com,nationalparksmom.com,naturalbabylife.com,naturalbeachliving.com,naturalfertilityandwellness.com,naturalhomeapothecary.com,naturallieplantbased.com,naturallysavvy.com,natureinspiredlearning.com,navaraforum.com,navylookout.com,nayturr.com,nbadraftroom.com,ncraoa.com,nearthebeatenpath.com,nedandmimi.com,neighborfoodblog.com,nelliebellie.com,neonlightsmedia.com,nerdburglars.net,nerdsandbeyond.com,nerdsandscoundrels.com,nerdtechy.com,nestingwithgrace.com,nestofposies-blog.com,neuroscientificallychallenged.com,newengland.com,newlifeonahomestead.com,newlywoodwards.com,newser.com,newtoncustominteriors.com,nextlevelgents.com,nextofwindows.com,nextstophawaii.com,nexuspointnews.com,nflperry.com,nhltraderumor.com,nhltraderumors.me,nickishomemadecrafts.com,nickiswift.com,nickskitchen.com,nikke.gg,nikkisplate.com,nikolopaa.com,ninahendrick.com,ninaoutandabout.ca,ninersdaily.com,ninjacue.com,ninjaguide.com,nintendosmash.com,nippyfish.net,nirvanacakery.com,nishkitchen.com,nitroowners.com,njwoodsandwater.com,nobakerecipes.com,nobiggie.net,noblepig.com,nobunplease.com,nocrumbsleft.net,nofilmschool.com,nomadasgourmet.com,nomadsunveiled.com,nomastehungry.com,nombeah.com,nomnompaleo.com,nonamehiding.com,noracooks.com,nordichook.com,norecipes.com,norinesnest.com,northsidebaseball.com,northwestforkids.co.uk,norwegiancruiselineblog.com,noshingwiththenolands.com,nosidebar.com,nospoonnecessary.com,nosweatshakespeare.com,notabully.org,notateslaapp.com,notenoughcinnamon.com,notentirelyaverage.com,notesbythalia.com,noticiaspais.com,notimeforflashcards.com,notjustahousewife.net,nourish-and-fete.com,nourishandtempt.com,nourishedbynic.com,nourishingjoy.com,nourishingminimalism.com,nourishingpursuits.com,nourishmovelove.com,novaljalocal.com,novelgames.com,nowgeorgia.com,nowhabersham.com,nremtpracticetest.com,ntertain.us,number-2-pencil.com,numstheword.com,nursefern.com,nursingtheory.org,nurtureandthriveblog.com,nurturemygut.com,nutmegandvinegar.com,nutmegnanny.com,nutriciously.com,nutrient-matters.com,nutritionadvance.com,nutritionfor.us,nutritionforrunning.com,nutritionistreviews.com,nutritiontofit.com,nutritiontwins.com,nutritiousdeliciousness.com,nycforfree.co,nyssaskitchen.com,nytbee.com,nytcrossword.org,nytcrosswordanswers.org,nytspellingbeeanswers.org,nywoodsandwater.com,nzpocketguide.com##+js(rmnt, script, /__adblocker|html-load/) +oakandmarlow.com,oaxacatraveltips.com,oceaninfo.com,oceanusadventure.com,ochristine.com,ofbatteranddough.com,offbeathome.com,offbeatwed.com,offgridgirl.com,officerassignments.com,officialdata.org,officialgamerules.org,officiallyglutenfree.com,offtheeatenpathblog.com,ohhappyday.com,ohhappyjoy.com,ohhowcivilized.com,ohiofestivals.net,ohmeohmyblog.com,ohmy-creative.com,ohmyfoodrecipes.com,ohsheglows.com,ohsimply.com,ohsobeautifulpaper.com,ohsodelicioso.com,ohsospotless.com,ohsweetbasil.com,ohthatsgood.com,oilburners.net,okonomikitchen.com,oldest.org,oldhousecalling.com,oldhousesforsale.com,oldhousesunder100k.com,oldhousesunder50k.com,oldhousesusa.com,oldhousetonewhome.net,oldsaltfarm.com,oldschoollabs.com,oldwest.org,olgainthekitchen.com,olgasflavorfactory.com,oliveandmango.com,olivesnthyme.com,olivetomato.com,oliveyouwhole.com,oliviaadriance.com,omaddiet.com,omegaforums.net,omgchocolatedesserts.com,omnivorescookbook.com,on3.com,onceuponacheerio.com,onceuponachef.com,onceuponaprintable.com,onebalancedlife.com,onebeautifulhomeblog.com,onecomputerguy.com,onecrazyhouse.com,onecrazymom.com,onecreativemommy.com,onedayitinerary.com,onedishkitchen.com,oneessentialcommunity.com,onegoodthingbyjillee.com,onehappybite.com,onehappydish.com,onehotoven.com,oneingredientchef.com,onelittleproject.com,onelovelylife.com,onepiece.gg,onepotdishrecipe.com,onepotrecipes.com,oneprojectcloser.com,oneshetwoshe.com,onesweetappetite.com,onionringsandthings.com,online-field-guide.com,online-solitaire.com,onlineguitarbooks.com,onlinemictest.com,onlyfoods.net,onlygators.com,onlyinyourstate.com,onlypassionatecuriosity.com,onmykidsplate.com,onohawaiianrecipes.com,onolicioushawaii.com,onpenang.com,onpointfresh.com,onsuttonplace.com,onthefeeder.com,onthegas.org,oombawkadesigncrochet.com,ootrandomizer.com,openrangeowners.com,opereviews.com,optimizedportfolio.com,optimizepri.me,orangebloods.com,orchestracentral.com,orchidbliss.com,organicallyaddison.com,organisemyhouse.com,organizationjunkie.com,organized31.com,organizedisland.com,organizeyourselfskinny.com,organizingmoms.com,orgjunkie.com,origamiway.com,orlando-parenting.com,orlandodatenightguide.com,orlandoparkstop.com,orlandovoyager.com,ornithology.com,orwhateveryoudo.com,osrsguide.com,osxdaily.com,otisandus.co.uk,ourbestbites.com,ourcraftycocktails.com,ourcrowsnest.com,ourfamilyofseven.com,ourfifthhouse.com,ourgabledhome.com,ourglobetrotters.com,ourhappymess.com,ourhomemadeeasy.com,ourkindofcrazy.com,ourlifetastesgood.com,ourlovelanguageisfood.com,ournourishingtable.com,ourplantbasedworld.com,oursaltykitchen.com,oursportscentral.com,ourstoneyacres.com,ourwovenjourney.com,ourzestylife.com,outagescope.com,outdoorapothecary.com,outdoorguide.com,outdoors.com,outdoortroop.com,outgrilling.com,outsidergaming.com,outsons.com,overclockers.com,overdraftapps.com,overemployed.com,overframe.gg,overthebigmoon.com,overthefirecooking.com,ozstudies.com##+js(rmnt, script, /__adblocker|html-load/) +packinsider.com,paddlingmag.com,padresmission.com,pageflutter.com,pagingsupermom.com,paintstrategies.com,paleoleap.com,paleomg.com,paleorunningmomma.com,pamelasalzman.com,panaceaspantryblog.com,pancakerecipes.com,panlasangpinoy.com,pantrymama.com,paperscissorscraft.com,papertoys.com,papertraildesign.com,par3nearme.com,parametric-architecture.com,parapropracticetest.com,parentingchaos.com,parentingpatch.com,parentingpod.com,parentingscience.com,parentingstronger.com,parentingteensandtweens.com,parentportfolio.com,parentpreviews.com,parkrangerjohn.com,parksavers.com,parsleyandicing.com,passionatecrafter.com,passmesometasty.com,passportandpixels.com,passportandplates.com,passtheplants.com,pastatwins.com,pastrieslikeapro.com,pastrybysaloni.com,pastrychefonline.com,pastryliving.com,patientgardener.co.uk,patsfans.com,pattern-paradise.com,pattyplates.com,pauladeenmagazine.com,paulmarina.com,pawdiet.com,pawsnpups.com,pawsomerecipes.com,pbfingers.com,pc-builder.io,pcguide.com,pcmecca.com,pcosnutritionistalyssa.com,pd2.tools,peacefulparenthappykids.com,peaceloveandlowcarb.com,peakbagger.com,peakdistrictkids.co.uk,peaktoplate.com,peanutblossom.com,peanutblossombookclub.com,peanutbutterandjilly.com,peanutbutterandjulie.com,peanutbutterpluschocolate.com,peanutbutterrunner.com,peartreekitchen.com,peasandcrayons.com,peelwithzeal.com,pelletsandpits.com,pelobuddy.com,penaltyfile.com,pennantchase.com,penniesintopearls.com,pennymediallc.com,pennypinchinmom.com,pepperporch.com,pepperscale.com,peppershomeandgarden.com,perchancetocook.com,percolately.com,perfectbrew.com,periodicadventures.com,periodnirvana.com,persialou.com,persnicketyplates.com,personafans.com,personalityclub.com,personalitygrowth.com,personalityhunt.com,personalitymax.com,personalityunleashed.com,pertpracticetest.com,perudelights.com,pestdude.com,pestleanalysis.com,pestpush.com,pestseek.com,pet-happy.com,petadvisers.com,petalrepublic.com,petalstopicots.com,petcarrierverdict.com,petdogowner.com,petiteinparis.com,petkeen.com,petpress.net,petrinadarrah.com,petsgal.com,petsoid.com,pewterreport.com,phillyvoice.com,philrosenthalworld.com,phlebotomyexaminer.com,phlebotomypracticetest.net,phoenixwithkids.net,photographypursuits.com,phototraces.com,phyrra.net,physicianassistantforum.com,physicianonfire.com,physicsforum.com,physicsread.com,pianodreamers.com,pickanytwo.net,pickerwheel.com,pickledbarrel.com,pickledplum.com,picksandparlays.net,picky-palate.com,pickyeaterblog.com,picturethemagic.com,pieladybakes.com,piesandtacos.com,piloncilloyvainilla.com,pilotplans.com,pimylifeup.com,pinchandswirl.com,pinchmeimeating.com,pinchofyum.com,pincutsewstudio.com,pineconesandacorns.com,pinkpopdesign.com,pinsandprocrastination.com,pinstripesnation.com,pipandebby.com,pipeburn.com,pipingpotcurry.com,pipsunlimited.app,piratesandprincesses.net,pistolsfiringblog.com,pitbossforum.com,pitcherlist.com,pivot-table.com,pivotalweather.com,pixcams.com,pizzablab.com,pizzamaking.com,pizzazzerie.com,pjip.org,pkmncards.com,placeofmytaste.com,plaidandpaleo.com,plainchicken.com,planetguide.net,planetnatural.com,plankandpillow.com,planneratheart.com,planomoms.com,plantbaes.com,plantbasedcookingshow.com,plantbasedjess.com,plantbasedjuniors.com,plantbasedonabudget.com,plantbasedrdblog.com,plantcaretoday.com,plantedinthekitchen.com,planthebestvacation.com,plantifullybasedblog.com,plantinformer.com,plantpowercouple.com,plantyou.com,platedcravings.com,platingsandpairings.com,plattertalk.com,playbarkrun.com,playdoughtoplato.com,playerstv.com,playideas.com,playingmtg.com,playpartypin.com,playpartyplan.com,playswellwithbutter.com,playthetunes.com,playtivities.com,playtolearnpreschool.us,pletaura.com,plowingthroughlife.com,pluggedingolf.com,plumbingforums.com,pmppracticeexam.org,pmstudycircle.com,pnwmoto.com,pocketchangegourmet.com,pocketturbo.com,pocus101.com,poemanalysis.com,poemofquotes.com,poemsandoccasions.com,poemsource.com,pokedata.io,pokejungle.net,pokemap.net,pokemon-zone.com,pokemoncard.io,pokemoncoders.com,pokemontcgzone.com,pokequestrecipes.me,pokesymbols.com,pokopiadex.com,pokuniverse.com,polestar.forum,polkadotchair.com,pontoonopedia.com,pookspantry.com,popularrecipes.com,populationpyramid.net,populationpyramids.org,popville.com,porchdaydreamer.com,porofessor.gg,porsche-mania.com,poshplate.us,positivelysplendid.com,positivepsychology.com,postergrind.com,posthouselegacy.net,postpartumtrainer.com,posturedirect.com,potomaclocal.com,poultryshowcentral.com,powellfamilycooking.com,powerhungry.com,powerliftingtechnique.com,powershellfaqs.com,powerstrokearmy.com,practical-golf.com,practicallyfunctional.com,practicallyhomemade.com,practicalpie.com,practicalselfreliance.com,practicecnatest.com,prayerist.com,pre-kpages.com,preciouscore.com,prefabreview.com,pregnancyfoodchecker.com,pregnantchicken.com,premeditatedleftovers.com,preparednessadvice.com,preparednessmama.com,prepear.com,preppykitchen.co.uk,preppykitchen.com,preschoolplayandlearn.com,presentationskills.me,pressurecookingtoday.com,pressurecookrecipes.com,prettyhandygirl.com,prettymyparty.com,prettypies.com,prettyprovidence.com,prettyprudent.com,prettysimplesweet.com,preventionrd.com,pricematchguarantee.net,priceme.game,priceoftravel.com,pricescope.com,primaledgehealth.com,primallyinspired.com,primandprep.com,primaverakitchen.com,primermagazine.com,princesscruisesblog.com,princesshairstyles.com,princesspinkygirl.com,printablecrush.com,printablesforlife.com,printabulls.com,printerknowledge.com,probaseballhistory.com,prodigalpieces.com,prodigygamers.com,productivityspot.com,productmint.com,profootballdaily.com,profootballhistory.com,profootballnetwork.com,profusioncurry.com,progametalk.com,progardentips.com,prohockeyhistory.com,projectgolfau.com,prologuetalk.com,pronounceskincare.com,properlyrooted.com,prospectingaustralia.com,proteincakery.com,proteinsnackqueen.com,protoolreviews.com,prouddogmom.com,prouditaliancook.com,proudtobeprimary.com,prowrestlingstories.com,prudentpennypincher.com,ps4storage.com,psychologydictionary.org,psychologyjunkie.com,ptcbpracticetest.com,ptcgpocket.gg,ptoanswers.com,pttrns.com,pumpkinnspice.com,pumpkinsandpetals.com,punchbowl.com,puppyleaks.com,puppyweightcalculator.com,pupswithchopsticks.com,puptraveller.com,purelykaylie.com,purseblog.com,putacupinit.com,puttingmetogether.com,puzzlepagecheats.com,puzzles-to-print.com,puzzleseveryday.com,pynative.com,python-graph-gallery.com,pythoncentral.io,pythonforbeginners.com,pythonguides.com##+js(rmnt, script, /"__adblocker"|"data-sdk"/) +quaries.com,queenbeetoday.com,queersapphic.com,queue-times.com,quickpreprecipes.com,quickweeknightmeals.com,quietlifefarm.com,quiltdom.com,quizwise.com,quotecatalog.com##+js(rmnt, script, /__adblocker|html-load/) +rabbitandwolves.com,rabbitcaretips.com,rabbitliving.com,rachaelsgoodeats.com,rachelcooks.com,rachelcooksthai.com,rachelteodoro.com,rachelwojo.com,rachlmansfield.com,rachnacooks.com,radiantlydressed.com,radicalfire.com,radiofidelity.com,radiokorea.com,radiologyinplainenglish.com,raepublic.com,raffamusadesigns.com,ragerampage.com,raiderking.com,raidersbeat.com,raidersreport.com,railwaymodels.uk,rainbownourishments.com,rainbowplantlife.com,rainonatinroof.com,rainydaymum.co.uk,raisecuriouskids.com,raisinghealthyfamilies.com,rakskitchen.net,rallyjournal.com,ram-rho.com,ram-trx.com,ramforum.com,ramonascuisine.com,randaderkson.com,random.country,randomcity.net,randomgenerators.com,randompowergenerator.com,randomstreetview.com,randymajors.org,rangeofsounds.com,rangerxd.com,ranker.com,rapidfireart.com,raptive.com,raptive.net,raptivesite.com,rarethief.com,ratracerebellion.com,ratrelief.com,ratrodbikes.com,ratrodsrule.com,rav4resource.com,rbtpracticeexam.com,rctalk.com,rdr2.org,readingmiddlegrade.com,readygamesurvive.com,realadvicegal.com,realandvibrant.com,realbalanced.com,realcountrysizes.com,realestateinfoguide.com,realestatelicensewizard.com,realfoodrealdeals.com,realfoodwholelife.com,realfoodwithsarah.com,realgreekrecipes.com,realhousemoms.com,realitydaydream.com,reallifeathome.com,reallifedinner.com,reallifenutritionist.com,reallifeoflulu.com,reallittlemeals.com,reallyawesomecostumes.com,realmenrealstyle.com,realmomkitchen.com,realmomnutrition.com,realsimplegood.com,realwaystoearnmoneyonline.com,reasonstoskipthehousework.com,rebeccaandtheworld.com,rebeccataig.com,rebootedmom.com,recessedlighting.com,recetatipica.com,recetatipica.net,recipe-diaries.com,recipe52.com,recipeboy.com,recipefairy.com,recipegirl.com,recipelibrary.net,recipemagik.com,recipesandplaces.com,recipesbynora.com,recipesforholidays.com,recipesfromeurope.com,recipesfromleftovers.com,recipessimple.com,recipesthatcrock.com,recipeswithessentialoils.com,recipesworthrepeating.com,recipeteacher.com,recipethis.com,recipetineats.com,recipevibes.com,recipezazz.com,recteqforum.com,red-herring.info,redandhoney.com,redaroundtheworld.com,redbus2us.com,redcottagechronicles.com,redcurrantbakery.com,redheadcandecorate.com,redherringanswers.com,redhousespice.com,redtedart.com,reenactingschedule.org,referee.com,reformationacres.com,reheardle.com,reinventeddelaware.com,reisefroh.de,reizeclub.com,relationshipculture.com,religiousforums.com,reluctantentertainer.com,remingtonavenue.com,remodelaholic.com,renaldiethq.com,reneerenovates.com,reneeroaming.com,renovatedrvsforsale.com,repaintnow.com,repairwin.com,repeatcrafterme.com,reptilecraze.com,reptilejam.com,repurposingjunkie.com,rerev.com,resetera.com,resin-expert.com,resolutioneats.com,resortsgal.com,respiratorytherapyzone.com,resplendentkitchen.com,restaurantmenuprice.com,restlessbackpacker.com,restlesschipotle.com,restonnow.com,retail-insider.com,retailshout.com,retireby40.org,retiredom.net,retirementtipsandtricks.com,retrieveradvice.com,retrohousewifegoesgreen.com,retropotluck.com,retrorecipebox.com,retrorenovation.com,returnpolicyguide.com,review42.com,reviewlution.ca,revisitinghistory.com,rewardcharts4kids.com,rexgarden.com,rgbcolorpicker.com,rhiansrecipes.com,rhythmsofplay.com,rib.net,richardalois.com,richlyrooted.com,richtexturescrochet.com,ride.guru,riftbound.gg,riftdecks.com,riftmana.com,rigorousthemes.com,risasfamilykitchen.com,rivertenkitchen.com,rmkshoes.com,roadbikerider.com,roadfood.com,roadtripalberta.com,roadtripmanitoba.com,roamingwithkids.com,robloxlist.com,rockcelebrities.net,rockcrawler.com,rocketryforum.com,rockguitaruniverse.com,rockyourhomeschool.net,rogallylife.com,rogerebert.com,rogueengineer.com,rookieroad.com,roomfortuesday.com,rootedrevival.com,rootsandradishes.com,rosebakes.com,rotinrice.com,rotoballer.com,routedfamily.com,routesnorth.com,royalbaloo.com,royalskeep.com,rpginformer.com,rtbookreviews.com,rtwin30days.com,ruffledblog.com,rugbynoise.com,rulergame.net,runbundle.com,runeatrepeat.com,runeterrafire.com,runlifteatrepeat.com,runnerclick.com,runnersblueprint.com,runnerslab.com,runninginaskirt.com,runningonrealfood.com,runningshoesguru.com,runningtothekitchen.com,runsforcookies.com,runstreet.com,runtoradiance.com,runtothefinish.com,runwashington.com,russellstreetreport.com,russianmachineneverbreaks.com,rusticpassionbyallieblog.com,rvandplaya.com,rvblogger.com,rvforum.net,rvinspiration.com,rvlife.com,rvliving.com,rvpioneers.com,rvrank.com,rvtravel.com,ryannordheimer.com##+js(rmnt, script, /__adblocker|html-load/) +sabrinacurrie.com,sailorbailey.com,saintlad.com,salesforcefaqs.com,sallysbakingaddiction.com,salongeek.com,saltandbaker.com,saltandwind.com,saltbuttersmoke.com,saltedplains.com,saltinmycoffee.com,saltnpepperhere.com,saltnsprinkles.com,saltypearlcrochet.com,salu-salo.com,salvagedinspirations.com,samdoesherbest.com,sammibrondo.com,samoaobserver.ws,sandandsisal.com,sandbetweenmypiggies.com,sandhyahariharan.co.uk,sandytoesandpopsicles.com,sarahfit.com,sarahjoyblog.com,sarahremmer.com,sarahsfitfood.com,sarahsvegankitchen.com,sarahtitus.com,sarcasticmommy.com,sasstrology.com,saunahelper.com,savage.ventures,savedbylovecreations.com,saving.org,savingadvice.com,savingdessert.com,savingdollarsandsense.com,savingslifestyle.com,savingtoinvest.com,savorandsavvy.com,savoredeats.com,savoringitaly.com,savoringthegood.com,savortheflavour.com,savorybitesrecipes.com,savoryexperiments.com,savorylotus.com,savorysimple.net,savoryspin.com,savorysweetspoon.com,savorytooth.com,savvybudgetboss.com,savvygardening.com,savvyhomebody.com,savvyhomemade.com,savvyhoney.com,savvymamalifestyle.com,savvysavingcouple.net,sawdust2stitches.com,sawdustgirl.com,sawsonskates.com,sayyes.com,scalemodeladdict.com,scam-detector.com,scantechy.com,scarlatifamilykitchen.com,scatteredthoughtsofacraftymom.com,scentchasers.com,scentselective.com,scheckeats.com,schisandraandbergamot.com,schoolwix.com,science-sparks.com,sciencefacts.net,scienceofpeople.com,scientificallysweet.com,scotchandscones.com,scrapfabriclove.com,scrappygeek.com,scratchandstitch.com,scratchmommy.com,screendynamite.com,screenidle.app,scrollsguided.com,scrumptiously.com,scubadiverlife.com,sdvoyager.com,seahawks.net,seaofknowledge.org,seasonalcravings.com,seasonedandsalted.com,seasonedhomemaker.com,seasonedskilletblog.com,seasonsandsuppers.ca,sedecordle.com,seededatthetable.com,seedscientific.com,seekatesew.com,seekinggoodeats.com,seekingscripture.com,seevanessacraft.com,selfdecode.com,selfhacked.com,selfproclaimedfoodie.com,selfsufficientkids.com,selftattoo.com,semidelicatebalance.com,semihomemadekitchen.com,semihomemaderecipes.com,seniorcatwellness.com,seniorgolfsource.com,seniorskillet.com,seniorsmobility.org,seniortailwaggers.com,senseandedibility.com,sensibledigs.com,seonkyounglongest.com,septle.com,serenetrail.com,seriesgraph.com,servsafepracticetest.com,setforset.com,settingforfour.com,setup.gg,sew4home.com,sewcanshe.com,sewguide.com,sewingiscool.com,sewingmachinetalk.com,sewmuchado.com,sewnikki.com,sewrella.com,sewsomestuff.com,sewwhatalicia.com,sfat4582testa.com,shabbyfufu.com,shadesofblueinteriors.com,shadesofsummr.com,shadowverse.gg,shakedrinkrepeat.com,shakentogetherlife.com,shaneandsimple.com,shanty-2-chic.com,shapeandjoy.com,shapinguptobeamom.com,sharepointdiary.com,sharingkindergarten.com,sharksider.com,sharksinfo.com,sharktankblog.com,sharktankrecap.com,sheaffertoldmeto.com,sheepandstitch.com,sheetaki.com,shelfcooking.com,shelikesmilk.com,shetriedwhat.com,shinesheets.com,shiplapandshells.com,shoforum.com,shooting.org,shoppingtelly.com,shoppingwithdave.com,shorebeat.com,shortgirltallorder.com,shortstackkitchen.com,shotkit.com,shottalk.com,shouldwewatch.com,shoutoutarizona.com,shoutoutatlanta.com,shoutoutcolorado.com,shoutoutdfw.com,shoutouthtx.com,shoutoutla.com,shoutoutmiami.com,shoutoutsocal.com,shoutoutsouthcarolina.com,showstarnews.com,shuangyskitchensink.com,shuttermuse.com,shwetainthekitchen.com,siepracticeexam.com,siftandsimmer.com,siftwithkima.com,sightandsoundreading.com,sightwordsgame.com,silkroadrecipes.com,silodrome.com,silverhomestead.com,silverrecyclers.com,simguided.com,simmerandsage.com,simple-nourished-living.com,simple-veganista.com,simple.money,simpleandfraiche.com,simpleasthatblog.com,simplebakingwithjolene.com,simplecarguides.com,simplecopycatrecipes.com,simpledesserts.com,simpleediy.com,simpleeverydaymom.com,simplefunforkids.com,simplegreenmoms.com,simplegreensmoothies.com,simplehealthykitchen.com,simplejoy.com,simplemadepretty.com,simpleshowing.com,simplesidedishes.com,simplesimonandco.com,simpleveganbites.com,simpleveganblog.com,simplicityandastarter.com,simplifyplants.com,simplisticallyliving.com,simply-delicious-food.com,simplybakings.com,simplybeyondherbs.com,simplycanning.com,simplyceecee.co,simplycollectiblecrochet.com,simplyhappenings.com,simplyhappyfoodie.com,simplyhealthyfamily.org,simplyhomeandhealth.com,simplyhomecooked.com,simplyhookedbyjanet.com,simplyjillicious.com,simplykinder.com,simplylakita.com,simplylovecoloring.com,simplylowcal.com,simplymacros.com,simplymadeeats.com,simplymaggie.com,simplyquinoa.com,simplyrebekah.com,simplyscratch.com,simplyscratchmade.com,simplystacie.net,simplytaralynn.com,simplywhisked.com,simscommunity.info,simshomekitchen.com,sincerelysarad.com,sinfulkitchen.com,sinfullyspicy.com,singaporeanmalaysianrecipes.com,singingcarrots.com,sipandfeast.com,sipbitego.com,sixdollarfamily.com,sixfiguresunder.com,sixhungryfeet.com,sixmanfootball.com,sixtyandme.com,sixvegansisters.com,sizzlingeats.com,sketchok.com,skidsteerforum.com,skilledgolf.com,skillscouter.com,skincarehero.com,skinnyfitalicious.com,skinnykitchen.com,skinnyms.com,skinnysouthernrecipes.com,skinnytaste.com,skiptomylou.org,skoolie.net,skoolielivin.com,skytough.com,slapdashmom.com,slashfilm.com,slashgear.com,slateauto.forum,sleepbubble.com,sleeping.guide,slenderkitchen.com,slippertalk.com,slopitchcentral.com,slowcookedeats.com,slowcookerclub.com,slowcookerfoodie.com,slowcookerliving.com,slowcookermeals.com,slowcookingperfected.com,slowlivingkitchen.com,slowthecookdown.com,smallfootprintfamily.com,smalltownwoman.com,smartbikegames.com,smartcanucks.ca,smartcentsmom.com,smartdoglover.com,smartdrivinggames.com,smartfundiy.com,smartgardenguide.com,smartmoneysimplelife.com,smartnutrition.ca,smartringnews.com,smartschoolhouse.com,smarttereachday.com,smellylunchbox.com,smilingcolors.com,smitefire.com,smithspestmanagement.com,smokedbbqsource.com,smokinandgrillinwitab.com,smoking-meat.com,smokingmeatforums.com,smoothdraw.com,sn95forums.com,snackhistory.com,snacknation.com,snailpacetransformations.com,snap.fan,snaphappytravel.com,snappygourmet.com,sneakerfiles.com,sneakerfortress.com,snippetsofparis.com,snootysims.com,snowboardhow.com,snowbreak.gg,snowest.com,snowmobilehow.com,soapcentral.com,soapdelinews.com,soapmakingforum.com,soapoperadigest.com,soapoperamagazine.com,soapoperanetwork.com,soapoperaspy.com,soapsindepth.com,soberjulie.com,socalhiker.net,socaltrailriders.org,soccerballworld.com,socialadventures.net,socialjunkie.com,societyofrock.com,softballace.com,soho.com.au,sokoskitchen.com,soletshangout.com,solveyourtech.com,somebodyfeedseb.com,somethingaboutsandwiches.com,somethingborrowedpdx.com,somethingnutritiousblog.com,somewhatsimple.com,somewhatsimpleliving.com,somewhereworthwhile.com,somuchbetterwithage.com,somuchfoodblog.com,somuchlife.com,sonatahomedesign.com,songbirdblog.com,songmeaningsandfacts.com,soreyfitness.com,soulcysters.net,soulfoodcooking101.com,soulfullymade.com,soulsisterstravel.com,soundgearnerd.com,soundproofcentral.com,soupaddict.com,sourceofthespring.com,sourdoughbrandon.com,sourdoughjesha.com,sourdoughtalk.com,southcarolinavoyager.com,southernbite.com,southerncastiron.com,southerncrushathome.com,southerndakotamama.com,southerndiscourse.com,southernhomemagazine.com,southernhospitalityblog.com,southernladymagazine.com,southernmadesimple.com,southernplate.com,southgeorgiastyle.com,southhousedesigns.com,souvlakiforthesoul.com,soxmachine.com,spacechatter.com,spacequotations.com,spanishmama.com,spanishsabores.com,sparklesofsunshine.com,spatuladesserts.com,speedyrecipe.com,spellmana.com,spendwithpennies.com,spguides.com,spiceandlife.com,spicebangla.com,spicecravings.com,spicedblog.com,spiceography.com,spiceupthecurry.com,spicysouthernkitchen.com,spideridentifications.com,spidersworlds.com,spinachandbacon.com,spiritanimaldreams.com,spiritanimalsandsymbolism.com,spiritanimaltest.org,spiritualhack.com,spiritualmeanings.org,spoonforkbacon.com,spoonfulofflavor.com,spoonfulofsi.com,sporked.com,sportscardforum.com,sportsfeelgoodstories.com,sportsfoundation.org,sportsgamersonline.com,sportsmansparadiseonline.com,sportsmobileforum.com,sportsmomsurvivalguide.com,sportstalkatl.com,sporttrac.org,spotebi.com,spotifystats.com,spottedhorsedesignco.com,spreadsheetpage.com,spreadsheetpoint.com,sprinklebakes.com,sprinkleofthis.com,sprinklesandsprouts.com,sprinklesomesugar.com,sproutedkitchen.com,sqlserverguides.com,squeaksandnibbles.com,squirrelsatthefeeder.com,stacylynharris.com,stadiumrant.com,stageagent.com,stageberry.com,stagnes.net,star-facts.com,starbucks-calorie-calculator.com,starbuckssecretmenu.net,stardewguide.com,starlinkinsider.com,starlust.org,startdesigngroup.com,starterstory.com,startup101.com,starwarsforum.co.uk,starwarsunlimited.gg,stateofdinner.com,static.com,statisticsglobe.com,statsalt.com,statscrew.com,status.net,statz.gg,stayfitmom.com,stayglam.com,steamandbake.com,steampoweredfamily.com,steelersdepot.com,steelersreport.com,steerplanet.com,stellanspice.com,stemandspoon.com,stepbystepbusiness.com,stephaniessweets.com,stephiecooks.com,stephreallife.com,stephsocial.com,stephsunshine.com,stepstomagic.com,stereogum.com,stetted.com,sticktothemodel.com,stillbeingmolly.com,stillrealtous.com,stitch11.com,stitchbyfay.com,stitching-together.com,stockcharts.com,stockpilingmoms.com,stocktitan.net,stocktrades.ca,stonegableblog.com,storyberries.com,storylandamis.blog,storyofmathematics.com,strandsgame.me,strategiesforparents.com,streamersplaybook.com,streamscheme.com,streetsmartnutrition.com,streetstylis.com,streetsweepingschedule.com,strengthandsunshine.com,stressfreemommies.com,stretchandfolds.com,strictlyweddings.com,stripedspatula.com,strongpasswordgenerator.org,strongsounds.com,stuckonsweet.com,studentdevos.com,studentofguitar.com,studio73designsnb.com,studyfinds.com,studyrocket.co.uk,stuffparentsneed.com,stylebyemilyhenderson.com,stylegirlfriend.com,stylinbyaylin.com,stylinbysarita.com,stylishcelebrations.com,stylishcurves.com,sublimereflection.com,suburbansimplicity.com,succulentcity.com,suebeehomemaker.com,sueseaqpi.com,sufficientself.com,sugarandcharm.com,sugarandsnappeas.com,sugarandsoul.co,sugarandsparrow.com,sugarapron.com,sugarbeecrafts.com,sugarfreelondoner.com,sugargeekshow.com,sugarhero.com,sugarlesscrystals.com,sugarmaplefarmhouse.com,sugarologie.com,sugarsaltmagic.com,sugarspunrun.com,sugaryums.com,suitsexpert.com,sulaandspice.com,summeryule.com,summle.net,sundayschoolzone.com,sundaysuppermovement.com,sungrownkitchen.com,sunheron.com,sunkissedkitchen.com,sunlineclub.com,sunnydayfamily.com,sunrisespecialty.com,sunshineandhurricanes.com,superage.com,supercarnostalgia.com,supercars.net,supercheats.com,superdutydiesel.com,supereslresources.com,supergoldenbakes.com,superhealthykids.com,superherojacked.com,supermanhomepage.com,superwestsports.com,supplyme.com,sureketo.com,surf-reports.com,surfacetip.com,surfhungry.com,surveychris.com,survivalsullivan.com,survivedivorce.com,survivingateacherssalary.com,survivingthestores.com,sustainablecooks.com,sustainablereview.com,sustainlifejournal.com,sustainmycookinghabit.com,sustainmycrafthabit.com,suzyssitcom.com,svadore.com,svg.com,svgandme.com,svgnation.com,swaddlesnbottles.com,swankyrecipes.com,sweetandsavorybyshinee.com,sweetandsavorymeals.com,sweetandsimpleliving.com,sweetashoney.co,sweetcaramelsunday.com,sweetcreekpatterns.com,sweetcsdesigns.com,sweetestmenu.com,sweetkitchencravings.com,sweetlittlebluebird.com,sweetlycakes.com,sweetlysplendid.com,sweetopia.net,sweetpealifestyle.com,sweetpeasandsaffron.com,sweetpeaskitchen.com,sweetphi.com,sweetpotato3.com,sweetpotatosoul.com,sweetsandthankyou.com,sweetscienceoffighting.com,sweetsimplevegan.com,sweetsofties.com,sweetsugarbelle.com,sweetteaandthyme.com,sweettheorydesigns.com,sweettoothsweetlife.com,swgoh.gg,switzerlanding.com,swoonhub.com,swtorista.com,syllablecounter.io,symbolsage.com,symbolsandsynchronicity.com,syzygist.com##+js(rmnt, script, /__adblocker|html-load/, excludes, self.__next) +tablefortwoblog.com,takeayard.com,talesfromthekitchenshed.com,talesofthemiddleages.com,talkandroid.com,talkbass.com,talksox.com,tamatalk.com,tammileetips.com,tampabaydatenightguide.com,tampabayparenting.com,tanga.com,tanningsalonsnearme.com,tarantulaforum.com,tarateaspoon.com,tarathueson.com,tarotforum.net,tarotgoddess.com,tarynwhiteaker.com,tashasartisanfoods.com,tasteandtellblog.com,tastefullygrace.com,tasteofartisan.com,tasteoflithuania.com,tasteofreality.com,tasteofthesouthmagazine.com,tastesbetterfromscratch.com,tasteslovely.com,tastesoflizzyt.com,tastingtable.com,tastingtothrive.com,tastingwithtina.com,tasty-yummies.com,tastyairfryerrecipes.com,tastycocktailrecipes.com,tastyoven.com,tastyrecollections.com,tastythin.com,tastytreatsandeats.com,tattooglee.com,tatyanaseverydayfood.com,tbirdforum.com,tcdb.com,tdalabamamag.com,tdeecalculator.me,teaandinksociety.com,teachbesideme.com,teaching2and3yearolds.com,teachingautism.co.uk,teachingmama.org,teachjunkie.com,teachpreschool.org,teaforturmeric.com,teakandthyme.com,teamfight.lol,teaspoonofgoodness.com,teatimemagazine.com,tech21century.com,techcrawlr.com,techguided.com,techjunkie.com,technipages.com,technologydots.com,techpenny.com,techrt.com,techsiting.com,techwiser.com,techwithtech.com,tecmint.com,teds-list.com,tegutalk.com,tellmemoregolf.com,temeculablogs.com,temptalia.com,tenacrebaker.com,tenniscompanion.org,tennisworldusa.org,tenrowsaday.com,tequilaoclock.com,terianncarty.com,terilynadams.com,territorysupply.com,teslanorth.com,tessiestable.com,texanerin.com,textfixer.com,tflcar.com,tfltruck.com,tftibbq.com,thai-foodie.com,thaicaliente.com,thatbreadlady.com,thatdisneyfam.com,thatfoodiegirl.in,thatgirlcookshealthy.com,thatguywhogrills.com,thatlowcarblife.com,thatonepointofview.com,thatoregonlife.com,thatslowcarb.com,thatsmycrystal.com,thatspicychick.com,thatswhatchesaid.net,thattravel.co.uk,thatveganbabe.com,thatvideogameblog.com,the-bella-vita.com,the-digital-picture.com,the-girl-who-ate-everything.com,the-social-edge.com,the-sound.co.uk,the-take.com,the-travel-life.com,the36thavenue.com,the5krunner.com,theadultman.com,theadventuresatlas.com,theairfryingdiva.com,theallergychef.com,thealmondeater.com,theaquariumguide.com,theartofdoingstuff.com,theartofsimple.net,theatrenerds.com,theatretrip.com,theawesomegreen.com,thebakeologie.com,thebakermama.com,thebakerupstairs.com,thebakingchocolatess.com,thebalancednutritionist.com,thebananadiaries.com,thebarbell.com,thebargainsisters.com,thebatavian.com,thebathroomblueprint.com,thebaynet.com,thebazaarzone.com,thebeachhousekitchen.com,thebearfootbaker.com,thebellyrulesthemind.net,thebenchtrading.com,thebensonstreet.com,thebestcakerecipes.com,thebestideasforkids.com,thebestketorecipes.com,thebestkidscraftsandactivities.com,thebestmods.com,thebetteredblondie.com,thebettermom.com,thebigmansworld.com,theblogette.com,theblokecave.co.uk,theblondcook.com,theboldabode.com,theboondocksblog.com,thebossykitchen.com,thebourbonculture.com,thebreadguide.com,thebudgetbabe.com,thebudgetdecorator.com,thebudgetmom.com,thebudgetsavvybride.com,thebugsquad.com,theburntbuttertable.com,thebusybaker.ca,thebutteryfairytale.com,thecafesucrefarine.com,thecaffeinatedsnail.com,thecaglediaries.com,thecakeblog.com,thecalculatorsite.com,thecambridgeconsultant.com,thecandidcooks.com,thecandidly.com,thecardswedrew.com,thecarefreekitchen.com,thecarmomofficial.com,thecarnivalcruiseblog.com,thecarrotunderground.com,thecastawaykitchen.com,thecatsite.com,thecellguide.com,thecentsableshoppin.com,thecentsofmoney.com,thechaosandtheclutter.com,thechaotictable.com,thecheekychickpea.com,theclassicvaluer.com,theclassroomcreative.com,thecleaneatingcouple.com,theclevercarrot.com,theclevermeal.com,thecoconutmama.com,thecoldwire.com,thecollector.com,thecollegeinvestor.com,thecomicboard.com,theconscientiouseater.com,theconsciousplantkitchen.com,thecontentauthority.com,thecookful.com,thecookiedoughdiaries.com,thecookierookie.com,thecookinchicks.com,thecookingcollective.com.au,thecookingduo.com,thecookingfoodie.com,thecookingjar.com,thecookingmom.com,thecoppertable.com,thecottagejournal.com,thecottagemarket.com,thecountrycook.net,thecouponchallenge.com,thecozyapron.com,thecozyfork.com,thecozyplum.com,thecpuguide.com,thecraftathomefamily.com,thecraftedsparrow.com,thecraftingchicks.com,thecraftingnook.com,thecraftpatchblog.com,thecraftsmanblog.com,thecrafttrain.com,thecraftyblogstalker.com,thecravetraveler.com,thecrazycraftlady.com,thecreameri.com,thecreativecurator.com,thecreativefolk.com,thecreativemuggle.com,thecreativeshour.com,thecreativityexchange.com,theculinarycompass.com,thedailypour.com,thedailyview.com,thedaringkitchen.com,thedarlingapron.com,thedebrief.org,thedefineddish.com,thedeliciouscrescent.com,thedeliciousspoon.com,thedetroitbureau.com,thediaryofadisneydad.com,thediaryofarealhousewife.com,thediggings.com,thedigitalcrowns.com,thedinkpickleball.com,thedinnerbite.com,thediyplaybook.com,thediyvillage.com,thedizzycook.com,thedomesticrebel.com,thedrinkkings.com,thedroidguy.com,theeastcoastkitchen.com,theeasygarden.com,theeburgerdude.com,theedgyveg.com,theeducatorsroom.com,theendlessappetite.com,theendlessmeal.com,theepicureanmouse.com,theeverylastdetail.com,thefamilyfoodkitchen.com,thefamilyfreezer.com,thefamousbirthdays.com,thefarmchicken.com,thefashionablehousewife.com,thefastrecipe.com,thefeatherednester.com,thefedoralounge.com,thefemaleprofessional.com,thefieryvegetarian.com,thefilmbandit.com,thefinalfrontier.us,thefinancebuff.com,thefirstmess.com,thefirstyearblog.com,thefitchen.com,thefitnessphantom.com,thefitnesstribe.com,thefitpeach.com,theflattopking.com,theflavorbender.com,theflavoursofkitchen.com,theflexitarian.co.uk,thefloridatravelgirl.com,thefoodcafe.com,thefoodcharlatan.com,thefoodhussy.com,thefoodieaffair.com,thefoodieblogger.com,thefoodietakesflight.com,theforgottensouth.com,theforkedspoon.com,thefpsreview.com,thefreshcooky.com,thefriendlyredfox.com,thefrugalchicken.com,thefrugalgirls.com,thefrugalhomemaker.com,thefruityjem.com,thefullhelping.com,thegamecrater.com,thegameslayer.com,thegardenglove.com,thegardengrazer.com,thegardeningdad.com,thegardeningfoodie.com,thegarlicdiaries.com,thegatheredhome.com,thegayglobetrotter.com,thegeneticchef.com,thegimptutorials.com,thegirlinspired.com,thegirlonbloor.com,theglamkitchen.com,theglampad.com,theglobalgaming.com,theglowingfridge.com,theglucosegourmet.com,theglutenfreeaustrian.com,thegoldfishtank.com,thegoldhive.com,thegoodgermanshepherd.com,thegoodride.com,thegraciouspantry.com,thegraciouswife.com,thegradcafe.com,thegrapepursuit.com,thegraphicsfairy.com,thegraydetails.com,thegreekfoodie.com,thegreenpinky.com,thegritandpolish.com,thegrumpymechanic.com,thegunnysack.com,thegymlab.org,thehandmadehome.net,thehappierhomemaker.com,thehappycatsite.com,thehappychickencoop.com,thehappyfarmhouse.com,thehappyhousewife.com,thehappyhousie.com,thehappypuppysite.com,theharperhouse.com,theharristeeterdeals.com,theharvestkitchen.com,thehawaiivacationguide.com,thehealthfulideas.com,thehealthyconsultant.com,thehealthyepicurean.com,thehealthyhomecook.com,thehealthyhomeeconomist.com,thehealthyhoneys.com,theheartylife.org,theheirloompantry.co,thehiddenveggies.com,thehistoryofwwe.com,thehivelaw.com,theholidazecraze.com,thehollydogblog.com,theholymess.com,thehomebrewforum.co.uk,thehomecookskitchen.com,thehomeedit.com,thehomeschoolmom.com,thehomeschoolscientist.com,thehomesihavemade.com,thehomesteadinghippy.com,thehoneyhome.com,thehonoursystem.com,thehoopsgeek.com,thehouseoffancy.com,thehouseofsmiths.com,thehousethatlarsbuilt.com,thehoya.com,thehumbledhomemaker.com,thehungrybites.com,thehungrysoles.com,thehybridathlete.com,thehyundaiforums.com,theidearoom.net,theimaginationtree.com,theimpulsivebuy.com,theincrediblebulks.com,theinformr.com,theinspirationboard.com,theinspiredroom.net,theinspiredtreehouse.com,theintentionalmom.com,theirishmanswife.com,thejoysharing.com,thejoysofboys.com,thejudge13.com,thekeeperofthecheerios.com,thekeeperofthememories.com,thekimsixfix.com,thekindergartenconnection.com,thekitchengirl.com,thekitchenmagpie.com,thekitchenpaper.com,thekoreanvegan.com,thelabradoodlesite.com,thelabradorforum.com,thelabradorsite.com,thelastfoodblog.com,thelavenderchair.com,thelazydish.com,theleftrough.com,thelemonbowl.com,theletteredcottage.net,thelibertyline.com,thelifejolie.com,thelifestylecure.com,thelilypadcottage.com,thelist.com,theliterarylifestyle.com,thelittleblogofvegan.com,thelittleepicurean.com,thelittlepine.com,theliveinkitchen.com,theloopholefox.com,theloopylamb.com,theloopywhisk.com,themagicalslowcooker.com,themakerista.com,themakeyourownzone.com,themamahandbook.com,themarblekitchen.com,thematbakh.com,thembites.com,themediterraneandish.com,themeparkinsider.com,themeparkreview.com,themerrythought.com,themiddlesizedgarden.co.uk,themilitarywifeandmom.com,themilliondollarmama.com,theminimalistvegan.com,themiracleofessentialoils.com,themoderngram.com,themodernnonna.com,themodernproper.com,themodestman.com,themodestmomblog.com,themom100.com,themomcreative.com,themomfriend.com,themomnutritionist.com,themontessoritwinmama.com,themorrismansionblog.com,themountainkitchen.com,themountainviewcottage.net,themovementmenu.com,themuse.com,themusicman.uk,thenaturalnurturer.com,thenavagepatch.com,thenerdstash.com,thenerdyfarmwife.com,thenetline.com,thenewbaguette.com,thenewcamera.com,thenewknew.com,thenicolechase.com,thenightowlchef.com,thenodramamama.com,thenoise.com,thenourishinggourmet.com,thenourishinghome.com,thenovicehomestead.com,thenwewalked.com,thenymelrosefamily.com,theoi.com,theoldhouselife.com,theoliveroad.com,theoregondietitian.com,theorganisedhousewife.com.au,theottoolbox.com,theoutbound.com,thepalatablelife.com,thepancakeprincess.com,theparentsflewthenest.com,thepastaqueen.cooking,thepeachiespoon.com,thepeasantsdaughter.net,theperfectfrench.com,theperfectloaf.com,thepetiteplanner.com,thepeugeotforums.com,thephotoforum.com,thepinningmama.com,thepinterestedparent.com,theplanetd.com,theplantbasedschool.com,theplantnative.com,thepointsinsider.com,thepondsfarmhouse.com,thepopularlist.com,thepopupprincess.com,theppk.com,thepragmaticparent.com,theprettybee.com,theprimaryparade.com,theproductanalyst.com,theprofitupdates.com,thepuppymag.com,thepurpleponcho.com,thepurplepumpkinblog.co.uk,thepurposefulpantry.com,thequeenzone.com,theramblingredhead.com,therapybypro.com,therapyfunzone.net,therealfarmhouse.com,therealfooddietitians.com,therealisticmama.com,thereallife-rd.com,therealrecipes.com,therebelwalk.com,therecipecritic.com,therecipelife.com,therecipepot.com,thereciperebel.com,therecipewell.com,theredcarpet.net,thereisfoodathome.com,thereptileroom.net,theresaneoforthat.com,theresearchedtraveler.com,thereviewgeek.com,theriagames.com,therideshareguy.com,thermo.kitchen,thermocookery.com,thermomixdivarecipes.com,theroastedroot.net,therookiejurist.com,therootedfarmhouse.com,theroyalcourtofpasta.com,theroyalforums.com,theroyalobserver.com,therugbyforum.com,theruntesters.com,thesaltedsweets.com,thesaltycooker.com,thesaltymarshmallow.com,thesaltypot.com,thesaltysarge.com,thesassybarn.com,thesaturnforums.com,thesavorychopstick.com,thesavvysparrow.com,thesawguy.com,thescattymum.com,thescranline.com,theseamanmom.com,theseasonalhomestead.com,theseasonedmom.com,theseasonedwok.com,thesecretofthetarot.com,theseoldcookbooks.com,thesewingloftblog.com,theshabbycreekcottage.com,theshabbytree.com,theshaderoom.com,theshadowleague.com,thesimpleparent.com,thesimplycraftedlife.com,thesimplyluxuriouslife.com,theskeletalsystem.net,theskinnyishdish.com,theskinnypot.com,theslenderwrist.com,theslimmingfoodie.com,thesmokies.com,thesoapscoop.com,thesoccermomblog.com,thesologlobetrotter.com,thesouthernladycooks.com,thespacebetweenblog.net,thespeckledpalate.com,thespiritualindian.com,thesportsrush.com,thesqueakymixer.com,thestayathomechef.com,thestemlaboratory.com,thestingyvegan.com,thestitchinmommy.com,thestonesoup.com,thestressfreechristmas.com,thestrive.co,thesubaruforums.com,thesuburbanmom.com,thesugarfreediva.com,thesugarhit.com,thesundaymorningedit.com,thesurfatlas.com,thesurvivalmom.com,thesustainablelivingguide.com,thesweetsimplethings.com,thetabletopfamily.com,thetakeout.com,thetalkingsuitcase.com,thetarotguide.com,thetastytravelers.com,thetaylor-house.com,theteacherscorner.net,thetechwire.com,theteenmagazine.com,thethingswellmake.com,thethriftycouple.com,thetimelinegeek.com,thetinylife.com,thetoastedpinenut.com,thetrendspotter.net,theturkeytraveler.com,theturquoisehome.com,thetwincookingproject.net,thetwobiteclub.com,thetwordtravel.com,theunbox.com,theunconventionalroute.com,theuncorkedlibrarian.com,theunsealed.com,theurbenlife.com,theveganlarder.com,theveglife.com,thevegspace.co.uk,thevetdesk.com,thevgnway.com,theviewfromgreatisland.com,thevintagecook.com,thevivalavita.com,thevolvoforums.com,thevspotblog.com,thewanderfulme.com,thewanderlustkitchen.com,thewanderlustwithin.com,thewave.ca,thewaystowealth.com,theweathereddoor.com,theweatheredfox.com,theweeklyad.com,theweighwewere.com,thewhiskeyjug.com,thewholecook.com,thewholesomedish.com,thewimpyvegetarian.com,thewoksoflife.com,thewoodenskillet.com,thewoodgraincottage.com,thewordcounter.com,theworkathomewife.com,theworkathomewoman.com,theworldbucketlist.com,theyarethefuture.co.uk,theyarncrew.com,theyummybowl.com,theyummydelights.com,theyummylife.com,thezag.com,thinbluefoods.com,thinkingcloset.com,thirtyhandmadedays.com,thisbagogirl.com,thisdelicioushouse.com,thisdishisvegetarian.com,thisevergreenhome.com,thisfarmgirlcooks.com,thishealthykitchen.com,thisishowwebingham.com,thisisraleigh.com,thisisreno.com,thisitaliankitchen.com,thisjess.com,thislittlehome.com,thismessisours.com,thisoldbaker.com,thisorganicgirl.com,thispilgrimlife.com,thispixiecreates.com,thisreadingmama.com,thissavoryvegan.com,thissillygirlskitchen.com,thistlewoodfarms.com,thisvivaciouslife.com,thisweekinworcester.com,thiswortheylife.com,thorforums.com,thoroughlytravel.com,thought.is,thoughtcard.com,thoughtcatalog.com,threadsmonthly.com,threebirdnest.org,threekidsthreecatsandahusband.com,thriftydecorchick.com,thriftydiydiva.com,thriftyfrugalmom.com,thriftynomads.com,thriftynorthwestmom.com,thriftytraveler.com,thrivestrive.com,thriving-glutenfree.com,thrivinghomeblog.com,thrivinginparenting.com,thrivingmum.com,throttlepack.com,throughthefibrofog.com,thunderboltlaptop.com,thurrott.com,thymeandjoy.com,tiaclara.com,ticoandtina.com,ticotimes.net,tidbits-cami.com,tidbitsandtwine.com,tidefans.com,tideking.com,tideschart.com,tidymom.net,tiffanymccauley.com,tiffinandteaofficial.com,tiffycooks.com,tighttorque.com,tikvica.com,timefordelish.com,timelessdishes.org,timelessmyths.com,timelylists.com,timothyplivingston.com,tinboats.net,tinkerlab.com,tinyhomeforums.com,tinyhousetalk.com,tinytotintokyo.com,tipbuzz.com,tipjunkie.com,tipranks.com,tipsaholic.com,titlecaseconverter.com,tjrwrestling.net,tlycblog.com,tmcadaptations.net,todaysdelight.com,todaysgardener.com,todaysthebestday.com,toddlerapproved.com,toddlerdietitiantiff.com,togetherasfamily.com,tokaiforum.com,tokyohive.com,tolstoytherapy.com,tomahawkleader.com,tomakeamommy.com,tomtomforums.com,tonsofthanks.com,toolsofmen.com,toolsweek.com,top-ten-travel-list.com,top40weekly.com,topairfryerrecipes.com,topdogtips.com,tophotsprings.com,topsecretrecipes.com,topshelfdiy.com,topsoccerblog.com,toptierlist.net,toptreehouses.com,topweddingsites.com,tornadopath.com,tortoiseforum.org,tortoiseknowledge.com,toshistable.com,totallygoldens.com,totallythebomb.com,tothotornot.com,totschooling.net,toucharcade.com,touchdowntexas.com,touringplans.com,towingcap.com,town-n-country-living.com,townandtourist.com,towratings.net,toyhabits.com,toysnbricks.com,tprteaching.com,trackmustangsonline.com,tractorbynet.com,traderie.com,traegerforum.com,trailboss.org,trailmanorowners.com,trainfanatics.com,transizion.com,trashschedules.com,travel-mi.com,travel-on-points.com,travelawaits.com,travelcaffeine.com,traveler.gg,travelfashiongirl.com,travelingfamilyblog.com,travelingigloo.com,travelingjules.com,travelingness.com,travelingossip.com,travelingwithjessica.com,travellemming.com,travellerselixir.com,travelmath.com,travelmelodies.com,travelmexicosolo.com,traveltomerida.com,traveltooaxaca.com,traveltrailerpro.com,travelwithmeena.com,traversewithtaylor.com,trawlerforum.com,treadmill.run,treasuredtips.com,treasurenet.com,treasurie.com,trekbible.com,trendingbreeds.com,triadmomsonmain.com,triedandtasty.com,triedandtrueblog.com,triedandtruerecipe.com,tripmemos.com,trippy.com,triumphtalk.com,triviabliss.com,trlnfam.com,troprockin.com,truckconversion.net,truckmodcentral.com,true-north-kitchen.com,truemoneysaver.com,truesourdough.com,truity.com,trumpexcel.com,trvlcollective.com,trvst.world,trx-forum.com,tryhardguides.com,trythisanswer.com,tsipracticetest.com,tucsonfoodie.com,tulamama.com,tun.com,tuner.ninja,tuppennysfireplace.com,turbli.com,turkishliving.com,turkuazkitchen.com,turningforprofit.com,turntablekitchen.com,tutti-dolci.com,tvfoodmaps.com,tvline.com,tvovermind.com,tvtotalkabout.com,twelveonmain.com,twinsdaily.com,twistandtoast.com,twistmepretty.com,twobrokewatchsnobs.com,twobrothersblankets.com,twocloveskitchen.com,twocupsflour.com,twokooksinthekitchen.com,twoluckyspoons.com,twomonkeystravelgroup.com,twoofwands.com,twopeasandtheirpod.com,twoplaidaprons.com,twopurplefigs.com,twosisterscrafting.com,twospoons.ca,twotwentyone.net,twsn.net,tycorenetwork.com,typerush.com,typinggames.zone,tysonsreporter.com##+js(rmnt, script, /"__adblocker"|"data-sdk"/) +u-createcrafts.com,uglyducklingbakery.com,uglyducklinghouse.com,umamidays.com,umamigirl.com,umamusume.gg,unboundwellness.com,unclutteredsimplicity.com,uncomplicatedchef.com,unconventionalbaker.com,uncorkedasheville.com,uncovercolorado.com,uncovered.com,uncovervietnam.com,undefiningmotherhood.com,undergroundcrafter.com,unefemme.net,unexpectedelegance.com,unicode-explorer.com,unicornsinthekitchen.com,unifycosmos.com,uniquedognames.net,unixmen.com,unleashedllc.co,unofficialnetworks.com,unoriginalmom.com,unpeeledjournal.com,unrulygardening.com,unscramble.me,unscramble.org,unscramblerer.com,unscramblewords.net,unscramblex.com,untoldrecipesbynosheen.com,upanddownwordsanswers.com,upbeetandkaleingitblog.com,upcyclemystuff.com,updweller.com,upliftingmayhem.com,upstateramblings.com,upworthy.com,urbanblisslife.com,urbancowgirllife.com,urbanfarmandkitchen.com,urbanfarmie.com,urbantastebud.com,urbo.com,usadventurer.com,usatodaycrosswordanswers.com,usethinkscript.com,utahsadventurefamily.com##+js(rmnt, script, /__adblocker|html-load/) +vaingloryfire.com,valentinascorner.com,valyastasteofhome.com,vancouverwithlove.com,vandymania.com,vanillaandbean.com,vanillabeancuisine.com,vanlifers.com,vanlivingforum.com,veenaazmanov.com,veganblueberry.com,veganderlust.com,veganfamilyrecipes.com,veganfoodlover.com,veganfoundry.com,veganreset.com,veganricha.com,veganwins.co.uk,veganyumminess.com,vegasfoodandfun.com,vegehomecooking.com,vegetablerecipes.com,veggiebalance.com,veggiehomesteading.com,veggieinspired.com,veggiekinsblog.com,veggiesociety.com,veggiessavetheday.com,veggl.com,vegrecipesofindia.com,ventureteambuilding.co.uk,veronikaskitchen.com,veryanxiousmommy.com,veryveganish.com,veteranslawblog.org,vettemod.com,vftt.org,vibrantguide.com,vibrantlygfree.com,vickypham.com,victoriaelizabethbarnes.com,victoriamag.com,vidarbergum.com,videochums.com,vidhyashomecooking.com,vietworldkitchen.com,viewalongtheway.com,vikalinka.com,vikingsnation.com,vincenzosplate.com,vindulge.com,vinodelvida.com,vintage-recipes.com,vintagekitchennotes.com,vintageleatherjackets.org,violacentral.com,viperclub.org,virtualdrumming.com,visagrader.com,visatraveler.com,vishakablone.com,visitdowntownnashville.com,visualcapitalist.com,visualfractions.com,vivaveltoro.com,vivcrochets.com,vivifytribe.com,vlhhealth.com,vloggerpro.com,vmaxforum.net,voicefilm.com,voronoiapp.com,voyageatl.com,voyageaustin.com,voyagebaltimore.com,voyagedallas.com,voyagedenver.com,voyagehouston.com,voyagekc.com,voyagela.com,voyagemia.com,voyagemichigan.com,voyageminnesota.com,voyageohio.com,voyagephoenix.com,voyageraleigh.com,voyagestl.com,voyagetampa.com,voyageutah.com,vssmonitoring.com,vtcoa.com##+js(rmnt, script, /__adblocker|html-load/) +wakeupandkale.com,walderwellness.com,walkingonsunshinerecipes.com,walletbliss.com,wallflowerkitchen.com,wandercooks.com,wandering-bird.com,wanderingcalifornia.com,wanderingchickpea.com,wanderingindisney.com,wanderingourworld.com,wanderlustingk.com,wandersomewhere.com,wanderthewest.com,wanderworthy.com,warbirdfanatics.com,warframe.today,watchers.news,waternitylab.com,watertemp.org,waupacanow.com,wavyhaircare.com,wdio.com,wdw-magazine.com,wdwmagic.com,wdwnt.com,wdwnt.jp,weairdown.com,wealthbytes.co,wealthup.com,wear-next.com,wearablyweird.com,wearemoba.com,wearychef.com,weathernj.com,webbikeworld.com,webdesignerdepot.com,webisjericho.com,webnewsobserver.com,webnots.com,webservertalk.com,weddingpioneer.com,weddlegame.com,weddleunlimited.com,weeatatlast.com,weekdaypescatarian.com,weekendatthecottage.com,weelicious.com,weightofstuff.com,weirdunsocializedhomeschoolers.com,weldingmastermind.com,welivedhappilyeverafter.com,wellfedbaker.com,wellnessbykay.com,wellnourished.com.au,wellplated.com,wellseasonedstudio.com,welovecatsandkittens.com,welovedoodles.com,wendaful.com,wendypolisi.com,wenthere8this.com,wepc.com,weraveyou.com,werefarfromnormal.com,wereintherockies.com,wereparents.com,weretherussos.com,werockyourweb.com,west-games.com,wethedryers.com,wetravelwebond.com,wgrv.com,whatagirleats.com,whatamomneeds.com,whatcanmydogeat.com,whatdowedoallday.com,whatdresscodeblog.com,whateatly.com,whatgreatgrandmaate.com,whatihavelearnedteaching.com,whatismyelevation.com,whatjewwannaeat.com,whatmollymade.com,whatnow.com,whatscookinchicago.com,whatsgabycooking.com,whatsinthepan.com,whatsmomcookin.com,whatsonglasgow.co.uk,whatthefroth.com,whattobecome.com,whattocooktoday.com,whattogetmy.com,wheatbythewayside.com,whec.com,wheel-decide.com,wheelndealmama.com,wheninyourstate.com,whereismyspoon.co,wheretianatravels.com,wheretogowithkids.co.uk,whereverwriter.com,whichyr.com,whipitlikebutter.com,whippedcreamsounds.com,whippeditup.com,whipperberry.com,whiskaffair.com,whiskeyriff.com,whiskeywatch.com,whiskingmama.com,whistleandivy.com,whiteandwoodgrain.com,whitehouseblackshutters.com,whitekitchenredwine.com,whitelacecottage.com,whitelightsonwednesday.com,whiteonricecouple.com,whiteoutdata.com,whitneybond.com,whofacts.com,wholeandheavenlyoven.com,wholefoodsoulfoodkitchen.com,wholefully.com,wholeheartykitchen.co.uk,wholekitchensink.com,wholelifestylenutrition.com,wholelottayum.com,wholenewmom.com,wholesomelicious.com,wholesomelymorgan.com,wholesomemadeeasy.com,wholesomepatisserie.com,wholesomeyum.com,wholesomeyumfoods.com,whollytasteful.com,whycalculator.com,wichitabyeb.com,wideopencountry.com,wideopenspaces.com,wifemamafoodie.com,wigrevival.com,wikiofthrones.com,wildbeeoutdoors.co.uk,wildernessredefined.com,wildernesstoday.com,wildexplained.com,wildfireinteriors.com,wildlifenomads.com,wildriftfire.com,wilkerdos.com,wilmade.com,win10faq.com,winbuzzer.com,windingcreekranch.org,windingroadcrochet.com,windowcleaningforums.co.uk,windowsdigitals.com,windowsdispatch.com,windowsreport.com,windowstip.com,winemakingtalk.com,wineturtle.com,winnersandwhiners.com,winnieowners.com,winning-homebrew.com,winsipedia.com,wintips.org,wired2fish.com,wisforwebsite.com,wishesndishes.com,witanddelight.com,witchyspiritualstuff.com,withinhours.com,withinthegrove.com,withthewoodruffs.com,wmdesignhouse.com,wnyt.com,womangettingmarried.com,womanscribbles.net,womansworld.com,women.com,womenlivingwell.org,wondercrochet.blog,wonderfuldiy.com,wondermomwannabe.com,wonderoak.com,wonkywonderful.com,woodimprove.com,woodshopdiaries.com,woodworkingtrade.com,woofbarkgrowl.co.uk,woonheng.com,word-craze.com,word-crossy.com,word-stacks.com,word500.com,wordbrain.info,wordcollectanswers.com,wordconnect.info,wordcookieanswer.com,wordcookies.info,wordcrushanswer.com,wordcrushanswers.com,worddb.com,wordfromthebird.blog,wordhikehelp.com,wordimpostor.com,wordl.org,wordmaker.info,wordnerd.co,wordonlinetips.com,wordsaladanswers.com,wordsaladgame.com,wordscapeshelp.com,wordscookiesanswers.com,wordsofdeliciousness.com,wordtrip.net,workkeyspracticetest.com,worksheetgenius.com,worksheetplace.com,worksheets-to-print.com,workweeklunch.com,workwithjoshua.com,worldbirds.com,worldboxingnews.com,worldclock.com,worldfootprints.com,worldhistory.org,worldhistoryedu.com,worldofblenders.com,worldofcardgames.com,worldofgardenplants.com,worldofpans.com,worldofprintables.com,worldpopulationreview.com,worldsalaries.com,worldwarwings.com,worldwildschooling.com,worthingcourtblog.com,wowclassicdb.com,wowdb.com,wrappedinrust.com,wrestlecrap.com,wrestleview.com,wrestling-world.com,wrestlinginc.com,wristenthusiast.com,writermag.com,writersedit.com,writerswrite.co.za,writingexercises.co.uk,writingtipsoasis.com,writtenreality.com,wutheringwaves.gg,wyseguide.com##+js(rmnt, script, /__adblocker|html-load/) +xoxobella.com##+js(rmnt, script, /__adblocker|html-load/) +yankeesnews.com,yarnandchai.com,yarnhookneedles.com,yarnutopia.com,yaycoloringpages.com,yayforyarn.com,yellowblissroad.com,yellowbrickhome.com,yetgamer.com,yogabasics.com,yogabytheday.com,yolopooch.com,yomotherboard.com,youbrewmytea.com,youcouldtravel.com,youhadmeatgardening.com,youngandtheinvested.com,younghouselove.com,yourastrologyreading.com,yourcupofcake.com,yourfirstvisit.net,yourfreecareertest.com,yourfriendthenomad.com,yourguardianchef.com,yourguidesabroad.com,yourhomebasedmom.com,yourlifestylelibrary.com,yourmodernfamily.com,yourmotorguide.com,yoursoundmatters.com,yourteenmag.com,yourtherapysource.com,youshouldgrow.com,youvegotthismath.com,ypi.com,ytravelblog.com,yummiestfood.com,yummyaddiction.com,yummyhealthyeasy.com,yummytoddlerfood.com,yummytummyaarthi.com,yupitsvegan.com,yuzubakes.com##+js(rmnt, script, /__adblocker|html-load/) +zardyplants.com,zenaskitchen.com,zenless.gg,zeroair.org,zeroglutenguide.com,zestforbaking.com,zestfulkitchen.com,zestuous.com,zhangcatherine.com,zimmysnook.ca,zipgameonline.com,zodiacfire.com,zoebakes.com,zonecoverage.com##+js(rmnt, script, /__adblocker|html-load/) +! Others +thenerdstash.com##+js(acs, String.prototype.match, __adblocker, /^data:/) +! NOTE: Fora software +! network +||html-load.com^$xhr,script,domain=1000rr.net|10thcivicforum.com|1130cc.com|123easy4me.com|124spider.org|125ccsportsbikes.com|1911addicts.com|1911forum.com|1911talk.com|1919a4.com|2-seriesforum.com|2008ownersclub.co.uk|200forums.com|208ownersclub.co.uk|240sxforums.com|250r.net|2coolfishing.com|300cforums.com|300cforumz.com|350z-tech.com|355nation.net|360tuna.com|3800pro.com|3dprinterful.com|3dshoots.com|3si.org|4-seriesforums.com|460ford.com|4activetalk.com|4btswaps.com|4c-forums.com|4runner-forums.com|4thgentacoma.com|4xeforums.com|500xownersclub.co.uk|502streetscene.net|5thramforum.com|5thrangerforum.com|600rr.net|68forums.com|6mt.net|6thgenram.com|700rifle.com|718forum.com|790dukeforum.com|7thgenhonda.com|7thmustang.com|899panigale.org|8thcivic.com|959panigale.net|992forum.com|9thgencivic.com +||html-load.com^$xhr,script,domain=a1-forum.co.uk|a5oc.com|abarthforum.co.uk|acadiaforum.net|accordxclub.com|aceforums.net|acemanforum.com|aclassclub.co.uk|acrforum.com|acura-legend.com|acuraworld.com|adamownersclub.co.uk|adxtalk.com|afeelachat.com|africatwinforum.com|airflowforum.com|airsoftsniperforum.com|airsoftsociety.com|akff.net|alfabb.com|alfajuniorforum.com|alfaowner.com|allcoast.com|allcorsa.co.uk|allfordmustangs.com|alliancervforums.com|allpar.com|altimaforums.net|amarokforum.com|amazonastroforum.com|amrapideforum.com|antaraownersclub.com|antiquetractorsforum.com|applecarforum.com|applefitnessforum.com|aquariumforum.com|aquaticplantcentral.com|ar15forums.com|archeryaddix.com|archerytalk.com|arcticchat.com|ariyaforums.com|arizonagunowners.com|arizonahuntingforums.com|arkansashunting.net|armslocker.com|aronaforums.co.uk|arteonforums.com|artistforum.com|ascentforums.com|askandyaboutclothes.com|astonmartinlife.com|astrakforums.co.uk|astraownersnetwork.co.uk|astrosafari.com|at4xowners.com|atecaforums.co.uk|ats-v.org|atv-forum.com|atvdragracers.com|atvtorture.com|audi-forums.com|audif1forum.com|audiforum.us|audiq3forum.com|ausrc.com|aussieexotics.com|austinbassfishing.com|australiaforum.com|authenticforum.com|avengerforumz.com|avsforum.com|azbasszone.com +||html-load.com^$xhr,script,domain=b15sentra.net|b15u.com|babybmw.net|badgerowners.com|bapetalk.com|basketballforum.com|basset.net|bc4x4.com|bcaquaria.com|bcfishingreports.com|bcsportbikes.com|beaglesunlimited.com|beekeepingforums.com|beesource.com|benelliforum.com|benzforum.com|benzworld.org|bersaforum.com|bersapistolforum.com|bettafish.com|bigblockdart.com|bimmerfest.com|bimmerforums.co.uk|bimmerwerkz.com|blazerevforum.com|blowgunforum.com|blueovalfanatics.com|bluetraxx.com|bmaxownersclub.co.uk|bmw-driver.net|bmwevforum.com|bmwlt.com|booksworthdiscussing.com|bowfishingcountry.com|bowfishingforum.com|boxerforums.com|boxingforum.com|brightdropforum.com|broncoevforum.com|broncosporttalk.com|brutecentral.com|brutusforum.com|buceesfans.com|buelltalk.com|buickevforum.com|bulldogbreeds.com|bullnettlenews.com|burgmanusa.com|byd-forums.com|bzforums.com +||html-load.com^$xhr,script,domain=c-classforum.com|c10trucks.com|cactusforums.co.uk|cadenzaforum.com|cadillacforums.com|caferacer.net|caliberforums.com|caliberforumz.com|californiaevforum.com|camaros.net|camarozone.com|campercommunity.com|can-amelectric.com|can-amforum.com|can-amtalk.com|canadianmoneyforum.com|canamspyderforums.com|capriforum.com|capturownersclub.co.uk|caraudioclassifieds.org|carnivalforums.com|carolinafishtalk.com|carolinashootersclub.com|casecoltingersoll.com|catfish1.com|catforum.com|cattleforum.com|cayenneforums.com|cbr250.com|cbr250.net|cbr300forum.com|cbr500riders.com|cbrxx.com|ce02forum.com|celicasupra.com|cfmotoforums.com|challengerforumz.com|challengerlife.com|challengertalk.com|chargerforums.com|chargerforumz.com|checkhookboxing.com|cheftalk.com|cherokeesrt8.com|cherokeetalk.com|chevelles.com|chevroletownersclub.co.uk|chevyblazer.org|chevybolt.org|chevymalibuforum.com|cheyennechat.com|chicagolandfishing.com|chicagolandsportbikes.com|chickenforum.com|chiefmotorcycleforum.com|chihuahua-people.com|chinacarforums.com|chrforums.uk|chromebookforum.com|chryslerminivan.net|cichlid-forum.com|cigarforums.net|civic11forum.com|civinfo.com|cl500forum.com|clarityforum.com|classic-jdm.com|cleaningtalk.com|climbingforums.com|club3g.com|club4g.org|club700xx.com|clubarmada.com|clubcrosstrek.com|clubfrontier.org|clubroadster.net|clubrsx.com|clubsearay.com|clubtitan.org|clubtouareg.com|clubtread.com|clubwrx.net|clubxb.com|clubxterra.org|cmaxownersclub.co.uk|cmaxownersclub.com|cobaltss.com|coffeeforums.co.uk|coloradodiesel.org|coloradoevowners.com|coloradofans.com|coloradofisherman.com|coltforum.com|commanderforums.org|commandertalk.com|contractortalk.com|corollacrossforum.com|corral.net|corsa-c.co.uk|corsaeforums.co.uk|cretaforum.com|cricketforum.com|crossbownation.com|crosstourownersclub.com|crownforums.com|cruzetalk.com|crvownersclub.com|crxcommunity.com|crzforum.com|ct200hforum.com|ctsvowners.com|ctx1300forum.com|ctx700forum.com|cumminsforum.com|customdakotas.com|customfighters.com|custommagnums.com|customtacos.com|cx30talk.com|cx3forum.com|cx500forum.com|cx50forums.com|cx5forum.com|cx70forum.com|cx90forum.com|cyberquadforum.com|cybertrucktalk.com|cycleforums.com|cztalk.com +||html-load.com^$xhr,script,domain=d-series.org|daciaforum.co.uk|dairygoatinfo.com|dakota-durango.com|dakotaforumz.com|danieldefenseforums.com|daytonaowners.com|dbstalk.com|dealsforum.com|deerhuntersclub.com|defendersource.com|defensivecarry.com|dendroboard.com|desertxforum.com|detailingworld.co.uk|dfwstangs.net|diabetesforum.com|diavel-forum.com|diecastcrazy.com|diecastxchange.com|dieself150forum.com|dieselforums.com|dieseljeeps.com|dieselplace.com|dieselramforum.com|digitalcorvettes.com|digitalhome.ca|dippy.org|discosportforums.co.uk|discoverysport.net|diychatroom.com|diyelectriccar.com|diymobileaudio.com|dobermantalk.com|dodge-dart.org|dodge-nitro.com|dodgedartforumz.com|dodgedurango.net|dodgeevforum.com|dodgeintrepid.net|dodgetalk.com|dogfoodchat.com|dogforum.com|dogforums.com|dootalk.com|dpselfhelp.com|driveaccord.net|drywalltalk.com|ds450hq.com|ds4ownersclub.co.uk|dsmtalk.com|ducati.ms|ducati.org|ducatimonster.org|ducatiscramblerforum.com|ducatisupersport939.net|duckhuntingchat.com|duramaxforum.com|durangoforumz.com +||html-load.com^$xhr,script,domain=e-tronforum.com|e46fanatics.com|easttennesseefishing.com|ebikerforums.com|echelonforum.com|eclipsecrossforums.com|ecoboostmustang.org|ecosportforum.com|ecosportownersclub.co.uk|edsupportforum.com|ehmac.ca|elantraforum.com|elantragtforum.com|elantrasport.com|elantraxd.com|elcaminocentral.com|electriciantalk.com|electricmotorcyclesforum.com|elementownersclub.com|eliminatorforum.com|enclaveforum.net|envisionforum.com|envistaforum.com|epaceforum.com|epaceforums.co.uk|equinoxevforum.com|erayforums.com|escaladeevforum.com|escape-city.com|esportbike.com|esprinterforum.com|etransitforum.com|everestowners.com|everything2stroke.com|evoqueforums.net|evoqueownersclub.co.uk|evotuners.net|evoxforums.com|ex-500.com|ex30owners.com|ex90forum.com|expatforum.com|explorerevforum.com|explorertalk.com +||html-load.com^$xhr,script,domain=f-typeclub.com|f150ecoboost.net|f150forumz.com|f650.co.uk|f6cforum.com|f800riders.org|familycheftalk.com|fancymicebreeders.com|feoa.net|ferrari-talk.com|ferrari296forum.com|ferrarilife.com|fertilityfriends.co.uk|ffcars.com|fiat500owners.com|fiestafaction.com|fiestast.net|fiestast.org|fiestastoc.com|firearmstalk.com|firebirdnation.com|fireblades.org|fishforums.com|fiskerbuzz.com|fjcforums.com|fjcruiserforums.com|fjrowners.com|floridaconcealedcarry.com|flyfishbc.com|flyfishing.co.uk|flyfishingforum.com|fnforum.net|focaljet.com|focusfanatics.com|focusrs.org|focusrsoc.com|focusst.org|focusstoc.com|fordescape.org|fordexplorer.org|fordforums.com|fordforumsonline.com|fordfusionclub.com|fordgt500.com|fordinsidenews.com|fordmuscleforums.com|fordranger.net|fordstnation.com|fordtough.ca|fordtransitusaforum.com|forteforums.com|forteturbo.org|fpaceforum.com|fpaceforums.co.uk|frugalvillage.com|fullsizebronco.com|furyforums.com|fusionsportforums.com|fz-10forum.com|fz07oc.com|fz09.org +||html-load.com^$xhr,script,domain=g20.net|g310rforum.com|g5club.net|g6ownersclub.com|g8board.com|g8forum.com|gamefishin.com|gamingfora.com|gardentractortalk.com|gasserhotrods.com|gatorforums.net|gen3insight.com|gencoupe.com|genealogyspeaks.com|genesisevforum.com|genesisforums.com|genesisforums.org|genesisg70forum.com|genesisg80forum.com|geocaching101.com|georgianbaymessageboard.com|georgiapacking.org|germanshepherds.com|ghibliforum.com|giuliaforums.com|gixxer.com|gl1800riders.com|glaowners.com|glaownersclub.co.uk|glcforums.com|glock.pro|glockforum.com|glockforum.net|glocktalk.com|gm-volt.com|gmdietforums.com|gmfullsize.com|gminsidenews.com|gmtruckclub.com|go2gbo.com|goldenretrieverforum.com|goldwingfacts.com|goldwingowners.com|golfforum.com|goosehuntingchat.com|gopitbull.com|goproforums.com|gourbanhiking.com|gr-yaris.co.uk|gr86.org|grandhighlanderforum.com|grcorollaforum.com|greatlakes4x4.com|grecaleforum.com|greentractortalk.com|grizzlycentral.com|grizzlyowners.com|grizzlyriders.com|gromforum.com|gsxr.com|gsxs1000.org|gt350.org|gt86ownersclub.co.uk|gtaaquaria.com|gtoforum.com|gtr.co.uk|gtrlife.com|guitars101.com|guitarscanada.com|gunandgame.com|gunboards.com|gunco.net|gunforums.net|gunhub.com|gunnerforum.com|gvforums.com +||html-load.com^$xhr,script,domain=halloweenforum.com|handgunforum.net|handgunsandammunition.com|hardcoresledder.com|harley-davidsonforums.com|hauntforum.com|havaneseforum.com|havocxforum.com|haytalk.com|hdlivewireforum.com|hdstreetforums.com|hedgehogcentral.com|hellcat.org|hemitruckclub.com|heresy-online.net|hinoforums.com|hipointfirearmsforums.com|hkpro.com|hobbytalk.com|hockeyforum.com|homesteadingtoday.com|hometheatershack.com|hondaatvforums.net|hondacb1000r.com|hondacivicforum.co.uk|hondaevforum.com|hondaforeman.com|hondagrom.net|hondanxriders.com|hondapioneerforum.com|hondarebel3forum.com|hondarebelforum.com|hondashadow.net|hondatwins.net|hornetowners.com|horseforum.com|hotrodders.com|hrvforum.com|hummerchat.com|huntingpa.com|hvac-talk.com|hvacsite.com|hyundai-forums.com|hyundaicoupeclub.co.uk|hyundaikonaforum.com|hyundaiperformance.com +||html-load.com^$xhr,script,domain=i-paceforum.com|i4talk.com|i5talk.com|iawaterfowlers.com|ibsgroup.org|ifish.net|ikonforum.com|ilovemycockapoo.com|ilxforums.com|imboc.com|impalaforums.com|impalas.net|impalassforum.com|impreza5.com|impreza6.com|indianasportsman.com|indianmotorcycles.net|infinitifx.org|infinitijxforum.com|infinitiq30.org|infinitiq50.org|infinitiq60.org|infinitiqx30.org|infinitiqx50.org|infinitiqx60.org|infinitiqx80.org|insightcentral.net|insterevforum.com|integratalk.com|ioniqforum.com|ipaceforums.co.uk|iphoneographytalk.com|iq-forums.com|iwsti.com|ix3talk.com|ixforums.com +||html-load.com^$xhr,script,domain=jaginfo.org|jaguarforum.com|jaguarxeforum.com|jdfanatics.com|jeepcherokeeclub.com|jeepcommander.com|jeepevforum.com|jeepforum.com|jeepgarage.org|jeeppatriot.com|jeeprenegadeforum.com|jeeptrackhawk.org|jemsite.com|jettajunkie.com|jkowners.com|jockeyjournal.com|jpaceforum.com|jukeforums.co.uk|jukeforums.com|jukeownersclub.co.uk|justlabradors.com +||html-load.com^$xhr,script,domain=k-bikes.com|k1600forum.com|k20a.org|k3forum.com|k4owners.com|k5owners.com|k900forum.com|kahrforum.com|kandiforums.com|kanyetothe.com|kawasakimotorcycle.org|kawasakininja1000.com|kawasakininja300.com|kawasakiversys.com|kawasakiworld.com|kawasakiz650.com|kawieriders.com|kawiforums.com|kboards.com|keltecforum.com|ketolifetalk.com|kfx450central.com|kfx450hq.com|kia-forums.com|kiaevforums.com|kianiroforum.com|kiaownersclub.co.uk|kiasoulforums.com|kiastonicforum.org|kiatellurideforums.com|kiatuskerforum.com|kickrunners.com|kimbertalk.com|klrforum.com|knittingparadise.com|kodiakowners.com|kodiaqforums.co.uk|krxforum.com|ktm1090forum.net|ktmatvhq.com|ktmduke390forum.com|ktmforum.co.uk|ktmforums.com|kugaownersclub.co.uk +||html-load.com^$xhr,script,domain=labradoodle-dogs.net|labradorforums.co.uk|lakesimcoemessageboard.com|lakestclair.net|lamborghini-talk.com|lancerregister.com|landcruiser-forum.com|landroverevforum.com|landroversonly.com|lawnsite.com|layitlow.com|leapmotorforum.com|legacygt.org|lexusevforum.com|lexusfforum.com|lexusnxforum.com|lexusrcowners.com|lexusrxowners.com|librarium-online.com|lightningowners.com|lightningrodder.com|lincolnevforum.com|longislandfirearms.com|lotustalk.com|low-riders.com|ls1gto.com|ls1lt1.com|ltr450hq.com|lucid-forum.com|lugerforums.com|lumberjocks.com|luxury4play.com|lxforums.com|lynkcoforum.com +||html-load.com^$xhr,script,domain=m1000xrforum.com|m109riders.com|m14forum.com|m5board.com|macanforum.com|macheclub.com|magnetoforum.com|magnumforumz.com|mainehuntingforums.com|majestyusa.com|manitobafishingforum.com|manitobahuntingforum.com|manutdtalk.com|marlinforum.com|marlinowners.com|marutisuzukiforum.com|maseratilevanteforum.com|maseratilife.com|masscops.com|maverickchat.com|maverickforums.net|mavericklightning.org|mazda2revolution.com|mazda3forums.com|mazda3revolution.com|mazda6club.com|mazdaworld.org|mbeqclub.com|mclarenlife.com|mdxers.org|medstudentz.com|meganesport.net|menstennisforums.com|mercedescla.org|mercedesclaforum.com|mercedesgleforum.com|mercurycougar.net|metalguitarist.org|metrisforum.com|mg-rover.org|mgzrownersclub.co.uk|michigan-sportsman.com|michiganreefers.com|microskiff.com|midwest-horse.com|migweb.co.uk|millwrighttalk.com|mini2.com|minievforum.com|minif56.com|minif66.com|minitorque.com|missouriwhitetails.com|mitsubishi-forums.com|mkcforum.com|mkzforum.com|mmaforum.com|moddedmustangs.com|moddedraptor.com|model2.org|modelrailforum.com|modeltrainforum.com|moderncamaro.com|modularfords.com|mokkaownersclub.co.uk|mondeostoc.com|morels.com|mothering.com|motorcycleforum.com|motorcycleforums.net|motorcycletherapy.net|motorgeek.com|motorhomefacts.com|motorsportsracingtalk.com|mountainbuzz.com|mp-pistol.com|mr2oc.com|msgo.com|mtbr.com|mudinmyblood.net|mullenowners.com|muscularmustangs.com|mustangecoboost.net|mustangevolution.com|mvagusta.net|mx30forum.com|mx5life.com|mx5nutz.com|mx6.com|my.is|myaudiq5.com|mybikeforums.com|myfastgti.com|myjeepcompass.com|mylargescale.com|mylawnmowerforum.com|mymbonline.com|mytiguan.com|mytractorforum.com|mytreg.com|myturbodiesel.com +||html-load.com^$xhr,script,domain=nagca.com|nationalgunforum.com|ncangler.com|ncgunowners.com|neowners.com|newbeetle.org|newbrunswickfishing.com|newbrunswickhunting.com|newcelica.org|newcougar.org|newf150forum.com|newjerseyhunter.com|newninja.com|newnissanz.com|newscionxb.com|newtahoeyukon.com|newtiburon.com|ngemu.com|ninetowners.com|ninja400riders.com|ninjah2.org|niocarclub.com|nissan-navara.net|nissanclub.com|nissancubelife.com|nissanforums.com|nissankicksforum.com|nissanmurano.org|nissanversaforums.com|nitroforumz.com|nodakoutdoors.com|nordenforums.com|noreast.com|noteownersclub.co.uk|novas.net|novascotiafishing.com|novascotiahunting.com|nv200forum.com|nybass.com|nyfirearms.com +||html-load.com^$xhr,script,domain=observedtrials.net|oceanforums.com|odyclub.com|ohiogamefishing.com|ohiosportsman.com|ohiowaterfowlerforum.com|oklahomahunter.net|onefora.com|onesixthwarriors.com|opelgt.com|optimaforums.com|optiqforum.com|ourbeagleworld.com|outbackers.com|outlanderforums.com|overclock.net +||html-load.com^$xhr,script,domain=pacificaforums.com|paintballforum.com|painttalk.com|palisadeforum.com|panameraforum.com|panamericaforums.com|panigalev4club.com|paracordforum.com|passatworld.com|passportforums.com|pathfindertalk.com|patrol4x4.com|pavementsucks.com|paviseforum.com|paw-talk.net|pearforum.com|pelotonforum.com|pensacolafishingforum.com|perfectmancave.com|perfectunion.com|performanceboats.com|personalitycafe.com|petforums.co.uk|peugeot108forum.co.uk|peugeotforums.com|pickleballertalk.com|pierandsurf.com|pigeons.biz|pigforum.com|piloteers.org|pioneerforums.com|piranha-fury.com|pirate4x4.com|pistolsmith.com|pistolworld.com|planet-9.com|planet4x4.net|planetisuzoo.com|planetminis.com|plantedtank.net|plowsite.com|plumbingzone.com|pnwriders.com|pocketbikeplanet.com|polarisatvforums.com|polarisgeneralforum.com|polarisriders.com|polestar-forum.com|politicaltownhall.com|poodleforum.com|porscheevforum.com|powerequipmentforum.com|powerstroke.org|powerstrokenation.com|prcforum.com|predatortalk.com|preludeonline.com|preludepower.com|preparedsociety.com|prepperforums.net|preservationtalk.com|prius5.com|priusforum.com|priusonline.com|prologuedrivers.com|promasterforum.com|prophecyowners.com|prowlerforums.net|prowlertalk.net|psychobike.com|pursuitforum.com|pwcforum.com +||html-load.com^$xhr,script,domain=q2forums.co.uk|q3ownersclub.co.uk|qyiforum.com +||html-load.com^$xhr,script,domain=r1-forum.com|r1200gs.info|r1200rforum.com|r125forum.com|r1300gsforum.com|r2forums.com|r3-forums.com|r32oc.com|r6-forum.com|r6messagenet.com|r7forums.com|r8talk.com|r9riders.com|rabbitdogs.net|rallyforums.com|ram1500diesel.com|ramchargercentral.com|ramevforum.com|ramforumz.com|ramrebel.org|ramrebelforum.com|ramrho.org|rangerforums.net|rangerovers.net|rangerraptorowners.com|raptorforum.com|raptorforumz.com|ratforum.com|rav4world.com|rc350forum.com|rc51forums.com|recon-forum.com|redlineforums.com|redlineutvforums.net|regalforums.com|renaultforums.co.uk|renegadeforum.com|reptileforums.co.uk|retrievertraining.net|rhinoforums.net|rhinotalk.net|riderforums.com|ridgeforum.com|ridgelineownersclub.com|rimfirecentral.com|rinconriders.com|rivianownersforum.com|rlxforum.com|roadbikereview.com|roadglide.org|roadstarraider.com|roadtripliving.com|robloxforum.com|rodsnsods.co.uk|roguesportforum.com|rollsroyceforums.com|roofingtalk.com|rootzwiki.com|rottweilersonline.com|routerforums.com|royalenfieldforum.com|rs25.com|rswarrior.com|rubiconownersforum.com|rugerforum.net|rugerpistolforums.com|rugertalk.com|runeriders.com|runnersforum.co.uk|rzforums.com|rzrforums.net +||html-load.com^$xhr,script,domain=s1000rrforum.com|s10forum.com|saabcentral.com|saablink.net|saabscene.com|sailnet.com|salmonfishingforum.com|santacruzforums.com|santafeforums.com|sarforums.com|saturnoutlookforum.net|savanaforum.com|saxontheweb.net|sb9t.com|scioniaforum.com|scionimforum.com|scirocconet.co.uk|scoutmotorsforum.com|scr950forum.com|scramblerforum.com|seadoospark.org|seat-forum.co.uk|seatroutforum.com|segwayforums.com|seltosforum.com|serial1forum.com|shercoforums.com|shipsnostalgia.com|shootersforum.com|shootingworld.com|shotgunforums.com|shotgunworld.com|sidexsideworld.com|siennachat.com|sierraevforum.com|sigarms556.com|sigtalk.com|silveradocheyenne.org|silveradoevforum.com|silveradosierra.com|skincaretalk.com|skylineowners.com|skyroadster.com|skyscrapercity.com|slatedroid.com|slateownersforum.com|slingshotforum.com|slingshotforums.com|slkworld.com|slotforum.com|smartcarofamerica.com|smartevforum.com|smithandwessonforums.com|smokinvette.com|snackfora.com|sniperforums.com|snowblowerforum.com|snowboardingforum.com|snowmobilefanatics.com|snowmobileforum.com|snowmobileworld.com|snowplowforums.com|socialanxietysupport.com|solanforum.com|solsticeforum.com|solterraforum.com|sonataforums.com|sonymobilityforum.com|sparktalk.com|speakev.com|specialstage.com|speedwake.com|speedzilla.com|speypages.com|spoiledmaltese.com|sportbikes.net|sportbikeworld.com|springfieldforum.com|spyderchat.com|spydertalk.com|sr20forum.com|srt10forum.com|srt4mation.com|srtforums.com|ssforums.com|ssrfanatic.com|starbikeforums.com|starlinktalk.com|stdrivers.co.uk|stelvioforum.com|stevesnovasite.com|steyrclub.com|stingerforums.com|stingrayforums.com|stormtrakforum.com|stratolinerdeluxe.com|streetfighterv2forum.com|stripers247.com|stromerforum.com|stromtrooper.com|subarubrzforum.com|subaruforester.org|subaruoutback.org|subaruxvforum.com|superhonda.com|supermotojunkie.com|supra6.com|supraforums.com|survivalistboards.com|suzuki-forums.com|suzuki-forums.net|suzukiatvforums.com|suzukicentral.com|sv-portal.com|svrider.com|swedespeed.com +||html-load.com^$xhr,script,domain=t-goforum.com|t-shirtforums.com|taikoboards.com|talkaboutmarriage.com|talkbudgies.com|talkclassical.com|talkcockatiels.com|talkesg.com|talkford.com|talkparrotlets.com|talkparrots.com|talonsxsforum.com|taosforums.com|tarokforum.com|tarracoforums.co.uk|taurusarmed.net|taurusclub.com|taycanevforum.com|tbssowners.com|tccoa.com|tcrossforums.co.uk|team-integra.net|techguy.org|techsupportforum.com|telo-forum.com|tennisforum.com|tennspeed.net|terrainforum.com|terrainforum.net|teryxforums.net|teryxhq.com|teslabottalk.com|teslaownersonline.com|texas4x4.org|theakforum.net|thebassbarn.com|thebassholes.com|theboxotruth.com|thecombineforum.com|thedieselgarage.com|thedieselstop.com|thefirearmsforum.com|theflyfishingforum.com|thegoatspot.net|thektog.org|thelawnforum.com|thelupussite.com|thelureforum.com|themgzr.co.uk|thenewx.org|theprofilebrotherhood.com|thereeftank.com|theslingshotforum.com|thespeedtriple.com|thevog.net|thewatchforum.co.uk|thewatchsite.com|theworldofarchitecture.com|thyroidboards.com|tidalfish.com|tiguanevforum.com|tiguanforums.co.uk|titantalk.com|titanxdforum.com|tivocommunity.com|tjcruiserforums.com|tlxforums.com|tlzone.net|tnhuntingclub.com|tonaletalk.com|topolinoforum.com|toyotacelicas.com|toyotachrforum.com|toyotaevforum.com|toyotanation.com|tractorforum.com|tradtalk.com|trailblazertalk.com|trailhunterforums.com|trailsportforum.com|trailvoy.com|transalpowners.com|trapshooters.com|traverseforum.com|traxforum.com|treadmillforum.com|trifive.com|triumph400forum.com|triumph675.net|triumphbobberforum.com|triumphrat.net|trocforums.co.uk|tropicalfishforums.co.uk|tropicalfishkeeping.com|truestreetcars.com|trx250r.net|trx450r.org|trxforums.com|tsxclub.com|ttforum.co.uk|ttora.com|tucson-forum.com|tundra3.com|tundraevforum.com|tundrasolutions.com|tundratalk.net|turbobuicks.com|turbododge.com|tw200forum.com|twospoke.com|twowheelforum.com|txowners.com +||html-load.com^$xhr,script,domain=uberpeople.net|uk-audis.net|uk-mkivs.net|uk-muscle.co.uk|ukcorsa-d.com|ultimateaircooled.com|upownersclub.co.uk|usmle-forums.com|utahconcealedcarry.com|utahwildlife.net +||html-load.com^$xhr,script,domain=v-twinforum.com|v6performance.net|v6z24.com|v8bikeriders.com|vagdrivers.net|vantasforum.com|varminthunters.com|vauxhallownersnetwork.co.uk|veggieboards.com|veggiegardener.com|velarforums.co.uk|veloster.org|velostern.com|velosterturbo.org|venuedrivers.com|victoryforums.com|videoeditingtalk.com|vikingforum.net|vikingforum.org|vinfasttalk.com|vintage-mustang.com|viperalley.com|vizslaforums.com|vn750.com|volconforum.com|volkswagenforum.co.uk|volkswagenownersclub.com|volkszone.com|volusiariders.com|volvo-forums.com|volvoevforum.com|volvoforum.com|volvov40club.com|vtcafe.com|vtxcafe.com|vtxoa.com|vulcanforums.com|vwatlasforum.com|vweosclub.com|vwforum.com|vwidtalk.com|vwscout.org|vwt4forum.co.uk|vwvortex.com +||html-load.com^$xhr,script,domain=wagoneerfans.com|walkingstickforum.com|waltherforums.com|washingtonflyfishing.com|watchfreeks.com|watchtalkforums.info|watchuseek.com|weldingweb.com|wethearmed.com|wfmachines.com|wildcatforums.net|windycityfishing.com|wolverineforums.com|woodworkingtalk.com|workingdogforum.com|workingfromhomeforum.com|worldseafishing.com|wranglerboard.com|wranglerforum.com|wranglerjlforum.com|wrestlingforum.com|wristtwisters.com|wrxforums.com|wrxtuners.com +||html-load.com^$xhr,script,domain=x-trail-uk.co.uk|x7forum.com|xc100forum.com|xc40forum.com|xclassforums.com|xcrforum.com|xdforum.com|xdtalk.com|xeforums.co.uk|xfforum.co.uk|xlrforum.com|xmowners.com|xpeditionforum.com|xpengevforum.com|xpowerforums.com|xr1200ownersgroup.com|xr150lforum.com|xrv.org.uk|xsr700forums.com|xtratime.org +||html-load.com^$xhr,script,domain=yamaha-forum.net|yamahaforum.com|yamahastarbolt.com|yamahastarstryker.com|yariscrossclub.com|yellowbullet.com|yetiownersclub.co.uk|yfzcentral.com|yorkshire-divers.com|yourcobalt.com|yourpatientvoice.com|yoursciontc.com|yxztalk.com +||html-load.com^$xhr,script,domain=z06vette.com|z1000forum.com|z125owners.com|zafiraowners.co.uk|zcar.com|zdxowners.com|zeekrchat.com|zeromotorcycleforum.com|zotyezone.com|zrvforum.com|zx-10r.net|zx25rforum.com|zx4rforum.com|zx6r.com|zxforums.com +! scriptlet +1000rr.net,10thcivicforum.com,1130cc.com,123easy4me.com,124spider.org,125ccsportsbikes.com,1911addicts.com,1911forum.com,1911talk.com,1919a4.com,2-seriesforum.com,2008ownersclub.co.uk,200forums.com,208ownersclub.co.uk,240sxforums.com,250r.net,2coolfishing.com,300cforums.com,300cforumz.com,350z-tech.com,355nation.net,360tuna.com,3800pro.com,3dprinterful.com,3dshoots.com,3si.org,4-seriesforums.com,460ford.com,4activetalk.com,4btswaps.com,4c-forums.com,4runner-forums.com,4thgentacoma.com,4xeforums.com,500xownersclub.co.uk,502streetscene.net,5thramforum.com,5thrangerforum.com,600rr.net,68forums.com,6mt.net,6thgenram.com,700rifle.com,718forum.com,790dukeforum.com,7thgenhonda.com,7thmustang.com,899panigale.org,8thcivic.com,959panigale.net,992forum.com,9thgencivic.com##+js(rmnt, script, html-load.com) +a1-forum.co.uk,a5oc.com,abarthforum.co.uk,acadiaforum.net,accordxclub.com,aceforums.net,acemanforum.com,aclassclub.co.uk,acrforum.com,acura-legend.com,acuraworld.com,adamownersclub.co.uk,adxtalk.com,afeelachat.com,africatwinforum.com,airflowforum.com,airsoftsniperforum.com,airsoftsociety.com,akff.net,alfabb.com,alfajuniorforum.com,alfaowner.com,allcoast.com,allcorsa.co.uk,allfordmustangs.com,alliancervforums.com,allpar.com,altimaforums.net,amarokforum.com,amazonastroforum.com,amrapideforum.com,antaraownersclub.com,antiquetractorsforum.com,applecarforum.com,applefitnessforum.com,aquariumforum.com,aquaticplantcentral.com,ar15forums.com,archeryaddix.com,archerytalk.com,arcticchat.com,ariyaforums.com,arizonagunowners.com,arizonahuntingforums.com,arkansashunting.net,armslocker.com,aronaforums.co.uk,arteonforums.com,artistforum.com,ascentforums.com,askandyaboutclothes.com,astonmartinlife.com,astrakforums.co.uk,astraownersnetwork.co.uk,astrosafari.com,at4xowners.com,atecaforums.co.uk,ats-v.org,atv-forum.com,atvdragracers.com,atvtorture.com,audi-forums.com,audif1forum.com,audiforum.us,audiq3forum.com,ausrc.com,aussieexotics.com,austinbassfishing.com,australiaforum.com,authenticforum.com,avengerforumz.com,avsforum.com,azbasszone.com##+js(rmnt, script, html-load.com) +b15sentra.net,b15u.com,babybmw.net,badgerowners.com,bapetalk.com,basketballforum.com,basset.net,bc4x4.com,bcaquaria.com,bcfishingreports.com,bcsportbikes.com,beaglesunlimited.com,beekeepingforums.com,beesource.com,benelliforum.com,benzforum.com,benzworld.org,bersaforum.com,bersapistolforum.com,bettafish.com,bigblockdart.com,bimmerfest.com,bimmerforums.co.uk,bimmerwerkz.com,blazerevforum.com,blowgunforum.com,blueovalfanatics.com,bluetraxx.com,bmaxownersclub.co.uk,bmw-driver.net,bmwevforum.com,bmwlt.com,booksworthdiscussing.com,bowfishingcountry.com,bowfishingforum.com,boxerforums.com,boxingforum.com,brightdropforum.com,broncoevforum.com,broncosporttalk.com,brutecentral.com,brutusforum.com,buceesfans.com,buelltalk.com,buickevforum.com,bulldogbreeds.com,bullnettlenews.com,burgmanusa.com,byd-forums.com,bzforums.com##+js(rmnt, script, html-load.com) +c-classforum.com,c10trucks.com,cactusforums.co.uk,cadenzaforum.com,cadillacforums.com,caferacer.net,caliberforums.com,caliberforumz.com,californiaevforum.com,camaros.net,camarozone.com,campercommunity.com,can-amelectric.com,can-amforum.com,can-amtalk.com,canadianmoneyforum.com,canamspyderforums.com,capriforum.com,capturownersclub.co.uk,caraudioclassifieds.org,carnivalforums.com,carolinafishtalk.com,carolinashootersclub.com,casecoltingersoll.com,catfish1.com,catforum.com,cattleforum.com,cayenneforums.com,cbr250.com,cbr250.net,cbr300forum.com,cbr500riders.com,cbrxx.com,ce02forum.com,celicasupra.com,cfmotoforums.com,challengerforumz.com,challengerlife.com,challengertalk.com,chargerforums.com,chargerforumz.com,checkhookboxing.com,cheftalk.com,cherokeesrt8.com,cherokeetalk.com,chevelles.com,chevroletownersclub.co.uk,chevyblazer.org,chevybolt.org,chevymalibuforum.com,cheyennechat.com,chicagolandfishing.com,chicagolandsportbikes.com,chickenforum.com,chiefmotorcycleforum.com,chihuahua-people.com,chinacarforums.com,chrforums.uk,chromebookforum.com,chryslerminivan.net,cichlid-forum.com,cigarforums.net,civic11forum.com,civinfo.com,cl500forum.com,clarityforum.com,classic-jdm.com,cleaningtalk.com,climbingforums.com,club3g.com,club4g.org,club700xx.com,clubarmada.com,clubcrosstrek.com,clubfrontier.org,clubroadster.net,clubrsx.com,clubsearay.com,clubtitan.org,clubtouareg.com,clubtread.com,clubwrx.net,clubxb.com,clubxterra.org,cmaxownersclub.co.uk,cmaxownersclub.com,cobaltss.com,coffeeforums.co.uk,coloradodiesel.org,coloradoevowners.com,coloradofans.com,coloradofisherman.com,coltforum.com,commanderforums.org,commandertalk.com,contractortalk.com,corollacrossforum.com,corral.net,corsa-c.co.uk,corsaeforums.co.uk,cretaforum.com,cricketforum.com,crossbownation.com,crosstourownersclub.com,crownforums.com,cruzetalk.com,crvownersclub.com,crxcommunity.com,crzforum.com,ct200hforum.com,ctsvowners.com,ctx1300forum.com,ctx700forum.com,cumminsforum.com,customdakotas.com,customfighters.com,custommagnums.com,customtacos.com,cx30talk.com,cx3forum.com,cx500forum.com,cx50forums.com,cx5forum.com,cx70forum.com,cx90forum.com,cyberquadforum.com,cybertrucktalk.com,cycleforums.com,cztalk.com##+js(rmnt, script, html-load.com) +d-series.org,daciaforum.co.uk,dairygoatinfo.com,dakota-durango.com,dakotaforumz.com,danieldefenseforums.com,daytonaowners.com,dbstalk.com,dealsforum.com,deerhuntersclub.com,defendersource.com,defensivecarry.com,dendroboard.com,desertxforum.com,detailingworld.co.uk,dfwstangs.net,diabetesforum.com,diavel-forum.com,diecastcrazy.com,diecastxchange.com,dieself150forum.com,dieselforums.com,dieseljeeps.com,dieselplace.com,dieselramforum.com,digitalcorvettes.com,digitalhome.ca,dippy.org,discosportforums.co.uk,discoverysport.net,diychatroom.com,diyelectriccar.com,diymobileaudio.com,dobermantalk.com,dodge-dart.org,dodge-nitro.com,dodgedartforumz.com,dodgedurango.net,dodgeevforum.com,dodgeintrepid.net,dodgetalk.com,dogfoodchat.com,dogforum.com,dogforums.com,dootalk.com,dpselfhelp.com,driveaccord.net,drywalltalk.com,ds450hq.com,ds4ownersclub.co.uk,dsmtalk.com,ducati.ms,ducati.org,ducatimonster.org,ducatiscramblerforum.com,ducatisupersport939.net,duckhuntingchat.com,duramaxforum.com,durangoforumz.com##+js(rmnt, script, html-load.com) +e-tronforum.com,e46fanatics.com,easttennesseefishing.com,ebikerforums.com,echelonforum.com,eclipsecrossforums.com,ecoboostmustang.org,ecosportforum.com,ecosportownersclub.co.uk,edsupportforum.com,ehmac.ca,elantraforum.com,elantragtforum.com,elantrasport.com,elantraxd.com,elcaminocentral.com,electriciantalk.com,electricmotorcyclesforum.com,elementownersclub.com,eliminatorforum.com,enclaveforum.net,envisionforum.com,envistaforum.com,epaceforum.com,epaceforums.co.uk,equinoxevforum.com,erayforums.com,escaladeevforum.com,escape-city.com,esportbike.com,esprinterforum.com,etransitforum.com,everestowners.com,everything2stroke.com,evoqueforums.net,evoqueownersclub.co.uk,evotuners.net,evoxforums.com,ex-500.com,ex30owners.com,ex90forum.com,expatforum.com,explorerevforum.com,explorertalk.com##+js(rmnt, script, html-load.com) +f-typeclub.com,f150ecoboost.net,f150forumz.com,f650.co.uk,f6cforum.com,f800riders.org,familycheftalk.com,fancymicebreeders.com,feoa.net,ferrari-talk.com,ferrari296forum.com,ferrarilife.com,fertilityfriends.co.uk,ffcars.com,fiat500owners.com,fiestafaction.com,fiestast.net,fiestast.org,fiestastoc.com,firearmstalk.com,firebirdnation.com,fireblades.org,fishforums.com,fiskerbuzz.com,fjcforums.com,fjcruiserforums.com,fjrowners.com,floridaconcealedcarry.com,flyfishbc.com,flyfishing.co.uk,flyfishingforum.com,fnforum.net,focaljet.com,focusfanatics.com,focusrs.org,focusrsoc.com,focusst.org,focusstoc.com,fordescape.org,fordexplorer.org,fordforums.com,fordforumsonline.com,fordfusionclub.com,fordgt500.com,fordinsidenews.com,fordmuscleforums.com,fordranger.net,fordstnation.com,fordtough.ca,fordtransitusaforum.com,forteforums.com,forteturbo.org,fpaceforum.com,fpaceforums.co.uk,frugalvillage.com,fullsizebronco.com,furyforums.com,fusionsportforums.com,fz-10forum.com,fz07oc.com,fz09.org##+js(rmnt, script, html-load.com) +g20.net,g310rforum.com,g5club.net,g6ownersclub.com,g8board.com,g8forum.com,gamefishin.com,gamingfora.com,gardentractortalk.com,gasserhotrods.com,gatorforums.net,gen3insight.com,gencoupe.com,genealogyspeaks.com,genesisevforum.com,genesisforums.com,genesisforums.org,genesisg70forum.com,genesisg80forum.com,geocaching101.com,georgianbaymessageboard.com,georgiapacking.org,germanshepherds.com,ghibliforum.com,giuliaforums.com,gixxer.com,gl1800riders.com,glaowners.com,glaownersclub.co.uk,glcforums.com,glock.pro,glockforum.com,glockforum.net,glocktalk.com,gm-volt.com,gmdietforums.com,gmfullsize.com,gminsidenews.com,gmtruckclub.com,go2gbo.com,goldenretrieverforum.com,goldwingfacts.com,goldwingowners.com,golfforum.com,goosehuntingchat.com,gopitbull.com,goproforums.com,gourbanhiking.com,gr-yaris.co.uk,gr86.org,grandhighlanderforum.com,grcorollaforum.com,greatlakes4x4.com,grecaleforum.com,greentractortalk.com,grizzlycentral.com,grizzlyowners.com,grizzlyriders.com,gromforum.com,gsxr.com,gsxs1000.org,gt350.org,gt86ownersclub.co.uk,gtaaquaria.com,gtoforum.com,gtr.co.uk,gtrlife.com,guitars101.com,guitarscanada.com,gunandgame.com,gunboards.com,gunco.net,gunforums.net,gunhub.com,gunnerforum.com,gvforums.com##+js(rmnt, script, html-load.com) +halloweenforum.com,handgunforum.net,handgunsandammunition.com,hardcoresledder.com,harley-davidsonforums.com,hauntforum.com,havaneseforum.com,havocxforum.com,haytalk.com,hdlivewireforum.com,hdstreetforums.com,hedgehogcentral.com,hellcat.org,hemitruckclub.com,heresy-online.net,hinoforums.com,hipointfirearmsforums.com,hkpro.com,hobbytalk.com,hockeyforum.com,homesteadingtoday.com,hometheatershack.com,hondaatvforums.net,hondacb1000r.com,hondacivicforum.co.uk,hondaevforum.com,hondaforeman.com,hondagrom.net,hondanxriders.com,hondapioneerforum.com,hondarebel3forum.com,hondarebelforum.com,hondashadow.net,hondatwins.net,hornetowners.com,horseforum.com,hotrodders.com,hrvforum.com,hummerchat.com,huntingpa.com,hvac-talk.com,hvacsite.com,hyundai-forums.com,hyundaicoupeclub.co.uk,hyundaikonaforum.com,hyundaiperformance.com##+js(rmnt, script, html-load.com) +i-paceforum.com,i4talk.com,i5talk.com,iawaterfowlers.com,ibsgroup.org,ifish.net,ikonforum.com,ilovemycockapoo.com,ilxforums.com,imboc.com,impalaforums.com,impalas.net,impalassforum.com,impreza5.com,impreza6.com,indianasportsman.com,indianmotorcycles.net,infinitifx.org,infinitijxforum.com,infinitiq30.org,infinitiq50.org,infinitiq60.org,infinitiqx30.org,infinitiqx50.org,infinitiqx60.org,infinitiqx80.org,insightcentral.net,insterevforum.com,integratalk.com,ioniqforum.com,ipaceforums.co.uk,iphoneographytalk.com,iq-forums.com,iwsti.com,ix3talk.com,ixforums.com##+js(rmnt, script, html-load.com) +jaginfo.org,jaguarforum.com,jaguarxeforum.com,jdfanatics.com,jeepcherokeeclub.com,jeepcommander.com,jeepevforum.com,jeepforum.com,jeepgarage.org,jeeppatriot.com,jeeprenegadeforum.com,jeeptrackhawk.org,jemsite.com,jettajunkie.com,jkowners.com,jockeyjournal.com,jpaceforum.com,jukeforums.co.uk,jukeforums.com,jukeownersclub.co.uk,justlabradors.com##+js(rmnt, script, html-load.com) +k-bikes.com,k1600forum.com,k20a.org,k3forum.com,k4owners.com,k5owners.com,k900forum.com,kahrforum.com,kandiforums.com,kanyetothe.com,kawasakimotorcycle.org,kawasakininja1000.com,kawasakininja300.com,kawasakiversys.com,kawasakiworld.com,kawasakiz650.com,kawieriders.com,kawiforums.com,kboards.com,keltecforum.com,ketolifetalk.com,kfx450central.com,kfx450hq.com,kia-forums.com,kiaevforums.com,kianiroforum.com,kiaownersclub.co.uk,kiasoulforums.com,kiastonicforum.org,kiatellurideforums.com,kiatuskerforum.com,kickrunners.com,kimbertalk.com,klrforum.com,knittingparadise.com,kodiakowners.com,kodiaqforums.co.uk,krxforum.com,ktm1090forum.net,ktmatvhq.com,ktmduke390forum.com,ktmforum.co.uk,ktmforums.com,kugaownersclub.co.uk##+js(rmnt, script, html-load.com) +labradoodle-dogs.net,labradorforums.co.uk,lakesimcoemessageboard.com,lakestclair.net,lamborghini-talk.com,lancerregister.com,landcruiser-forum.com,landroverevforum.com,landroversonly.com,lawnsite.com,layitlow.com,leapmotorforum.com,legacygt.org,lexusevforum.com,lexusfforum.com,lexusnxforum.com,lexusrcowners.com,lexusrxowners.com,librarium-online.com,lightningowners.com,lightningrodder.com,lincolnevforum.com,longislandfirearms.com,lotustalk.com,low-riders.com,ls1gto.com,ls1lt1.com,ltr450hq.com,lucid-forum.com,lugerforums.com,lumberjocks.com,luxury4play.com,lxforums.com,lynkcoforum.com##+js(rmnt, script, html-load.com) +m1000xrforum.com,m109riders.com,m14forum.com,m5board.com,macanforum.com,macheclub.com,magnetoforum.com,magnumforumz.com,mainehuntingforums.com,majestyusa.com,manitobafishingforum.com,manitobahuntingforum.com,manutdtalk.com,marlinforum.com,marlinowners.com,marutisuzukiforum.com,maseratilevanteforum.com,maseratilife.com,masscops.com,maverickchat.com,maverickforums.net,mavericklightning.org,mazda2revolution.com,mazda3forums.com,mazda3revolution.com,mazda6club.com,mazdaworld.org,mbeqclub.com,mclarenlife.com,mdxers.org,medstudentz.com,meganesport.net,menstennisforums.com,mercedescla.org,mercedesclaforum.com,mercedesgleforum.com,mercurycougar.net,metalguitarist.org,metrisforum.com,mg-rover.org,mgzrownersclub.co.uk,michigan-sportsman.com,michiganreefers.com,microskiff.com,midwest-horse.com,migweb.co.uk,millwrighttalk.com,mini2.com,minievforum.com,minif56.com,minif66.com,minitorque.com,missouriwhitetails.com,mitsubishi-forums.com,mkcforum.com,mkzforum.com,mmaforum.com,moddedmustangs.com,moddedraptor.com,model2.org,modelrailforum.com,modeltrainforum.com,moderncamaro.com,modularfords.com,mokkaownersclub.co.uk,mondeostoc.com,morels.com,mothering.com,motorcycleforum.com,motorcycleforums.net,motorcycletherapy.net,motorgeek.com,motorhomefacts.com,motorsportsracingtalk.com,mountainbuzz.com,mp-pistol.com,mr2oc.com,msgo.com,mtbr.com,mudinmyblood.net,mullenowners.com,muscularmustangs.com,mustangecoboost.net,mustangevolution.com,mvagusta.net,mx30forum.com,mx5life.com,mx5nutz.com,mx6.com,my.is,myaudiq5.com,mybikeforums.com,myfastgti.com,myjeepcompass.com,mylargescale.com,mylawnmowerforum.com,mymbonline.com,mytiguan.com,mytractorforum.com,mytreg.com,myturbodiesel.com##+js(rmnt, script, html-load.com) +nagca.com,nationalgunforum.com,ncangler.com,ncgunowners.com,neowners.com,newbeetle.org,newbrunswickfishing.com,newbrunswickhunting.com,newcelica.org,newcougar.org,newf150forum.com,newjerseyhunter.com,newninja.com,newnissanz.com,newscionxb.com,newtahoeyukon.com,newtiburon.com,ngemu.com,ninetowners.com,ninja400riders.com,ninjah2.org,niocarclub.com,nissan-navara.net,nissanclub.com,nissancubelife.com,nissanforums.com,nissankicksforum.com,nissanmurano.org,nissanversaforums.com,nitroforumz.com,nodakoutdoors.com,nordenforums.com,noreast.com,noteownersclub.co.uk,novas.net,novascotiafishing.com,novascotiahunting.com,nv200forum.com,nybass.com,nyfirearms.com##+js(rmnt, script, html-load.com) +observedtrials.net,oceanforums.com,odyclub.com,ohiogamefishing.com,ohiosportsman.com,ohiowaterfowlerforum.com,oklahomahunter.net,onefora.com,onesixthwarriors.com,opelgt.com,optimaforums.com,optiqforum.com,ourbeagleworld.com,outbackers.com,outlanderforums.com,overclock.net##+js(rmnt, script, html-load.com) +pacificaforums.com,paintballforum.com,painttalk.com,palisadeforum.com,panameraforum.com,panamericaforums.com,panigalev4club.com,paracordforum.com,passatworld.com,passportforums.com,pathfindertalk.com,patrol4x4.com,pavementsucks.com,paviseforum.com,paw-talk.net,pearforum.com,pelotonforum.com,pensacolafishingforum.com,perfectmancave.com,perfectunion.com,performanceboats.com,personalitycafe.com,petforums.co.uk,peugeot108forum.co.uk,peugeotforums.com,pickleballertalk.com,pierandsurf.com,pigeons.biz,pigforum.com,piloteers.org,pioneerforums.com,piranha-fury.com,pirate4x4.com,pistolsmith.com,pistolworld.com,planet-9.com,planet4x4.net,planetisuzoo.com,planetminis.com,plantedtank.net,plowsite.com,plumbingzone.com,pnwriders.com,pocketbikeplanet.com,polarisatvforums.com,polarisgeneralforum.com,polarisriders.com,polestar-forum.com,politicaltownhall.com,poodleforum.com,porscheevforum.com,powerequipmentforum.com,powerstroke.org,powerstrokenation.com,prcforum.com,predatortalk.com,preludeonline.com,preludepower.com,preparedsociety.com,prepperforums.net,preservationtalk.com,prius5.com,priusforum.com,priusonline.com,prologuedrivers.com,promasterforum.com,prophecyowners.com,prowlerforums.net,prowlertalk.net,psychobike.com,pursuitforum.com,pwcforum.com##+js(rmnt, script, html-load.com) +q2forums.co.uk,q3ownersclub.co.uk,qyiforum.com##+js(rmnt, script, html-load.com) +r1-forum.com,r1200gs.info,r1200rforum.com,r125forum.com,r1300gsforum.com,r2forums.com,r3-forums.com,r32oc.com,r6-forum.com,r6messagenet.com,r7forums.com,r8talk.com,r9riders.com,rabbitdogs.net,rallyforums.com,ram1500diesel.com,ramchargercentral.com,ramevforum.com,ramforumz.com,ramrebel.org,ramrebelforum.com,ramrho.org,rangerforums.net,rangerovers.net,rangerraptorowners.com,raptorforum.com,raptorforumz.com,ratforum.com,rav4world.com,rc350forum.com,rc51forums.com,recon-forum.com,redlineforums.com,redlineutvforums.net,regalforums.com,renaultforums.co.uk,renegadeforum.com,reptileforums.co.uk,retrievertraining.net,rhinoforums.net,rhinotalk.net,riderforums.com,ridgeforum.com,ridgelineownersclub.com,rimfirecentral.com,rinconriders.com,rivianownersforum.com,rlxforum.com,roadbikereview.com,roadglide.org,roadstarraider.com,roadtripliving.com,robloxforum.com,rodsnsods.co.uk,roguesportforum.com,rollsroyceforums.com,roofingtalk.com,rootzwiki.com,rottweilersonline.com,routerforums.com,royalenfieldforum.com,rs25.com,rswarrior.com,rubiconownersforum.com,rugerforum.net,rugerpistolforums.com,rugertalk.com,runeriders.com,runnersforum.co.uk,rzforums.com,rzrforums.net##+js(rmnt, script, html-load.com) +s1000rrforum.com,s10forum.com,saabcentral.com,saablink.net,saabscene.com,sailnet.com,salmonfishingforum.com,santacruzforums.com,santafeforums.com,sarforums.com,saturnoutlookforum.net,savanaforum.com,saxontheweb.net,sb9t.com,scioniaforum.com,scionimforum.com,scirocconet.co.uk,scoutmotorsforum.com,scr950forum.com,scramblerforum.com,seadoospark.org,seat-forum.co.uk,seatroutforum.com,segwayforums.com,seltosforum.com,serial1forum.com,shercoforums.com,shipsnostalgia.com,shootersforum.com,shootingworld.com,shotgunforums.com,shotgunworld.com,sidexsideworld.com,siennachat.com,sierraevforum.com,sigarms556.com,sigtalk.com,silveradocheyenne.org,silveradoevforum.com,silveradosierra.com,skincaretalk.com,skylineowners.com,skyroadster.com,skyscrapercity.com,slatedroid.com,slateownersforum.com,slingshotforum.com,slingshotforums.com,slkworld.com,slotforum.com,smartcarofamerica.com,smartevforum.com,smithandwessonforums.com,smokinvette.com,snackfora.com,sniperforums.com,snowblowerforum.com,snowboardingforum.com,snowmobilefanatics.com,snowmobileforum.com,snowmobileworld.com,snowplowforums.com,socialanxietysupport.com,solanforum.com,solsticeforum.com,solterraforum.com,sonataforums.com,sonymobilityforum.com,sparktalk.com,speakev.com,specialstage.com,speedwake.com,speedzilla.com,speypages.com,spoiledmaltese.com,sportbikes.net,sportbikeworld.com,springfieldforum.com,spyderchat.com,spydertalk.com,sr20forum.com,srt10forum.com,srt4mation.com,srtforums.com,ssforums.com,ssrfanatic.com,starbikeforums.com,starlinktalk.com,stdrivers.co.uk,stelvioforum.com,stevesnovasite.com,steyrclub.com,stingerforums.com,stingrayforums.com,stormtrakforum.com,stratolinerdeluxe.com,streetfighterv2forum.com,stripers247.com,stromerforum.com,stromtrooper.com,subarubrzforum.com,subaruforester.org,subaruoutback.org,subaruxvforum.com,superhonda.com,supermotojunkie.com,supra6.com,supraforums.com,survivalistboards.com,suzuki-forums.com,suzuki-forums.net,suzukiatvforums.com,suzukicentral.com,sv-portal.com,svrider.com,swedespeed.com##+js(rmnt, script, html-load.com) +t-goforum.com,t-shirtforums.com,taikoboards.com,talkaboutmarriage.com,talkbudgies.com,talkclassical.com,talkcockatiels.com,talkesg.com,talkford.com,talkparrotlets.com,talkparrots.com,talonsxsforum.com,taosforums.com,tarokforum.com,tarracoforums.co.uk,taurusarmed.net,taurusclub.com,taycanevforum.com,tbssowners.com,tccoa.com,tcrossforums.co.uk,team-integra.net,techguy.org,techsupportforum.com,telo-forum.com,tennisforum.com,tennspeed.net,terrainforum.com,terrainforum.net,teryxforums.net,teryxhq.com,teslabottalk.com,teslaownersonline.com,texas4x4.org,theakforum.net,thebassbarn.com,thebassholes.com,theboxotruth.com,thecombineforum.com,thedieselgarage.com,thedieselstop.com,thefirearmsforum.com,theflyfishingforum.com,thegoatspot.net,thektog.org,thelawnforum.com,thelupussite.com,thelureforum.com,themgzr.co.uk,thenewx.org,theprofilebrotherhood.com,thereeftank.com,theslingshotforum.com,thespeedtriple.com,thevog.net,thewatchforum.co.uk,thewatchsite.com,theworldofarchitecture.com,thyroidboards.com,tidalfish.com,tiguanevforum.com,tiguanforums.co.uk,titantalk.com,titanxdforum.com,tivocommunity.com,tjcruiserforums.com,tlxforums.com,tlzone.net,tnhuntingclub.com,tonaletalk.com,topolinoforum.com,toyotacelicas.com,toyotachrforum.com,toyotaevforum.com,toyotanation.com,tractorforum.com,tradtalk.com,trailblazertalk.com,trailhunterforums.com,trailsportforum.com,trailvoy.com,transalpowners.com,trapshooters.com,traverseforum.com,traxforum.com,treadmillforum.com,trifive.com,triumph400forum.com,triumph675.net,triumphbobberforum.com,triumphrat.net,trocforums.co.uk,tropicalfishforums.co.uk,tropicalfishkeeping.com,truestreetcars.com,trx250r.net,trx450r.org,trxforums.com,tsxclub.com,ttforum.co.uk,ttora.com,tucson-forum.com,tundra3.com,tundraevforum.com,tundrasolutions.com,tundratalk.net,turbobuicks.com,turbododge.com,tw200forum.com,twospoke.com,twowheelforum.com,txowners.com##+js(rmnt, script, html-load.com) +uberpeople.net,uk-audis.net,uk-mkivs.net,uk-muscle.co.uk,ukcorsa-d.com,ultimateaircooled.com,upownersclub.co.uk,usmle-forums.com,utahconcealedcarry.com,utahwildlife.net##+js(rmnt, script, html-load.com) +v-twinforum.com,v6performance.net,v6z24.com,v8bikeriders.com,vagdrivers.net,vantasforum.com,varminthunters.com,vauxhallownersnetwork.co.uk,veggieboards.com,veggiegardener.com,velarforums.co.uk,veloster.org,velostern.com,velosterturbo.org,venuedrivers.com,victoryforums.com,videoeditingtalk.com,vikingforum.net,vikingforum.org,vinfasttalk.com,vintage-mustang.com,viperalley.com,vizslaforums.com,vn750.com,volconforum.com,volkswagenforum.co.uk,volkswagenownersclub.com,volkszone.com,volusiariders.com,volvo-forums.com,volvoevforum.com,volvoforum.com,volvov40club.com,vtcafe.com,vtxcafe.com,vtxoa.com,vulcanforums.com,vwatlasforum.com,vweosclub.com,vwforum.com,vwidtalk.com,vwscout.org,vwt4forum.co.uk,vwvortex.com##+js(rmnt, script, html-load.com) +wagoneerfans.com,walkingstickforum.com,waltherforums.com,washingtonflyfishing.com,watchfreeks.com,watchtalkforums.info,watchuseek.com,weldingweb.com,wethearmed.com,wfmachines.com,wildcatforums.net,windycityfishing.com,wolverineforums.com,woodworkingtalk.com,workingdogforum.com,workingfromhomeforum.com,worldseafishing.com,wranglerboard.com,wranglerforum.com,wranglerjlforum.com,wrestlingforum.com,wristtwisters.com,wrxforums.com,wrxtuners.com##+js(rmnt, script, html-load.com) +x-trail-uk.co.uk,x7forum.com,xc100forum.com,xc40forum.com,xclassforums.com,xcrforum.com,xdforum.com,xdtalk.com,xeforums.co.uk,xfforum.co.uk,xlrforum.com,xmowners.com,xpeditionforum.com,xpengevforum.com,xpowerforums.com,xr1200ownersgroup.com,xr150lforum.com,xrv.org.uk,xsr700forums.com,xtratime.org##+js(rmnt, script, html-load.com) +yamaha-forum.net,yamahaforum.com,yamahastarbolt.com,yamahastarstryker.com,yariscrossclub.com,yellowbullet.com,yetiownersclub.co.uk,yfzcentral.com,yorkshire-divers.com,yourcobalt.com,yourpatientvoice.com,yoursciontc.com,yxztalk.com##+js(rmnt, script, html-load.com) +z06vette.com,z1000forum.com,z125owners.com,zafiraowners.co.uk,zcar.com,zdxowners.com,zeekrchat.com,zeromotorcycleforum.com,zotyezone.com,zrvforum.com,zx-10r.net,zx25rforum.com,zx4rforum.com,zx6r.com,zxforums.com##+js(rmnt, script, html-load.com) +! !SECTION: Ad-Shield +! SECTION: Fineshop Design anti-adb sites +!#if cap_html_filtering +cccam4sat.com,dipsnp.com,everydaytechvams.com,formyanime.com,gsm-solution.com,h-donghua.com,hindisubbedacademy.com,hm4tech.info,husseinezzat.com,mydverse.*,panelprograms.blogspot.com,ripexbooster.xyz,serial4.com,technicians0.blogspot.com,tutorgaming.com,unblockedgamesgplus.gitlab.io##^script:has-text(antiAdBlockerHandler) +!#else +cccam4sat.com,dipsnp.com,everydaytechvams.com,formyanime.com,gsm-solution.com,h-donghua.com,hindisubbedacademy.com,hm4tech.info,husseinezzat.com,mydverse.*,panelprograms.blogspot.com,ripexbooster.xyz,serial4.com,technicians0.blogspot.com,tutorgaming.com,unblockedgamesgplus.gitlab.io##+js(rmnt, script, antiAdBlockerHandler) +!#endif +formyanime.com,gsm-solution.com,h-donghua.com,hindisubbedacademy.com,hm4tech.info,mydverse.*,panelprograms.blogspot.com,ripexbooster.xyz,serial4.com,tutorgaming.com,unblockedgamesgplus.gitlab.io,everydaytechvams.com,dipsnp.com,cccam4sat.com##.popSc +lankapradeepa.com##.js-antiadblocker:remove() +! !SECTION: Fineshop Design anti-adb sites +! SECTION: Arkadium +@@||ams.cdn.arkadiumhosted.com/advertisement/video/*/video-ads.js$script,domain=zone.msn.com +arcade.buzzrtv.com,arcade.dailygazette.com,arcade.lemonde.fr,arena.gamesforthebrain.com,bestpuzzlesandgames.com,cointiply.arkadiumarena.com,gamelab.com,gameplayneo.com,games.abqjournal.com,games.arkadium.com,games.amny.com,games.bellinghamherald.com,games.besthealthmag.ca,games.bnd.com,games.boston.com,games.bostonglobe.com,games.bradenton.com,games.centredaily.com,games.charlottegames.cnhinews.com,games.crosswordgiant.com,games.dailymail.co.uk,games.dailymail.com,games.dallasnews.com,games.daytondailynews.com,games.denverpost.com,games.everythingzoomer.com,games.fresnobee.com,games.gameshownetwork.com,games.get.tv,games.greatergood.com,games.heraldonline.com,games.heraldsun.com,games.idahostatesman.com,games.insp.com,games.islandpacket.com,games.journal-news.com,games.kansas.com,games.kansascity.com,games.kentucky.com,games.lancasteronline.com,games.ledger-enquirer.com,games.macon.com,games.mashable.com,games.mercedsunstar.com,games.metro.us,games.metv.com,games.miamiherald.com,games.modbee.com,games.moviestvnetwork.com,games.myrtlebeachonline.com,games.games.newsgames.parade.com,games.pressdemocrat.com,games.puzzlebaron.com,games.puzzler.com,games.puzzles.ca,games.qns.com,games.readersdigest.ca,games.sacbee.com,games.sanluisobispo.com,games.sixtyandme.com,games.sltrib.com,games.springfieldnewssun.com,games.star-telegram.com,games.startribune.com,games.sunherald.com,games.theadvocate.com,games.thenewstribune.com,games.theolympian.com,games.theportugalnews.com,games.thestar.com,games.thestate.com,games.tri-cityherald.com,games.triviatoday.com,games.usnews.com,games.word.tips,games.wordgenius.com,games.wtop.com,jeux.meteocity.com,juegos.as.com,juegos.elnuevoherald.com,juegos.elpais.com,philly.arkadiumarena.com,play.dictionary.com,puzzles.bestforpuzzles.com,puzzles.centralmaine.com,puzzles.crosswordsolver.org,puzzles.independent.co.uk,puzzles.nola.com,puzzles.pressherald.com,puzzles.standard.co.uk,puzzles.sunjournal.com##+js(set, __INITIAL_STATE__.config.theme.ads.isAdBlockerEnabled, false) +arcade.buzzrtv.com,arcade.dailygazette.com,arcade.lemonde.fr,arena.gamesforthebrain.com,bestpuzzlesandgames.com,cointiply.arkadiumarena.com,gamelab.com,gameplayneo.com,games.abqjournal.com,games.arkadium.com,games.amny.com,games.bellinghamherald.com,games.besthealthmag.ca,games.bnd.com,games.boston.com,games.bostonglobe.com,games.bradenton.com,games.centredaily.com,games.charlottegames.cnhinews.com,games.crosswordgiant.com,games.dailymail.co.uk,games.dailymail.com,games.dallasnews.com,games.daytondailynews.com,games.denverpost.com,games.everythingzoomer.com,games.fresnobee.com,games.gameshownetwork.com,games.get.tv,games.greatergood.com,games.heraldonline.com,games.heraldsun.com,games.idahostatesman.com,games.insp.com,games.islandpacket.com,games.journal-news.com,games.kansas.com,games.kansascity.com,games.kentucky.com,games.lancasteronline.com,games.ledger-enquirer.com,games.macon.com,games.mashable.com,games.mercedsunstar.com,games.metro.us,games.metv.com,games.miamiherald.com,games.modbee.com,games.moviestvnetwork.com,games.myrtlebeachonline.com,games.games.newsgames.parade.com,games.pressdemocrat.com,games.puzzlebaron.com,games.puzzler.com,games.puzzles.ca,games.qns.com,games.readersdigest.ca,games.sacbee.com,games.sanluisobispo.com,games.sixtyandme.com,games.sltrib.com,games.springfieldnewssun.com,games.star-telegram.com,games.startribune.com,games.sunherald.com,games.theadvocate.com,games.thenewstribune.com,games.theolympian.com,games.theportugalnews.com,games.thestar.com,games.thestate.com,games.tri-cityherald.com,games.triviatoday.com,games.usnews.com,games.word.tips,games.wordgenius.com,games.wtop.com,jeux.meteocity.com,juegos.as.com,juegos.elnuevoherald.com,juegos.elpais.com,philly.arkadiumarena.com,play.dictionary.com,puzzles.bestforpuzzles.com,puzzles.centralmaine.com,puzzles.crosswordsolver.org,puzzles.independent.co.uk,puzzles.nola.com,puzzles.pressherald.com,puzzles.standard.co.uk,puzzles.sunjournal.com#@#display-ad-component +arcade.buzzrtv.com,arcade.dailygazette.com,arcade.lemonde.fr,arena.gamesforthebrain.com,bestpuzzlesandgames.com,cointiply.arkadiumarena.com,gamelab.com,gameplayneo.com,games.abqjournal.com,games.arkadium.com,games.amny.com,games.bellinghamherald.com,games.besthealthmag.ca,games.bnd.com,games.boston.com,games.bostonglobe.com,games.bradenton.com,games.centredaily.com,games.charlottegames.cnhinews.com,games.crosswordgiant.com,games.dailymail.co.uk,games.dailymail.com,games.dallasnews.com,games.daytondailynews.com,games.denverpost.com,games.everythingzoomer.com,games.fresnobee.com,games.gameshownetwork.com,games.get.tv,games.greatergood.com,games.heraldonline.com,games.heraldsun.com,games.idahostatesman.com,games.insp.com,games.islandpacket.com,games.journal-news.com,games.kansas.com,games.kansascity.com,games.kentucky.com,games.lancasteronline.com,games.ledger-enquirer.com,games.macon.com,games.mashable.com,games.mercedsunstar.com,games.metro.us,games.metv.com,games.miamiherald.com,games.modbee.com,games.moviestvnetwork.com,games.myrtlebeachonline.com,games.games.newsgames.parade.com,games.pressdemocrat.com,games.puzzlebaron.com,games.puzzler.com,games.puzzles.ca,games.qns.com,games.readersdigest.ca,games.sacbee.com,games.sanluisobispo.com,games.sixtyandme.com,games.sltrib.com,games.springfieldnewssun.com,games.star-telegram.com,games.startribune.com,games.sunherald.com,games.theadvocate.com,games.thenewstribune.com,games.theolympian.com,games.theportugalnews.com,games.thestar.com,games.thestate.com,games.tri-cityherald.com,games.triviatoday.com,games.usnews.com,games.word.tips,games.wordgenius.com,games.wtop.com,jeux.meteocity.com,juegos.as.com,juegos.elnuevoherald.com,juegos.elpais.com,philly.arkadiumarena.com,play.dictionary.com,puzzles.bestforpuzzles.com,puzzles.centralmaine.com,puzzles.crosswordsolver.org,puzzles.independent.co.uk,puzzles.nola.com,puzzles.pressherald.com,puzzles.standard.co.uk,puzzles.sunjournal.com##+js(nano-sib, generalTimeLeft, *, 0.001) +arcade.buzzrtv.com,arcade.dailygazette.com,arcade.lemonde.fr,arena.gamesforthebrain.com,bestpuzzlesandgames.com,cointiply.arkadiumarena.com,gamelab.com,gameplayneo.com,games.abqjournal.com,games.arkadium.com,games.amny.com,games.bellinghamherald.com,games.besthealthmag.ca,games.bnd.com,games.boston.com,games.bostonglobe.com,games.bradenton.com,games.centredaily.com,games.charlottegames.cnhinews.com,games.crosswordgiant.com,games.dailymail.co.uk,games.dailymail.com,games.dallasnews.com,games.daytondailynews.com,games.denverpost.com,games.everythingzoomer.com,games.fresnobee.com,games.gameshownetwork.com,games.get.tv,games.greatergood.com,games.heraldonline.com,games.heraldsun.com,games.idahostatesman.com,games.insp.com,games.islandpacket.com,games.journal-news.com,games.kansas.com,games.kansascity.com,games.kentucky.com,games.lancasteronline.com,games.ledger-enquirer.com,games.macon.com,games.mashable.com,games.mercedsunstar.com,games.metro.us,games.metv.com,games.miamiherald.com,games.modbee.com,games.moviestvnetwork.com,games.myrtlebeachonline.com,games.games.newsgames.parade.com,games.pressdemocrat.com,games.puzzlebaron.com,games.puzzler.com,games.puzzles.ca,games.qns.com,games.readersdigest.ca,games.sacbee.com,games.sanluisobispo.com,games.sixtyandme.com,games.sltrib.com,games.springfieldnewssun.com,games.star-telegram.com,games.startribune.com,games.sunherald.com,games.theadvocate.com,games.thenewstribune.com,games.theolympian.com,games.theportugalnews.com,games.thestar.com,games.thestate.com,games.tri-cityherald.com,games.triviatoday.com,games.usnews.com,games.word.tips,games.wordgenius.com,games.wtop.com,jeux.meteocity.com,juegos.as.com,juegos.elnuevoherald.com,juegos.elpais.com,philly.arkadiumarena.com,play.dictionary.com,puzzles.bestforpuzzles.com,puzzles.centralmaine.com,puzzles.crosswordsolver.org,puzzles.independent.co.uk,puzzles.nola.com,puzzles.pressherald.com,puzzles.standard.co.uk,puzzles.sunjournal.com##[class^="DisplayAd__container"] +gameplayneo.com##+js(rmnt, script, /adblock/i) +crosswordsolver.com##.ad-container +gameplayneo.com##ark-top-ad +gameplayneo.com##.ark-ad-display-container +||arkadiumhosted.com/*/adsBlob/$xhr,domain=bestforpuzzles.com|charlotteobserver.com|independent.co.uk|miamiherald.com|standard.co.uk|word.tips +##.ark-ad-message +/advertisement/video/static/advantage.xml^$xhr +arkadiumhosted.com##+js(set, Adv_ab, false) +@@||imasdk.googleapis.com/js/sdkloader/ima3.js$script,domain=arkadiumhosted.com +||ams.cdn.arkadiumhosted.com/advertisement/display/staging/display-ads.js$xhr,domain=arkadium.com,redirect=noopjs +arkadium.com##+js(set, __INITIAL_STATE__.gameLists.gamesNoPrerollIds.indexOf, trueFunc) +arkadium.com##+js(nano-sib) +arkadium.com#@#div[class^="Ad-adContainer"] +arkadium.com##div[class^="Ad-adContainer"]:style(min-height:1px!important;min-width:1px!important;) +arkadium.com##span[class*=Ad-caption-] +! !SECTION: Arkadium +! SECTION: Dood +*$script,3p,denyallow=cloudflare.com|crisp.chat|doodcdn.io|google.com|gstatic.com,domain=all3do.com|d0000d.com|d000d.com|d0o0d.com|do0od.com|do7go.com|dood.*|doods.*|dooodster.com|dooood.*|doply.net|ds2play.com|ds2video.com|dsvplay.com|vidply.com|vide0.net|vvide0.com|playmogo.com +/sw.js$script,domain=all3do.com|d0000d.com|d000d.com|d0o0d.com|do0od.com|do7go.com|dood.*|doods.*|dooodster.com|dooood.*|doply.net|ds2play.com|ds2video.com|dsvplay.com|vidply.com|vide0.net|vvide0.com|playmogo.com +!#if cap_html_filtering +all3do.com,d0000d.com,d000d.com,d0o0d.com,do0od.com,do7go.com,dood.*,doods.*,doodstream.*,dooodster.com,dooood.*,doply.net,ds2play.com,ds2video.com,playmogo.com,vide0.net,vidply.com,vvide0.com##^script:has-text(/adblock|popunder|openedPop|WebAssembly|wpadmngr/) +!#else +all3do.com,d0000d.com,d000d.com,d0o0d.com,do0od.com,do7go.com,dood.*,doods.*,doodstream.*,dooodster.com,dooood.*,doply.net,ds2play.com,ds2video.com,playmogo.com,vide0.net,vidply.com,vvide0.com##+js(rmnt, script, /adblock|popunder|openedPop|WebAssembly|wpadmngr/) +!#endif +all3do.com,d0000d.com,d000d.com,d0o0d.com,do0od.com,do7go.com,dood.*,doods.*,doodstream.*,dooodster.com,dooood.*,doply.net,ds2play.com,ds2video.com,playmogo.com,vide0.net,vidply.com,vvide0.com##+js(aopr, __aaZoneid) +all3do.com,d0000d.com,d000d.com,d0o0d.com,do0od.com,do7go.com,dood.*,doods.*,doodstream.*,dooodster.com,dooood.*,doply.net,ds2play.com,ds2video.com,playmogo.com,vide0.net,vidply.com,vvide0.com##+js(aopw, DoodPop) +all3do.com,d0000d.com,d000d.com,d0o0d.com,do0od.com,do7go.com,dood.*,doods.*,doodstream.*,dooodster.com,dooood.*,doply.net,ds2play.com,ds2video.com,playmogo.com,vide0.net,vidply.com,vvide0.com##+js(acs, decodeURI, decodeURIComponent) +all3do.com,d0000d.com,d000d.com,d0o0d.com,do0od.com,do7go.com,dood.*,doods.*,doodstream.*,dooodster.com,dooood.*,doply.net,ds2play.com,ds2video.com,playmogo.com,vide0.net,vidply.com,vvide0.com##+js(nowoif) +/embed-1/ajax/e-1/banners|$xhr +/embed-1/e-1/banners|$xhr +||iili.io/JvfIu1a.gif$image +hianime.to##[href="https://1flix.to/"] +###vidcloud-player > #overlay-container +||doo.lat/public/overroll_gasparin.js +dodz.*,doodss.*,doood.*,doooood.*,kakitengah.*,y2tube.pro##+js(nowoif) +||dooods.pro/download_popunder$popup +doodss.*###video-container ~ a[href="#"] +doooood.co###overlay +dsvplay.com##+js(acs, WebAssembly, atob) +dsvplay.com##+js(nowoif) +$popup,3p,domain=ds2play.com,badfilter +! !SECTION: Dood +! SECTION: voe.sx +/\/[0-9a-z]{2}\/[0-9a-f]{32}\.js/$script,xhr,3p,match-case,method=get,to=com,from=alejandrocenturyoil.com|bryantenunder.com|caseyimpactstation.com|charlessheimprove.com|charlestoughrace.com|christopheruntilpoint.com|dianaavoidthey.com|ellenpoliticalfollow.com|ericeastweight.com|eugenemakedraw.com|garylargeavailable.com|heatherwholeinvolve.com|ianrequireadult.com|jamesbornmain.com|jamiesamewalk.com|jeanprofessorcentral.com|jefferycontrolmodel.com|jennifereconomicgive.com|jessicachoosemake.com|jessicaclearout.com|jessicaglassauthor.com|jessicayeahcatch.com|jilliandescribecompany.com|johnbeyondnation.com|johnfullwonder.com|juliewomanwish.com|katherineschoolphone.com|kathyinformationwhether.com|kellywhatcould.com|kennethofficialitem.com|kristiesoundsimply.com|lancewhosedifficult.com|lauradaydo.com|lindalastattack.com|lisatrialidea.com|lorimuchbenefit.com|loriwithinfamily.com|lukecomparetwo.com|lukesitturn.com|mariatheserepublican.com|marissasharecareer.com|markstyleall.com|maryspecialwatch.com|matthewhotelscience.com|michaelapplysome.com|mikaylaarealike.com|morganoperationface.com|nicolehappyoutside.com|pamelachangemission.com|phenomenalityuniform.com|rebeccacostthousand.com|rebeccapracticeloss.com|richardquestionbuilding.com|richardsignfish.com|roberteachfinal.com|robertordercharacter.com|robertplacespace.com|ryanagoinvolve.com|sandratableother.com|sandrataxeight.com|sethniceletter.com|shannonpersonalcost.com|stevenfamilyedge.com|susanhavekeep.com|timmaybealready.com|tracylocalschool.com|vickisaveworker.com|voe.sx|walterprettytheir.com +||imasdk.googleapis.com/js/sdkloader/ima3.js$script,3p,redirect=google-ima.js,domain=alejandrocenturyoil.com|bryantenunder.com|caseyimpactstation.com|charlessheimprove.com|charlestoughrace.com|christopheruntilpoint.com|dianaavoidthey.com|ellenpoliticalfollow.com|ericeastweight.com|eugenemakedraw.com|garylargeavailable.com|heatherwholeinvolve.com|ianrequireadult.com|jamesbornmain.com|jamiesamewalk.com|jeanprofessorcentral.com|jefferycontrolmodel.com|jennifereconomicgive.com|jessicachoosemake.com|jessicaclearout.com|jessicaglassauthor.com|jessicayeahcatch.com|jilliandescribecompany.com|johnbeyondnation.com|johnfullwonder.com|juliewomanwish.com|katherineschoolphone.com|kathyinformationwhether.com|kellywhatcould.com|kennethofficialitem.com|kristiesoundsimply.com|lancewhosedifficult.com|lauradaydo.com|lindalastattack.com|lisatrialidea.com|lorimuchbenefit.com|loriwithinfamily.com|lukecomparetwo.com|lukesitturn.com|mariatheserepublican.com|marissasharecareer.com|markstyleall.com|maryspecialwatch.com|matthewhotelscience.com|michaelapplysome.com|mikaylaarealike.com|morganoperationface.com|nicolehappyoutside.com|pamelachangemission.com|phenomenalityuniform.com|rebeccacostthousand.com|rebeccapracticeloss.com|richardquestionbuilding.com|richardsignfish.com|roberteachfinal.com|robertordercharacter.com|robertplacespace.com|ryanagoinvolve.com|sandratableother.com|sandrataxeight.com|sethniceletter.com|shannonpersonalcost.com|stevenfamilyedge.com|susanhavekeep.com|timmaybealready.com|tracylocalschool.com|vickisaveworker.com|voe.sx|walterprettytheir.com,important +alejandrocenturyoil.com,bryantenunder.com,caseyimpactstation.com,charlessheimprove.com,charlestoughrace.com,christopheruntilpoint.com,dianaavoidthey.com,ellenpoliticalfollow.com,ericeastweight.com,eugenemakedraw.com,garylargeavailable.com,heatherwholeinvolve.com,ianrequireadult.com,jamesbornmain.com,jamiesamewalk.com,jeanprofessorcentral.com,jefferycontrolmodel.com,jennifereconomicgive.com,jessicachoosemake.com,jessicaclearout.com,jessicaglassauthor.com,jessicayeahcatch.com,jilliandescribecompany.com,johnbeyondnation.com,johnfullwonder.com,juliewomanwish.com,katherineschoolphone.com,kathyinformationwhether.com,kellywhatcould.com,kennethofficialitem.com,kristiesoundsimply.com,lancewhosedifficult.com,lauradaydo.com,lindalastattack.com,lisatrialidea.com,lorimuchbenefit.com,loriwithinfamily.com,lukecomparetwo.com,lukesitturn.com,mariatheserepublican.com,marissasharecareer.com,markstyleall.com,maryspecialwatch.com,matthewhotelscience.com,michaelapplysome.com,mikaylaarealike.com,morganoperationface.com,nicolehappyoutside.com,pamelachangemission.com,phenomenalityuniform.com,rebeccacostthousand.com,rebeccapracticeloss.com,richardquestionbuilding.com,richardsignfish.com,roberteachfinal.com,robertordercharacter.com,robertplacespace.com,ryanagoinvolve.com,sandratableother.com,sandrataxeight.com,sethniceletter.com,shannonpersonalcost.com,stevenfamilyedge.com,susanhavekeep.com,timmaybealready.com,tracylocalschool.com,vickisaveworker.com,voe.sx,walterprettytheir.com##+js(nowoif) +alejandrocenturyoil.com,bryantenunder.com,caseyimpactstation.com,charlessheimprove.com,charlestoughrace.com,christopheruntilpoint.com,dianaavoidthey.com,ellenpoliticalfollow.com,ericeastweight.com,eugenemakedraw.com,garylargeavailable.com,heatherwholeinvolve.com,ianrequireadult.com,jamesbornmain.com,jamiesamewalk.com,jeanprofessorcentral.com,jefferycontrolmodel.com,jennifereconomicgive.com,jessicachoosemake.com,jessicaclearout.com,jessicaglassauthor.com,jessicayeahcatch.com,jilliandescribecompany.com,johnbeyondnation.com,johnfullwonder.com,juliewomanwish.com,katherineschoolphone.com,kathyinformationwhether.com,kellywhatcould.com,kennethofficialitem.com,kristiesoundsimply.com,lancewhosedifficult.com,lauradaydo.com,lindalastattack.com,lisatrialidea.com,lorimuchbenefit.com,loriwithinfamily.com,lukecomparetwo.com,lukesitturn.com,mariatheserepublican.com,marissasharecareer.com,markstyleall.com,maryspecialwatch.com,matthewhotelscience.com,michaelapplysome.com,mikaylaarealike.com,morganoperationface.com,nicolehappyoutside.com,pamelachangemission.com,rebeccacostthousand.com,rebeccapracticeloss.com,richardquestionbuilding.com,richardsignfish.com,roberteachfinal.com,robertordercharacter.com,robertplacespace.com,ryanagoinvolve.com,sandratableother.com,sandrataxeight.com,sethniceletter.com,shannonpersonalcost.com,stevenfamilyedge.com,susanhavekeep.com,timmaybealready.com,tracylocalschool.com,uptodatefinishconference.com,uptodatefinishconferenceroom.com,vickisaveworker.com,voe.sx,walterprettytheir.com##+js(set, console.clear, undefined) +alejandrocenturyoil.com,bryantenunder.com,caseyimpactstation.com,charlessheimprove.com,charlestoughrace.com,christopheruntilpoint.com,dianaavoidthey.com,ellenpoliticalfollow.com,ericeastweight.com,eugenemakedraw.com,garylargeavailable.com,heatherwholeinvolve.com,ianrequireadult.com,jamesbornmain.com,jamiesamewalk.com,jeanprofessorcentral.com,jefferycontrolmodel.com,jennifereconomicgive.com,jessicachoosemake.com,jessicaclearout.com,jessicayeahcatch.com,jilliandescribecompany.com,johnbeyondnation.com,johnfullwonder.com,juliewomanwish.com,katherineschoolphone.com,kathyinformationwhether.com,kellywhatcould.com,kristiesoundsimply.com,lancewhosedifficult.com,lauradaydo.com,lindalastattack.com,lukesitturn.com,mariatheserepublican.com,marissasharecareer.com,maryspecialwatch.com,matthewhotelscience.com,mikaylaarealike.com,nicolehappyoutside.com,pamelachangemission.com,rebeccacostthousand.com,rebeccapracticeloss.com,richardquestionbuilding.com,stevenfamilyedge.com,timmaybealready.com,tracylocalschool.com,vickisaveworker.com,voe.sx,walterprettytheir.com##+js(acs, globalThis, break;case) +alejandrocenturyoil.com,bryantenunder.com,caseyimpactstation.com,charlessheimprove.com,charlestoughrace.com,christopheruntilpoint.com,dianaavoidthey.com,ellenpoliticalfollow.com,ericeastweight.com,eugenemakedraw.com,garylargeavailable.com,heatherwholeinvolve.com,ianrequireadult.com,jamesbornmain.com,jamiesamewalk.com,jeanprofessorcentral.com,jefferycontrolmodel.com,jennifereconomicgive.com,jessicachoosemake.com,jessicaclearout.com,jessicayeahcatch.com,jilliandescribecompany.com,johnbeyondnation.com,johnfullwonder.com,juliewomanwish.com,katherineschoolphone.com,kathyinformationwhether.com,kellywhatcould.com,kristiesoundsimply.com,lancewhosedifficult.com,lauradaydo.com,lindalastattack.com,lukesitturn.com,marissasharecareer.com,maryspecialwatch.com,matthewhotelscience.com,mikaylaarealike.com,nicolehappyoutside.com,pamelachangemission.com,stevenfamilyedge.com,rebeccacostthousand.com,rebeccapracticeloss.com,richardquestionbuilding.com,timmaybealready.com,tracylocalschool.com,vickisaveworker.com,voe.sx,walterprettytheir.com##+js(acs, WebAssembly, atob) +||rochestertrend.com^$all +||facesnotebook.com^$all +||highrevenuecpm.com^$all +/\/[0-9a-z]{2}\/[0-9a-f]{32}\.js/$script,xhr,3p,match-case,method=get,to=com,top=pro|to|top|tv|win|~gov.to|~gov.tv|~twitch.tv +/\/[0-9a-z]{2}\/[0-9a-f]{32}\.js/$script,xhr,3p,match-case,method=get,to=com,top=anihq.org|bestbondagevideos.com|filmifen.com|voe.sx +voe.sx>>,anihq.org>>,aniworld.to>>,bestbondagevideos.com>>,embed.tmp-url.pro>>,filmifen.com>>,filmo.to>>,javboys.tv>>,nupload.top>>,s.to>>,seriesflixhd.*>>,~addtoany.com,~cloudflare.com,~facebook.com,~fastly.net,~twitter.com##+js(nowoif) +voe.sx>>,anihq.org>>,aniworld.to>>,bestbondagevideos.com>>,embed.tmp-url.pro>>,filmifen.com>>,filmo.to>>,javboys.tv>>,nupload.top>>,s.to>>,seriesflixhd.*>>,~addtoany.com,~cloudflare.com,~facebook.com,~fastly.net,~twitter.com##+js(set, console.clear, undefined) +voe.sx>>,anihq.org>>,aniworld.to>>,bestbondagevideos.com>>,embed.tmp-url.pro>>,filmifen.com>>,filmo.to>>,javboys.tv>>,nupload.top>>,s.to>>,seriesflixhd.*>>,~addtoany.com,~cloudflare.com,~facebook.com,~fastly.net,~twitter.com##+js(acs, globalThis, break;case) +voe.sx>>,anihq.org>>,aniworld.to>>,bestbondagevideos.com>>,embed.tmp-url.pro>>,filmifen.com>>,filmo.to>>,javboys.tv>>,nupload.top>>,s.to>>,seriesflixhd.*>>,~addtoany.com,~cloudflare.com,~facebook.com,~fastly.net,~twitter.com##+js(acs, WebAssembly, atob) +voe.sx>>,anihq.org>>,aniworld.to>>,bestbondagevideos.com>>,embed.tmp-url.pro>>,filmifen.com>>,filmo.to>>,javboys.tv>>,nupload.top>>,s.to>>,seriesflixhd.*>>,~addtoany.com,~cloudflare.com,~facebook.com,~fastly.net,~twitter.com##+js(trusted-json-edit, .check=false) +! !SECTION: voe.sx +! SECTION: Hydrax +||iamcdn.net/players/player*.*mins.js$script,domain=freeplayervideo.com|nazarickol.com|player-cdn.com +! abysscdn.com,freeplayervideo.com,nazarickol.com,player-cdn.com##+js(set, detectAdBlockAll, noopFunc) +*$image,redirect-rule=32x32.png,domain=freeplayervideo.com|nazarickol.com|player-cdn.com +freeplayervideo.com,nazarickol.com,player-cdn.com,playhydrax.com##+js(set, console.clear, undefined) +freeplayervideo.com,nazarickol.com,player-cdn.com,playhydrax.com##+js(ra, style, #over) +fullfreeimage.com,freeplayervideo.com,hydraxcdn.biz,imagelovers.com,nazarickol.com,player-cdn.com,playhydrax.com##+js(nowoif, /^/, 1) +jav.guru##.inside-right-sidebar > aside.widget_custom_html +jav.guru###text-76 +jav.guru###text-92 +jav.guru###text-93 +/cdn-cgi/trace$xhr,1p,domain=abysscdn.com|playhydrax.com +abysscdn.com##div[style*="z-index:100000"] +abysscdn.com##.playover +abysscdn.com,playhydrax.com##+js(set, document.ontouchend, null) +abysscdn.com,playhydrax.com##+js(set, document.onclick, null) +abysscdn.com,fembedx.top,fullfreeimage.com,hihihaha1.xyz,hydraxcdn.biz,imagelovers.com,player-cdn.com,playembedapi.site,playermeow.com,playhydrax.com##+js(trusted-replace-outbound-text, Array.prototype.shift, /^.+$/s, '', condition, https) +/favicon.ico|$image,3p,domain=abysscdn.com|fullfreeimage.com|hihihaha1.xyz|hihihaha2.xyz|hydraxcdn.biz|imagelovers.com|player-cdn.com|playermeow.com|playhydrax.com +! popups when moving out of fullscreen +abysscdn.com,fembedx.top,fullfreeimage.com,hihihaha1.xyz,hihihaha2.xyz,hydraxcdn.biz,imagelovers.com,mov18plus.cloud,playembedapi.site,player-cdn.com,playermeow.com,playhydrax.com##+js(aost, HTMLElement.prototype.click, _0x) +abysscdn.com,abyssplayer.com,fembedx.top,fullfreeimage.com,hydraxcdn.biz,imagelovers.com,playembedapi.site,playermeow.com,playhydrax.com###overlay +||com/ick.infonium.org^$frame,1p +||infonium.org^$frame,3p +abysscdn.com,fullfreeimage.com,hihihaha1.xyz,hihihaha2.xyz,playhydrax.com,rufiiguta.com##.loading-overlay ~ div[style^="position: relative;"] +abysscdn.com,fullfreeimage.com,hihihaha1.xyz,hihihaha2.xyz,playhydrax.com,rufiiguta.com##.loading-overlay:has-text(ad) +myzoversion.blogspot.com###content-locker +mov18plus.cloud##+js(nowoif) +mov18plus.cloud##+js(rpnt, script, /.+/gms, 'document.addEventListener("load",()=>{if (typeof jwplayer!="undefined"&&typeof jwplayer().play=="function"){jwplayer().play();}})', condition, FuckAdBlock) +||decafeligiblyhad.com^$all +abyssplayer.com##+js(set, urls, []) +abyssplayer.com##+js(nowoif, , 1) +zokaj.com##+js(nowoif, , 1) +zokaj.com##+js(rmnt, script, popupShown) +zokaj.com###media-player +playhydrax.com##+js(rpnt, script, (isNoAds), (true)) +||affluentarmyequator.com^$popup,doc +||boobausauhipsa.net^$popup,doc +||usheebainaut.com^ +! !SECTION: Hydrax +! SECTION: TurboVIPlay +! fix emturbovid.com player (e.g. supjav.com) +emturbovid.com,findjav.com,javggvideo.xyz,mmtv01.xyz,stbturbo.xyz,trailerhg.xyz,turbocloud.xyz,turboplayers.xyz,turbovid.vip,turbovidhls.com###pop +emturbovid.com,findjav.com,javggvideo.xyz,mmtv01.xyz,stbturbo.xyz,trailerhg.xyz,turbocloud.xyz,turboplayers.xyz,turbovid.vip,turbovidhls.com###pop1 +emturbovid.com,findjav.com,javggvideo.xyz,mmtv01.xyz,stbturbo.xyz,trailerhg.xyz,turbocloud.xyz,turboplayers.xyz,turbovid.vip,turbovidhls.com###pop2 +emturbovid.com,turbocloud.xyz,turbovid.xyz##.div_pop +!emturbovid.com,findjav.com,javggvideo.xyz,mmtv01.xyz,stbturbo.xyz,trailerhg.xyz,turboplayers.xyz,turbovid.vip,turbovidhls.com##+js(aeld, click, pop) +emturbovid.com,findjav.com,javggvideo.xyz,mmtv01.xyz,stbturbo.xyz,trailerhg.xyz,turbocloud.xyz,turboplayers.xyz,turbovid.vip,turbovidhls.com##+js(trusted-set, premium, "'1'") +emturbovid.com,findjav.com,javggvideo.xyz,mmtv01.xyz,stbturbo.xyz,trailerhg.xyz,turbocloud.xyz,turboplayers.xyz,turbovid.vip,turbovidhls.com##+js(nowoif) +emturbovid.com,findjav.com,javggvideo.xyz,mmtv01.xyz,stbturbo.xyz,trailerhg.xyz,turbocloud.xyz,turboplayers.xyz,turbovid.vip,turbovidhls.com##+js(nostif, window.open) +emturbovid.com,findjav.com,javggvideo.xyz,mmtv01.xyz,stbturbo.xyz,trailerhg.xyz,turbocloud.xyz,turboplayers.xyz,turbovid.vip,turbovidhls.com##+js(trusted-rpnt, script, /openNewTab\(".*?"\)/g, null) +!#if cap_html_filtering +||emturbovid.com^$replace=/openNewTab\(".*?"\)/null/g +||mmtv01.xyz^$replace=/openNewTab\(".*?"\)/null/g +||stbturbo.xyz^$replace=/openNewTab\(".*?"\)/null/g +||javggvideo.xyz^$replace=/openNewTab\(".*?"\)/null/g +||trailerhg.xyz^$replace=/openNewTab\(".*?"\)/null/g +||turboplayers.xyz^$replace=/openNewTab\(".*?"\)/null/g +||turbovidhls.com^$replace=/openNewTab\(".*?"\)/null/g +||emturbovid.com^$csp=sandbox allow-forms allow-same-origin allow-scripts allow-modals allow-orientation-lock allow-pointer-lock allow-presentation allow-top-navigation +||turbovid.xyz^$csp=sandbox allow-forms allow-same-origin allow-scripts allow-modals allow-orientation-lock allow-pointer-lock allow-presentation allow-top-navigation +!#endif +! ##.jw-wrapper > div[style="opacity: 0; visibility: hidden; overflow: hidden; display: block; position: absolute; top: 0px; left: 0px; width: 100%; height: 100%;"] +!#if env_mobile +emturbovid.com,hihihehe01.xyz#@#.jw-wrapper > div[style="opacity: 0; visibility: hidden; overflow: hidden; display: block; position: absolute; top: 0px; left: 0px; width: 100%; height: 100%;"] +!#endif +turtleviplay.xyz##+js(set, playID, 1) +turtleviplay.xyz##+js(aost, document.createElement, openNewTab) +turtleviplay.xyz##+js(nowoif) +! !SECTION: TurboVIPlay +! SECTION: BigWarp +bigwarp.*##+js(nowoif) +bigwarp.*##+js(acs, document.createElement, overlay) +||bigwarp.io/images/close.png$image +bigwarp.*###blk1 +*$script,3p,denyallow=bigwarp.io|bootstrapcdn.com|fontawesome.com|gstatic.com|jsdelivr.net,domain=bigwarp.cc +! !SECTION: BigWarp +! SECTION: Mixdrop +yomovies.*##+js(aopr, decodeURI) +mixdrp.*##+js(aeld, load, download-wrapper) +mixdrop.*##+js(set, MDCore.adblock, 0) +mixdrop.*,mixdrp.*##+js(acs, $, String.fromCharCode) +mdbekjwqa.pw##+js(noeval-if, setInterval) +mdbekjwqa.pw##+js(acs, document.createElement, onerror) +m1xdrop.*,m1xdrop.com,m1xdrop.net,md3b0j6hj.com,mdfx9dc8n.net,mdzsmutpcvykb.net,miixdrop.*,miiixdrop.*,miiiixdrop.net,miiiiixdrop.net,mixdrop21.net,mixdrop23.net,mixdropjmk.pw##+js(rmnt, script, /h=decodeURIComponent|popundersPerIP|dtnoppu|adserverDomain/) +m1xdrop.*,m1xdrop.com,m1xdrop.net,md3b0j6hj.com,mdbekjwqa.pw,mdfx9dc8n.net,mdzsmutpcvykb.net,miixdrop.*,miiixdrop.*,miiiixdrop.net,miiiiixdrop.net,mixdroop.*,mixdrop.*,mixdrop21.net,mixdrop23.net,mixdropjmk.pw,mixdrp.*##+js(nowoif) +md3b0j6hj.com##+js(nano-stb, Please wait, *, 0.001) +||mixdrop.*/sw.js$script,1p +m1xdrop.*,m1xdrop.com,m1xdrop.net,md3b0j6hj.com,mdbekjwqa.pw,mdfx9dc8n.net,miixdrop.*,miiixdrop.*,miiiixdrop.net,miiiiixdrop.net,mixdrop23.net,mixdroop.*,mixdrop.*,mixdrop21.net,mixdrop23.net,mixdropjmk.pw,mixdrp.*##body > div[style^="position: absolute;"][style*="z-index"] +*$script,3p,denyallow=google.com|gstatic.com|hwcdn.net|jquery.com,domain=m1xdrop.com|m1xdrop.net|mixdrop23.net|mixdrop.*|mixdrp.*|~mixdrop.one|mixdroop.*|m1xdrop.bz +miixdrop.net,miiixdrop.net,miiiixdrop.net,miiiiixdrop.net##+js(acs, addEventListener, adserverDomain) +###videojs ~ div[style="position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; z-index: 2147483646;"] +milfnut.com>>,watch-movies.com.pk>>,~addtoany.com,~cloudflare.com,~google.com,~ok.ru##+js(rmnt, script, /h=decodeURIComponent|popundersPerIP|dtnoppu|adserverDomain/) +milfnut.com>>,watch-movies.com.pk>>,~addtoany.com,~cloudflare.com,~google.com,~ok.ru##+js(nowoif) +||brightadnetwork.com^ +! !SECTION: Mixdrop +! SECTION: Streamtape +!#if cap_html_filtering +adblockeronstape.*,adblockplustape.*,adblockstreamtape.*,adblockstrtape.*,adblockstrtech.*,adblocktape.*,advertape.net,advertisertape.com,antiadtape.*,gettapeads.com,noblocktape.*,stapadblockuser.*,stape.*,strcloud.*,streamadblocker.*,streamadblockplus.*,streamnoads.com,streamta.*,streamtape.*,streamtapeadblockuser.*,strtape.*,strtapeadblock.*,strtapeadblocker.*,strtpe.*,tapeadsenjoyer.com,tapeadvertisement.com,tapeantiads.com,tapeblocker.com,tapelovesads.org,tapenoads.com,tapepops.com,tapewithadblock.org,tpead.net,watchadsontape.com##^script:has-text(/WebAssembly|forceunder/) +!#else +adblockeronstape.*,adblockplustape.*,adblockstreamtape.*,adblockstrtape.*,adblockstrtech.*,adblocktape.*,advertape.net,advertisertape.com,antiadtape.*,gettapeads.com,noblocktape.*,stapadblockuser.*,stape.*,strcloud.*,streamadblocker.*,streamadblockplus.*,streamnoads.com,streamta.*,streamtape.*,streamtapeadblockuser.*,strtape.*,strtapeadblock.*,strtapeadblocker.*,strtpe.*,tapeadsenjoyer.com,tapeadvertisement.com,tapeantiads.com,tapeblocker.com,tapelovesads.org,tapenoads.com,tapepops.com,tapewithadblock.org,tpead.net,watchadsontape.com##+js(rmnt, script, /WebAssembly|forceunder/) +!#endif +adblockeronstape.*,adblockplustape.*,adblockstreamtape.*,adblockstrtape.*,adblockstrtech.*,adblocktape.*,advertape.net,advertisertape.com,antiadtape.*,gettapeads.com,noblocktape.*,stapadblockuser.*,stape.*,strcloud.*,streamadblocker.*,streamadblockplus.*,streamnoads.com,streamta.*,streamtape.*,streamtapeadblockuser.*,strtape.*,strtapeadblock.*,strtapeadblocker.*,strtpe.*,tapeadsenjoyer.com,tapeadvertisement.com,tapeantiads.com,tapeblocker.com,tapelovesads.org,tapenoads.com,tapepops.com,tapewithadblock.org,watchadsontape.com##+js(nosiif, adblock) +adblockeronstape.*,adblockplustape.*,adblockstreamtape.*,adblockstrtape.*,adblockstrtech.*,advertape.net,advertisertape.com,antiadtape.*,gettapeads.com,noblocktape.*,shavetape.*,stapadblockuser.*,stape.*,strcloud.*,streamadblocker.*,streamadblockplus.*,streamnoads.com,streamta.*,streamtape.*,streamtapeadblock.*,streamtapeadblockuser.*,strtape.*,strtapeadblock.*,strtapeadblocker.*,strtapewithadblock.*,strtpe.*,tapeadsenjoyer.com,tapeadvertisement.com,tapeantiads.com,tapeblocker.com,tapelovesads.org,tapenoads.com,tapepops.com,tapewithadblock.org,watchadsontape.com##+js(nowoif) +adblockeronstape.*,adblockplustape.*,adblockstreamtape.*,adblockstrtape.*,adblockstrtech.*,advertape.net,advertisertape.com,antiadtape.*,gettapeads.com,noblocktape.*,shavetape.*,stapadblockuser.*,stape.*,strcloud.*,streamadblocker.*,streamadblockplus.*,streamnoads.com,streamta.*,streamtape.*,streamtapeadblock.*,streamtapeadblockuser.*,strtape.*,strtapeadblock.*,strtapeadblocker.*,strtapewithadblock.*,strtpe.*,tapeadsenjoyer.com,tapeadvertisement.com,tapeantiads.com,tapeblocker.com,tapelovesads.org,tapenoads.com,tapepops.com,tapewithadblock.org,watchadsontape.com##+js(aopr, Adcash) +strcloud.*,streamtape.*,streamta.*,strtape.*,strtapeadblock.*##+js(ra, target, #downloadvideo) +adblockeronstape.*,adblockplustape.*,adblocktape.*,advertape.net,advertisertape.com,antiadtape.*,gettapeads.com,noblocktape.*,shavetape.*,stapadblockuser.*,strcloud.*,streamadblockplus.*,streamnoads.com,streamta.*,streamtape.*,streamtapeadblockuser.*,strtape.*,strtapeadblock.*,tapeadsenjoyer.com,tapeadvertisement.com,tapeantiads.com,tapeblocker.com,tapelovesads.org,tapenoads.com,tapepops.com,tapewithadblock.org,watchadsontape.com##+js(nano-stb, counter) +adblockstreamtape.*,adblockstrtape.*,adblockstrtech.*,antiadtape.*,stape.*,strcloud.*,streamtape.*,streamta.*,strtape.*,strtpe.*,strtapeadblock.*#@#.google-ad +adblockstreamtape.*,adblockstrtape.*,adblockstrtech.*,antiadtape.*,shavetape.*,stape.*,strcloud.*,streamtape.*,streamta.*,strtape.*,strtpe.*,strtapeadblock.*##[class*="bn-container"], div[style*="z-index: 300000;"] +@@*$ghide,domain=adblockstreamtape.*|adblockstrtape.*|adblockstrtech.*|antiadtape.*|shavetape.cash|stape.*|strcloud.*|streamta.*|streamtape.*|streamtapeadblock.*|strtape.*|strtpe.* +strcloud.*,streamtape.*,streamta.*,strtape.*,strtpe.*,strtapeadblock.*##iframe[src^="data:"] +/sw.js$script,1p,domain=strcloud.*|streamtape.*|streamta.*|strtape.*|strtpe.*|strtapeadblock.* +streamadblocker.*##+js(acs, setTimeout, admc) +streamnoads.com##+js(rmnt, script, FingerprintJS) +||dzhzp0zlnyoe8.cloudfront.net^ +advertisertape.com,tapeadsenjoyer.com,tapeadvertisement.com,tapeantiads.com,tapelovesads.org,tapenoads.com,watchadsontape.com#@#.skyscraper.ad +*$script,3p,denyallow=google.com|gstatic.com,domain=advertape.net|streamtape.*|tpead.net|watchadsontape.com +*$object,3p,domain=advertape.net|streamtape.com|streamtape.to|tapepops.com|tpead.net|watchadsontape.com +! downloads blocked +*$popup,3p,from=tapepops.com,badfilter +streamtape.*,watchadsontape.com##+js(aopr, Adcash) +||pndax.love^ +! !SECTION: Streamtape +! SECTION: fakeplayer +hdmozi.hu,yabaisub.cloud###fakeplayer +hdmozi.hu,yabaisub.cloud##+js(trusted-click-element, #player-option-1, , 500) +! !SECTION: fakeplayer +! SECTION: playerAds / RPMShare +favoyeurtube.net>>,primewire.*>>,tokuzilla.net>>,tokuzl.net>>,tukoz.com>>,~cloudflare.com##+js(json-prune, ads playerAds) +favoyeurtube.net>>,primewire.*>>,tokuzilla.net>>,tokuzl.net>>,tukoz.com>>,~cloudflare.com##+js(trusted-json-edit, ..allowAdblock=true) +embedseek.xyz,nuovo.vidplayer.live,p2pplay.pro,primevid.click,streamcasthub.store,strp2p.site##+js(json-prune, ads playerAds) +||imasdk.googleapis.com/js/sdkloader/ima3.js$redirect=noopjs,domain=favoyeurtube.net|tokuzilla.net|tokuzl.net|tukoz.com|embedseek.xyz|nuovo.vidplayer.live|p2pplay.pro|primevid.click|streamcasthub.store|strp2p.site +||imasdk.googleapis.com/js/sdkloader/ima3.js$redirect=noopjs,domain=anichin.rpmvid.com|disneycdn.net|rpmhub.site|rpmlive.online|rpmplay.me|rpmplay.xyz|rpmstream.live|rpmvip.com|vidplayer.live +||imasdk.googleapis.com/js/sdkloader/ima3.js$redirect=noopjs,domain=strp2p.com,important +rpmplay.xyz##+js(aopr, open) +! nsfw pandamovies .org /watchporn4k. com +easyvidplayer.com,embedseek.online,player4me.online##+js(aeld, click, popunder) +easyvidplayer.com,embedseek.online,player4me.online##+js(aost, document.createElement, displayLayer) +easyvidplayer.com##+js(aeld, click, adId) +easyvidplayer.com,rpmplay.online,pandamovies.org,watchporn4k.com##+js(nowoif) +pandamovies.org,watchporn4k.com###video-overlay +watchporn4k.com##.happy-player-beside +*$script,3p,domain=easyvidplayer.com|embedseek.online|player4me.online +||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=google-ima.js,domain=easyvidplayer.com|embedseek.online|player4me.online|rpmplay.online +||magazineschnappstrusting.com^ +||nibaz.com^ +||tookfree.com^ +! !SECTION: playerAds / RPMShare +! SECTION: .protection / detectAdblock +3minx.com,555fap.com,ai18.pics,anime-jav.com,blackwidof.org,chinese-pics.com,cn-av.com,cnpics.org,cnxx.me,cosplay-xxx.com,cosplay18.pics,fc2ppv.stream,fikfok.net,gofile.download,hentai-sub.com,hentai4f.com,hentaicovid.com,hentaixnx.com,idol69.net,javball.com,javbee.*,javring.com,javsunday.com,javtele.net,kin8-av.com,kin8-jav.com,kr-av.com,ovabee.com,pig69.com,porn-pig.com,porn4f.org,sweetie-fox.com,xcamcovid.com,xxpics.org##+js(rmnt, script, /detectAdblock|WebAssembly|pop1stp|popMagic/i) +!#if cap_html_filtering +101kks.com,hispajav.com,bebasbokep.online,bellezashot.com,besthdgayporn.com,bighentai.org,bokepindo13.*,bokepindoh.*,brokensilenze.net,dimensionalseduction.com,drivenime.com,erothots1.com,familypornhd.com,hentaitv.fun,javbobo.com,javup.org,kaliscan.*,likemanga.ink,madouqu.com,pitube.net,premiumporn.org,savefiles.com,shemaleup.net,transflix.net,veo-hentai.com,worthcrete.com,x-x-x.video##^script:has-text(/popMagic|pop1stp/) +!#else +101kks.com,hispajav.com,bebasbokep.online,bellezashot.com,besthdgayporn.com,bighentai.org,bokepindo13.*,bokepindoh.*,brokensilenze.net,dimensionalseduction.com,drivenime.com,erothots1.com,familypornhd.com,hentaitv.fun,javbobo.com,javup.org,kaliscan.*,likemanga.ink,madouqu.com,pitube.net,premiumporn.org,savefiles.com,shemaleup.net,transflix.net,veo-hentai.com,worthcrete.com,x-x-x.video##+js(rmnt, script, /popMagic|pop1stp/) +!#endif +fucksporn.com###FloatingLayer +fucksporn.com##.adv_banners +fucksporn.com##.prefix-player-out +drivenime.com###stickyb +socigames.com##.socig-target +xhamster.fm##+js(acs, pop_init) +gayxx.net##+js(aopr, adsbyjuicy) +||superficial-disaster.com^ +||flixbaba.net/utilsminhill.js +! !SECTION: .protection / detectAdblock +! SECTION: np.detect +explorecams.com,minecraft.buzz,rarepike.com##+js(aeld, np.detect) +! !SECTION: np.detect +! SECTION: Temporal +*,~edu,~edu.cn,~127.0.0.1,~adobe.com,~addtoany.com,~amazon.*,~antiphishing.biz,~apple.com,~archlinux.org,~azure.com,~bsky.app,~bing.com,~bitwarden.com,~canva.com,~captcha-delivery.com,~cbox.ws,~chatango.com,~chatgpt.com,~chess.com,~chrome.com,~claude.ai,~claude.com,~cloudflare.com,~codeberg.org,~consentmanager.net,~costco.com,~dailymotion.com,~disqus.com,~duck.ai,~ebay.*,~facebook.com,~fbsbx.com,~flickr.com,~gitea.com,~github.com,~gitlab.com,~google.com,~hcaptcha.com,~huggingface.co,~instagram.com,~kagi.com,~kimi.com,~lichess.org,~linkedin.com,~live.com,~localhost,~mega.nz,~microsoft.com,~mistral.ai,~mozilla.org,~netflix.com,~ok.ru,~openrouter.ai,~piano.io,~pinterest.com,~powershell.org,~privacy-mgmt.com,~proton.me,~px-cloud.net,~rakuten.co.jp,~rakuten.com,~recaptcha.net,~reddit.com,~spotify.com,~stripe.com,~stripecdn.com,~tiktok.com,~tinypass.com,~trustpilot.com,~tumblr.com,~twitch.tv,~twitchcdn.net,~twitter.com,~virustotal.com,~vscode.dev,~vscode-cdn.net,~whatsapp.com,~wikipedia.org,~x.com,~yahoo.com,~yandex.*,~yandexcloud.net,~youtube.com,~youtube-nocookie.com,~www.digitalocean.com##+js(prevent-clipboard-write, /^ms(hta|iexec)(\.exe)? |^(bash <<<|curl -kfsSL) \$\(echo .+? base64 -d\b|^cmd \/c .*?\bcurl .+?(\.exe|\.bat)\b|^cmd .*?\bfor \/f .*?\bdelims .*?\bpow |(^|\\)powershell(\.exe)? .*?-w(indowStyle)? h(idden)?\b|(^|\\)powershell(\.exe)? .*?-w[a-z]* m[a-z]* |(^|\\)powershell(\.exe)? .*?-NoP\b|(^|\\)powershell(\.exe)? .*?-e(xecution)?p(olicy)? b(ypass)?\b|(^|\\)powershell(\.exe)? .*?-e(xecution)?p(olicy)? u(nrestricted)?\b|(^|\\)powershell(\.exe)? .*?\biex\(|(^|\\)powershell(\.exe)? .*?Invoke-Expression|(^|\\)powershell.+?Invoke-WebRequest|(^|\\)powershell.+?-UseBasicParsing|^cmd .*?\/c .+? -nop .+? iex\b|^(cmd|powershell)\b.+?recaptcha|^(cmd|powershell)\b.+?#(Verification| )|^(cmd|powershell)\b.+? #|^osascript .+?\bcurl http|^curl -s\b.+?\| (bash|sh|zsh)\b|^\/bin\/(bash|sh|zsh) -c\b.+?\bcurl|^bash -c\b.+?\$\(curl|^python3? -c\b.+?\b(exec|urllib|subprocess)\b|^echo .+?base64 .+?\b(bash|osascript|z?sh)\b|openssl base64 -d|^curl\b .+?chmod \+x.+?&&|^(bash|sh|osascript)\b.+?recaptcha|^(bash|sh|osascript)\b.+?#(Verification| )|^(bash|sh|osascript)\b.+? #|^wget .+?\| (bash|sh)\b|^curl\b.+?-o\b.+?\/tmp\/.+?&&|^nc .+?-e \/bin\/(bash|sh)\b|^\/tmp\/.+?chmod \+x.+?&&|^wget -q.+?\.(sh|py|bin|elf)\b|^cmd .+?\bcertutil .+?\b(\.exe|\.bat)\b|(^|\\)powershell(\.exe)? .+?\birm .+?\.[a-z]+\/.+?powershell|\bpcalua(\.exe)? .*?\b(curl|powershell|saps|cmd)\b|^cmd .+?\bcmdkey .+?\bschtasks|^Invoke-Command .+?Base64String|^c(onhost|md) .*?--headless |^iex\(i(rm|wr) |^\(?irm .+?\biex\b|^%COMSPEC% .*?\bstart .*?\/min\b|^cmd .*?\/c .*?%TEMP%.*?\.bat\b|\bconvert\b.*?\$env:ComSpec\b|^<#Verification/msi, domAlert, 'Beware, uBlock Origin blocked a potential ClickFix attack: ${text}', excludeMatches, /Maintainer|Contributor|^\{|^http|^(git|import|require|use) /i) +brew.sh,christitus.com,community-scripts.org,datadoghq.*,devaccellabs.com,massgrave.dev,natfrp.com#@#+js(prevent-clipboard-write, /^ms(hta|iexec)(\.exe)? |^(bash <<<|curl -kfsSL) \$\(echo .+? base64 -d\b|^cmd \/c .*?\bcurl .+?(\.exe|\.bat)\b|^cmd .*?\bfor \/f .*?\bdelims .*?\bpow |(^|\\)powershell(\.exe)? .*?-w(indowStyle)? h(idden)?\b|(^|\\)powershell(\.exe)? .*?-w[a-z]* m[a-z]* |(^|\\)powershell(\.exe)? .*?-NoP\b|(^|\\)powershell(\.exe)? .*?-e(xecution)?p(olicy)? b(ypass)?\b|(^|\\)powershell(\.exe)? .*?-e(xecution)?p(olicy)? u(nrestricted)?\b|(^|\\)powershell(\.exe)? .*?\biex\(|(^|\\)powershell(\.exe)? .*?Invoke-Expression|(^|\\)powershell.+?Invoke-WebRequest|(^|\\)powershell.+?-UseBasicParsing|^cmd .*?\/c .+? -nop .+? iex\b|^(cmd|powershell)\b.+?recaptcha|^(cmd|powershell)\b.+?#(Verification| )|^(cmd|powershell)\b.+? #|^osascript .+?\bcurl http|^curl -s\b.+?\| (bash|sh|zsh)\b|^\/bin\/(bash|sh|zsh) -c\b.+?\bcurl|^bash -c\b.+?\$\(curl|^python3? -c\b.+?\b(exec|urllib|subprocess)\b|^echo .+?base64 .+?\b(bash|osascript|z?sh)\b|openssl base64 -d|^curl\b .+?chmod \+x.+?&&|^(bash|sh|osascript)\b.+?recaptcha|^(bash|sh|osascript)\b.+?#(Verification| )|^(bash|sh|osascript)\b.+? #|^wget .+?\| (bash|sh)\b|^curl\b.+?-o\b.+?\/tmp\/.+?&&|^nc .+?-e \/bin\/(bash|sh)\b|^\/tmp\/.+?chmod \+x.+?&&|^wget -q.+?\.(sh|py|bin|elf)\b|^cmd .+?\bcertutil .+?\b(\.exe|\.bat)\b|(^|\\)powershell(\.exe)? .+?\birm .+?\.[a-z]+\/.+?powershell|\bpcalua(\.exe)? .*?\b(curl|powershell|saps|cmd)\b|^cmd .+?\bcmdkey .+?\bschtasks|^Invoke-Command .+?Base64String|^c(onhost|md) .*?--headless |^iex\(i(rm|wr) |^\(?irm .+?\biex\b|^%COMSPEC% .*?\bstart .*?\/min\b|^cmd .*?\/c .*?%TEMP%.*?\.bat\b|\bconvert\b.*?\$env:ComSpec\b|^<#Verification/msi, domAlert, 'Beware, uBlock Origin blocked a potential ClickFix attack: ${text}', excludeMatches, /Maintainer|Contributor|^\{|^http|^(git|import|require|use) /i) +! Specific cases +sites.google.com##+js(prevent-clipboard-write, /^ms(hta|iexec)(\.exe)? |^(bash <<<|curl -kfsSL) \$\(echo .+? base64 -d\b|^cmd \/c .*?\bcurl .+?(\.exe|\.bat)\b|^cmd .*?\bfor \/f .*?\bdelims .*?\bpow |(^|\\)powershell(\.exe)? .*?-w(indowStyle)? h(idden)?\b|(^|\\)powershell(\.exe)? .*?-w[a-z]* m[a-z]* |(^|\\)powershell(\.exe)? .*?-NoP\b|(^|\\)powershell(\.exe)? .*?-e(xecution)?p(olicy)? b(ypass)?\b|(^|\\)powershell(\.exe)? .*?-e(xecution)?p(olicy)? u(nrestricted)?\b|(^|\\)powershell(\.exe)? .*?\biex\(|(^|\\)powershell(\.exe)? .*?Invoke-Expression|(^|\\)powershell.+?Invoke-WebRequest|(^|\\)powershell.+?-UseBasicParsing|^cmd .*?\/c .+? -nop .+? iex\b|^(cmd|powershell)\b.+?recaptcha|^(cmd|powershell)\b.+?#(Verification| )|^(cmd|powershell)\b.+? #|^osascript .+?\bcurl http|^curl -s\b.+?\| (bash|sh|zsh)\b|^\/bin\/(bash|sh|zsh) -c\b.+?\bcurl|^bash -c\b.+?\$\(curl|^python3? -c\b.+?\b(exec|urllib|subprocess)\b|^echo .+?base64 .+?\b(bash|osascript|z?sh)\b|openssl base64 -d|^curl\b .+?chmod \+x.+?&&|^(bash|sh|osascript)\b.+?recaptcha|^(bash|sh|osascript)\b.+?#(Verification| )|^(bash|sh|osascript)\b.+? #|^wget .+?\| (bash|sh)\b|^curl\b.+?-o\b.+?\/tmp\/.+?&&|^nc .+?-e \/bin\/(bash|sh)\b|^\/tmp\/.+?chmod \+x.+?&&|^wget -q.+?\.(sh|py|bin|elf)\b|^cmd .+?\bcertutil .+?\b(\.exe|\.bat)\b|(^|\\)powershell(\.exe)? .+?\birm .+?\.[a-z]+\/.+?powershell|\bpcalua(\.exe)? .*?\b(curl|powershell|saps|cmd)\b|^cmd .+?\bcmdkey .+?\bschtasks|^Invoke-Command .+?Base64String|^c(onhost|md) .*?--headless |^iex\(i(rm|wr) |^\(?irm .+?\biex\b|^%COMSPEC% .*?\bstart .*?\/min\b|^cmd .*?\/c .*?%TEMP%.*?\.bat\b|\bconvert\b.*?\$env:ComSpec\b|^<#Verification/msi, domAlert, 'Beware. uBlock Origin blocked a potential ClickFix attack: ${text}', excludeMatches, /Maintainer|Contributor|^\{|^http|^(git|import|require|use) /i) +! !SECTION: Temporal +! SECTION: Placeholder by EasyPrivacy +! rcm.shinobi.jp and cnobi.jp +##.ninja-recommend-block +blogterest.net##.blockSide > div.blockWrapper:has(> div > div.ninja-recommend-block) +doorblog.jp,pachinkopachisro.com,blog.livedoor.jp,blog.jp,vipstyle.tokyo##.plugin-memo:has(> div.side > div.ninja-recommend-block) +adseek.site###primary:style(display: block !important;) +minnyuu.jp##div[class$="BlockBase"]:has(> div > div > div.plugin-freearea > div.ninja-recommend-block) +norisoku.com###random +samuraisoccer.doorblog.jp##.plugin-l-t:last-child +dvdrev.com##.side_menu:has(> div > div.plugin-freearea > div.ninja-recommend-block) +xn--r8jwklh769h2mc880dk1o431a.com##.underbox +tousatu-ch.net##.widget_custom_html:has(> div.textwidget > div[style^="width: 100%;"] > div.ninja-recommend-block) +geinoukame.com##.ninja-recommend-block + br +geinoukame.com##.ninja-recommend-block + hr +na2ka4.blog.fc2.com###inner2 > div.section2:has(> div.ninja-recommend-block) +! Cxense/Piano +jiji.com##.RecommendPianoWrapper +jiji.com##.RecommendUnderlayer +rbbtoday.com##.cx-top-news +president.jp##.recommend +kobe-np.co.jp##section.sec:has(> #piano_recs_inline_title) +vivi.tv##.section__inner:has(> #recommended-posts-result) +augsburger-allgemeine.de##div[id^="cx_"] +hochi.news###ohtani-pickup +businessinsider.jp##div[class^="article_specialFeature_"] +businessinsider.jp##div[class^="displayhandler"]:has(> div[class^="premiumRecommend"]) +sankei.com##div[id^="piano_special_Top_"] +diamond.jp###contents > div.sub-column > div.title:has(+ #cx-recommed) +diamond.jp###cx-recommed +baseballpost.jp###highschool-pickup +s.response.jp##.aside-box-relation-arti +nikkei.com###pianoRecommendBottom +entapark.jp##div[id$="-pickup"][style^="height"] +itmedia.co.jp##.is-recommend:empty +itmedia.co.jp##.format--subheading:has(+ .is-recommend:empty) +lifehacker.jp###mainContent > div[class^="articles_pArticles_Title_"]:has(+ div[class^="displayhandler_"] > div > div[id^="cxMore"]) +harpersbazaar.com##div[aria-labelledby="recirc-heading"] +! ziyu.net +jin115.com,livedoor.biz#?#.plugin-memo:has(> div.side > script[src*="ziyu.net/"]) +okutta.net##.article__footer > div[style="height:500px; overflow-y:scroll;"] +! Taboola +cartune.me##.contents-inner > div:has(> div#taboola-alternating-thumbnails-a) +gendai.media##.elementSectionHeadingsWithSuffix:has(+ div[id^="taboola-below-article-thumbnails-gendai_biz-desktop"]) +infoseek.co.jp##.co-Widget[style="min-height: 6000px;"]:style(min-height: auto !important;) +anime-drama.jp###block-11 +crank-in.net##.wrap_general:has(> #taboola-below-article-thumbnails-mg) +crank-in.net##article > section.block-area:has(> div#taboola-below-article-thumbnails-mg) +jbpress.ismedia.jp##div.--wid:has(> div#taboola-below-article-thumbnails-bottom) +mdpr.jp##.p-articleList__heading:has(+ div#taboola-below-article-thumbnails-desktop) +full-count.jp##.s-entry > section > div.c-heading:has(> div#taboola-below-article-thumbnails-desktop) +newsweekjapan.jp##.taboola-below-article-thumbnails-desktop-2-wrap +pashplus.jp##.content_right > div > span[style^="display: block; font-size: 30px"]:has(+ div#taboola-below-article-thumbnails) +bunshun.jp##.recommend-articles:has(> div[class^="taboola"]) +! Rtoaster +nifty.com##div[class^="Setsuzoku_ourServicesDList"] > dl > dt:first-child +nifty.com##dd[class^="Setsuzoku_servicePromo"] +! Taxel +wanchan.jp##.recommend_header +wanchan.jp##.recommend_header + div[style^="aspect-ratio:"] +! other +blog.jp#?#.plugin-memo:has(> div.side > div > div[id^="blz_rss"]) +nukigazo.com###text-2 +comichara.com,movient.net###text-6 +okazuch.site###custom_html-30 +tousatu-club.com###text-9 +erostopics.net###custom_html-81 +erostopics.net###custom_html-137 +erostopics.net###related-box +idle-girl.com###custom_html-74 +excite.co.jp###exCollaboration +lmaga.jp##.recommend +! Outbrain +nekochan.jp###main > aside:has(> div.OUTBRAIN) +! k5a.io +tv2.no##.article-recommended +! !SECTION: Placeholder by EasyPrivacy +! SECTION: Non-English sites +! NOTE: Arabian +liveonlinesports.net##+js(acs, document.createElement, dataset.zone) +/\.liveonlinesports\.net/[a-z0-9]{35}\.js$/$script,1p +!#if env_safari +/\.liveonlinesports\.net/[a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]\.js$/$script +!#endif +! NOTE: Armenian +||auto.am/static/azd/ +auto.am##.azd-top +auto.am##.bncont +auto.am##.toggle-adv-search +||mediasystems.am^$3p +hraparak.am##.big_advert +! NOTE: Bulgarian +||advertere.zamunda.net^ +@@||seirsanduk.*?loader.js^$script,domain=seirsanduk.* +@@||ads.poshtata.online/*.js|$script,domain=seirsanduk.*|seir-sanduk.com|seirsanduk.com|seirsanduk.net|seirsanduk.online +@@||ads.poshtata.online/*.js?$script,domain=seirsanduk.*|seir-sanduk.com|seirsanduk.com|seirsanduk.net|seirsanduk.online +@@||kupuvamsamo.online/script/aclib.js$script,domain=seirsanduk.online +! MV3 wildcard issue +!#if ext_ubol +@@||seirsanduk.*?loader.js^$script,domain=seirsanduk.com|seirsanduk.online +!#endif +seirsanduk.net##p:has-text(???????) +@@||glebul.com^$script,1p +glebul.com##p:has-text(???????) +/^https:\/\/filmizip\.com\/templates\/filmizip\/js\/[a-z0-9]{16}\.js\?v=/$script,1p,match-case,domain=filmizip.com +/^https:\/\/filmizip\.com\/templates\/filmizip\/js\/[a-z0-9]{12}\.min\.js\?v=/$script,1p,match-case,domain=filmizip.com +!#if env_safari +/^https:\/\/filmizip\.com\/templates\/filmizip\/js\/[a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]\.js\?v=/$script,1p,match-case,domain=filmizip.com +/^https:\/\/filmizip\.com\/templates\/filmizip\/js\/[a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]\.min\.js\?v=/$script,1p,match-case,domain=filmizip.com +!#endif +filmizip.com##+js(no-fetch-if, googlesyndication, length:40000-60000) +filmizip.com##+js(nowoif) +filmizip.com##+js(no-fetch-if, mode:no-cors) +||widgets.outbrain.com/outbrain.js$xhr,redirect=noopjs,domain=filmizip.com +filmizip.com##+js(no-fetch-if, outbrain) +filmizip.com##+js(rmnt, script, zIndex) +filmizip.com##.video-inside-overlay +||filmifen.com/templates/filmi/js/adb.js +filmifen.com##+js(aeld, DOMContentLoaded, adb) +filmifen.com##+js(aeld, contextmenu) +kinofen.cc###popup-wrapper +! NOTE: Chinese +@@||cdn.jsdmirror.com/gh/justlovemaki/imagehub@main/js/adview_pic_cpc_cpm_cpa_guanggao_gg_guge__ads_300x250.js +!#if !env_mobile +hk.yahoo.com###main-bottom:style(margin-top: 164px !important;) +!#endif +ofiii.com##+js(json-prune-fetch-response, prerolls midrolls postrolls comm_ad house_ad pause_ad block_ad end_ad exit_ad pin_ad content_pool vertical_ad elements, , propsToMatch, /detail) +ofiii.com##.nonlinear_ad +||adsv.svc.litv.tv^ +||hbs.svc.litv.tv^ +||cdi.ofiii.com/*/video/ad_urls +@@||imasdk.googleapis.com/js/sdkloader/ima3.js$domain=ofiii.com +iplark.com##+js(aeld, DOMContentLoaded, adClosedTimestamp) +bilibili.com#@#+js(json-prune-fetch-response, data.item.[-].business_info.ad_desc, '', /feed/rcmd) +bilibili.com##+js(json-prune-fetch-response, data.item.[-].business_info.ad_desc, , propsToMatch, /feed/rcmd) +||adblock.static-cloudflare.workers.dev^ +||d16sc05it918j8.cloudfront.net^ +||achang-tw.github.io^ +||affiliates.one^$3p +ai.hubtoday.app##+js(set, killads, true) +@@||ai.hubtoday.app/*.js|$script,1p +news.now.com##+js(set, NMAFMediaPlayerController.vastManager.vastShown, true) +shipin188.com##+js(rmnt, script, _cpv) +ofiii.com##+js(json-prune-fetch-response, prerolls midrolls postrolls comm_ad house_ad pause_ad block_ad end_ad exit_ad pin_ad content_pool vertical_ad elements, , propsToMatch, api/v1/detail) +@@||mnya.tw^$generichide +mnya.tw##.adsbygoogle +||gxbs.cc/dog.js +! NOTE: Czech +@@||titulky.com^$script,1p +titulky.com#@#+js(set-constant, xmxalr, '') +kiaclub.cz##+js(nostif, getComputedStyle) +kiaclub.cz##.div_make_links +kiaclub.cz#@#.adwords +zive.cz##article:has-text(Reklama) +zive.cz##[class^="ad-list"] +idnes.cz#@#+js(acis, HTMLIFrameElement.prototype.contentWindow) +@@/site=*/viewid=*/size=$script,domain=idnes.cz +idnes.cz##.abchead +idnes.cz##.s_widesquare:has(> div > #widesquare > a[rel="sponsored"]) +idnes.cz##div[id].pla-net > div > span:empty +idnes.cz##body::before:style(background: none !important;) +idnes.cz##html:style(cursor: auto !important;) +idnes.cz##+js(acs, document.onclick, reklama-flash-body) +||idnes.cz/_servix/media/video.aspx$script,uritransform=/reklama=1/reklama=0/ +||vod.idnes.cz/*krr.mp4$media +idnes.cz###main > table +expres.cz,idnes.cz,lidovky.cz##a[href^="https://servix.idnes.cz/data.aspx?"] +expres.cz,idnes.cz,lidovky.cz##div[id^="fix-block-"] +expres.cz,lidovky.cz##+js(rmnt, script, pingUrl) +expres.cz,lidovky.cz##+js(aeld, /click|mouse/, /scoreUrl|pingUrl/) +lidovky.cz###main > table +lidovky.cz###selfart-box +lidovky.cz##.s_nativ_advertorial +||1gr.cz/*/js/uni/paticka.js +||1gr.cz/*/reklama.svg +!#if cap_html_filtering +sbazar.cz##^script:has-text(ads) +!#else +sbazar.cz##+js(rmnt, script, ads) +!#endif +||seznam.cz/html/adform_sync.html$frame,domain=sbazar.cz +expres.cz###main > table[id][class*=" "]:has(td > div[class] > div[id] > script) +expres.cz##div[id][class*=" "]:has(> div[class]:not([id]) > span:empty) +svetserialu.io##+js(nowoif) +indian-tv.cz##+js(set, appPageData.appAds, {}) +indian-tv.cz##+js(set, appPageData.appAdsHandles, {}) +portalridice.cz##.bz-branding +||portalridice.cz/data/banner-creative/ +penize.cz##.ad +penize.cz###article_content > div.toolBox:has(a[data-ga-hittype="ad"]) +! NOTE: Dutch +alleveilingen.be,alleveilingen.nl##+js(acs, document.addEventListener, fakeAd) +||2mdn.net/instream/html5/ima3.js$redirect=google-ima.js,domain=puna.bbvms.com,important +nos.nl##+js(json-prune-fetch-response, adUrl, , propsToMatch, .azurewebsites.net) +@@||imasdk.googleapis.com/js/sdkloader/ima3_dai.js$domain=goplay.be|play.tv +@@||pubads.g.doubleclick.net/ondemand/$xhr,domain=goplay.be|play.tv +||imasdk.googleapis.com/js/sdkloader/ima3.js$redirect=noopjs,domain=goplay.be|play.tv +||pagead2.googlesyndication.com/omsdk/releases/live/omweb-v1.js$redirect=noopjs,domain=goplay.be|play.tv +||dai.google.com/ondemand/dash/content/*/time-events.json$domain=goplay.be|play.tv +||shared.mediahuis.be/ka-ching/goplay/ka-ching.umd.js +bnnvara.nl,npodoc.nl,vpro.nl##+js(json-prune-fetch-response, assets.preroll assets.prerollDebug, , propsToMatch, /stream-link) +telegraaf.nl##+js(no-fetch-if, /doubleclick|ad-delivery|googlesyndication/) +||securepubads.g.doubleclick.net/*gpt$script,domain=play.tv,important +||cdn.kaching.eu.com/latest/play/kaching.js$domain=play.tv +agf.nl##+js(nosiif, show) +luisterradio.fm##div.max-w-full:has(> .uppercase) +! NOTE: French +hentaivost.fr##+js(rmnt, script, _ADX_) +||hentaivost.fr/detect.js^ +||gupload.xyz/data/player/adblock-detector.js^ +||gupload.xyz/data/head/script.php^ +||lopfly.com^ +/vast/*.php?nocache= +zone-telechargement.*##a[href^="https://dl-protect.link/"] img +dl-protect.link##a[href^="https://planetwealthbuilders.net/trck/"] +||zone-telechargement.*/templates/zone/images/dl/telechargement-direct.png +||dl-protect.link/images2/afl*.png +||planetwealthbuilders.net^$all +||pmur.org/*_abChoice. +!#if env_firefox +qub.ca##.jss2 +!#endif +qub.ca##+js(set, __NEXT_DATA__.runtimeConfig._qub_sdk.qubConfig.video.adBlockerDetectorEnabled, false) +qub.ca##+js(set, __NEXT_DATA__.runtimeConfig._qub_sdk.qubConfig.ad.adBlockerDetectorEnabled, false) +tvasports.ca##[data-testid="ad-container"] +tvasports.ca##+js(trusted-json-edit, ..adBlockerDetectorEnabled=false) +||imasdk.googleapis.com/js/sdkloader/ima3.js$redirect=google-ima.js,domain=tv.free.fr +||cta-service-cms*.hubspot.com/web-interactives/public/v1/embed/combinedConfigs +||ariase.com/get-module?moduleType=BANDEAU_BAS +ariase.com##+js(rmnt, script, dataLayer) +ariase.com##.c-pub-header +@@||toutes-les-solutions.fr^$ghide +@@||toutes-les-solutions.fr/phpbb/images/*.jpg$image,1p +mym-db.com###swup > .row > div:has(> .card > div[data-ad-site]) +actu.orange.fr##.media-top-article-video:remove() +actu.orange.fr##+js(rc, d-none|media-filter-brightness|bg-dark, .media-main-image) +@@||gp.cdn.woopic.com/magic/o_tealium.js$script,domain=actu.orange.fr +noovo.info##.b-ads-custom +*$script,3p,domain=supervideo.cc,badfilter +*$script,3p,from=filecrypt.cc,badfilter +||vivasexe.com/pix/pub/ +||vivasexe.com/disclaimer.php?cid=/search.php +vivasexe.com###div_inline +vivasexe.com###filtre +vivasexe.com##div[class="row 0%"][style] > div[class]:has(> div[align] > a[target="_blank"]) +vivasexe.com###searchlisting > a[href][target="_blank"] +vivasexe.com###searchlisting > div#cadre_annonce[style]:not([onclick]) +vivasexe.com##.rdv-card-wrapper +vivasexe.com##.rdv-card-wrapper + div:has(> .owl-carousel) +vivasexe.com###skel-layers-wrapper > #main-wrapper:has-text(Annonces similaires :) +vivasexe.com##a.btnmoncompte[href="https://www.vivasexe.com/alerte/"] +vivasexe.com##+js(acs, history.replaceState, location.href) +! NOTE: Georgian +||forum.ge/trash/ads_ +||sab.fast.ge^$subdocument +forum.ge##.w3-hide-medium:has(img[src="/trash/ads_down.gif"]) +/video/pre/*.mp4$media,domain=myvideo.ge +myvideo.ge##+js(json-prune, data.[].relationships.advert data.[].relationships.vast) +amindi.info##.fb-popup +||img.mykadri.click/asvla2/ +||mykadri.tv/preroll/ +mykadri.tv##.avc-asvla +! NOTE: German +moz.de###bluum +@@||spiele.heise.de^$ghide +heise.de###topBannerContainer +heise.de##.keygameBannerContainer +heise.de##.ad-microsites +heise.de##.tipps-content-ad +heise.de##.hbs-ad +heise.de##.stage-advertising +heise.de##.ad +heise.de##section[data-layout="TeaserListLayout"] > section[data-component="TeaserList"] > div.relative:has(> div > article > a[data-google-interstitial]) +||testsieger.de/native-retail-media/pdp/brand-showcase/ +||testsieger.de/native-retail-media/pdp/brand-banner/ +testsieger.de##+js(json-prune, offers) +testsieger.de###sponsoredProductPdp +testsieger.de###sponsoredAdsHeader +20min.ch##section aside:has(> div > div > div[data-ad-unit-id]) +20min.ch##div[class^="ContentPage_contentPage"] > div[class]:not([class^=""]):has(> div > div > div[data-ad-unit-id]) +20min.ch##div[type="ad"] +! NOTE: Greek +korinthostv.gr##.sgpb-popup-overlay +korinthostv.gr##.sgpb-popup-dialog-main-div-wrapper +korinthostv.gr##.sgpb-overflow-hidden:style(overflow: auto !important;) +||jobfind.gr/clientfiles/Banner2025/ +jobfind.gr##div[id^="bannerzone"] +! NOTE: Hebrew +13tv.co.il##+js(no-fetch-if, /doubleclick|googlesyndication/) +13tv.co.il##+js(trusted-replace-xhr-response, /#EXT-X-DISCONTINUITY\n(?:#EXTINF:.*\,\n.+?adType=preroll[\s\S]+?)(?=#EXT-X-DISCONTINUITY)/gm, , /.*\.m3u8/) +! NOTE: Indonesian +komikdewasa.art##+js(nowoif) +komikdewasa.art##+js(aeld, click, tampilkanUrl) +komikdewasa.art##+js(rmnt, script, location.href) +otakudesu.*##.box_item_ads_popup +.gif$image,domain=otakudesu.*|otakudesu.best|otakudesu.org +otakudesu.*##+js(nowoif) +||ads.desustream.com^ +! cast server blocked at https://tv3.nontondrama.my/can-this-love-be-translated-season-1-episode-1-2026 +playeriframe.sbs##body > a[href][target="_blank"][rel*="noopener"] +cloud.hownetwork.xyz###overlay +podjav.tv##.sidebar-box:has(> div[data-banner-id]) +podjav.tv##.player-banner-ads-top +kuyhaa.me###protected-content +kuyhaa.me##+js(acs, document.addEventListener, window.open) +||meong.club/go/?aHR0c*$doc,urlskip=/\/go\/\?(aHR0c.+)/ -base64 +||kuyhaa.me/pmbut.js +||kuyhaa.me/*.php +kazefuri.id##+js(rmnt, script, sessionStorage.getItem) +||donasi.showcdnx.com/seiklasnya.js +###vstr ~ #overlay +##body > a.visible[id][href][target="_blank"] +videonode.de###overlay +videonode.de##body > a[target="_blank"] +! NOTE: Italy +! ||detour.padovia.it^ +! NOTE: Japanese +!bus-location.1507t.xyz##+js(nostif, ()=>{, 2501-) +solispia.com##+js(trusted-rpnt, script, /document\.addEventListener\('DOMContentLoaded'\, function[\S\s]+?const novelId\s*=\s*(\d+);\s*const targetUrl\s*=.+?novel\\\/\d+";\s*const backToTitle[\S\s]+?SolispiaRewardedAdGate\.init\(\{\s*cancelUrl: backToTitle[\S\s]+/, !async function(){const e=$1\,t=`https://solispia.com/novel/${e}`\,o=document.querySelector('meta[name="csrf-token"]')?.getAttribute("content")||"";try{const a=await fetch(`/api/ad/rewarded/start/${e}`\,{method:"POST"\,headers:{"Content-Type":"application/json"\,"X-CSRF-TOKEN":o\,"X-Requested-With":"XMLHttpRequest"}\,body:JSON.stringify({})})\,i=await a.json();if(!i?.ok)return;await(n=5e3+Math.floor(1e3*Math.random())+500\,new Promise((e=>setTimeout(e\,n))));const d=await fetch("/api/ad/rewarded/complete"\,{method:"POST"\,headers:{"Content-Type":"application/json"\,"X-CSRF-TOKEN":o\,"X-Requested-With":"XMLHttpRequest"}\,body:JSON.stringify({challenge_id:i.challenge_id\,unlock_token:i.unlock_token\,event_key:i.event_key\,novel_id:e\,ad_meta:{}})})\,s=await d.json();s?.ok&&(window.location.href=t)}catch(e){}var n}();) +vk.sportsbull.jp##.hidden-by-ima:remove-class(hidden-by-ima) +! NOTE: Korean +map.naver.com##+js(json-edit-xhr-response, .layers.*[?.metadata.name=="POI_Ads"], propsToMatch, /PCWeb_Real.json) +pcmap.place.naver.com##+js(rpnt, script, document.write, window.__APOLLO_STATE__=JSON.parse(JSON.stringify(window.__APOLLO_STATE__));document.write) +pcmap.place.naver.com##+js(json-edit, .*[?.adId]) +aagag.com##+js(no-xhr-if, googlesyndication) +! NOTE: Netherlands +almelo1.nl##.almelo-ad +! NOTE: Persian +shahied4u.me##+js(rmnt, script, /googlesyndication|adblock|keydown|popundersPerIP/i) +! NOTE: Polish +@@||imasdk.googleapis.com/js/sdkloader/ima3.js$script,domain=player.pl +player.pl##+js(no-fetch-if, /gaid=, war:noop-vast2.xml) +@@||jelonka.com^$ghide +jelonka.com##.adsbygoogle +jelonka.com##.kontener-reklam +||jelonka.com/static/jelonka/js/news-ad-access-gate.js +jelonka.com##.ad-area +@@||static5.hsg.com.pl/icons/*/icon.png^$image +auto-swiat.pl##+js(nostif, consent) +lamoda.pl##body [class*="REKLAMA"] +onet.pl##ad-default +wrzesnia.info.pl##+js(no-fetch-if, ads) +@@||tyna.info.pl/pl/js/*.js|$script,1p +||tyna.info.pl/pl/js/new-system.js$important +tyna.info.pl##.billboard +tyna.info.pl##.baner +gostyn24.pl##+js(set, arePiratesOnBoard, false) +@@||gostyn24.pl/pl/js/trustmeimadolphin/*.js|$script,1p +||ogladajanime.pl/command_processor.php +wirtualnemedia.pl##+js(set, __INIT_CONFIG__.randvar, undefined) +wirtualnemedia.pl##+js(aeld, click, instanceof Event, elements, body) +||imasdk.googleapis.com/js/sdkloader/ima3.js$redirect=google-ima.js,domain=wirtualnemedia.pl +@@||wirtualnemedia.pl^$ghide +wirtualnemedia.pl#@#.ads +kobieta.wp.pl##+js(nostif, bait) +abczdrowie.pl,allani.pl,autokrata.pl,autokult.pl,biztok.pl,dzieci.pl,easygo.pl,echirurgia.pl,fotoblogia.pl,gadzetomania.pl,hotmoney.pl,interaktywnie.com,inwestycje.pl,jejswiat.pl,kafeteria.pl,kafeteria.tv,kantory.pl,kazimierzdolny.pl,komediowo.pl,komorkomania.pl,mazury.com,mojeauto.pl,mojeosiedle.pl,money.pl,nasygnale.pl,niewiarygodne.pl,nocowanie.pl,odkrywcy.pl,parenting.pl,pudelek.pl,pudelek.tv,pytamy.pl,sfora.pl,snobka.pl,tlen.pl,totalmoney.pl,wakacje.pl,wawalove.pl,wp.pl,~www.wp.pl,wp.tv#@#html, html > body:style(overflow: auto !important;) +abczdrowie.pl,allani.pl,autokrata.pl,autokult.pl,biztok.pl,dzieci.pl,easygo.pl,echirurgia.pl,fotoblogia.pl,gadzetomania.pl,hotmoney.pl,interaktywnie.com,inwestycje.pl,jejswiat.pl,kafeteria.pl,kafeteria.tv,kantory.pl,kazimierzdolny.pl,komediowo.pl,komorkomania.pl,mazury.com,mojeauto.pl,mojeosiedle.pl,money.pl,nasygnale.pl,niewiarygodne.pl,nocowanie.pl,odkrywcy.pl,parenting.pl,pudelek.pl,pudelek.tv,pytamy.pl,sfora.pl,snobka.pl,tlen.pl,totalmoney.pl,wakacje.pl,wawalove.pl,wp.pl,~www.wp.pl,wp.tv##html:not(#id), html:not(#id) > body:not(#id):style(overflow: visible !important;) +poczta.o2.pl,poczta.wp.pl##*:matches-css-after(content:/K/):upward(1) +poczta.o2.pl,poczta.wp.pl##.d_flex.flex-d_column.h_full.pos_relative +@@||strimek.tv^$ghide +||strimek.tv^$csp=sandbox allow-forms allow-same-origin allow-scripts allow-modals allow-orientation-lock allow-pointer-lock allow-presentation allow-top-navigation +||strimek.tv/apple.js$script,1p +@@||wspinanie.pl^$ghide +wspinanie.pl##+js(nostif, getComputedStyle) +wspinanie.pl##.global__advertisement +@@*$css,other,domain=pilot.wp.pl +*/adv/$image,domain=pilot.wp.pl,redirect=1x1.gif +!#if ext_ubol +||static.criteo.net/js/$script,domain=pilot.wp.pl,redirect=noopjs +@@||imasdk.googleapis.com/js/sdkloader/ima3.js$script,domain=pilot.wp.pl +!#endif +||dot.wp.pl/*/dot.gif?rmt=css$css,redirect=noop.css,domain=pilot.wp.pl,important +pilot.wp.pl##+js(set, prebidConfig.steering.disableVideoAutoBid, true) +polskawliczbach.pl##+js(nostif, offsetHeight) +@@||imasdk.googleapis.com/js/sdkloader/ima3.js$script,domain=wiadomosci.wp.pl +wiadomosci.wp.pl##+js(nostif, , 100) +polsatsport.pl##+js(no-xhr-if, xml) +fakt.pl,plejada.pl##+js(nostif, offsetHeight) +||portal.librus.pl/ad^ +portal.librus.pl##advertisement-module:remove() +tuwroclaw.com##.grid__ad +tuwroclaw.com##.grid__col:has(> .adv) +stalowemiasto.pl##+js(aeld, load, detect) +! NOTE: Portuguese/Spanish +||static-cloud.mediaset.net/misc/ad/adanalytics.js^$redirect=noopjs +||static-cloud.mediaset.net/misc/ad/adanalytics.js^$redirect=noopjs,domain=mediasetinfinity.es,important +download.kingtecnologia.com##+js(nostif, await _0x) +download.kingtecnologia.com##+js(trusted-replace-argument, document.getElementById, 0, json:"Blog1", condition, ad-top) +ryxy.online##+js(no-fetch-if, adblock.js) +! daemonanime.net/daemon-hentai.com anti-adb +daemonanime.net##+js(acs, eval, replace) +daemonanime.net##+js(acs, document.addEventListener, google_ad_client) +daemonanime.net##+js(nostif, adbl) +daemonanime.net#@#div[id^="div-gpt-"]:not([style^="width: 1px; height: 1px; position: absolute; left: -10000px; top: -"]) +daemonanime.net#@#[id^="div-gpt-ad"]:not([style^="width: 1px; height: 1px; position: absolute; left: -10000px; top: -"]) +||a.magsrv.com/video-slider.js$script,redirect=noop.js,domain=daemonanime.net|daemon-hentai.com +@@||daemon-hentai.com^$ghide +daemonanime.net##+js(set, detectAdBlock, noopFunc) +daemonanime.net,daemon-hentai.com##+js(nowoif, _blank) +*$xhr,domain=daemon-hentai.com,redirect=empty,to=adligature.com|outbrain.com|quantserve.com|srvtrck.com +||daemonanime.net/wp-content/themes/covernews/js/*.js +! daemon-hentai.com,daemonanime.net +||mangaspdf.xyz/js/list-*.js +daemon-hentai.com##+js(aeld, click, openPopunder) +daemon-hentai.com##+js(nostif, openPopunder) +daemon-hentai.com##+js(aeld, load, .getComputedStyle) +daemonanime.net##+js(aeld, , STORAGE2) +daemonanime.net##+js(aeld, DOMContentLoaded, app_advert) +||google-analytics.com^$3p,image,redirect=1x1.gif,from=daemon-hentai.com +daemon-hentai.com##+js(rmnt, script, adblock) +||imasdk.googleapis.com/js/sdkloader/ima3.js$redirect=google-ima.js,domain=cooperativa.cl +lared.cl##+js(no-fetch-if, doubleclick) +lared.cl##+js(set, googletag._loaded_, true) +lared.cl##.ads +lared.cl##ned-ad +pelisxporno.net##+js(acs, document.addEventListener, adsBlocked) +@@||midara.ink/api/$script,1p +||cdn.embedtv.net/embed/betnacional.webp$image +embedtv.net##+js(nostif, closeBanner) +pcbolsa.com##+js(set, NoTenia, false) +novizer.com>>##+js(acs, EventTarget.prototype.addEventListener, delete window) +||cyou/player/assets/js/jquery.js?v=$script,1p +||cyou/player/assets/js/ads.js?v=$script,1p +loldewfwvwvwewefdw.cyou##+js(nowoif) +infogenyus.top,saboroso.blog#@#.ad-unit:not(.adsbox, .text-ad, .textads):not([style^="width: 1px; height: 1px; position: absolute;"]) +infogenyus.top,saboroso.blog##+js(rmnt, script, /bait/i) +||imasdk.googleapis.com/js/sdkloader/ima3_dai.js$redirect=noopjs,domain=lpfplay.com +||static.diaridetarragona.com/dab/detector.js +diaridetarragona.com##.c-add +||imasdk.googleapis.com/js/sdkloader/ima3.js$redirect=noopjs,domain=envivo.tvazteca.com +novelaplay.com##+js(aeld, DOMContentLoaded, bait) +novelaplay.com##+js(nowoif) +@@||vix.com^$ghide +vix.com##+js(json-prune, breaks interstitials info, interstitials) +vix.com##+js(xml-prune, 'xpath(//*[name()="Period"][.//*[name()="BaseURL" and contains(text(),".mp.lura.live/prod/")]] | //*[name()="MPD"]/@mediaPresentationDuration)', , .mpd) +vix.com##+js(json-prune-xhr-response, ads, ads.policy.skipMode, propsToMatch, /play) +||mp.lura.live/vod/vast.info/ +||imasdk.googleapis.com/js/sdkloader/ima3.js$script,3p,redirect=google-ima.js,domain=vix.com +@@||imasdk.googleapis.com/js/sdkloader/ima3_dai.js$script,3p,domain=vix.com +vix.com##+js(json-prune, ad_slots) +vix.com##+js(json-prune, plugins.dfp) +vix.com##+js(m3u-prune, lura.live/prod/, /prog.m3u8) +vix.com###video-player-track[style*="display: block"]:style(visibility: visible !important;) +disneyembed.wtf##+js(trusted-set-local-storage-item, locker_timestamp, $now$) +embedtv.best##+js(nowoif, !embedtv.best) +pkproject.net##+js(acs, setTimeout, adblock) +pkproject.net##div[data-fuse] +||imasdk.googleapis.com/js/sdkloader/ima3.js$redirect=google-ima.js,domain=recordplus.com +@@||imasdk.googleapis.com/js/sdkloader/ima3_dai.js$domain=recordplus.com +googleapis.com.de,googleapis.com.do,redecanais.*,redecanaistv.*##body.swal2-shown > .swal2-container +googleapis.com.de,googleapis.com.do,redecanais.*,redecanaistv.*##html.swal2-shown, body.swal2-shown:style(overflow: auto !important;) +googleapis.com.de,googleapis.com.do,redecanais.*,redecanaistv.*##+js(aeld, click, _0x) +redecanais.*,redecanaistv.*,redisex.*,xn-----0b4asja7ccgu2b4b0gd0edbjm2jpa1b1e9zva7a0347s4da2797e8qri.xn--1ck2e1b,xn--90afacv0clj6ac0dxa.xn--p1ai,xn--90afacv0cu2a3cr.xn--p1ai##+js(aopr, __Y) +!googleapis.com.de,googleapis.com.do,redecanais.*,redecanaistv.*##+js(nowoif) +relampagomovies.com##+js(rmnt, script, offsetHeight) +relampagomovies.com##+js(acs, document.addEventListener, window.open) +||webcinevs*.com/api/app/vast-ads +##.pppx +superflixapi.best,warezcdn.lat##+js(aeld, , pop_) +warezcdn.*##+js(acs, Array.isArray, bait) +warezcdn.*##+js(nowoif) +llanfairpwllgwyngy.com##+js(acs, document.addEventListener, POP_URL) +llanfairpwllgwyngy.com##+js(trusted-replace-argument, eval, 0, repl:/"popactive":true/"popactive":false/) +primeflix.*>>,~cloudflare.com##+js(nowoif) +primeflix.*>>,~cloudflare.com##+js(rmnt, script, POP_URL) +primeflix.*>>,~cloudflare.com##+js(trusted-replace-argument, eval, 0, repl:/"popactive":true/"popactive":false/) +@@||meuplayeronlinehd.com^$ghide +meuplayeronlinehd.com###adblock-overlay +||multicanaistt.space/pop/pop.js$script +||cdn.jsdelivr.net/npm/disable-devtool$script,domain=myapiplay.top +myapiplay.top###popup-overlay +meuplayeronlinehd.com###popupOverlay +meuplayeronlinehd.com##+js(nowoif) +meuplayeronlinehd.com##+js(ra, style, [style*="z-index"], stay) +meuplayeronlinehd.com,multicanaistt.space##+js(aeld, load, detect) +||minhatela.xyz/mt-probe.js +minhatela.xyz##+js(nosiif, (!1)) +cnnamador.com##+js(nostif, backRedirect) +cnnamador.com##+js(aeld, , pop) +cnnamador.com##+js(noeval) +cnnamador.com##.banner +||cnnamador.com/player/float.php +||cnnamador.com/m18/ +cnnamador.com##.is-ad-visible +cnnamador.com##+js(aopw, adv_pre_duration) +cnnamador.com##+js(aopw, adv_post_duration) +cnnamador.com##+js(aeld, /^(click|mousedown|mousemove|touchstart|touchend|touchmove)/, system.popunder) +cnnamador.com##.cards__item:has([href*="loboclick"]) +||cnnamador.com/sw.js$script,1p +||adsloboclick.com^ +cg-gamespc.net##+js(rmnt, script, :visible) +cg-gamespc.net###notiene:style(display:block !important) +cg-gamespc.net##div:nth-of-type(5):has-text(Advertising) +cg-gamespc.net##.header__nav-link:style(line-height:unset !important) +cg-gamespc.net,elamigosgames.net,elamigosgamez.net##+js(nostif, checkAdblockUser) +cg-gamespc.net,elamigosgames.net,elamigosgamez.net##.content_store +cg-gamespc.net,elamigosgames.net,elamigosgamez.net##.iframeDiv +elamigosgamez.net##h3.my-4:has-text(/^Advertising/) +||instant-gaming.com/api/banner/ +||adme2.click^ +rdembed.*##+js(aeld, click, pop_) +rdembed.*##+js(nowoif) +! NOTE: Thai +steamseries88.com##+js(rpnt, script, let playerType, 'window.addEventListener("load",()=>{if(typeof playMovie==="function"){playMovie()}});let playerType') +! NOTE: Turkish +isgfrm.com##+js(acs, document.createElement, .offsetHeight) +isgfrm.com##+js(rmnt, script, /adbl|RegExp/i) +unibilgi.net##[href*="adset"] +unibilgi.net##.ays-pb-modals +unibilgi.net###custom_html-2 +unibilgi.net###custom_html-9 +unibilgi.net###custom_html-10 +unibilgi.net###custom_html-11 +joymaxtr.net##+js(acs, RegExp, navigator.userAgent) +/js/aclb.js^$script,1p,domain=anizle.com|anizm.net|puffytr.com +||teknofenomen.com/forum/ext/*/js/adblock_detection.js +filmizle.*,filmizletv.*,filmizleplus.*,fullhdfilm.*,fullhdfilmizle.*,gofilmizle.com,hdfilmcehennemi.*,hdfilmizlesene.*,hdfilmsitesi.*,sine5.dev,sinezy.org##+js(trusted-rpnt, script, window.lazyLoadOptions =, if(typeof ilk_part_getir==="function"){ilk_part_getir()}window.lazyLoadOptions =, sedCount, 1) +filmizle.*,filmizletv.*,filmizleplus.*,fullhdfilm.*,fullhdfilmizle.*,gofilmizle.com,hdfilmcehennemi.*,hdfilmizlesene.*,hdfilmsitesi.*,sine5.dev,sinezy.org##body:style(background-image: unset !important;) +||hdfilmce.com/bt.webp$image +||filmvitrini.net/wp-content/themes/filmizle/js/elma.js +.gif^$image,domain=filmvitrini.net +filmvitrini.net##.videoust +asyaanimeleri.pw##+js(rpnt, script, popactive, nopop) +asyaanimeleri.pw##+js(nowoif, !asyaanimeleri.) +asyaanimeleri.pw##+js(set-cookie, popcounter, 2) +asyaanimeleri.pw##.pppx +##.bb ~ main#container .containerAds +##html[lang="tr"] #aa-wp + .fixed-footer .footer-ad-container +##html[lang="tr"] #aa-wp .container-ads-adjustment +##html[lang="tr"] #aa-wp .rnd-ads-adjustment +dizipal1536.com,dizipal1537.com,dizipal1538.com,dizipal1539.com,dizipal1540.com,dizipal1541.com,dizipal1542.com,dizipal1543.com,dizipal1544.com,dizipal1545.com,dizipal1546.com,dizipal1547.com,dizipal1548.com,dizipal1549.com,dizipal1550.com,dizipal1551.com,dizipal1552.com,dizipal1553.com,dizipal1554.com,dizipal1555.com,dizipal1556.com,dizipal1557.com,dizipal1558.com,dizipal1559.com,dizipal1560.com,dizipal1561.com,dizipal1562.com,dizipal1563.com,dizipal1564.com,dizipal1565.com,dizipal1566.com,dizipal1567.com,dizipal1568.com,dizipal1569.com,dizipal1570.com,dizipal1571.com,dizipal1572.com,dizipal1573.com,dizipal1574.com,dizipal1575.com,dizipal1576.com,dizipal1577.com,dizipal1578.com,dizipal1579.com,dizipal1580.com,dizipal1581.com,dizipal1582.com,dizipal1583.com,dizipal1584.com,dizipal1585.com,dizipal1586.com,dizipal1587.com,dizipal1588.com,dizipal1589.com,dizipal1590.com,dizipal1591.com,dizipal1592.com,dizipal1593.com,dizipal1594.com,dizipal1595.com,dizipal1596.com,dizipal1597.com,dizipal1598.com,dizipal1599.com,dizipal1600.com##+js(trusted-rpnt, script, /manageAds\(video_urls\[activeItem\]\, video_seconds\[activeItem\]\, ad_urls\[activeItem]\,true\);/, playVideo();, condition, playAdd) +dizipal1536.com,dizipal1537.com,dizipal1538.com,dizipal1539.com,dizipal1540.com,dizipal1541.com,dizipal1542.com,dizipal1543.com,dizipal1544.com,dizipal1545.com,dizipal1546.com,dizipal1547.com,dizipal1548.com,dizipal1549.com,dizipal1550.com,dizipal1551.com,dizipal1552.com,dizipal1553.com,dizipal1554.com,dizipal1555.com,dizipal1556.com,dizipal1557.com,dizipal1558.com,dizipal1559.com,dizipal1560.com,dizipal1561.com,dizipal1562.com,dizipal1563.com,dizipal1564.com,dizipal1565.com,dizipal1566.com,dizipal1567.com,dizipal1568.com,dizipal1569.com,dizipal1570.com,dizipal1571.com,dizipal1572.com,dizipal1573.com,dizipal1574.com,dizipal1575.com,dizipal1576.com,dizipal1577.com,dizipal1578.com,dizipal1579.com,dizipal1580.com,dizipal1581.com,dizipal1582.com,dizipal1583.com,dizipal1584.com,dizipal1585.com,dizipal1586.com,dizipal1587.com,dizipal1588.com,dizipal1589.com,dizipal1590.com,dizipal1591.com,dizipal1592.com,dizipal1593.com,dizipal1594.com,dizipal1595.com,dizipal1596.com,dizipal1597.com,dizipal1598.com,dizipal1599.com,dizipal1600.com##div[class^="header"]:has(> .container-ads-adjustment:only-child) +||blogger.googleusercontent.com/img/$domain=dizipal1536.com|dizipal1537.com|dizipal1538.com|dizipal1539.com|dizipal1540.com|dizipal1541.com|dizipal1542.com|dizipal1543.com|dizipal1544.com|dizipal1545.com|dizipal1546.com|dizipal1547.com|dizipal1548.com|dizipal1549.com|dizipal1550.com|dizipal1551.com|dizipal1552.com|dizipal1553.com|dizipal1554.com|dizipal1555.com|dizipal1556.com|dizipal1557.com|dizipal1558.com|dizipal1559.com|dizipal1560.com|dizipal1561.com|dizipal1562.com|dizipal1563.com|dizipal1564.com|dizipal1565.com|dizipal1566.com|dizipal1567.com|dizipal1568.com|dizipal1569.com|dizipal1570.com|dizipal1571.com|dizipal1572.com|dizipal1573.com|dizipal1574.com|dizipal1575.com|dizipal1576.com|dizipal1577.com|dizipal1578.com|dizipal1579.com|dizipal1580.com|dizipal1581.com|dizipal1582.com|dizipal1583.com|dizipal1584.com|dizipal1585.com|dizipal1586.com|dizipal1587.com|dizipal1588.com|dizipal1589.com|dizipal1590.com|dizipal1591.com|dizipal1592.com|dizipal1593.com|dizipal1594.com|dizipal1595.com|dizipal1596.com|dizipal1597.com|dizipal1598.com|dizipal1599.com|dizipal1600.com +x.ag2m2.cfd##+js(json-edit, .*[?.linkurl^="http"]) +##html[lang="tr"] > body.has-footer-ad.has-pageskin-desktop a.pageskin-click-left +##html[lang="tr"] > body.has-footer-ad.has-pageskin-desktop a.pageskin-click-right +##html[lang="tr"] > body.has-footer-ad.has-pageskin-desktop a.pageskin-desktop-wrapper +dizipal1965.com,dizipal1966.com,dizipal1967.com,dizipal1968.com,dizipal1969.com,dizipal1970.com,dizipal1971.com,dizipal1972.com,dizipal1973.com,dizipal1974.com,dizipal1975.com,dizipal1976.com,dizipal1977.com,dizipal1978.com,dizipal1979.com,dizipal1980.com,dizipal1981.com,dizipal1982.com,dizipal1983.com,dizipal1984.com,dizipal1985.com,dizipal1986.com,dizipal1987.com,dizipal1988.com,dizipal1989.com,dizipal1990.com,dizipal1991.com,dizipal1992.com,dizipal1993.com,dizipal1994.com,dizipal1995.com,dizipal1996.com,dizipal1997.com,dizipal1998.com,dizipal1999.com,dizipal2000.com##a[class^="pageskin-"] +||blogger.googleusercontent.com/img/$domain=dizipal1965.com|dizipal1966.com|dizipal1967.com|dizipal1968.com|dizipal1969.com|dizipal1970.com|dizipal1971.com|dizipal1972.com|dizipal1973.com|dizipal1974.com|dizipal1975.com|dizipal1976.com|dizipal1977.com|dizipal1978.com|dizipal1979.com|dizipal1980.com|dizipal1981.com|dizipal1982.com|dizipal1983.com|dizipal1984.com|dizipal1985.com|dizipal1986.com|dizipal1987.com|dizipal1988.com|dizipal1989.com|dizipal1990.com|dizipal1991.com|dizipal1992.com|dizipal1993.com|dizipal1994.com|dizipal1995.com|dizipal1996.com|dizipal1997.com|dizipal1998.com|dizipal1999.com|dizipal2000.com +trgoals1526.xyz,trgoals1527.xyz,trgoals1528.xyz,trgoals1529.xyz,trgoals1530.xyz,trgoals1531.xyz,trgoals1532.xyz,trgoals1533.xyz,trgoals1534.xyz,trgoals1535.xyz,trgoals1536.xyz,trgoals1537.xyz,trgoals1538.xyz,trgoals1539.xyz,trgoals1540.xyz,trgoals1541.xyz,trgoals1542.xyz,trgoals1543.xyz##+js(rpnt, script, prerollEnabled:true, prerollEnabled:false) +macizletaraftarium.online,restmacizle23.cfd##+js(rpnt, script, prerollEnabled:true, prerollEnabled:false) +||inattv*.xyz/channel.html$frame,replace=/prerollEnabled:true/prerollEnabled:false/ +inattv1275.xyz,inattv1276.xyz,inattv1277.xyz,inattv1278.xyz,inattv1279.xyz,inattv1280.xyz,inattv1281.xyz,inattv1282.xyz,inattv1283.xyz,inattv1284.xyz,inattv1285.xyz,inattv1286.xyz,inattv1287.xyz,inattv1288.xyz,inattv1289.xyz,inattv1290.xyz,inattv1291.xyz,inattv1292.xyz,inattv1293.xyz,inattv1294.xyz,inattv1295.xyz,inattv1296.xyz,inattv1297.xyz,inattv1298.xyz,inattv1299.xyz,inattv1300.xyz,inattv1301.xyz,inattv1302.xyz,inattv1303.xyz,inattv1304.xyz,inattv1305.xyz,inattv1306.xyz,inattv1307.xyz,inattv1308.xyz,inattv1309.xyz,inattv1310.xyz,inattv1311.xyz,inattv1312.xyz,inattv1313.xyz,inattv1314.xyz,inattv1315.xyz,inattv1316.xyz,inattv1317.xyz,inattv1318.xyz,inattv1319.xyz,inattv1320.xyz,inattv1321.xyz,inattv1322.xyz,inattv1323.xyz,inattv1324.xyz,inattv1325.xyz,inattv1326.xyz,inattv1327.xyz,inattv1328.xyz,inattv1329.xyz,inattv1330.xyz,inattv1331.xyz,inattv1332.xyz,inattv1333.xyz,inattv1334.xyz,inattv1335.xyz,inattv1336.xyz,inattv1337.xyz,inattv1338.xyz,inattv1339.xyz,inattv1340.xyz,inattv1341.xyz,inattv1342.xyz,inattv1343.xyz,inattv1344.xyz,inattv1345.xyz,inattv1346.xyz,inattv1347.xyz,inattv1348.xyz,inattv1349.xyz,inattv1350.xyz##+js(rpnt, script, prerollEnabled:true, prerollEnabled:false) +hdfilmizlesen.com##+js(acs, document.addEventListener, initPop) +hdfilmizlesen.com##+js(set, app._data.ads, []) +||hdfilmizlesen.com/ponpis.js^ +fontyukle.net##+js(aost, setTimeout, onload) +fontyukle.net##div.sponsor +fontyukle.net#@#div[class^="sag-ust"] +canlikolik.my###video-click-overlay +canlikolik.my##+js(aeld, message, adsense) +canlikolik.my##+js(trusted-set, reklamlar, json:[{"sure":"0"}]) +canlikolik.my##+js(trusted-rpnt, script, skipButton.innerText !==, "" ===) +canlikolik.my##+js(trusted-rpnt, script, var controlBar =, skipButton.click();var controlBar =, sedCount, 1) +tureng.com###tureng-cambly-ad-placeholder +tureng.com##.debug-ad +pandaspor.live##[href^="https://go.aff."] +pandaspor.live##+js(rpnt, script, await runPreRollAds();) +turkedebiyati.org##+js(rmnt, script, /adbl/i) +optraco.top##+js(rpnt, script, shouldShowAds() ?, false ?) +tranimeizle.*#@#.video-ad-container +tranimeizle.*##body .video-ad-top:style(display: block !important;) +tranimeizle.*##.advertisement +tranimeizle.*##a[href^="https://cutt.ly/"] +||tranimeizle.io/js/mm*.js +/^www\.selcuksportshd[a-z0-9-]+\.xyz$/##.banner +/^www\.selcuksportshd[a-z0-9-]+\.xyz$/##.banners +/^www\.selcuksportshd[a-z0-9-]+\.xyz$/##.container > aside.sidebar:has(> .banner) +/^www\.selcuksportshd[a-z0-9-]+\.xyz$/##.footer +/^www\.selcuksportshd[a-z0-9-]+\.xyz$/##.socials a:is(.meritroyal, .iptv, .streamradar) +||blogger.googleusercontent.com/img/$domain=/^main\.uxsyplayer[a-z0-9-]+\.click$/ +||vipifsa.com/api/ad +||vipifsa.com/api/popup +vipifsa.com##+js(json-prune-fetch-response, ads, , propsToMatch, /api/video) +animecix.tv##+js(set, Object.prototype.showInterstitialAd, false) +kanald.com.tr##+js(set, googlefc, undefined) +! NOTE: Vietnamese +lxmanga.my##+js(set, skipAdblockCheck, true) +qmh.*##+js(json-prune-xhr-response, data.header_script data.footer_script data.direct_link_ads data.direct_link_ads_vip_1 data.direct_link_ads_vip_2 data.direct_link_ads_play_vip_2 data.direct_link_ads_zoom_vip_2, , propsToMatch, /config) +||qmh.*/assets/js/simpleblocker.js +||api.viphubss.shop/api/link-rotation/ +||api.viphubss.shop/api/banner +||moneyoyo.com^$3p +||static.accesstrade.vn^$3p +streamobs.net##+js(aost, document.createElement, createAgeModal) +streamobs.net##+js(nowoif, _blank, 1, obj) +streamobs.net##.modal +sieutamphim.me##+js(acs, document.addEventListener, Object[_0x) +sieutamphim.me##+js(nowoif, _blank) +||tinxe.vn/dist/scripts/campaign-bn.min.js.gz +||ad.vietbao.vn^ +tinhte.vn##+js(nostif, .getComputedStyle) +vozer.io,vozer.vn##+js(acs, document.addEventListener, Popunder) +ios.codevn.net##+js(rmnt, script, /popup/i) +ios.codevn.net##+js(nowoif, _blank) +watch.rkplayer.xyz##+js(set, adsPlayer, undefined) +lokhung888.com##+js(rmnt, script, /popup|arrDirectLink/) +lokhung888.com##+js(nowoif, _blank) +||pagead2.googlesyndication.com^$script,domain=vnjpclub.com,important +vnjpclub.com##+js(rmnt, script, /adblock/i) +vnjpclub.com##.vnjp-ad-slot +||animevietsub.*/ads/$script +animevietsub.*###invideo_wrapper +animevietsub.*##.mobile-catfish-top +animevietsub.*##.mobile-catfixx +animevietsub.*##.pc-catfixx +animevietsub.*##.Ads +animevietsub.*##.Adv +animevietsub.*##a[href][target="_blank"] img[src^="https://lh3.googleusercontent.com/"] +animevietsub.*##+js(rmnt, script, PopupManager) +storage.googleapiscdn.com,stream.googleapiscdn.com##+js(aeld, DOMContentLoaded, _0x) +||pagead2.googlesyndication.com^$script,domain=storage.googleapiscdn.com|stream.googleapiscdn.com,important +/player/jwplayer-*/vast.js$script +||imasdk.googleapis.com/js/sdkloader/ima3.js$redirect=noopjs,domain=vtvgo.vn,important +! cap3. pro +cap3.*##+js(trusted-replace-argument, String.prototype.includes, this, 'json:"mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/145.0.0.0 safari/537.36"', condition, mozilla/5.0) +cap3.*#@##ad-wrapper +cap3.*##+js(nowoif, popup=) +cap3.*##+js(aeld, click, setTimeout) +cap3.*##+js(aeld, click, ()}, elements, .art-control-fullscreen) +||cap3.*/api/ads +! Video player popup +vip.stream101.space##+js(nowoif) +storage.googleapiscdn.com,stream.googleapiscdn.com##+js(rmnt, script, /bait/i) +@@||googleapiscdn.com/player/*animevietsub.$ghide +||googleapiscdn.com/admin/api/ads/ +/static/jwplayer/vast.js +motphimr.io##+js(aeld, click, document.createElement) +motphimr.io##+js(trusted-set-session-storage-item, popup-ads-last-shown, $now$) +##html[lang="vi"] .sspp-area +rophimz.*##+js(set-session-storage-item, ads-clicked-under-last-click, 11) +rophimz.*##+js(trusted-set-session-storage-item, shopee-ads-clicked, $now$) +rophimz.*##+js(trusted-set-session-storage-item, shopee-ads-last-click, $now$) +rophimz.*##+js(trusted-override-element-method, HTMLAnchorElement.prototype.click, a[target="_blank"][rel*="sponsored"]) +voznovel.com##+js(rmnt, script, shopeeLinks) +voznovel.com##+js(aeld, click, shopeeLinks) +||phimcn.*/assets/pu.js +||phimcn.*/graph/api?action=init-load-ads +phimfun.net>>##+js(nowoif) +vnexpress.net##.wrap-hd-adblock +! !SECTION: Non-English sites +! noadblocker.js "Enhanced Ad Blocker Detection Script" +/^https:\/\/[a-z0-9]{6,10}\.[a-z]{2,3}\/js\d?\/noadblocker\.js(?:\?v=\d)?$/$script,1p,match-case +!#if env_safari +/^https:\/\/[a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]?[a-z0-9]?[a-z0-9]?[a-z0-9]?\.[a-z][a-z][a-z]?\/js[0-9]?\/noadblocker\.js(\?v=[0-9])?$/$script,1p,match-case +!#endif +! END: General filters (put filters before this line) +! *** uAssets:filters/filters-2020.txt *** +*$script,redirect-rule=noopjs,domain=arcai.com +arcai.com##+js(set, pubAdsService, trueFunc) +@@||doubleclick.net^$script,xhr,domain=arcai.com +@@||fundingchoicesmessages.google.com^$script,domain=arcai.com +@@||googletagservices.com/tag/js/gpt.js$script,domain=arcai.com +@@*$ghide,domain=arcai.com +mysflink.blogspot.com##+js(set, safelink.adblock, false) +mysflink.blogspot.com##+js(nano-sib) +sofwaremania.blogspot.com##+js(nano-stb) +jav1080.com##div.boxzilla, .boxzilla-overlay, [href^="https://adsxyz.com/"] +jav1080.com###custom_html-3 +jav1080.com###custom_html-4 +/300x250.html|$frame,3p +l2db.info##+js(nowoif) +||l2db.info/uploads/banners/$image +l2db.info##.branding +l2db.info##[href^="https://overworld.pro/"] +l2db.info###wrapper-content:style(margin-top:0px !important) +l2db.info##[href*="adv"] +l2db.info###branding +psychic.de##+js(nostif, offsetHeight) +my-code4you.blogspot.com##+js(nostif, offsetLeft) +my-code4you.blogspot.com##+js(set, config.pauseInspect, false) +*$script,redirect-rule=noopjs,domain=my-code4you.blogspot.com +made-by.org##+js(nostif, ads) +*$xhr,redirect-rule=nooptext,domain=made-by.org +made-by.org###overlay +ilovephd.com##+js(set, adsbygoogle, null) +@@||notepad.pw^$ghide +gosemut.*##+js(nowoif) +rexdlfile.com##+js(aopr, require) +! art sites redirections, ads +opisanie-kartin.com,painting-planet.com##+js(aopr, LieDetector) +||edugrampromo.com^$3p +*/?pu=$script +1plus1plus1equals1.net,cooksinfo.com,heatherdisarro.com##+js(aopr, Date.prototype.toUTCString) +25yearslatersite.com##+js(set, jQuery.adblock, false) +helpnetsecurity.com##+js(acs, jQuery, Object) +thepiratebay.org##+js(aopr, exoJsPop101) +||thepiratebay.org/sw.js +kollhong.com##+js(aopr, adBlockDetected) +||cointiply.com^$3p +||reingod.com^ +! rppk13baru.blogspot.com anti-adb +rppk13baru.blogspot.com##+js(acs, addEventListener, blocker) +! arabamob.blogspot.com anti-adb +arabamob.blogspot.com##+js(acs, addEventListener, blocker) +*$script,redirect-rule=noopjs,domain=akunssh.net +videosection.com##+js(aopr, exoJsPop101) +techieway.blogspot.com##+js(acs, addEventListener, AdBlock) +pornfd.com##+js(nostif, innerText, 2000) +pornfd.com##+js(aopr, console.clear) +pornfd.com##+js(aeld, , bi()) +pornfd.com##.bannerImage +pornfd.com##.sponsor +||pornfd.com/*.php +flickr.com##+js(set, appContext.adManager.context.current.adFriendly, false) +flickr.com##.sub-photo-submoola-view +flickr.com##section:has([href*="istockphoto.com"]) +! flickr.com##.sub-photo-right-view [href^="/account/upgrade"]:upward(.sub-photo-right-view > div) +flickr.com##body::after:style(top: 0 !important;) +flickr.com##.nav-ad-container +flickr.com##.fluid-magic-subnav-view.desktop-nav-ad .fluid-subnav.fixed, .fluid-magic-subnav-view.mobile-nav-ad .fluid-subnav.fixed:style(top: 0 !important;) +flickr.com##.global-nav-view.desktop-nav-ad, .global-nav-view.desktop-nav-ad .global-nav-content, .global-nav-view.mobile-nav-ad, .global-nav-view.mobile-nav-ad .global-nav-content:style(margin-top: 0 !important;) +flickr.com##.search-photos-unified-page-view .desktop-nav-ad:remove-class(desktop-nav-ad) +flickr.com##.search-photos-unified-page-view .mobile-nav-ad:remove-class(mobile-nav-ad) +*$media,3p,domain=hdd.moviefun24.com,redirect=noopmp3-0.1s +pornky.com##+js(aopr, exoJsPop101) +rexporn.*##+js(aeld, , pop) +pleated-jeans.com##+js(aopr, HTMLIFrameElement) +flash-firmware.blogspot.com##+js(noeval-if, replace) +getmega.net##+js(aopr, adBlockDetected) +desktophut.com##+js(acs, document.getElementById, .style) +##[href^="https://fireads.online/"] +desktophut.com###loading-ad +*$frame,redirect-rule=noopframe,domain=desktophut.com +*$xhr,redirect-rule=nooptext,domain=desktophut.com +!!! +a-ads.com##.size300x250 +googlesyndication.com##.GoogleActiveViewElement:not(:has(> #reward_close_button_widget, .recommend_book)) +googlesyndication.com##.GoogleActiveViewElement > div:not(#reward_close_button_widget):not(.recommend_book) +googlesyndication.com###abgb +memoriadatv.com##+js(nano-stb) +@@||memoriadatv.com^$ghide +memoriadatv.com##ins.adsbygoogle +@@||myzyia.com^$ghide +zone-annuaire.*##+js(nowoif) +notube.*,~notube.com##+js(nowoif) +*$script,redirect-rule=noopjs,domain=runmods.com +runmods.com##+js(nano-sib) +gal-dem.com##+js(aopr, dsanity_ad_block_vars) +forumconstruire.com#?#.post_simple:has(.postsimple_pseudo:has-text(/promo/i)) +latitude.to##+js(nostif, show) +apkmb.com##+js(nano-sib, show_download_links) +uploadking.net##+js(nano-stb, downloadbtn) +||pub.network^$script,redirect=noopjs,domain=vrcmods.com +vrcmods.com##+js(nano-sib, timeLeft) +vrcmods.com##+js(nostif, height) +vrcmods.com##+js(nosiif, height) +vrcmods.com###download-form:style(display: initial !important;) +vrcmods.com###app:style(display: none !important;) +vrcmods.com###app_msg:style(display: none !important;) +vrcmods.com##.show.fade.modal +vrcmods.com##.show.fade.modal-backdrop +leolist.cc##+js(nowoif) +! teachersguidetn.blogspot.com/bayaningfilipino.blogspot.com/fileandsharing.com anti-adb +teachersguidetn.blogspot.com,bayaningfilipino.blogspot.com##+js(acs, addEventListener, blocker) +firefile.cc##+js(set, blockAdBlock._options.baitClass, null) +@@||manhwa18.com^$ghide +uploadhub.*##+js(nowoif) +uploadhub.*##+js(no-fetch-if, adsbygoogle) +uploadhub.*##+js(nostif, location.href, 1000) +*$script,3p,denyallow=bootstrapcdn.com|cloudflare.com,domain=uploadhub.* +uploadhub.*##[src^="https://blogger.googleusercontent.com/"] +verteleseriesonline.com##+js(aopr, adBlockDetected) +verteleseriesonline.com##+js(nosiif, visibility, 1000) +flight-report.com##+js(aeld, load, /AdBlock/i) +! ievaphone .com anti adb +ievaphone.com##+js(acs, onload) +obsev.com##+js(aopr, HTMLIFrameElement) +pentruea.com##+js(nostif, charAt) +@@||heypikachu.com^$ghide +mchacks.net##+js(nostif, checkAds) +why-tech.it##+js(nostif, fadeIn, 0) +@@||why-tech.it^$ghide +why-tech.it##ins.adsbygoogle +techably.com##+js(acs, document.getElementById, adsbygoogle) +imintweb.com##+js(aopr, adBlockDetected) +@@||minorpatch.com^$ghide +*$image,redirect-rule=1x1.gif,domain=minorpatch.com +minorpatch.com##ins.adsbygoogle +minorpatch.com##+js(acs, decodeURIComponent, checkAD) +minorpatch.com##+js(no-fetch-if, googlesyndication) +@@||debrid-file.com^$ghide +||nexusbytes.com^$3p +maccanismi.it##+js(noeval-if, show) +manytoon.com##+js(aopr, decodeURI) +*$script,3p,denyallow=cloudflare.net|disqus.com|disquscdn.com|fastlylb.net,domain=manytoon.com +||fzj3v7sch2xg5gosh60vpkrth5c6cngvj5ivd9kg5ajcdl2vlp2ocj5fjbto.me^ +manytoon.com##.ad +||freecomiconline.me/*.gif^$image +compsmag.com##+js(nostif, jQuery) +vulture.com##+js(aeld, /^(?:click|mousedown)$/, latest!==) +ilmeteo.it##+js(nostif, google_jobrunner) +ilmeteo.it###banner-mnz-topleft:style(height: 80px !important) +rangerboard.com##+js(acs, $, btoa) +@@||rangerboard.com^$ghide +rangerboard.com##.adsbygoogle +rangerboard.com##+js(no-xhr-if, googlesyndication) +beermoneyforum.com##+js(acs, $, Adblock) +beermoneyforum.com##.is-active.overlay-container:has(div[data-position] > center > a) +beermoneyforum.com##.samBackground:style(background-image:none !important) +beermoneyforum.com##.samBackgroundItem.samItem +beermoneyforum.com##body:style(overflow: auto !important) +@@||ploudos.com^$ghide +beegsexxx.com##+js(aopr, document.dispatchEvent) +beegsexxx.com##.preview:has(> .prev > script[data-ad_sub]) +beeg.party##+js(nowoif) +spank-and-bang.com##+js(acs, decodeURI, decodeURIComponent) +tubxporn.com##+js(aopr, exoJsPop101) +pornone.com##+js(acs, $, adblock) +pornone.com##.vjs-paused > .warp +pornone.com##a[href*="//prtord.com/"] +pornone.com##.vjs-info-top +||pornone.com/js/combined.js +! sythe.org anti adb +sythe.org##+js(acs, $, adblocker) +sythe.org##+js(acs, document.getElementsByTagName, adblocker) +/?referral=sythe$all +||sythe.org/*.php$3p +/sytheb$all +/^https:\/\/([a-z]+\.)?sythe\.org\/[\w\W]{30,}/$image +*$image,redirect-rule=1x1.gif,domain=sythe.org +@@||sythe.org/*.png|$image,1p +@@||sythe.org/*.jpg?$image,1p +||i.imgur.com/*.mp4$media,domain=sythe.org +sythe.org##div[style="width: 100%; display: block; text-align: center;"] +sythe.org###topadplaceholder +wg-gesucht.de##+js(acs, $, detectAdBlocker) +mp4mania1.net##+js(aopr, LieDetector) +mp4mania1.net##.advert +mp4mania1.net##.prop_native1 +mp4mania1.net##[href^="https://ak.naiwoalooca.net/"] +||undefined^$script,redirect=noopjs +||d3g5ovfngjw9bw.cloudfront.net^$script,redirect=noopjs +khatrimaza.*##+js(aeld, , 0x) +khatrimaza.*##+js(acs, puShown, /doOpen|popundr/) +khatrimaza.*##+js(no-xhr-if, ads) +okhatrimaza.*##+js(acs, Object.defineProperty, XMLHttpRequest) +khatrimaza.*##+js(nostif, showModal) +tapetus.pl##+js(nostif, /^/) +*$script,redirect-rule=noopjs,domain=tapetus.pl +tapetus.pl##+js(acs, $, setTimeout) +tapetus.pl##div[style="box-sizing: border-box; padding:0px 5px 0px 0px; text-align:center;"] +yabiladi.com##+js(set, adBlockDetected, null) +livegore.com##+js(acs, atob, decodeURIComponent) +livegore.com##+js(aopr, LieDetector) +megaplayer.bokracdn.run##+js(aeld, DOMContentLoaded, .ready) +megaplayer.bokracdn.run##.blockingAd, .popBannerTeaser +pestleanalysis.com##+js(set, blockAdBlock._options.baitClass, null) +ouo.*,mirrorace.com,7starhd.*##+js(acs, String.fromCharCode, /'shift'|break;/) +*$media,redirect-rule=noopmp3-0.1s,domain=eroasmr.com +eroasmr.com##.elite_vp_videoPlayerAD +||eroasmr.com/preroll$xhr,1p +||eroasmr.com/postroll$xhr,1p +eroasmr.com##+js(trusted-rpnt, script, vastTag, v) +gaystream.pw##+js(aopr, adsbyjuicy) +gaystream.pw##.a-block +! twistedporn .com popup +twistedporn.com##+js(nowoif) +@@||paypou.com^$ghide +||paypou.com/newbanner +||oklivetv.com^$xhr,1p,redirect-rule=nooptext +*$script,redirect-rule=noopjs,domain=oklivetv.com +!#if env_firefox +@@||oklivetv.com^$xhr,script,css,1p +!#endif +@@||althub.club^$ghide +althub.club##+js(rmnt, script, Adblock) +sukidesuost.info##+js(nosiif, visibility, 1000) +@@||extremeoverclocking.com^$ghide +@@||burzowo.info^$1p,script +globes.co.il##+js(set, document.blocked_var, 1) +globes.co.il##+js(set, ____ads_js_blocked, false) +jardiner-malin.fr##+js(set, wIsAdBlocked, false) +*$script,3p,denyallow=google.com|gstatic.com,domain=skidrowcodex.net +ymp4.download##+js(nowoif) +ymp4.download###mp3button +eoreuni.com##+js(aopr, adBlockDetected) +eoreuni.com##a[href^="https://iherb.co/"] +! webcreator-journal.com anti adb +webcreator-journal.com##+js(acs, document.addEventListener, google_ad_client) +shinden.pl##+js(acs, document.createElement, shift) +@@||reklama.shinden.eu^$frame,domain=shinden.pl +tw-calc.net##+js(set, WebSite.plsDisableAdBlock, null) +tw-calc.net##.horizontal_large.container +tw-calc.net##.vertical.container +tw-calc.net##.vertical_large.container +tw-calc.net##.vertical_large_2.container +pornomoll.*##+js(nostif, innerText, 2000) +pornomoll.*##+js(aeld, , _blank) +/clc?aid=$all +supermarches.ca##+js(acs, $, css) +watchpornx.com##+js(aopr, document.dispatchEvent) +watchpornx.com##+js(aopr, jsUnda) +watchpornx.com##+js(nowoif) +watchpornx.com##+js(acs, puShown, /doOpen|popundr/) +watchpornx.com###execphp-2 +watchpornx.com###overlays +vidop.*##+js(nowoif) +! lagacetadesalamanca.es video ads +lagacetadesalamanca.es##+js(aopr, videootv) +seriemega.*##+js(nowoif) +seriemega.*##.bnr +swame.com##+js(set, is_adblocked, false) +ohmybrush.com##+js(set, ads_blocked, false) +@@||pigy.cz^$ghide +thatav.net##+js(aopr, decodeURI) +||thatav.net/sw.js$script,1p +pugam.com##+js(acs, jQuery, ai_adb) +@@||top10newgames.com^$ghide +@@||25cineframes.com^$ghide +25cineframes.com##ins.adsbygoogle +rojadirecta-tv-en-vivo.blogspot.com##+js(acs, String.fromCharCode, atob) +talkceltic.net##+js(set, samDetected, false) +@@||splitshire.com^$ghide +splitshire.com##.adsbygoogle:upward(.row-container) +splitshire.com##.ezoic-ad +@@||kwamkidhen.com^$ghide +kwamkidhen.com##[id*="ScriptRoot"] +kwamkidhen.com##ins.adsbygoogle +pdfindir.net##+js(aeld, , _0x) +autoroad.cz##+js(nostif, check) +! 1stcollegescholarship .net anti adb +@@||1stcollegescholarship.net^$ghide +! 3dmonitortips .com anti adb +@@||3dmonitortips.com^$ghide +womenreality.com##+js(nosiif, visibility, 1000) +@@||starbits.io^$ghide +comousarzararadio.blogspot.com##+js(aopr, adBlockDetected) +comousarzararadio.blogspot.com###HTML10, #HTML9 +infocorp.io##+js(aopr, detectAdBlocker) +! isohunt2 .net / isohunt. nz popups ads +isohunt.*##+js(nowoif) +||isohunt*.*/nordvpn/$frame +guncelkaynak.com##+js(acs, jQuery, ai_adb) +addictinggames.com##+js(aopr, Drupal.behaviors.agBlockAdBlock) +addictinggames.com#@#.ad_container +addictinggames.com#@#.add-bx +addictinggames.com##.add-bx:style(height: 0px !important; min-height: 0px !important;) +@@*$ghide,domain=4bigv.com|5278cc.co|accountingplus786.blogspot.com|aetools.blogspot.com|antenadosnaskyecia.com|apprendrelekabyle.com|asianexpress.co.uk|buxearn.com|coinrotation.com|comparatif-logiciels.fr|cours-de-droit.net|dicionarioconceitos.blogspot.com|edukalife.blogspot.com|engquimicasantossp.com.br|firefiles.us|football-highlight.com|gastroepato.it|gozd-les.com|granadaesnoticia.com|hayastantv.me|hunter.fm|info-desk.co.za|l2top.co|letras2.com|lootdb.com|metalymetal.com|mtabrasil.com.br|nekomeowmeow.com|numbersinwords.net|oztoml.com|rcbinfo.com|redheadpassions.com|remixsearch.es|rendaclix.com|tamilfunda.com|teknolojiprojeleri.com|tercihiniyap.net|top100golfcourses.com|transpassions.com|viewster.co|vww.yggtorrent.fr|walkingenglishman.com|wikihandbk.com +letras2.com##+js(nostif, nextFunction, 450) +cours-de-droit.net,football-highlight.com,gastroepato.it,granadaesnoticia.com,hayastantv.me,hunter.fm,info-desk.co.za,lootdb.com,mtabrasil.com.br,nekomeowmeow.com,numbersinwords.net,oztoml.com,redheadpassions.com,teknolojiprojeleri.com,tercihiniyap.net,vww.yggtorrent.fr,walkingenglishman.com,wikihandbk.com##ins.adsbygoogle +nekomeowmeow.com###text-6 +nekomeowmeow.com###text-5 +hunter.fm##.pwby_hiper +l2top.co##.main-top-ads +l2top.co##.rightBarAd +l2top.co##div.leftBarAd +l2top.co###bannerads-background +mtabrasil.com.br##.banner +redheadpassions.com,transpassions.com###header_ad_banner +viewster.co##.ads +xda-developers.com##+js(rc, twig-body) +@@||hiphopa.net^$ghide +||d10ydmitx7crxz.cloudfront.net^ +||extra69.net^$3p +@@||imedikament.de^$ghide +vosfemmes.com,voyeurfrance.net##+js(set, is_adblocked, false) +vosfemmes.com,voyeurfrance.net##+js(rmnt, script, /isAdBlocked|popUnderUrl/) +vosfemmes.com,voyeurfrance.net##+js(set-cookie, dscl2, 1) +sms-anonyme.net##+js(nowebrtc) +@@||sms-anonyme.net^$ghide +sms-anonyme.net##ins.adsbygoogle +portable4pc.com##+js(nosiif, visibility, 1000) +portable4pc.com##+js(aost, document.getElementById, adsBlocked) +kochamjp.pl##+js(set, blockAdBlock._options.baitClass, null) +||doubleclick.net^$frame,redirect=noopframe,domain=cpu-world.com +@@||pagead2.googlesyndication.com/pagead/managed/js/adsense/*/show_ads_impl$script,domain=cpu-world.com +@@||cpu-world.com^$ghide +cpu-world.com##ins.adsbygoogle +comparteunclic.com##+js(aopr, NoAdBlock) +localizaagencia.com##+js(nosiif, visibility, 1000) +tech-blogs.com##+js(nostif, mdp) +pghk.blogspot.com##+js(acs, addEventListener, google_ad_client) +upnewsinfo.com##+js(aopr, mMCheckAgainBlock) +punisoku.blogo.jp##+js(acs, url, Math.random) +@@||eska.pl^$ghide +resetoff.pl##+js(set, ads_unblocked, true) +logi.im##+js(nostif, adsbygoogle) +yourporngod.com##+js(acs, String.fromCharCode, 'shift') +yourporngod.com##+js(set, flashvars.adv_pre_vast, '') +yourporngod.com##+js(set, flashvars.adv_pre_vast_alt, '') +@@||yourporngod.com^$ghide +*$script,3p,denyallow=gstatic.com,domain=yourporngod.com +bussyhunter.com##+js(rpnt, script, /protect_block.*?\,/) +mentalfloss.com##+js(set, countClicks, 0) +/wp-content/plugins/eazy-ad-unblocker/*$script,css +adala-news.fr###eazy_ad_unblocker_dialog-message +anomize.xyz##+js(nano-sib) +anomize.xyz##+js(nosiif, visibility, 1000) +medebooks.xyz##+js(nostif, ai_adb) +anonymousceviri.com##+js(acs, addEventListener, nextFunction) +lavozdigital.es##+js(aopr, NREUM) +digitalstudiome.com##+js(aopr, adBlockDetected) +freepornhdonlinegay.com##+js(aopw, decodeURI) +tutorialforlinux.com##+js(set, blockAdBlock._options.baitClass, null) +||googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect=noop.js:10,domain=nsspot.herokuapp.com +uprafa.com##+js(set, settings.adBlockerDetection, false) +uprafa.com###stickyFooterBoxColseBtn +breatheheavy.com##+js(nostif, eabdModal) +megaflix.*##+js(nowoif) +wenxuecity.com##+js(acs, onload, adsbygoogle) +wenxuecity.com##+js(nostif, ab_root.show) +wenxuecity.com##+js(no-fetch-if, googlesyndication) +casos-aislados.com##+js(nosiif, visibility, 1000) +zipi.com##.ad +! brstej .com ads + popups +brstej.com##+js(aeld, , _0x) +! ads, popups +topwwnews.com##+js(aeld, , _0x) +*$script,3p,domain=topwwnews.com +smartwebsolutions.org##+js(acs, $, .show) +jootc.com##+js(aost, String.prototype.charCodeAt, ai_) +jootc.com##.ai_widget +freeomovie.to##+js(nosiif, visibility, 1000) +freeomovie.to##+js(acs, String.fromCharCode, 'shift') +pasteit.*##+js(noeval-if, AdBlock) +*$xhr,redirect-rule=nooptext,domain=freebinchecker.com +@@||geekprank.com^$ghide +freshstuff4u.info##+js(acs, addEventListener, google_ad_client) +freshstuff4u.info##div.widget_list_mag_wp_300px, .img-200 +anoboy.*##+js(acs, addEventListener, google_ad_client) +anoboy.*##div#judi2, #coloma, [href^="//kokipoker.net"] +anoboy.*##[href^="https://bit.ly/"] +anoboy.*##[href^="http://click2go.me/"] +anoboy.*###popup_box +anoboy.*###popup_bawah +turkrock.com##+js(acs, $, .show) +||c.amazon-adsystem.com/aax2/apstag.js$script,domain=foxnews.com,important +||googletagmanager.com^$script,domain=foxnews.com,important +||imasdk.googleapis.com/js/sdkloader/ima3_debug.js$domain=foxnews.com,important +foxnews.com##.site-header:style(min-height: 90px !important) +@@||85videos.com^$ghide +85videos.com##.sponsor +85videos.com###pop +85videos.com##.haha-body +hamakei.com###topBnr, #recBanner, .partner +key-hub.eu##+js(no-fetch-if, ads) +key-hub.eu##+js(nostif, gaData) +@@||key-hub.eu^$ghide +key-hub.eu##ins.adsbygoogle +@@||key-hub.eu/$1p,script +*$script,redirect-rule=noopjs,domain=bandab.com.br +bandab.com.br##.widget_publicidade +gtamaxprofit.com##+js(acs, $, wrapfabtest) +@@||myuploadedpremium.de^$ghide +myuploadedpremium.de##+js(aost, $, /(?=^(?!.*(https)))/) +myuploadedpremium.de##ins.adsbygoogle +myuploadedpremium.de###babasbmsgx +myuploadedpremium.de##.copyright > .card +@@||souqsky.net^$ghide +souqsky.net##+js(aopw, Fingerprint2) +@@||ubeat.tv^$ghide +@@||animesanka.*^$ghide +*$image,redirect-rule=1x1.gif,domain=animesanka.* +animesanka.*##[id*="-ads-"] +@@||napolitoday.it^$ghide +! jetanimes .com popups +jetanimes.*##+js(ra, href, #clickfakeplayer) +ephoto360.com##+js(acs, $, Adblock) +! movies07. art / .live anti adb +movies07.*##+js(aeld, , pop) +hpaudiobooks.*##+js(acs, String.fromCharCode, 'shift') +hpaudiobooks.*##^script:has-text('shift') +hpaudiobooks.*##^script:has-text(\'shift\') +gaydelicious.com##+js(aost, String.prototype.charCodeAt, ai_) +##[href^="//mellowads.com/"] +wwwfotografgotlin.blogspot.com##+js(set, fuckAdBlock._options.baitClass, null) +*$script,3p,denyallow=blogger.com|bootstrapcdn.com|cloudflare.com|cloudflare.net|gitcdn.link|githack.com|google.com|googleapis.com|gstatic.com|recaptcha.net,domain=wwwfotografgotlin.blogspot.com +||cpmlink.net^$3p +||unbrick.id^$3p +@@||viralfeed.*^$ghide +viralfeed.*##.admania-widgettit +! pornhail .com ads +*$script,3p,denyallow=cloudflare.com,domain=pornhail.com +pornhail.com##.bottom-blocks +! reamporn .com ads +*$script,3p,denyallow=cloudflare.com|cloudflare.net|googleapis.com|jquery.com|jsdelivr.net|netdna-cdn.com|rawgit.com,domain=reamporn.com +*.php$script,frame,domain=reamporn.com +reamporn.com##.vid-ave-ins +reamporn.com###bnclose +xxxmax.net##^script:has-text('shift') +xxxmax.net##^script:has-text(\'shift\') +xxxmax.net##+js(acs, String.fromCharCode, 'shift') +@@*$ghide,domain=uploadrar.* +uploadrar.*###commonId > a[target="_blank"] +uploadrar.*##main > center > a.btn-primary +uploadrar.*##form > center:has(.btn):has([href]) +uploadrar.*##.footer, span > .text-muted, .card, .m-2.submit-btn.btn-primary.btn +uploadrar.*##.fs-5, p, ul, li, #how-to-open, .download-controls, .ad-box + center +uploadrar.*##.ad-label, .adsbygoogle +uploadrar.*##+js(acs, document.documentElement, break;case $.) +uploadrar.*##+js(nano-stb, /.?/, *) +||pixeltrey.com^ +damndelicious.net,simplywhisked.com##+js(aopr, __eiPb) +@@||weibomiaopai.com^$ghide +linfoweb.com##+js(acs, Math.floor, document.write) +linfoweb.com##ins.adsbygoogle-wrapper +||texto.click^$3p +||contextbar.ru^$3p +*$script,3p,denyallow=cloudflare.com,domain=storieswatch.com +sexodi.com##+js(set, ads_unblocked, true) +sexodi.com##.background-cloud:style(display: none !important;) +sexodi.com###video_reklamy +upxin.net##+js(aeld, load, onload) +dayoftheweek.org##+js(nosiif, visibility, 1000) +@@||world-sms.org/get-ad/$xhr,1p +world-sms.org##.promoBlock +mypussydischarge.com##+js(aopr, adBlockDetected) +mypussydischarge.com##+js(aopr, decodeURI) +@@||arab4load.com^$ghide +sms24.*##body > div[style^="position: fixed; z-index: 1000"] +sms24.*##+js(aost, $ado, /ado/i) +sms24.*##+js(aost, document.createElement, app.js) +sms24.*##.ado-header +sms24.*##.ado-content +sms24.*##.placeholder:remove-class(placeholder) +@@||sms24.$ghide +hentaistream.com##+js(aeld, load, script) +hentaistream.com##+js(noeval-if, popUnderStage) +! popups hhkungfu. cash +hhkungfu.*##+js(nowoif) +*$xhr,redirect-rule=nooptext,domain=pricez.co.il +@@||fark.com/js/$1p,script +||sexy-egirls.com/sexy-egirls.com.mp4$media,1p,redirect=noopmp3-0.1s +@@||metro.co.uk^$ghide +metro.co.uk###we-need-monies +metro.co.uk##.ad-slot-container +metro.co.uk###connatix_placeholder_desktop +metro.co.uk##.metro__ad_area_left +metro.co.uk##.metro__ad_area_right +metro.co.uk###taboola-feed-container +metro.co.uk###taboola-below-article-thumbnails +javmvp.com##+js(aopr, __Y) +cracking.org##+js(acs, $, samAdBlockAction) +cracking.org##+js(acs, RegExp, googlebot) +softwaresde.com##+js(acs, $, advert) +! Amazon Music ads +||cloudfront.net^*.mp3|$media,redirect=noopmp3-0.1s,domain=music.amazon.com|music.amazon.ca|music.amazon.co.uk|music.amazon.fr|music.amazon.de|music.amazon.it|music.amazon.es|music.amazon.co.jp|music.amazon.com.au|music.amazon.com.mx +badassdownloader.com##+js(set, bscheck.adblocker, noopFunc) +badassdownloader.com,badasshardcore.com,badassoftcore.com##+js(nostif, innerHTML) +quickporn.net##+js(set, qpcheck.ads, noopFunc) +badassoftcore.com,badassdownloader.com,badasshardcore.com,quickporn.net###ban-cont +camarchive.tv##+js(no-fetch-if, popunder) +@@||pikwizard.com^$ghide +pikwizard.com##.sponsor-text +pikwizard.com##[href*="tradedoubler"] +! As of 2016-12-02, found site uses WebRTC to deliver ads +tomshardware.*##+js(aopw, tmnramp) +@@||teleboy.ch/assets/js/*$xhr,1p +teleboy.ch##a[href*="BrandingDay"] +ddownr.com##+js(nowoif) +keepv.id##+js(nowoif) +savethevideo.com##+js(nowoif) +savefrom.net##+js(nowoif, !sf-converter.com) +savefrom.net##+js(trusted-set, clickAds.banner.urls, 'json:[{"url":{"limit":0,"url":""}}]') +audiostereo.pl##div[style="margin-bottom: 10px;"] > a[href][target="_blank"], [href^="https://salony.nautilus.net.pl/"] +freelistenonline.com##+js(set, fuckAdBlock._options.baitClass, null) +fabioambrosi.it##+js(nostif, ad) +! Appears related to uponit.com +! Somehow, websocket requests are behind-the-scene with Firefox. Pending +! further investigation, this fixes the issue. +! ||4chan.org^$csp=connect-src https: http: +! *$script,3p,denyallow=4cdn.org|4chan.org|cloudflare.com|google.com|gstatic.com|hcaptcha.com|mathjax.org|spur.us,domain=boards.4channel.org +! *$script,3p,denyallow=4cdn.org|4channel.org|cloudflare.com|google.com|gstatic.com|hcaptcha.com|mathjax.org|spur.us,domain=4chan.org +artesacro.org##+js(acs, onload, adb) +curto.win##+js(aopr, app_vars.force_disable_adblock) +curto.win##+js(aeld, click, trigger) +*$frame,3p,domain=curto.win +||avantajados.com^$3p +kontrolkalemi.com##+js(aopr, adBlockDetected) +@@||gamebrew.org^$ghide +gamebrew.org##ins.adsbygoogle +gamebrew.org##+js(no-fetch-if, method:HEAD) +drtuber.*##+js(nowoif) +drtuber.*###video_list_banner +drtuber.*##.abtext +drtuber.*##.drt-spot-box +drtuber.*##.f_width.footer > .item_box +drtuber.*##.fh.heading +drtuber.*##.item_spots +drtuber.*##.livecams_main +drtuber.*##.puFloatLine +drtuber.*##.title-sponsored +||drtuber.*/footer_tiz.php +||drtst.com/promo/banners/ +drtuber.*###spot_video_partner_banner +m.drtuber.com###banner_overlay-postitial-video:remove() +takimag.com##+js(acs, document.getElementById, show_ads) +xsanime.com##+js(nosiif, _0x) +xsanime.com##+js(aeld, , _0x) +xsanime.com##+js(aopr, console.clear) +*$script,domain=xsanime.com,3p,denyallow=chatango.com|cloudflare.com|disqus.com|disquscdn.com|onesignal.com +ytboob.com##+js(aopr, document.dispatchEvent) +gsmfirmware.net##+js(acs, eval, ignielAdBlock) +! uploadraja .com ads +uploadraja.com##+js(acs, getCookie) +||uploadraja.com/sw.js$script,1p +||gamezop.com^$domain=uploadraja.com +||eriegentsfse.info^ +uploadraja.com##a[href^="https://so-gr3at3.com/"] +@@||f1countdown.com^$ghide +@@||stgeorgeutah.com^$ghide +stgeorgeutah.com##.main-top-ad +@@||distro.tv^$ghide +lookimg.com##+js(nosiif, visibility, 1000) +yellowbridge.com##+js(nostif, blocker) +yellowbridge.com##+js(set, isContentBlocked, falseFunc) +! ||spotify.com/storage-resolve/files/audio/interactive/*$xhr,domain=open.spotify.com +||adxcel.com^ +||akamaized.net/audio/$media,redirect=noop-1s.mp4:10,from=open.spotify.com +||scdn.co/audio/$media,redirect=noop-1s.mp4:10,domain=open.spotify.com +||scdn.co/mp3-ad/$media,redirect=noop-1s.mp4:10,domain=open.spotify.com +||scdn.co/mp3/$media,redirect=noop-1s.mp4:10,domain=open.spotify.com +||spotifycdn.com/audio/$media,redirect=noop-1s.mp4:10,domain=open.spotify.com +||amillionads.com^$media,redirect=noop-1s.mp4:10,from=open.spotify.com +||2mdn.net^$media,redirect=noop-1s.mp4:10,domain=open.spotify.com +||adxcel.com^$media,redirect=noop-1s.mp4:10,domain=open.spotify.com +||adstudio-assets.scdn.co^$media,redirect=noop-1s.mp4:10,domain=open.spotify.com +||spotify.com/ad-logic/$media,redirect=noop-1s.mp4:10,domain=open.spotify.com +*$media,3p,redirect-rule=noop-1s.mp4:10,domain=open.spotify.com +@@||podscribe.com/rss/$media,domain=open.spotify.com +@@||mgln.ai/e/$media,domain=open.spotify.com +@@/traffic.megaphone.fm/*.mp3^$media,domain=open.spotify.com +/traffic.megaphone.fm/*.mp3^$media,domain=open.spotify.com,urlskip=/(traffic\.megaphone\.fm\/\w+\.mp3)/ +https +ilgeniodellostreaming.*##+js(aopr, AaDetector) +ilgeniodellostreaming.*##+js(nowoif) +ilgeniodellostreaming.*##.opbtn.bnnr1 +ilgeniodellostreaming.*##.opbtn.bnnr2 +ilgeniodellostreaming.*##.opbtn.wp-content +ilgeniodellostreaming.*##[href*=".php"] +ilgeniodellostreaming.*##.alert-warning +safevideo.click##[meta-link="/video.html"] +v1.safevideo.click##.butt +v1.safevideo.click##.hov +v1.safevideo.click###register-overlay +v1.safevideo.click###custom-video +v1.safevideo.click###video-container +arabianbusiness.com##+js(aopr, adBlockDetected) +tattle.life##+js(nostif, prompt, 1000) +tattle.life##.visitorAdPost +eskiceviri.blogspot.com##+js(aopr, adBlockDetected) +eskiceviri.blogspot.com##+js(acs, puShown, /doOpen|popundr/) +siteunblocked.info,theproxy.app##+js(nowoif) +/app14.js$domain=siteunblocked.info|theproxy.app +/g12.js$domain=siteunblocked.info|theproxy.app +siteunblocked.info,theproxy.app##.all-linked +siteunblocked.info##+js(aopr, GetWindowHeight) +siteunblocked.info##+js(aopr, decodeURIComponent) +/hy.js$script,domain=siteunblocked.info +||siteunblocked.info/zpp/*$script,domain=siteunblocked.info +siteunblocked.info##+js(aeld, , /pop|wm|forceClick/) +siteunblocked.info##.antoic +siteunblocked.info##[id^="cookieConsent"] +||declk.com^$all +animeblkom.net##+js(set, blockAdBlock._options.baitClass, null) +animeblkom.net##+js(set, CloudflareApps.installs.Ik7rmQ4t95Qk.options.measureDomain, undefined) +vid4up.*###aoverlay +vid4up.*##+js(nowoif) +convert2mp3.tv##[href="/banner.html"] +cardiagn.com##+js(nostif, mdp) +@@||aosmark.com^$ghide +aosmark.com##+js(set, detectAB1, noopFunc) +@@||legrandrex.com^$ghide +@@||trueid.net^$ghide +baritoday.it##+js(nostif, bADBlock) +earncash.*##+js(aopr, app_vars.force_disable_adblock) +mashtips.com##+js(nostif, ai_adb) +ministryofsolutions.com##+js(acs, addEventListener, google_ad_client) +dj-figo.com##+js(aopr, adBlockDetected) +xiaomitools.com##+js(acs, addEventListener, google_ad_client) +link1s.*##+js(aopr, app_vars.force_disable_adblock) +link1s.*##+js(aopr, open) +link1s.*##.banner-inner +kiemlua.com,link1s.*###baolink1s +anhdep24.com##+js(acs, eval, replace) +anhdep24.com##.popup-container, .text-center h2~*, .text-center h2, .site-logo +anhdep24.com#@##link1s-wait1 +dreamcheeky.com,fidlarmusic.com,jncojeans.com,kiemlua.com,kingsleynyc.com,lucidcam.com,nguyenvanbao.com,nousdecor.com,publicananker.com,restorbio.com,staaker.com##+js(nano-sib, counter, *) +link1s.*##+js(set, blurred, false) +dreamcheeky.com,fidlarmusic.com,jncojeans.com,kiemlua.com,kingsleynyc.com,lucidcam.com,nguyenvanbao.com,nousdecor.com,publicananker.com,restorbio.com,staaker.com###link1s-link +dreamcheeky.com,fidlarmusic.com,jncojeans.com,kiemlua.com,kingsleynyc.com,lucidcam.com,nguyenvanbao.com,nousdecor.com,publicananker.com,restorbio.com,staaker.com###link1s-wait1 +dreamcheeky.com,fidlarmusic.com,jncojeans.com,kiemlua.com,kingsleynyc.com,lucidcam.com,nguyenvanbao.com,nousdecor.com,publicananker.com,restorbio.com,staaker.com###link1s-generate +dreamcheeky.com,fidlarmusic.com,jncojeans.com,kiemlua.com,kingsleynyc.com,lucidcam.com,nguyenvanbao.com,nousdecor.com,publicananker.com,restorbio.com,staaker.com###link1s-snp:style(display:block!important) +*$3p,denyallow=bootstrapcdn.com|cloudflare.com|consensu.org|google.com|googleapis.com|gstatic.com|hcaptcha.com|jquery.com|jsdelivr.net|recaptcha.net,domain=link1s.* +||i.imgur.com^$image,domain=anhdep24.com|dreamcheeky.com|fidlarmusic.com|kiemlua.com|lucidcam.com|nousdecor.com|publicananker.com +kiemlua.com,link1s.com##+js(noeval-if, /chp_?ad/) +kiemlua.com##^script:has-text(Adblock) +!#if !cap_html_filtering +kiemlua.com##+js(rmnt, script, Adblock) +!#endif +mynet.com##+js(nostif, googlefc) +dropshipin.id##+js(acs, $, ads) +haddoz.net##+js(set, adBlockDetected, noopFunc) +||static.adsafeprotected.com/vans-adapter-google-ima.js$script,redirect=noopjs,domain=motortrend.com +necksdesign.com##+js(nosiif, visibility, 1000) +hollywoodpq.com##+js(acs, document.querySelector, adb) +hollywoodpq.com##div.oboxads +! vidlo .us popups +vidlo.us##+js(aeld, , _0x) +brofist.io##.menuOverlay +larvelfaucet.com##+js(acs, addEventListener, nextFunction) +larvelfaucet.com##+js(nosiif, visibility, 1000) +larvelfaucet.com##+js(aeld, load, block) +larvelfaucet.com##[class^="bmadblock"] +larvelfaucet.com###bottomRightFloatingAd +larvelfaucet.com##ins[style] +larvelfaucet.com##.col-12 > div[style="display: inline-block"] +larvelfaucet.com###ptcAdIframe +larvelfaucet.com##[href^="https://larvelfaucet.com/ads-"] +*$object,redirect-rule=noopframe,domain=larvelfaucet.com +@@||larvelfaucet.com/images/ad_$image,1p +getdogecoins.com##+js(aopr, show_ads) +getdogecoins.com##[class^="bmadblock"] +youranshare.com##+js(acs, $, .init) +forumdz.com##+js(nostif, offsetHeight) +momzr.com##.item:has(> iframe) +*$script,3p,denyallow=fluidplayer.com|google.com|gstatic.com|googleapis.com|recaptcha.net|hcaptcha.com|hwcdn.net,domain=momzr.com +depo-program.blogspot.com##+js(acs, addEventListener, google_ad_client) +gototub.*##+js(nowoif) +quicasting.it##+js(nosiif, visibility, 1000) +blasianluvforever.com##+js(aopr, adBlockDetected) +freewatchserialonline.com##+js(acs, XMLHttpRequest, ActiveXObject) +@@||freewatchserialonline.com^$ghide +freewatchserialonline.com##[data-zone] +*$script,3p,domain=freewatchserialonline.com,denyallow=tvlogy.to|bootstrapcdn.com|disquscdn.com|disqus.com|fbcdn.net|facebook.net|fastly.net|fastlylb.net|jquery.com|hwcdn.net|hcaptcha.com|recaptcha.net|cloudflare.com|cloudflare.net|google.com|googleapis.com|gstatic.com|jwpcdn.com +creatur.io##+js(set, canRunAds, true) +@@||robofight.io/*/ads.js$script,1p +robofight.io##div.side-loadout-item:nth-of-type(3) +robofight.io##.home-banner +*$script,redirect-rule=noopjs,domain=booogle.net +tricksplit.io##+js(set, blockAdBlock, trueFunc) +tricksplit.io##p:has-text(Advertisement) +tricksplit.io##div:has(> .adsbygoogle) +tricksplit.io##div[class^="ads_longAd_"] +*$script,redirect-rule=noopjs,domain=dcode.fr +@@||dcode.fr^$ghide +dcode.fr##ins.adsbygoogle +dcode.fr##div[id^="div-gpt-ad"] +@@||dcode.fr^$xhr,1p +*$xhr,redirect-rule=nooptext,domain=ctrlv.* +ctrlv.*##a.download[target="_blank"]:not(a[href*="ctrlv."]):remove() +ctrlv.*##+js(set, uBlockOriginDetected, false) +||protagcdn.com/s/ctrlv.cz/site.js$script,redirect=noopjs,domain=ctrlv.* +ctrlv.*##+js(no-fetch-if, doubleclick) +fikiri.net##+js(nostif, mdp) +@@||librevpn.org^$script,1p +racaty.*##+js(aopw, Fingerprint2) +racaty.*##+js(nowebrtc) +! imgcredit.xyz popunder +imgcredit.xyz##+js(aopr, exoJsPop101) +pagalmovies.*,7starhd.*,jalshamoviez.*,9xupload.*,bdupload.*,desiupload.*,rdxhd1.*##+js(aeld, , /_0x|localStorage\.getItem/) +@@||couponcabin.com^$ghide +malaysiastock.biz##+js(aopr, google_ad_status) +malaysiastock.biz##.RightPanel_Rectangle1 +*$xhr,redirect-rule=nooptext,domain=katholisches.info +biopills.net##+js(aost, encodeURIComponent, inlineScript) +@@||atozmath.com^$ghide +@@||atozmath.com/Scripts/advertisement.js$xhr,1p +atozmath.com##.videoDiscovery +@@||services.bilsyndication.com/adv1/*$script,domain=atozmath.com +@@||biltag.bilsyndication.com^$script,domain=atozmath.com +@@||assets.bilsyndication.com/prebid/default/*$script,domain=atozmath.com +||assets.bilsyndication.com/plugins/*$script,redirect=noopjs,domain=atozmath.com +@@||ssl.google-analytics.com/ga.js$script,domain=atozmath.com +*$image,redirect-rule=2x2.png,domain=atozmath.com +*$script,redirect-rule=noopjs,domain=atozmath.com +@@||assets.bilsyndication.com/plugins/cmptcf2/cmp-v2.0.1.js$script,domain=atozmath.com +@@||services.bilsyndication.com/passback/?t=$script,domain=atozmath.com +@@||services.bilsyndication.com^$xhr,domain=atozmath.com +@@||amazon-adsystem.com/aax2/apstag.js$script,domain=atozmath.com +atozmath.com###vi-smartbanner +atozmath.com##.adsbyvli:style(opacity: 0 !important; pointer-events: none !important;) +atozmath.com##+js(set, googletag._vars_, {}) +atozmath.com##+js(set, googletag._loadStarted_, true) +atozmath.com##+js(set, googletag._loaded_, true) +atozmath.com##+js(set, google_unique_id, 1) +atozmath.com##+js(set, google.javascript, {}) +atozmath.com##+js(set, google.javascript.ads, {}) +atozmath.com##+js(set, google_global_correlator, 1) +||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=google-ima.js:5,domain=atozmath.com +kangkimin.com##+js(nofab) +kangkimin.com##+js(nano-sib) +! fix anti adb +miniminiplus.pl##+js(json-prune, ads.servers.[].apiAddress) +loadsamusicsarchives.blogspot.com##+js(aopr, AaDetector) +||weatherforecastmap.com^$3p +xxxfiles.com##+js(aopr, AaDetector) +toppng.com##+js(nostif, nextFunction, 250) +battleboats.io##+js(nofab) +battleboats.io##+js(set, adBlocker, false) +||battleboats.io/menu-overlay.html^$frame +! Foil blocker-sniffer code on Condé Nast sites. +architecturaldigest.com,arstechnica.com,bonappetit.com,brides.com,cntraveler.com,epicurious.com,golfdigest.com,newyorker.com,pitchfork.com,self.com,teenvogue.com,vanityfair.com,vogue.com,wmagazine.com##+js(nofab) +newyorker.com##+js(set, paywallGateway.truncateContent, noopFunc) +newyorker.com##.journey-unit +newyorker.com##.paywall-registration-gate +rumahit.id##+js(acs, eval, ignielAdBlock) +@@||hexagame.io^$ghide +1bitspace.com##+js(acs, setTimeout, Constant) +1bit.space,1bitspace.com##+js(aopr, u_cfg) +@@||1bit.space/default/public/assets/*$script,1p +1bit.space##.active.bnsLayers.is-block-touch.is-grid +1bit.space##.bounceIn.animated.bnsLayers.is-block-touch.is-grid +friendproject.net##+js(set, adblock, false) +parispi.net##+js(aeld, DOMContentLoaded, adblock) +wirralglobe.co.uk##+js(aopr, _sp_._networkListenerData) +texte.work##+js(acs, addEventListener, google_ad_client) +cointelegraph.com##[href^="javascript:void(0)"] +cointelegraph.com##div[class*="componentAdbutler_"] +t-rocforum.de##+js(acs, $, prompt) +hyundaitucson.info##+js(remove-node-text, script, /adb|offsetWidth|eval/i) +hyundaitucson.info##+js(noeval-if, /adbl/i) +hyundaitucson.info##.display_ads +*$script,redirect-rule=noopjs,domain=puressh.net +ciudadblogger.com##+js(aeld, load, onload) +@@||tel-emporio10.blogspot.com^$ghide +*$image,redirect-rule=2x2.png,domain=tel-emporio10.blogspot.com +! exambd. net redirection +exambd.net##+js(set-local-storage-item, lastRedirect, true) +exambd.net##+js(rmnt, script, contextmenu) +||adsux.com^ +! quizglobal.com anti-adblock +@@||quizglobal.com^$ghide +quizglobal.com##div[ng-if="vm.showAds"] +quizglobal.com##ins.adsbygoogle +! husseinezzat .com anti adb +@@||husseinezzat.com^$ghide +abukabir.fawrye.com##+js(acs, addEventListener, nextFunction) +@@||indianwebseries.*^$ghide +*$xhr,domain=indianwebseries.*,redirect-rule=nooptext +indianwebseries.*##^script:has-text(detect) +@@||inews.co.uk^$ghide +inews.co.uk##.thanks-3xsWr +dosya.co##+js(nano-stb) +*$xhr,redirect-rule=nooptext,domain=dynast.io +deepfakeporn.net##+js(aopr, open) +deepfakeporn.net##.highlight ~ li > a[target="_blank"] +||deepfakeporn.net/contents/rest/player/deepswap_japanese +brighteon.com##+js(set, adBlockDisabled, true) +brighteon.com##+js(set, __NEXT_DATA__.props.pageProps.adVideo, undefined) +iklandb.com##+js(nano-sib) +iklandb.com##.black-overlay +iklandb.com##.whitecontent +@@||simply-debrid.com^$ghide +simply-debrid.com##.adsbygoogle:remove() +fantacalcio.it##+js(nostif, .offsetHeight, 100) +wgzimmer.ch##+js(aopr, adBlockDetected) +w3schools.com###tryitLeaderboard +!#if !env_mobile +w3schools.com###breadcrumb + .trytopnav:style(top: 36px!important;) +w3schools.com###tryitLeaderboard + .trytopnav:style(top: 0!important;) +w3schools.com###tryitLeaderboard + #breadcrumb ~ #container:style(top: 84px!important;) +w3schools.com###tryitLeaderboard + .trytopnav ~ #dragbar + #container:style(top: 48px!important;) +!#endif +!#if env_mobile +w3schools.com##.trytopnav:style(top: 0!important;) +w3schools.com###tryitLeaderboard ~ #container:style(top: 48px!important;) +!#endif +vviruslove.com##+js(nosiif, visibility, 1000) +linksaya.com##+js(acs, addEventListener, google_ad_client) +more.tv##+js(set, blockedElement, noopFunc) +more.tv##[class^=Banner_] +! onlinetvrecorder .com anti adb +@@||onlinetvrecorder.com^$xhr,1p +gamezop.com##+js(nosiif, debugger) +gamezop.com##[data-native-ad] +! youx .xxx popups ads +youx.xxx##+js(aeld, , _0x) +youx.xxx##+js(aopr, exoNoExternalUI38djdkjDDJsio96) +youx.xxx##+js(set, flashvars.adv_pause_html, '') +youx.xxx##.thumb_banner +||youx.xxx/*.php| +*$script,domain=outerspace.com.br,redirect-rule=noopjs +! awdescargas.com fake button +awdescargas.com##+js(aopw, smrtSB) +deseneledublate.com##+js(acs, Math, XMLHttpRequest) +deseneledublate.com##+js(aopr, AaDetector) +deseneledublate.com##+js(nowoif) +||i.imgur.com^$domain=deseneledublate.com +unity3diy.blogspot.com##+js(nosiif, visibility, 1000) +! sportbar .biz popups +sportbar.*##+js(nowoif) +politico.com##.gallery-carousel-ad +! heavy-r .com popunder / ads +heavy-r.com##[class^="adzone"] +||awdeliverynet.com^$3p +youtubetomp3.*##+js(nowoif) +youtubetomp3.*##a[href="/button.php"] +*$script,3p,denyallow=cloudflare.com|cloudflare.net|disqus.com|disquscdn.com|facebook.net|fastlylb.net|fbcdn.net|fluidplayer.com|google.com|googleapis.com|gravatar.com|gstatic.com|hwcdn.net|jsdelivr.net|wp.com,domain=veranime.*|verhentai.* +healthline.com##aside:has(div:matches-css-before(content:/ADVERTISEMENT/)) +healthline.com##div[data-empty^="true"]:matches-css-before(content:/ADVERTISEMENT/) +healthline.com##[class*="css"]:matches-css-before(content:/ADVERTISEMENT/) +healthline.com##[href*="redirect"]:upward(section) +healthline.com##hl-adsense +video1tube.com##+js(set, popit, false) +video1tube.com##+js(acs, btoa) +@@||mercedesclub.cz^$ghide +mercedesclub.cz##ins.adsbygoogle, [class^="side_ad_"] +! reddit adb tracking +@@||redditstatic.com^*/xads.js$script,domain=reddit.com +@@||overtakefans.com^$ghide +brawlhalla.fr##+js(nostif, check) +informaxonline.com##+js(no-xhr-if, googlesyndication) +informaxonline.com##+js(no-xhr-if, /ad) +informaxonline.com###wpsafe-generate, #wpsafe-link:style(display: block !important;) +informaxonline.com###wpsafe-generate, #wpsafe-link:others() +hentaifreak.org##+js(aopr, decodeURI) +hentaifreak.org##+js(aopw, onpopstate) +hentaifreak.org##+js(nostif, popState) +*.gif$image,domain=hentaifreak.org +@@||orangeobserver.com^$ghide +pimylifeup.com##+js(aopr, adthrive.config) +@@||chronicle.com/dg/default/rest/$xhr,1p +chronicle.com##.GoogleDfpAd-container +animepahe.*##+js(aopw, __C) +||uii.io^$3p +tecnotutoshd.net##+js(acs, eval, replace) +moneywar2.blogspot.com##+js(acs, addEventListener, google_ad_client) +*$script,redirect-rule=noop.js,domain=flowsoft7.com +checkfiletype.com##+js(nosiif, visibility, 1000) +@@||scrapbox.io^$xhr,1p +santoinferninho.com##+js(nosiif, visibility, 1000) +hypebeast.com##+js(nostif, ad-block-popup) +izismile.com###banner_code_rotator +izismile.com##.js-banner-top +dafideff.com##+js(acs, addEventListener, google_ad_client) +! world4ufree. plus antiadblock +world4ufree.*##+js(aeld, , _0x) +world4ufree.*##+js(acs, eval, replace) +krankheiten-simulieren.de##+js(nostif, exitTimer) +! venusarchives .com popups + anti adb +venusarchives.com##+js(aeld, , bi()) +venusarchives.com##+js(aopr, b2a) +errotica-archives.com##+js(ra, href, [href*="ccbill"]) +*$script,3p,denyallow=aechannel.com|ahacdn.me|rncdn7.com|disqus.com|jsdelivr.net|jwpcdn.com|fastly.net|fastlylb.net|jquery.com|hwcdn.net|recaptcha.net|cloudflare.com|cloudflare.net|google.com|googleapis.com|gstatic.com,domain=gayporno.fm +catholic.com##+js(nostif, innerHTML.replace) +trentotoday.it##+js(nostif, bADBlock) +@@||prinxy.app^$ghide +prinxy.app##.native-ads-wrapper +prinxy.app##.sticky-banner +angeloyeo.github.io##+js(nosiif, visibility, 1000) +annabelle.ch##+js(aopr, _sp_._networkListenerData) +csgo-ranks.com##+js(nosiif, visibility, 1000) +androidgreek.com##+js(aopr, adBlockDetected) +*$script,domain=ad-doge.com,redirect-rule=noopjs +ad-doge.com##+js(nostif, _0x) +fshost.me##+js(acs, onload, ajax) +fshost.me##+js(set, abu, falseFunc) +tutoganga.blogspot.com##+js(acs, addEventListener, google_ad_client) +royalkom.com##+js(nosiif, visibility, 1000) +super-ethanol.com##+js(nosiif, visibility, 1000) +thingiverse.com##+js(nano-sib) +thingiverse.com##[class*="ThingPage__topAd"] +thingiverse.com##[class^="ItemCardContainer__itemCard"]:has(> [title="Advertisement"]) +responsivevoice.org##.cp-modal-popup-container:remove() +samapkstore.com##+js(nosiif, visibility, 1000) +samapkstore.com##+js(nano-sib, countDown) +th-cam.com##+js(aopw, HTMLElement.prototype.insertAdjacentHTML) +th-cam.com##pp +jacksorrell.tv##+js(acs, jQuery, adblocker) +9xmovies.*##+js(nowoif) +cgtips.org##+js(rmnt, script, /adblock|var Data.*];/) +link.cgtips.org##+js(acs, addEventListener, google_ad_client) +link.cgtips.org##+js(set, countdown, 0) +cgtips.org##div[class*="better-ads-listitemad"]:remove() +saradahentai.com,hentaiarena.com##+js(aopr, document.dispatchEvent) +eddiekidiw.com##+js(acs, $, _ads) +blkom.com##+js(set, blockAdBlock._options.baitClass, null) +! gratispaste.com popup +gratispaste.com##.content > center +||za.gl^$script,3p +*$script,3p,denyallow=googleapis.com|jquery.com,domain=gratispaste.com +clipartmax.com##+js(nano-stb) +imagenesderopaparaperros.com##+js(acs, String.fromCharCode, 'shift') +imagenesderopaparaperros.com##+js(aopr, app_vars.force_disable_adblock) +imagenesderopaparaperros.com##+js(set, blurred, false) +freewebcart.com##+js(aost, Math, showModal) +freewebcart.com##+js(rmnt, script, var Data) +||wootly.ch^$csp=sandbox allow-forms allow-same-origin allow-scripts allow-modals allow-orientation-lock allow-pointer-lock allow-presentation allow-top-navigation +javhdporn.net###player_3x2_container_inner +javhdporn.net##+js(set, clientSide.adbDetect, noopFunc) +javhdporn.net##iframe[title="offer"] +techinferno.com##+js(nostif, eabpDialog) +xup.in##+js(nostif, clientHeight) +xup.in##div[style="width:728px; overflow:hidden; height:90px;"] +xup.in##div[style="width:300px;height:250px;position:relative;overflow:hidden;"] +xup.in##fieldset#option:nth-of-type(1) > [href^="https://www.xup.in/blog/"] +||sexei.net^$3p +adeth.cc##+js(nosiif, visibility, 1000) +! comicbook.com header-banner +comicbook.com##body > header:style(top:0 !important) +comicbook.com##body.pcm-public:style(margin-top: 84px !important;) +nulleb.com##+js(rmnt, script, deblocker) +*$xhr,redirect-rule=nooptext,domain=nulleb.com +*$script,3p,redirect-rule=noopjs,domain=staples.ca +! ohentai.org popup ads +ohentai.org##[class^="detail"][class*="iframecontainer"] +ohentai.org##[class^="listleaderboardcontainer"] +ohentai.org##.videobrick:has(> .videoadintro) +ohentai.org##+js(nowoif) +hentaicloud.com##+js(aeld, click, open) +hentaicloud.com##+js(set, decodeURI, noopFunc) +hentaicloud.com##+js(aopr, TotemToolsObject) +hentaicloud.com##+js(aopr, AaDetector) +hentaicloud.com##.vertical-ads-content +hentaicloud.com##.ad:upward(.horizontal-ads-content) +hentaicloud.com##section.videos-content:has(.thumbnail > a[href^="https://www.nutaku.net/signup/landing/"]) +! javdoe.to/javtc.fun popup ads +player.javtc.*###preroll +javfree.sh,javtc.*##[style^="height: 250px;overflow"] +*$script,3p,denyallow=cdndoe.xyz|cloudflare.com|doecdn.me|googleapis.com,domain=javfree.* +*$script,3p,domain=javdoe.to|javtc.* +javbangers.com##+js(acs, document.addEventListener, initBCPopunder) +javbangers.com##+js(acs, readCookieDelit) +javbangers.com##+js(acs, onload, puHref) +javbangers.com##+js(set, flashvars.adv_pre_vast, '') +javbangers.com##+js(set, flashvars.adv_postpause_vast, '') +javbangers.com##div.opt +*$script,3p,denyallow=fastly.net|google.com|googleapis.com|gstatic.com|h-cdn.com|javcdn.li,domain=javbangers.com +netfapx.com##[id^="ads-position"] +bikemania.org##[id^="blocker-modal-"] +apksvip.com##+js(aopr, app_vars.force_disable_adblock) +apksvip.com##+js(set, blurred, false) +linuxsecurity.com##+js(aeld, load, nextFunction) +linuxsecurity.com##.ad_prev_main +loader.to##+js(aopr, open) +lookcam.*##+js(set, canRunAds, true) +lookcam.*##div.prefix-adlabel +*$script,3p,denyallow=cloudflare.com|cloudflare.net|fastly.net|google.com|googleapis.com|gstatic.com|hcaptcha.com|jsdelivr.net|recaptcha.net,domain=manga4life.com +*$frame,script,3p,denyallow=cloudflare.com|cloudflare.net|google.com|googleapis.com|gstatic.com|hcaptcha.com|jsdelivr.net|fastly.net|recaptcha.net,domain=mangasee123.com +realityblurb.com##+js(aopr, HTMLIFrameElement) +drphil.com##+js(set, canRunAds, true) +drphil.com##.adBanner:style(height:1px !important) +||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=google-ima.js,domain=drphil.com +iade.com##+js(aopr, adBlockDetected) +*$script,3p,denyallow=bootstrapcdn.com|disqus.com|jsdelivr.net|jwpcdn.com|fastly.net|fastlylb.net|jquery.com|hwcdn.net|recaptcha.net|cloudflare.com|cloudflare.net|google.com|googleapis.com|gstatic.com|facebook.net,domain=pendujatt.net +4allprograms.me##+js(nostif, ai_adb) +||btcclicks.com^$3p +swift4claim.com##+js(nosiif, visibility, 1000) +swift4claim.com##.overlay2 +swift4claim.com##.overlay +swift4claim.com##ins[class][style="display:inline-block;width:728px;height:90px;"] +swift4claim.com##ins[class][style="display:inline-block;width:300px;height:250px;"] +swift4claim.com##div[style="width:300px; height: 250px;"] +swift4claim.com##.overflow +best-shopme.com##+js(nosiif, visibility, 1000) +best-shopme.com##+js(aopr, noAdBlock) +newsbomb.gr##.banner-area +ibeconomist.com##+js(nostif, adsense) +getitfree.cn##+js(acs, document.getElementById, .style) +! m.webmusic.pro popup ads +ytjar.info##+js(nowoif, _blank) +/^https:\/\/(?:cdn77\.)?aj[0-9a-z]{2}\d{2}\.online\/[0-9a-z]{8}\.js$/$script,3p,to=online +/^https:\/\/(?:cdn77\.)?aj[0-9a-z]{2}\d{2}\.bid\/[0-9a-z]{8}\.js$/$script,3p,to=bid +/^https:\/\/(?:cdn77\.)?aj[0-9a-z]{2}\d{2}\.online\/[-_0-9A-Za-z]{70,}$/$frame,3p,to=online +/^https:\/\/(?:cdn77\.)?aj\d{4}\.bid\/[-_0-9A-Za-z]{80,}\?/$xhr,3p,to=bid +smallpocketlibrary.com##+js(aopr, adBlockDetected) +! iinbinlist.com/osqa.net/vanhawks.com anti-adb +*$xhr,redirect-rule=nooptext,domain=iinbinlist.com|osqa.net|vanhawks.com +@@||pixel.adsafeprotected.com^$xhr,domain=teleboy.ch +texture-packs.com##+js(no-xhr-if, adsbygoogle) +bookriot.com##+js(nostif, /Adblock|_ad_/) +bookriot.com###top_fold[style="display:flex !important;"]:style(min-height: 0px !important; transition: all 0s ease 0s !important;) +bookriot.com##.inside-content-promo-container +@@||databaseitalia.it^$ghide +||cdn.rawgit.com^*/wdbloogablock.js$script +@@||ufreegames.com^$ghide +||imasdk.googleapis.com/js/sdkloader/ima3.js$domain=ufreegames.com,redirect=google-ima.js +ufreegames.com##.spo +ufreegames.com##+js(nano-sib) +cpomagazine.com##+js(aopr, advads_passive_groups) +pholder.com##.AdSenseAboveFoldResponsive +pholder.com##section:has(.OUTBRAIN) +pholder.com##div[style$="margin-bottom:10px"]:has(.OUTBRAIN) +pholder.com##div[class]:has(div[class] > iframe[src^="https://chaturbate.com/in/"]) +pholder.com##section:has(div[href^="https://chaturbate.com/in/"]) +pholder.com##section.ShopWidget:has-text(Sponsored) +tw-hkt.blogspot.com##+js(nosiif, visibility, 1000) +*$script,redirect-rule=noopjs,domain=speedtesting.herokuapp.com|excelviewer.herokuapp.com|exifviewer.herokuapp.com|pdfrecover.herokuapp.com +hugo3c.tw##+js(nosiif, visibility, 1000) +4cash.me##+js(aopr, app_vars.force_disable_adblock) +4cash.me##+js(set, blurred, false) +4cash.me##.banner +*$frame,denyallow=google.com|recaptcha.net,domain=4cash.me +*$script,3p,denyallow=google.com|googleapis.com|gstatic.com|recaptcha.net,domain=4cash.me +cookpad.com###modals +cookpad.com##body:style(overflow:auto !important) +recordonline.com##+js(set, _sp_.msg.displayMessage, noopFunc) +! doramasyt.com ads +doramasyt.com##+js(aopr, GLX_GLOBAL_UUID_RESULT) +*$script,3p,denyallow=cloudflare.com|cloudflare.net|disqus.com|disquscdn.com|facebook.net|fastly.net|fastlylb.net|fbcdn.net|gstatic.com|jwpcdn.com|jwplatform.com,domain=doramasyt.com +xxxdan.com##+js(aopr, document.head.appendChild) +xxxdan.com##*:matches-css-after(content:/Advertisement/i) +linuxhint.com,thekitchenmagpie.com##+js(acs, Math, adthrive) +bonobono.com##.custom-html-widget +makefreecallsonline.com##+js(rmnt, script, onerror) +businesstimes.com.sg##.overlayWhite +businesstimes.com.sg##html:style(overflow-y: auto !important;) +camclips.tv##+js(acs, onload) +camclips.tv##+js(aopr, console.clear) +camclips.tv##+js(aeld, , pop) +camclips.tv##+js(aeld, , Pop) +camclips.tv##+js(set, flashvars.adv_pause_html, '') +camclips.tv##+js(set, flashvars.popunder_url, undefined) +camclips.tv##[href^="https://go.strpjmp.com"] +camclips.tv##[src^="https://camclips.tv/player/html.php?aid"] +camclips.tv##div.cbchat +camclips.tv##.box.rltd +camclips.tv##.table +shortzzy.*##+js(aopr, app_vars.force_disable_adblock) +shortzzy.*##+js(nowoif) +shortzzy.*##+js(nostif, ai_adb) +shortzzy.*##+js(nosiif, visibility, 1000) +shortzzy.*##+js(set, blurred, false) +shortzzy.*##.banner +shortzzy.*##.box-main > center > a[href][target="_blank"] +shortzzy.*##.navbar-right.navbar-nav.nav +shortzzy.*##.btnlink +*$script,3p,denyallow=cloudflare.com|codepen.io|consensu.org|google.com|googleapis.com|gstatic.com|hcaptcha.com|recaptcha.net,domain=shortzzy.* +rojadirecta.*##+js(nowoif) +sportsonline.si##+js(acs, JSON.parse, atob) +! jocooks .com nasty ads +jocooks.com##+js(aopw, HTMLElement.prototype.insertAdjacentHTML) +@@||cartoonbrew.com^$ghide +cartoonbrew.com##.ad-inner +purposegames.com##+js(nostif, googletag) +*$script,redirect-rule=noopjs,domain=purposegames.com +purposegames.com##.adlabel +##[href^="//cadsecs.com/"] +##[href^="https://wap4dollar.com/ad/nonadult/serve.php"] +*$script,3p,denyallow=fbcdn.net|facebook.net|fastly.net|fastlylb.net|jquery.com|hwcdn.net|hcaptcha.com|recaptcha.net|cloudflare.com|cloudflare.net|google.com|googleapis.com|gstatic.com|wp.com|chatango.com,domain=fullmatchtv.com +fullmatchtv.com##.belowpost +highporn.net##+js(acs, addEventListener, -0x) +highporn.net##+js(aopr, jsUnda) +*$script,3p,denyallow=chatango.com|cloudflare.com|cloudflare.net|disqus.com|disquscdn.com|facebook.net|fastly.net|fastlylb.net|fbcdn.net|google.com|googleapis.com|gstatic.com|hcaptcha.com|hwcdn.net|jquery.com|jsdelivr.net|jwpcdn.com|recaptcha.net|wp.com,domain=highporn.net +highporn.net##.in-video-1 +highporn.net##.fel-playclose +||highporn.net/js/aapp.js +! megadede. mobi, movidy. net popups, ads +megadede.*##.fake_player, #tab-ad +megadede.*##.les-title:has-text(HD) +megadede.*##[href="#tab-ad"] +movidy.*##+js(nowoif) +thepoorcoder.com##+js(aopr, adblockDetector) +! brave issue google funding +latimes.com##+js(nostif, f.parentNode.removeChild(f), 100) +*$script,3p,denyallow=fastly.net|fastlylb.net|jquery.com|hwcdn.net|hcaptcha.com|recaptcha.net|cloudflare.com|cloudflare.net|google.com|googleapis.com|gstatic.com,domain=13x4.com +camsclips.*##+js(nostif, innerText, 2000) +camsclips.*##.place +claimrbx.gg##+js(nostif, swal, 500) +perelki.net##+js(nostif, keepChecking, 1000) +gomaainfo.com##+js(acs, addEventListener, google_ad_client) +||exe.io^$3p +robot-forum.com##+js(acs, $, offsetHeight) +@@||homedecoratione.com^$ghide +homedecoratione.com##ins.adsbygoogle +androidtunado.com.br##+js(nosiif, visibility, 1000) +wristreview.com##+js(aopw, ai_front) +standardmedia.co.ke##+js(aopr, canRunAds) +*$script,redirect-rule=noopjs,domain=downloadrepack.com +downloadrepack.com###footer-widgets > .container-inner > .group.hu-pad +@@||thedelimagazine.com^$ghide +tecnobillo.com##+js(nostif, check) +tecnobillo.com##.tecnobillo-ad-wrapper-wrapper +! xtits.com/xxx pre-roll ads +xtits.*##+js(set, flashvars.adv_start_html, '') +xtits.*##+js(set, flashvars.adv_pause_html, '') +xtits.*##.adv-title +xtits.*##.table +xtits.*##.spot-holder +*$frame,script,3p,denyallow=ahacdn.me|bimbolive.com|cloudflare.net,domain=xtits.* +||xtits.*^$csp=script-src * 'unsafe-inline' +acapellas.eu##+js(nostif, getComputedStyle) +acapellas.eu##+js(rmnt, script, runCheck) +acapellas.eu##+js(acs, addEventListener, google_ad_client) +! descarga.xyz popup ads +descarga.xyz##+js(aopr, AaDetector) +descarga.xyz##+js(aopw, atOptions) +descarga.xyz##+js(aopw, smrtSB) +descarga.xyz##.code-block-1.code-block +*$script,3p,domain=descarga.xyz,denyallow=arc.io +file-converter-online.com##.lead-responsive +file-converter-online.com##.clearfix.entry > small +file-converter-online.com##div[style^="margin-top:10px;min-height:250px"] +urbanmilwaukee.com##+js(set, canRunAds, true) +urbanmilwaukee.com###fancybox-container-1 +urbanmilwaukee.com##body:style(overflow:auto !important) +emuenzen.de##+js(rmnt, script, replace) +emuenzen.de##+js(nostif, prompt, 1000) +emuenzen.de##a[href*="sjv.io"] +epidemia-koronawirus.pl###sgpb-popup-dialog-main-div-wrapper +epidemia-koronawirus.pl##.sgpb-popup-overlay +*$script,redirect-rule=noopjs,domain=seotechman.com +! nsfw popups gayvidsclub .com +gayvidsclub.com##+js(nowoif) +*$script,redirect-rule=noopjs,domain=markiza.sk +infomaniakos.*##+js(set, btoa, null) +shorttey.*##+js(aopr, app_vars.force_disable_adblock) +shorttey.*##+js(aopr, open) +shorttey.*##+js(aopw, adcashMacros) +shorttey.*##+js(aost, Math.random, t.pt) +shorttey.*##+js(json-prune, clickAnywhere urls) +shorttey.*##+js(set, blurred, false) +shorttey.*##+js(set, canRunAds, true) +shorttey.*##.short +shorttey.*###link-view > center > [href] +*$script,3p,denyallow=cloudflare.com|cloudflare.net|google.com|gstatic.com|jsdelivr.net|hcaptcha.com|recaptcha.net,domain=shorttey.* +||shorttey.*/sw.js$script,1p +*$script,3p,denyallow=cdn77.org|cloudflare.com|cloudflare.net|disqus.com|disquscdn.com|facebook.com|facebook.net|fastly.net|fastlylb.net|fbcdn.net|google.com|googleapis.com|gstatic.com|hcaptcha.com|hwcdn.net|instagram.com|jquery.com|jsdelivr.net|jwpsrv.com|plyr.io|twimg.com|twitter.com|recaptcha.net|wp.com|x.com,domain=hdmovieplus.* +*$script,redirect-rule=noopjs,domain=linuxgizmos.com +dota2freaks.com##+js(nosiif, visibility, 1000) +how2pc.com##+js(nosiif, visibility, 1000) +livingincebuforums.com##+js(nostif, .offsetHeight) +livingincebuforums.com##[id^="nbAdWidget"] +livingincebuforums.com##[data-blockid*="AdsWidget"] +tio.ch##+js(aeld, error) +tio.ch##+js(ra, href, a[href*="/ads.php"][target="_blank"]) +@@||tio.ch^$ghide +tio.ch##.ad +javfull.net##+js(nosiif, _0x) +javfull.net###wrapfabtest:style(height:1px !important;width:1px !important) +! nsfw xxgasm .com popups ads +xxgasm.com##+js(aopr, decodeURI) +*$script,3p,denyallow=cdn77.org|cloudflare.com|cloudflare.net|disqus.com|disquscdn.com|facebook.com|facebook.net|fastly.net|fastlylb.net|fbcdn.net|fluidplayer.com|google.com|googleapis.com|gstatic.com|hwcdn.net|hcaptcha.com|instagram.com|jquery.com|jsdelivr.net|jwpcdn.com|jwpsrv.com|plyr.io|twimg.com|twitter.com|recaptcha.net|wankgod.com|wp.com|x.com,domain=xxgasm.com +! nsfw kfapfakes .com popups ads +kfapfakes.com##+js(aopr, decodeURI) +! nsfw xsober .com ads popups +xsober.com##+js(aopr, decodeURI) +*$script,3p,denyallow=bootstrapcdn.com|cdn77.org|cloudflare.com|cloudflare.net|disqus.com|disquscdn.com|facebook.com|facebook.net|fastly.net|fastlylb.net|fbcdn.net|fluidplayer.com|google.com|googleapis.com|gstatic.com|hwcdn.net|hcaptcha.com|instagram.com|jquery.com|jsdelivr.net|jwpcdn.com|jwpsrv.com|plyr.io|twimg.com|twitter.com|recaptcha.net|wp.com|x.com,domain=xsober.com +! nsfw sexsaoy .com ads popups +sexsaoy.com##+js(aopr, decodeURI) +*$script,3p,denyallow=cdn77.org|cloudflare.com|cloudflare.net|disqus.com|disquscdn.com|facebook.com|facebook.net|fastly.net|fastlylb.net|fbcdn.net|fluidplayer.com|google.com|googleapis.com|gstatic.com|hwcdn.net|hcaptcha.com|instagram.com|jquery.com|jsdelivr.net|jwpcdn.com|jwpsrv.com|plyr.io|twimg.com|twitter.com|recaptcha.net|wp.com|x.com,domain=sexsaoy.com +##[href^="https://go.rdrjmp.com/"] +! img4fap. club popups ads +img4fap.*##+js(aopr, decodeURI) +*$script,3p,denyallow=cdn77.org|cloudflare.com|cloudflare.net|disqus.com|disquscdn.com|facebook.com|facebook.net|fastly.net|fastlylb.net|fbcdn.net|fluidplayer.com|google.com|googleapis.com|gstatic.com|hwcdn.net|hcaptcha.com|instagram.com|jquery.com|jsdelivr.net|jwpcdn.com|jwpsrv.com|plyr.io|twimg.com|twitter.com|recaptcha.net|wp.com|x.com,domain=img4fap.* +/tghr.js$script +##[href^="https://www.safestcontentgate.com/"] +filmyzilla.*##[href^="https://ak.hetadinh.com/"] +weviral.org##+js(nosiif, visibility, 1000) +paperzonevn.com##+js(nostif, adb) +popno-tour.net##+js(nostif, innerText, 2000) +@@||asianbookie.com^$script,1p +forums.asianbookie.com##.topics > table > tbody > tr > td > table > tbody > tr > .topicrowdate +||asianbookie.com/displaytable.cfm?tablename=cslodds$frame +asianbookie.com##a[href^="/cgi-bin/to.cgi"] +! elitetorrent.com popup +elitetorrent.*##+js(aopw, adcashMacros) +*$script,3p,denyallow=cloudflare.com|cloudflare.net|disqus.com|disquscdn.com|fastlylb.net|google.com|googleapis.com|gstatic.com|fontawesome.com|jsdelivr.net,domain=elitetorrent.* +siz.tv##+js(set, koddostu_com_adblock_yok, null) +! e-wok.tv anti-adb +@@||e-wok.tv/js/new/advertisment.js$script,1p +! several sites using the same popunder script +ashemaletv.com,beurettekeh.com,celibook.com,gourmandix.com,sexetag.com##+js(aopr, decodeURI) +ashemaletv.com###playerOverlay +||str.sexetag.com/voir.php$frame,1p +alltechnerd.com##+js(nosiif, visibility, 1000) +alltechnerd.com##+js(nostif, nitroAds) +alltechnerd.com##.ai_widget +alltechnerd.com##.code-block:has-text(ADV) +iobit.com##+js(aopr, LieDetector) +malaysianwireless.com##+js(nostif, class.scroll, 1000) +||malaysianwireless.com/wp-content/banners/*$image,1p +! iammagnus.com/dailyvideoreports.net anti-adb +dailyvideoreports.net##+js(aeld, load, /showModal|isBlanketFound/) +iammagnus.com,dailyvideoreports.net##+js(set, adsbygoogle.loaded, true) +*$script,redirect-rule=noopjs,domain=iammagnus.com|dailyvideoreports.net +*$script,redirect-rule=noopjs,domain=youneed.win +! estrenosgo.site popup +estrenosflux.*##+js(acs, JSON.parse, atob) +estrenosflix.*,estrenosflux.*,estrenosgo.*##+js(aopw, adcashMacros) +||adservice.google.com/adsid/integrator.js$script,redirect=noopjs,domain=ultimateclassicrock.com +comprovendolibri.it##+js(nostif, google_jobrunner) +universegunz.net##+js(nostif, adb) +citynews.ca##body:style(padding-top:0px !important) +forum.lolesporte.com##+js(aopr, onload) +shoppinglys.blogspot.com##+js(nosiif, visibility, 1000) +shoppinglys.blogspot.com##iframe[src^="data:"] +erinsakura.com##+js(nostif, disableDeveloperTools) +erinsakura.com##.herald-fa-grid +@@||fzmovies.*^$ghide +@@||fzm.*^$ghide +!#if env_firefox +fzm.*,fzmovies.*,fztvseries.live,mobiletvshows.site,tvseries.in##[onclick*="window.open"]:remove-attr(onclick) +!#else +fzm.*,fzmovies.*,fztvseries.live,mobiletvshows.site,tvseries.in##+js(ra, onclick, [onclick*="window.open"], stay) +!#endif +fzm.*,fzmovies.*##+js(nosiif, visibility, 1000) +9jarock.org,fzmovies.info,fztvseries.ng,netnaijas.com##+js(set, openWindow, noopFunc) +fztvseries.ng##div[class="code-block code-block-6"][style="margin: 8px 0; clear: both;"] +netnaijas.com,sabishares.com##div[class="code-block code-block-4"][style="margin: 8px 0; clear: both;"] +sabishares.com##p > a[href*="/4/"][target="_blank"] +||ligheechoagool.com^ +*$image,redirect-rule=1x1.gif,domain=freesslvpn.us|robotvpn.com +fritidsmarkedet.dk,maskinbladet.dk##+js(nostif, Check) +*$image,redirect-rule=1x1.gif,domain=maskinbladet.dk|fritidsmarkedet.dk +fritidsmarkedet.dk,maskinbladet.dk##.skybanner, .megaboard-inner +bdlink.pw##+js(nano-sib) +torresette.news##+js(acs, document.addEventListener, adsBlocked) +||torresette.news/img/banner/$image,1p +torresette.news##.content-banner-right +torresette.news###skinlink +downloadhub.*,hubstream.*##+js(nowoif) +||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=google-ima.js,domain=hubstream.* +ultimasnoticias.com.ve##pp +adultasianporn.com##+js(aeld, getexoloader) +adultasianporn.com##+js(cookie-remover, /^/) +adultasianporn.com##[class^="abra"] +adultasianporn.com##[href^="http://adultasianporn.com/out.php"] +adultasianporn.com##.banner +adultasianporn.com##[src*=".php"] +||adultasianporn.com^$frame +! gamesrepacks.com anti-adb +gamesrepacks.com##+js(noeval-if, show) +@@||firenzetoday.it^$ghide +! SSAI Video ads on ABC Owned TV station sites https://github.com/uBlockOrigin/uBlock-issues/issues/760#issuecomment-715702997 +||content.uplynk.com/api/*&ad=$xhr,removeparam=/^ad/,domain=abc7ny.com|abc7.com|abc7chicago.com|6abc.com|abc7news.com|abc13.com|abc11.com|abc30.com|abcnews.go.com +6abc.com,abc11.com,abc13.com,abc30.com,abc7.com,abc7chicago.com,abc7news.com,abc7ny.com,abcotvs.net##.nav.sticky:style(top: 0px !important;) +! SSAI Video ads on Discovery TV sites https://github.com/uBlockOrigin/uBlock-issues/issues/760#issuecomment-715926907 +||api.discovery.com/v1/streaming/video/*&adNetworkId=$xhr,removeparam=/^ad/,domain=ahctv.com|animalplanet.com|cookingchanneltv.com|destinationamerica.com|discovery.com|discoverylife.com|diynetwork.com|foodnetwork.com|hgtv.com|investigationdiscovery.com|motortrend.com|sciencechannel.com|tlc.com|travelchannel.com +walkthrough-indo.blogspot.com##+js(acs, addEventListener, google_ad_client) +! polska-ie.com anti-adb +polska-ie.com##+js(aeld, load, isBlanketFound) +*$script,redirect-rule=noopjs,domain=polska-ie.com +videohelp.com##div[id] :has(> a[href]:has-text(/^Try (?:D.?V.?D.?F.?a.?b|StreamFab)/) + a[href]) +! hentaitube ads +hentais.tube,hentaitube.online##+js(aopr, checkCookieClick) +hentais.tube,hentaitube.online##[href^="https://tm-offers.gamingadult.com/"] +fairyanime.com##+js(nano-sib) +fairyanime.com##.overlay +fairyanime.com###kosana.bounce.animated.kosana.concise +*$media,redirect=noopmp3-0.1s,domain=fairyanime.com +pg-wuming.com##+js(acs, $, .test) +proxybit.*##+js(acs, adcashMacros) +proxybit.*##+js(nowoif) +proxybit.*##+js(aopr, mm) +proxybit.*##[id*="banner"] +hdss.*##.pplayer +hdss.*##.btnsa +hdss.*##.homi +hdss.*##.widget_media_image +@@||top.gg/js/$script,1p +top.gg###vote-root:style(display:block !important) +top.gg###video-root +top.gg##+js(nano-stb, readyToVote, 12000) +top.gg##article[data-testid="promoted-product"] +top.gg##.chakra-popover__content .chakra-link[href*="/click?targetUrl="] +top.gg###rewarded-video +top.gg###parent_nn_player +top.gg##.chakra-stack[data-testid="p-p"] +top.gg##div[class^="css-"]:not(.chakra-stack):has(> #parent_nn_player) +top.gg##.css-adfhee:upward(2) +top.gg##aside > div.w-full > .items-center > .w-full.items-center:has-text(Ad) +@@||arrowos.net/js/*$script,1p +arrowos.net##body:style(visibility:visible !important) +@@||arrowos.net^$ghide +arrowos.net##.card-content:has(> .adsbygoogle) +arrowos.net##ins.adsbygoogle +arrowos.net###babasbmsgx +3hiidude.*##+js(aopr, String.fromCharCode) +! vidmoly . me | .to popups +kaembed.net,vidmoly.*##+js(nowoif, !vidmoly) +vidmoly.*##+js(set, HTMLAnchorElement.prototype.click, noopFunc) +vidmoly.*##+js(aeld, DOMContentLoaded, anchor.href) +||boyfriendmeaningless.com^ +||disproveknob.com^ +vidmoly.*###mg_vd +vidmoly.*###voc_block +vidmoly.*###dos_vlock +||cdn.staticmoly.me/*.php +vidmoly.*###adsblock +kaembed.net##body > img[id] +###vplayer ~ img[id][onclick] +lite-link.*##+js(aopr, app_vars.force_disable_adblock) +lite-link.*##+js(ra, target|href, a[href^="//"]) +lite-link.*##+js(set, blurred, false) +lite-link.*##.banner +*$script,3p,denyallow=google.com|gstatic.com|recaptcha.net,domain=lite-link.* +openloadmov.*##+js(nowoif) +aegeanews.gr,batterypoweronline.com,centrocommercialevulcano.com,cieonline.co.uk,commsbusiness.co.uk,dailygrindonline.net,delo.bg,dynastyseries.com,fabmx1.com,fat-bike.com,fmj.co.uk,localemagazine.com,metaforespress.gr,myvalley.it,niestatystyczny.pl,primapaginamarsala.it,ringelnatz.net,schoolsweek.co.uk,sikkenscolore.it,sportbet.gr,stagemilk.com,tautasdziesmas.lv,thetoneking.com,toplickevesti.com,zeroradio.co.uk##+js(aopr, wpsite_clickable_data) +*/wp-content/plugins/wpsite-background-takeover*/js/wpsite_clickable.js$script +8tm.net##+js(nosiif, visibility, 1000) +8tm.net##+js(acs, addEventListener, google_ad_client) +@@||8tm.net/stylesheets/$css,1p +||ads.exoclick.com/ads.js$script,redirect=noop.js +/teo4.$script +vipr.im##+js(acs, document.addEventListener, initBCPopunder) +vipr.im###rang2 +afasiaarchzine.com##+js(nosiif, visibility, 1000) +afasiaarchzine.com##.afasia_sidebar_ad_group +hidefninja.com##+js(aopr, adBlockDetected) +hidefninja.com##+js(acs, document.addEventListener, adsBlocked) +exbulletin.com##+js(aost, String.prototype.charCodeAt, ai_) +15min.lt##+js(nostif, insertBefore) +br0wsers.com##+js(acs, document.getElementsByClassName, offsetParent) +br0wsers.com###show_ag:style(display:block !important) +! vlive.tv pre-roll ads +vlive.tv##+js(json-prune, meta.advertise) +*$xhr,redirect-rule=nooptext,domain=lewdninja.com|new.lewd.ninja +lewdninja.com,new.lewd.ninja##a.navbar-item.is-hidden-desktop-only +@@*$document,csp=worker-src 'none',domain=new.lewd.ninja +*$popunder,domain=new.lewd.ninja +lewd.ninja##+js(aeld, click, shouldShow) +@@||recaptcha.net^$frame,csp=worker-src 'none',domain=lewd.ninja +*$script,3p,denyallow=google.com|gstatic.com,domain=lewdninja.com|new.lewd.ninja +new.lewd.ninja##+js(nano-sib, next, 1000, 0.001) +hentaienglish.com,hentaiporno.xxx##+js(set, vidorev_jav_plugin_video_ads_object.vid_ads_m_video_ads, '') +progameguides.com##[id^="sideAd-"] +progameguides.com##[id^="content_dynamicAd-"] +discoveryplus.*##.bmpui-seekbar-markers +discoveryplus.*##.bmpui-ui-ads-status +discoveryplus.*##+js(json-prune, data.attributes.config.freewheel data.attributes.config.featureFlags.dPlayer) +@@||identity.mparticle.com/v1/login$xhr,domain=discoveryplus.* +*$media,redirect=noopmp3-0.1s,domain=discoveryplus.* +||doubleclick.net^$xhr,domain=discoveryplus.*,important +!#if !env_firefox +||h264.io/a/x-goog-token=Expires$xhr,redirect=nooptext,domain=discoveryplus.*,important +!#endif +discoveryplus.*,go.discovery.com,watch.foodnetwork.com##+js(json-prune, data.attributes.ssaiInfo.forecastTimeline data.attributes.ssaiInfo.vendorAttributes.nonLinearAds data.attributes.ssaiInfo.vendorAttributes.videoView data.attributes.ssaiInfo.vendorAttributes.breaks.[].ads.[].adMetadata data.attributes.ssaiInfo.vendorAttributes.breaks.[].ads.[].adParameters data.attributes.ssaiInfo.vendorAttributes.breaks.[].timeOffset) +go.discovery.com,investigationdiscovery.com,go.tlc.com,sciencechannel.com,watch.foodnetwork.com##+js(xml-prune, xpath(//*[name()="MPD"][.//*[name()="BaseURL" and contains(text()\,'dash_clear_fmp4') and contains(text()\,'/a/')]]/@mediaPresentationDuration | //*[name()="Period"][./*[name()="BaseURL" and contains(text()\,'dash_clear_fmp4') and contains(text()\,'/a/')]]), , .mpd) +discoveryplus.*##+js(xml-prune, 'xpath(//*[name()="MPD"][.//*[name()="BaseURL" and contains(text(),"emea-free")]]/@mediaPresentationDuration | //*[name()="MPD"][.//*[name()="BaseURL" and contains(text(),"emea-free")]]//*[name()="Period"]/@start | //*[name()="Period"][./*[name()="BaseURL" and contains(text(),"emea-free")]])', , .mpd) +play.discoveryplus.com##+js(json-prune, ssaiInfo) +go.tlc.com,investigationdiscovery.com##+js(json-prune-xhr-response, data.attributes.ssaiInfo, , propsToMatch, /videoPlaybackInfo) +venge.io##+js(nofab) +venge.io##+js(set, adsProvider.init, noopFunc) +venge.io##+js(set, SDKLoaded, true) +@@||akwams.*^$ghide +akwams.*##ins.adsbygoogle +akwams.*##.ads +! tvmd .info ads +##.fints-block__row +@@||cdn.trafficdok.com/libs/e.js$script,domain=tvmd.info +tvmd.info###crosscol-overflow +mytoolz.net##+js(aopr, onload) +! pngtosvg.com anti-adb +||googlesyndication.com^$script,redirect=googlesyndication_adsbygoogle.js,domain=pngtosvg.com +moozpussy.com,zoompussy.com##+js(aopr, loadTool) +moozpussy.com,zoompussy.com##[href^="/go/desire"] +sitarchive.com##+js(nostif, css_class.show) +||googlesyndication.com^$script,redirect=googlesyndication_adsbygoogle.js,domain=sitarchive.com +sitarchive.com##[id^="aswift_"] +share1223.com##+js(aopr, adBlockDetected) +*$script,redirect-rule=noopjs,domain=telek.top +baddiehub.com##+js(nostif, css_class.scroll) +! chochox.com popup +chochox.com##+js(acs, String.fromCharCode, atob) +! miohentai.com popup ads +miohentai.com##+js(aopr, mnpwclone) +miohentai.com###idtop +miohentai.com##.in.paused-ad-container +*$script,3p,denyallow=cloudflare.com|google.com|gstatic.com,domain=miohentai.com +! familyporn.tv popup +familyporn.tv##+js(set, console.clear, noopFunc) +familyporn.tv##+js(aopr, AaDetector) +familyporn.tv##.media_spot +familyporn.tv##.textlink +familyporn.tv###player_adv +familyporn.tv##.adv +familyporn.tv##.col-last:has(> :is(.player-adverts, .place)) +familyporn.tv##.sponsor +! tabooporn.tv popup +tabooporn.tv##.table +tabooporn.tv##.textlink +tabooporn.tv##+js(aopr, mm) +! kaplog.com popup +kaplog.com##+js(nowoif) +*$script,3p,denyallow=google.com|gstatic.com,domain=kaplog.com +! emulatorgames.net boost countdown timer +emulatorgames.net##+js(nano-sib, , , 0.3) +emulatorgames.net##+js(nano-stb, , 7000, 0) +emulatorgames.net##[class*="-label"] +! nightlifeporn.com popup +nightlifeporn.com##.wps-player__happy-inside--pause.wps-player__happy-inside +getpczone.com##+js(nosiif, visibility, 1000) +getpczone.com###breadcrumb-ads-links +! kissmanga. nl popups +kissmanga.*###myModal +sssam.com##+js(set, ads, true) +*$script,redirect-rule=noopjs,domain=codimth.com +! fiyaplatform.com anti-adb +*$script,redirect-rule=noopjs,domain=fiyaplatform.com +! downloadtwittervideo.com popup +downloadtwittervideo.com##+js(nowoif) +*$script,redirect-rule=noopjs,domain=taufiqhdyt.com +taufiqhdyt.com###big-ads +beverfood.com##+js(nosiif, .offsetHeight) +beverfood.com##+js(aeld, DOMContentLoaded, offsetHeight) +beverfood.com###backy +beverfood.com##.switchabig +beverfood.com##a#x1 +beverfood.com##body:style(background-image: unset !important;) +beverfood.com##.sito:style(margin-top: 0 !important;) +beverfood.com##.theiaStickySidebar > ul > li.widget:has(> .textwidget > div[align="center"] > a[target=_blank]:not([class]) img) +||beverfood.com/immagini/*1920$image +! camthots.tv pre-roll ads +camfox.com##+js(set, flashvars.adv_pre_vast, '') +camfox.com##.table +javtrailers.com##+js(ra, href, [href*="nihonjav"], stay) +javtrailers.com###cta +javtrailers.com###popunderLink +! Foxella Blockadblock +@@||foxella.com^$ghide +foxella.com##ins.adsbygoogle +! wetpussy.sexy popunder, ads +wetpussy.sexy##.mansonry-item +||wetpussy.sexy/js/index-nb.js +! jaysndees.com anti-adb +jaysndees.com##+js(nosiif, visibility, 1000) +jaysndees.com##+js(nofab) +jaysndees.com##div[class][style^="width: 728px; height: 90px;"] +jaysndees.com###topshow +jaysndees.com##center:nth-of-type(3) +jaysndees.com###cust_btn2_random +jaysndees.com###block2 +jaysndees.com###block1 +mr9soft.com##+js(nostif, /null|Error/, 10000) +||googlesyndication.com^$script,redirect=googlesyndication_adsbygoogle.js,domain=mr9soft.com +@@||famfonts.com^$ghide +famfonts.com##ins.adsbygoogle +nifteam.info##+js(acs, document.getElementById, undefined) +nifteam.info###wtf:style(visibility:visible!important;display:block!important;) +! babeporn .net popunder => .org +babeporn.*##+js(aopr, decodeURI) +! livemint anti-adblock +! livemint.com##+js(aeld, DOMContentLoaded, nrWrapper) +livemint.com###adfreeDeskSpace +livemint.com###dekBudgetAd +||adconfigproxy.azurewebsites.net/Adurl$xhr +livenewsof.com##+js(nostif, css_class.show) +multics.eu##+js(acs, $, .test) +forums.lostmediawiki.com###ad1 +forums.lostmediawiki.com###remove_ads_link +forums.lostmediawiki.com##[id^="ad-"] +thejournal.ie##+js(nowoif) +thejournal.ie##html:style(background-image:none !important) +! iulive .blogspot.com popups +iulive.blogspot.com##+js(nowebrtc) +! livehere. one popups +livehere.*##+js(nowebrtc) +mailocal2.xyz##+js(nosiif, visibility, 1000) +! wonporn .com popunder +wonporn.com##td[style][width="360"] +adcorto.*##+js(aopr, app_vars.force_disable_adblock) +adcorto.*##+js(aopw, atOptions) +adcorto.*##+js(set, blurred, false) +adcorto.*##.banner +adcorto.*##.box-main > table +*$3p,script,denyallow=facebook.net|fbcdn.net|googleapis.com|google.com|gstatic.com|recaptcha.net|hcaptcha.com,domain=adcorto.* +camflow.tv,camhoes.tv##+js(acs, onload, onclick) +camflow.tv,camhoes.tv##+js(set, flashvars.adv_pause_html, '') +camflow.tv,camhoes.tv##+js(set, flashvars.adv_start_html, '') +camflow.tv,camhoes.tv##+js(set, flashvars.logo_text, '') +camflow.tv,camhoes.tv##+js(set, flashvars.mlogo, '') +camflow.tv,camhoes.tv##+js(set, flashvars.popunder_url, '') +camhoes.tv##+js(set, hasPoped, true) +camflow.tv,camhoes.tv##.box.rltd +camflow.tv,camhoes.tv##.table +playporngames.com##+js(aeld, DOMContentLoaded, window.open) +playsexgames.xxx##+js(acs, bannersRequest) +||saddlegirls.com/saddlegirls/ph/v/*_video.mp4$1p +saddlegirls.com##.image-link[href^="//www.zagvee.com"] +||playporngames.com/*.gif| +||playporngames.com/fuck_dolls_online.jpg +playporngames.com##.sidebarcont > .widget_text:not(#text-2) +/xxx\/(?:[a-z]+[_-]){1,2}[a-z]+\.(?:gif|jpg)$/$image,1p,domain=playsexgames.xxx +playsexgames.xxx##.widget:not(#text-2) +||lifeselector.com/banners/js/banner-controller. +||static.zhihu.com/heifetz/main.signflow.*.js$script,domain=zhihu.com +needgayporn.com#@#.is-ad-visible +needgayporn.com##+js(aopr, ExoLoader.serve) +needgayporn.com##[href="https://www.onlyhentaistuff.com/"] +needgayporn.com##.table +needgayporn.com##[src^="https://www.needgayporn.com/player/html.php"] +needgayporn.com##.fp-brand +needgayporn.com##^script:has-text('script') +||needgayporn.com/ohs-180x800.gif +forexforum.co##+js(acs, $, .test) +! rule34.paheal.net PH +rule34.paheal.net##script[src$="ads.js"]:upward(section[id]) +! palcomix.com ads +palcomix.com##center > font[size="3"][face="ARIAL"]:has-text(ADVERTISING):upward(td) +palcomix.com##table[width="800"]:has(img[src^="../ads/"]) +/\.com\/(full)?ad[0-9a-z]+\.(?:gif|jpg)$/$image,1p,domain=palcomix.com +freemagazines.top##+js(aopr, b2a) +freemagazines.top##+js(nostif, showModal) +freemagazines.top##+js(acs, eval, replace) +freemagazines.top##+js(rmnt, script, var Data) +freemagazines.top##+js(no-xhr-if, /doubleclick|googlesyndication/) +freemagazines.top##+js(aeld, DOMContentLoaded, /atob|overlay/) +freemagazines.top##.widget:has(> .adsbygoogle) +*$xhr,redirect-rule=nooptext,domain=freemagazines.top +dl-protect.*##+js(nowoif) +cryptowin.io##+js(acs, document.getElementById, 'body') +@@||cryptowin.io^$ghide +cryptowin.io##.panel-body > p[style=" color:#818181; background-color: #fffdc4; text-align: center; font-size: 14px; border-radius: 2px; width: 320px; max-width: 100%; margin: auto; margin-top: 15px; "] +cryptowin.io##.hidden-xs +movi.pk,netu.ac,player.msmini.*,player.sbnmp.*,netuplayer.*,vapley.*##+js(nowoif) +0gogle.com##+js(aopr, __Y) +movi.pk##+js(aeld, , vads) +movi.pk##+js(acs, eval, replace) +netu.ac,vapley.*##+js(aopr, doSecondPop) +movi.pk###vads +/cdn-cgi/trace$xhr,1p,domain=0gomovies.*|cdn1.fastvid.co|movi.pk|netu.ac|player.msmini.*|player.sbnmp.*|vapley.* +plugincrack.com##+js(nostif, ai_adb) +pikkado.com###googletop:remove() +pikkado.com###dest_rev +||gartic.io/videos/*$media,1p,redirect=noopmp4-1s +hindustantimes.com##+js(no-fetch-if, adsbygoogle.js) +hindustantimes.com##+js(ra, onclick, a[href][onclick^="getFullStory"]) +hindustantimes.com##.adBlockerPopup +hindustantimes.com##.adBlocker +hindustantimes.com##.blackOverlay +hindustantimes.com##.desktopAd +hindustantimes.com##.epaper-ad +hindustantimes.com##.ht-ad-v1 +hindustantimes.com##.ht_outbrain +hindustantimes.com##.m_ads_unit +hindustantimes.com##.storyAd +hindustantimes.com##.topAd +hindustantimes.com##.widget-ad +hindustantimes.com##[class^="adHeight"] +hindustantimes.com##[class^="adMinHeight"] +hindustantimes.com##body:style(overflow: auto !important;) +hindustantimes.com##div[id^="div-gpt-ad"] +tech.hindustantimes.com##.header-ad +tech.hindustantimes.com##div.mobileNone +tech.hindustantimes.com##.centerAd768 +hindustantimes.com##.new_ads_unit +hindustantimes.com##.i-amphtml-unresolved +hindustantimes.com##.top250Ad +hindustantimes.com##[amp-access^="NOT"] +hindustantimes.com##.headerAds250 +hindustantimes.com##.FirstAd +hindustantimes.com##[class*="adsHeight"] +hindustantimes.com##[class^="TopStoriesAd_storyAd__"] +hindustantimes.com##[class^="QuizComponent_smallAds300__"] +!#if !env_mobile +hindustantimes.com##body:style(padding-top: 0 !important;) +!#endif +! popups https://elitegoltv. es/canal-1.php +newdmn.*##+js(nowoif, !newdmn, 1) +newdmn.*###overlay +kitchennovel.com##+js(nostif, show) +! mp4hentai.com ads +||mp4hentai.com/holy-cell-feb3/ +mp4hentai.com###custom_html-5 +! hentaihd.net player overlay +hentaihd.net##.active-item +! nypost.com PH +nypost.com##img[src$="/knewz_300x250.png"]:upward(.widget_text) +nypost.com##.entry-content > .nyp-video-player +decider.com,nypost.com,pagesix.com,the-sun.com,thescottishsun.co.uk,thesun.co.uk,thesun.ie##+js(rmnt, script, parentNode.removeChild) +decider.com,nypost.com,pagesix.com,the-sun.com,thescottishsun.co.uk,thesun.co.uk,thesun.ie##+js(acs, atob, parentNode.removeChild) +! xmegadrive.com popup +xmegadrive.com##+js(set, flashvars.adv_pause_html, '') +xmegadrive.com##.table +! nsfwmonster.com popup +nsfwmonster.com##+js(aeld, getexoloader) +moviehdf.*##+js(aopr, popUp) +moviehdf.*##+js(nowoif) +! popups, devtools detection https://moviessources .cf/embed/38700 +moviessources.*##+js(aeld, devtoolschange) +moviessources.*##+js(aopr, console.clear) +! citynews sites .it anti adb in video +agrigentonotizie.it,anconatoday.it,arezzonotizie.it,avellinotoday.it,bresciatoday.it,brindisireport.it,casertanews.it,cataniatoday.it,cesenatoday.it,chietitoday.it,forlitoday.it,frosinonetoday.it,genovatoday.it,ilpescara.it,ilpiacenza.it,latinatoday.it,lecceprima.it,leccotoday.it,livornotoday.it,messinatoday.it,milanotoday.it,modenatoday.it,monzatoday.it,novaratoday.it,padovaoggi.it,parmatoday.it,perugiatoday.it,pisatoday.it,quicomo.it,ravennatoday.it,reggiotoday.it,riminitoday.it,romatoday.it,salernotoday.it,sondriotoday.it,sportpiacenza.it,ternitoday.it,today.it,torinotoday.it,trevisotoday.it,triesteprima.it,udinetoday.it,veneziatoday.it,vicenzatoday.it##+js(nostif, bADBlock) +*$script,redirect-rule=noopjs,domain=examsnet.com +javfun.me###invideo_wrapper +tophentaicomics.com##+js(acs, pop_init) +tophentaicomics.com##.sidebar-wrapper.widget_text +tophentaicomics.com##.thumb-ad +||tophentaicomics.com/istrippers.jpg +||tophentaicomics.com/pop.js +k12reader.com##+js(aopr, rccbase_styles) +cachevalleydaily.com##+js(aopr, rccbase_styles) +cachevalleydaily.com##.main-top-ad +girlsofdesire.org##+js(aeld, getexoloader) +girlsofdesire.org##[href^="http://refer.ccbill.com/cgi-bin/clicks.cgi"] > div +girlsofdesire.org##a[class="pink"][href*="refer.ccbill.com"] +girlsofdesire.org##div[id$="_frame_content"][class="wide_boxcontent"]:has-text(Adblock) +girlsofdesire.org###box_896 +girlsofdesire.org###box_897 +girlsofdesire.org##+js(nosiif, /^/) +girlsofdesire.org##[href^="/click"]:remove-attr(href) +! popups animeindo .asia +animeindo.asia##+js(aeld, , _0x) +family-fuck.net##.plink +adultfun.net##+js(nowoif) +topnewsshow.com##+js(nostif, css_class.show) +*$script,redirect-rule=noopjs,domain=topnewsshow.com +panel.skynode.pro##+js(aopr, adBlockerDetected) +telesintese.com.br##+js(refresh-defuser) +! its.porn popunder pre-roll ads +its.porn##+js(set, POPUNDER_ENABLED, false) +its.porn##+js(set, plugins.preroll, noopFunc) +its.porn##aside +its.porn##.spot_large +its.porn##.desk-banners +its.porn###rock-widget-host +*$frame,denyallow=google.com,domain=its.porn +! verdragonball.online anti adb +@@||verdragonball.online^$ghide +*$popunder,domain=r18hub.com,3p +||r18hub.com/assets/vast/videos/*$xhr,1p +7misr4day.com##+js(nano-sib) +7misr4day.com##+js(aopr, adBlockDetected) +7misr4day.com##+js(nowoif) +7misr4day.com##+js(noeval-if, ads) +miklpro.com##+js(aopr, app_vars.force_disable_adblock) +miklpro.com##+js(set, blurred, false) +miklpro.com##.box-main > .blog-item +miklpro.com##.banner +*$script,3p,denyallow=google.com|gstatic.com|recaptcha.net,domain=miklpro.com +sshconect.com.br##+js(acs, addEventListener, nextFunction) +! hd21 group sites +! hd21.com/net +hd21.*##+js(nowoif) +hd21.com##.ID-bottom-banner +hd21.com##.adv_middle +hd21.*##.aside_video +hd21.com##.drt-sponsor-block +||hd21.*/templates/base_master/js/jquery.shows.min.js +! iceporn.com/net +iceporn.*##+js(nowoif) +iceporn.com##.puFloatLine +iceporn.com###abmessage +iceporn.*###spot_video_livecams +iceporn.*##.furtherance +iceporn.*##.take_place + .take_place +iceporn.*###spot_video_partner_banner +iceporn.*###spot_video_partner_banner + span[style] +nuvid.*##+js(aeld, click, open) +nuvid.*##+js(nowoif) +nuvid.*##div[style^="height:477px"] +nuvid.*##footer > .rfix +nuvid.*##.aside > h2 +nuvid.*##.download_adv_text_photo +nuvid.*##.video-options +nuvid.*##.advertisement +||nuvid.*/player_right_$frame +! pornlib.com +pornlib.*##+js(nowoif) +! tubeon.com/net +tubeon.*##+js(nowoif) +tubeon.*##.spots +tubeon.*##.thr-rcol +! vivatube.com/net +vivatube.*##+js(nowoif) +vivatube.*##.livecams +vivatube.*##.clear + .mt15.container[style="margin-top:15px; border-bottom:0;"] +! winporn.com/net +winporn.*##+js(nowoif) +! yeptube.com/net +yeptube.*##+js(nowoif) +yeptube.com##.puFloatLine +yeptube.*##.spots +yeptube.*##.thr-rcol +gaytail.com##+js(aeld, getexoloader) +gaytail.com##+js(acs, onload, onclick) +gaytail.com##.happy-footer +||gaytail.com/fancy-mode-7abe/ +||datawav.club/*.php +game-owl.com##+js(aost, String.prototype.charCodeAt, ai_) +streamsport.*##+js(aeld, , _0x) +streamsport.*##+js(nowoif) +@@||micro.rubiconproject.com/prebid/dynamic$script,domain=ladbible.com +ladbible.com#@#div[class*="margin-Advert"] +ladbible.com##span:has-text(Advert) +ladbible.com##[data-cypress="sticky-ads"] +@@||pub.doubleverify.com/signals/pub.js$xhr,script,domain=ladbible.com|gamingbible.*|tyla.com|unilad.com +@@||rubiconproject.com/prebid/$xhr,script,domain=ladbible.com|gamingbible.*|tyla.com|unilad.com +@@||static.adsafeprotected.com/vans-adapter-google-ima.js$xhr,domain=ladbible.com|gamingbible.*|tyla.com|unilad.com +@@||c.amazon-adsystem.com/aax2/apstag.js$xhr,domain=ladbible.com|gamingbible.*|tyla.com|unilad.com +ladbible.com##[data-cypress="sticky-header"] +*$image,redirect-rule=1x1.gif,domain=rollercoin.com +! windowmatters.com anti-adb +windowsmatters.com##+js(aeld, load, isBlanketFound) +*$script,redirect-rule=noopjs,domain=windowsmatters.com +windowsmatters.com##div[class$="-quick-adsense"] +! masbrooo.com/2ndrun.tv anti-adb +2ndrun.tv##+js(aeld, load, showModal) +*$script,redirect-rule=noopjs,domain=2ndrun.tv +2ndrun.tv##+js(set, DHAntiAdBlocker, true) +*$xhr,redirect-rule=nooptext,domain=fr.de +@@||fr.de^$ghide +fr.de##div[data-id-advertdfpconf] +hdpicsx.com##.ads +timesnownews.com##.ad-section-one +timesnownews.com##.ad-section-three +timesnownews.com##.ad-panel-wrap +timesnownews.com##.add-wrap +timesnownews.com##.right-block > .section-six +timesnownews.com##.right-block > .section-one +||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=google-ima.js,domain=timesnownews.com +@@||imasdk.googleapis.com/js/sdkloader/ima3_dai.js$script,domain=timesnownews.com +@@*$ghide,domain=timesnownews.com|timesnowhindi.com|timesnowmarathi.com|zoomtventertainment.com +timesnownews.com,timesnowhindi.com,timesnowmarathi.com,zoomtventertainment.com##.adunit +timesnownews.com,timesnowhindi.com,timesnowmarathi.com,zoomtventertainment.com##+js(nostif, Adblock) +!#if env_mobile +@@||onelinksmartscript.appsflyer.com/onelink-smart-script-latest.js$script,domain=timesnownews.com +!#endif +tormalayalam.*##+js(aopw, adcashMacros) +blograffo.net##+js(acs, addEventListener, nextFunction) +blograffo.net##[href^="https://amzn.to/"] +aquiyahorajuegos.net##+js(aopr, adBlockDetected) +aquiyahorajuegos.net##+js(nowoif) +aquiyahorajuegos.net##+js(no-fetch-if, googlesyndication) +imag-r.com##+js(aopr, adBlockerDetected) +/block-adblock.js$script +eropaste.net##+js(set, isAdBlockActive, false) +eropaste.net###banner-dl +adult-sex-gamess.com,hentaigames.app,mobilesexgamesx.com,mysexgamer.com,porngameshd.com,sexgamescc.com##+js(nostif, /out.php) +adult-sex-gamess.com,hentaigames.app,mobilesexgamesx.com,mysexgamer.com,porngameshd.com,sexgamescc.com##.a-th:first-child:has(iframe) +adult-sex-gamess.com,hentaigames.app,mobilesexgamesx.com,mysexgamer.com,porngameshd.com,sexgamescc.com##.alert-danger > .row +adult-sex-gamess.com,hentaigames.app,mobilesexgamesx.com,mysexgamer.com,porngameshd.com,sexgamescc.com##.ntkSides +adult-sex-gamess.com,hentaigames.app,mobilesexgamesx.com,mysexgamer.com,porngameshd.com,sexgamescc.com###modalegames +! d.pornxp.com/pornxp.org popup +pornxp.com##+js(aopr, exoNoExternalUI38djdkjDDJsio96) +pornxp.com,pornxp.org##+js(aopr, AaDetector) +*$script,3p,domain=pornxp.com +||pornxp.*/sp/$subdocument +! generic AaDetector mitigation +##div[id][style^="position: fixed; inset: 0px; z-index: 2147483647; background: black"][style*="opacity: 0.01"] +/heyboy/com/*.js$script +/loadme/com/*.js$script +sexflashgame.org##+js(acs, ishop_codes) +||porngames.com/*.gif$image,1p +porngames.com##div[style^="display: block; position: fixed; z-index:"] +@@||cdnjs.cloudflare.com/ajax/libs/fuckadblock$script +! wmoviesfree. com (.online) popups +wmoviesfree.*##.orange.big-color-btn +||wmoviesfree.*/themes/movies/img/banner_leaderboard$image +ehotpics.com,upicsz.com##figure[style^="width: 310px;"] +@@||down.mdiaload.com^$ghide +down.mdiaload.com##div[style$="background-color:#ffffff; text-align:center"] +down.mdiaload.com##div[style="width:336px; height:280px"] +down.mdiaload.com##.btn-dow.btn[href$=".html"] +down.mdiaload.com##div.download-option-btn:nth-of-type(4) +@@||securepubads.g.doubleclick.net^$script,domain=mope.io +@@||securepubads.g.doubleclick.net/gampad/ads$xhr,domain=mope.io +mope.io##[id^="google_ads_iframe"] +gaysearch.com##+js(nowoif) +gaysearch.com##.twocolumns > .aside +*$script,redirect-rule=noopjs,domain=kursors.lv +javbix.com##.adsvideo +javbix.com##.content_movie > div[style="padding:10px; margin-top:15px; text-align:center"] +javbix.com##.letterLi:last-of-type +rawmanga.top##+js(aopr, AaDetector) +2adultflashgames.com##+js(aopr, loadTool) +||2adultflashgames.com/img/$1p +gatcha.org##+js(nostif, css_class.show) +zilinak.sk##+js(nostif, offsetHeight) +loadout.tf##body > div:shadow(div):shadow(div):has(:shadow(div:not([class])):has(:shadow(ins.adsbygoogle[data-ad-client]))) +||raw.githack.com/Raqmedia/adblock/$script,3p +raqmedia.com##[href^="https://www.englezz.com"] +filtercams.com##+js(acs, $, #advVid) +filtercams.com##.table +! cryptofun .space anti adb +/adex.js$badfilter +@@||cryptofun.space^$script,1p +@@||shrink.icu/prebid.js$script +! various filters +/ajax/banner/list?page=$xhr +hd44.net##+js(aopr, decodeURI) +ytc.*##+js(nowoif) +||cdn.ay.gy/js/$script,3p +hianime.to,shahid4u.*,watchonlinemoviespk.*##+js(nowoif) +megaupto.com##+js(nano-stb, seconds) +projectfreetv.*,hdss.*,moviesflix.*,10starhd.*##^script:has-text(break;case) +www-y2mate.com##+js(nowoif) +filmyzilla.*##[href^="//"][rel="nofollow"] +streamhub.*##center > a[href][target="_blank"] +streamhub.*##+js(aopw, __aaZoneid) +streamhub.*##+js(nowoif) +streamingcommunity.*##+js(acs, decodeURI, decodeURIComponent) +*$script,3p,denyallow=streamhub.to,domain=streamhub.* +superstream.*##+js(aopr, AaDetector) +$script,3p,denyallow=bootstrapcdn.com,domain=uploadflix.* +||bloggingworld.net/wp-content/plugins^$3p +moviezwap.*##+js(nowoif) +moviezwap.*##[style^=" width: 305px;"][type^="button"][onclick^="window.location.href"] +xdld.pages.dev##+js(noeval-if, window.open) +/^https:\/\/[0-9a-z]{8,}\.[a-z0-9]{7,}\.[a-z]{4,}\/[0-9a-f]{32}\/a4\/[0-9a-f]{13}\.js$/$script,3p,match-case +/^https:\/\/[0-9a-z]{8,}\.[a-z0-9]{7,}\.[a-z]{4,}\/[0-9a-f]{32}\/b4\/[0-9a-f]{13}\.js$/$script,3p,match-case +! *** uAssets:filters/filters-2021.txt *** +||imasdk.googleapis.com/js/sdkloader/ima3.js$script,domain=ottwow.com,redirect=google-ima.js +@@||backlinkping.com^$ghide +@@||deine-tierwelt.de^$ghide +deine-tierwelt.de##.OUTBRAIN +deine-tierwelt.de##.header-leaderboard +deine-tierwelt.de##.js-sticky-ad +haho.moe##+js(aeld, mouseup, decodeURIComponent) +haho.moe##div:has(> div[title="Click to Close the Ad"]) +haho.moe##[href^="//"][style*="position: fixed;"] +*$script,3p,denyallow=fluidplayer.com|cdn77.org|gstatic.com|hwcdn.net|recaptcha.net,domain=haho.moe +! freeporncave.com auto-redirect +freeporncave.com##+js(nostif, location.replace, 300) +vectogravic.com##+js(acs, eval, replace) +kusonime.com##+js(rpnt, script, /\(window\.show[^\)]+\)/, (true), condition, classList.add) +kusonime.com##+js(nostif, css_class.show) +kusonime.com##+js(set, showada, true) +kusonime.com##+js(set, showax, true) +kusonime.com##+js(aopw, app_advert) +kusonime.com##.iklanads +@@||kusonime.com^$script,1p +@@||nyaa-tan.my.id/js/$script,3p,domain=kusonime.com +cararegistrasi.com##+js(nano-sib, timer) +cararegistrasi.com##+js(nowoif) +cararegistrasi.com##a[href="https://bahasteknologi.com/"] +pornhd8k.*###invideo_wrapper +xxvideoss.org##+js(acs, String.fromCharCode, 'shift') +||xxvideoss.org/wp-content/uploads/*/bannerrtx.jpg$image,1p +/player/html.php?aid=post_roll_html^$redirect=noopframe,frame,1p +/player/html.php?aid=start_html&*&referer=$frame,1p +/player/html.php?aid=pause_html&*&referer=$frame,1p +/player/html.php?aid=pre_roll_html&*&referer=$frame,1p +||twinrdsrv.com^ +/preroll.engine? +/get_file/*.mp4/?rnd=$image +donghuanosekai.com##+js(nosiif, visibility, 1000) +! bitsfree.net/getdoge.io/qashbits.com anti-adb +qashbits.com##+js(aopr, NoAdBlock) +qashbits.com##.mx-auto +! e-sushi .fr popup +e-sushi.fr##+js(rmnt, script, window.open) +freeindianporn.mobi##+js(aeld, /.?/, popMagic) +||xedo.me^$3p +radionylive.com,radioitalylive.com,radiolovelive.com,radiocountrylive.com,radiosymphony.com,miamibeachradio.com,radiorockon.com,radioitaliacanada.com,radioitalianmusic.com,radioamericalatina.com,radiosantaclaus.com,radionorthpole.com,radionatale.com##+js(aopr, adp) +radionylive.com,radioitalylive.com,radiolovelive.com,radiocountrylive.com,radiosymphony.com,miamibeachradio.com,radiorockon.com,radioitaliacanada.com,radioitalianmusic.com,radioamericalatina.com,radiosantaclaus.com,radionorthpole.com,radionatale.com##[id^="ads-"] +! absolugirl .com ads +absolugirl.com,absolutube.com##+js(aopr, document.dispatchEvent) +@@||chaturbate.com/*embed$frame,domain=absolugirl.com +! allafricangirls .net ads + popups +allafricangirls.net##+js(aopr, document.dispatchEvent) +allafricangirls.net##[id^="exo_"] +allafricangirls.net##[src*="/banner"] +elvocero.com##+js(acs, __tnt, compatibility) +! popups, popunders, ads +dirtyfox.net##+js(aopr, decodeURI) +booru.eu,borwap.xxx,foxtube.com,hd-xxx.me,javembed.*,kissanime.*,longporn.xyz,matureworld.ws,sexy-games.*,xvideos.name,xxx-videos.org,xxxputas.net,youpornfm.com,maxtubeporn.net##+js(nowoif) +freexxxvideos.pro,nude-teen-18.com##+js(aopr, document.dispatchEvent) +123strippoker.com,babepedia.com,boobieblog.com,borwap.xxx,gamesofdesire.com,hd-xxx.me,hentaipins.com,longporn.xyz,pornhd720p.com,sikwap.xyz,super-games.cz,xxx-videos.org,xxxputas.net##+js(aopr, loadTool) +blackpornhq.com,xsexpics.com,wannafreeporn.com##+js(aeld, , pop) +soyoungteens.com##+js(aeld, getexoloader) +hentaipins.com##+js(acs, pop_init) +hentaipins.com##+js(aopr, popundrCheck) +pornvideoq.com##+js(aopr, history.replaceState) +rexxx.org##+js(aopr, rexxx.swp) +stvid.com##+js(noeval) +hypnohub.net,xnxxporn.video,xxxdessert.com,xxxshake.com##+js(aopr, exoNoExternalUI38djdkjDDJsio96) +freepornxxxhd.com##+js(acs, String.fromCharCode, constructor) +hot-cartoon.com,richhioon.eu##+js(aopr, BetterJsPop) +123movieshd.*##+js(aopr, mm) +123movieshd.*##+js(set, p18, undefined) +cfake.com###over +theyarehuge.com##+js(acs, Object.defineProperty, clickHandler) +*$script,3p,denyallow=bootstrapcdn.com,from=youdbox.* +! 123movies4u. site => player eplayvid. net popups +porntry.com##.js-mob-popup +erotic-beauties.com,hardsex.cc,sex-movies.biz,sikwap.xyz,tube18.sexy##+js(acs, pop_init) +blackcunts.org,finderporn.com##+js(acs, onbeforeunload) +dansmovies.com##+js(aopr, popunder) +hentaianimedownloads.com##+js(acs, puShown, /doOpen|popundr/) +grosnews.com##+js(acs, adcashMacros) +xxxymovies.com##+js(set, flashvars.adv_pause_html, '') +dirtyship.com##+js(acs, onload) +hotscopes.*##+js(aopw, puShown) +hotscopes.*##+js(nowoif) +hotscopes.*##.ml-auto.navbar-nav +afrodity.sk,brato.bg,cotannualconference.org.uk,couponsuniverse.com,cycraracing.com,dahh.net,dlhe-videa.sk,elmalajeno.com,extreme-board.com,free-famous-toons.com,istanbulescortnetworks.com,ok-th.com,payt.com,podkontrola.pl,redtubemov.com,shtab.su,spiritword.net##+js(acs, document.createElement, 'script') +elmalajeno.com##^script:has-text(d.createElement('script')) +elmalajeno.com##^script:has-text(d.createElement(\'script\')) +@@||onlinefetishporn.cc^$ghide +@@||streamextreme.cc^$ghide +shegotass.info##+js(aopr, popunder) +shegotass.info##+js(set, flashvars.adv_pre_vast, '') +xxxshake.com##+js(set, flashvars.adv_pause_html, '') +tubsxxx.com##+js(nostif, window.location.href) +camlovers.tv##+js(set, flashvars.protect_block, '') +anybunny.com##td[width="360"] +babepedia.com##.sidebar_block > a[rel="nofollow noopener"] +borwap.xxx##.embedright +cartoonvideos247.com##.adv +cartoonvideos247.com##.sponsor +cartoonvideos247.com##.topad +erotic-beauties.com##.sidebar > .widget_text +ezjav.com###preroll +ezjav.com##center +ezjav.com##div[style="overflow: hidden !important;margin-bottom:8px;"] +freexxxvideos.pro##.sidban +hd-xxx.me##.videoOverAdBig +hdjavonline.com##.happy-inside-player +hentaipins.com##.sidebar-wrapper.widget_text +hentaipins.com##.thumb-ad +hotntubes.com##td[width="360"] +javbest.xyz##.adsvideo +javrave.club,javraveclub.com##.leader_banner +kingcomix.com##[href^="//"][rel="nofollow norefferer noopener"] +longporn.xyz##[href="http://toplivesexcams.net"] +movies18.net##[href*="/go/"] +nude-teen-18.com##.cht6 +nude-teen-18.com##.rtrrtrlight-in-2 +pornvideoq.com###playerOverlay +pornvideoq.com##.h250 +sexpuss.org##.bn1 +sexpuss.org##.tu-sexc3 +sexroom.xxx##.table +sissytube.net##a[href^="http://refer.ccbill.com/"] +thecartoonporntube.com##[href="/go/tube.php"] +thecartoonporntube.com###advertising [href] +womennaked.net##.hrcht6 +pt.potwm.com##.pausedView +pt.potwm.com##.shown.visible.onlineIndicator +||protoawegw.com^$3p +tubsxxx.com##.aBlock +tubsxxx.com##.videoAd +pornez.net###cb00 +pornez.net###cb01 +pornxday.com,twinkybf.com##.happy-sidebar +###playerOverlay[style="position:absolute; z-index:3"] +roshy.tv##.roshy-widget +roshy.tv##.beeteam368-player-sub-element +roshy.tv##div[class*="roshy-stripchat-"] +roshy.tv##div[style]:has(> [id^="roshy-"]) +roshy.tv##.is-single-post-main-player > div:has(> div[class*="roshy-stripchat-"]) +roshy.tv##.shortcode_widget +*$script,3p,denyallow=cloudflare.com|cloudflare.net|fastly.net|jsdelivr.net|unpkg.com|zencdn.net,domain=xxxfiles.com +*$script,domain=hoporno.net,3p,denyallow=googleapis.com +/istripper*$image,domain=hentaipins.com +/popup/exo-ads.$frame,1p +/xxx.js|$script,1p +||brazz-girls.com/chaturbate/ +||brazz-girls.com/scripts/yall.*.js +||elitepaysites.com/photos/*.gif$image +||ezjav.com/p.js +||fapfappy.com/*.php$script,1p +||freepornxxxhd.com^*/exopop.js +||hentaipins.com/*.php$script,1p +||hentaipins.com/pop.js +||i.imgur.com^$domain=anime-hentai.jp.net|ezjav.com +||ibradome.com/ba/chargi.js +||imgbox.com/ae/$domain=matureworld.ws +||jorpetz.com/kahitano/banner.gif +||katestube.com/jsb/js_script.js +||mixxporn.com/b1.php +||pornhex.com/nb/ +||pornofaps.com/frosty-bread-04ce/ +||seed69.com/wp-content/uploads/*.gif$image +||sexyaporno.com/chat_$script +||tb.fuckandcdn.com/tbstatic*/tryboobs/compiled/script. +||thecartoonporntube.com/*.gif$image +||xszav.club/nb/ +||xxxdessert.com/*_fe.js +||camlovers.tv^$script,1p +@@||camlovers.tv/player/kt_player.js +||goryachie-foto.net^$3p +||pub.contexthub.net^ +||ptwmstc.com/npt/banner/ +||tabooporn.tv^$3p +||xmorex.com^$3p +##.full-ave-pl +##.full-bns-block +##.vertbars +##.video-brs +/safu/safu.js +! exit prevention, redirect, popups +/tp/filter.php?pro= +/myvids/rek/*$frame,script,1p +/myvids/show.php$frame,1p +/myvids/click/*$script,1p +###plban +##div[class$="player-promo-col"] +##.player-bns-block +/zlk/zlk.js +/pop1.js|$script,1p +||easyads28.*^ +! adultsclips.com,cutewifes.com,sexenvelope.com,sexpun.com +.com/fr.js|$1p +.com/v.js?v=3|$1p +! www.xxxvideor.com +/static/js/abb.js|$script,1p +! sextubexxl.com +/common-js/exit/om2.min.js +! wikiporn.tv etc. +/nb/thejsfile.js +m-hentai.net##div.leaderboardcontainer +m-hentai.net##div[class^="landingpageadcontainer_iframe"] +||m-hentai.net/JS/exoclick%20popunder.js +jetpunk.com##+js(no-xhr-if, prebid) +jetpunk.com##+js(cookie-remover, PageCount) +jetpunk.com##+js(set-local-storage-item, PageCount, $remove$) +jetpunk.com##+js(trusted-set, asc, 'json:{"cmd": [null], "que": [null], "wrapperVersion": "6.19.0", "refreshQue": {"waitDelay": 3000, "que": []}, "isLoaded": true, "bidderSettings": {}, "libLoaded": true, "version": "v9.20.0", "installedModules": [], "adUnits": [], "aliasRegistry": {}, "medianetGlobals": {}}') +jetpunk.com##+js(trusted-set, google_tag_manager, 'json:{ "G-Z8CH48V654": { "_spx": false, "bootstrap": 1704067200000, "dataLayer": { "name": "dataLayer" } }, "SANDBOXED_JS_SEMAPHORE": 0, "dataLayer": { "gtmDom": true, "gtmLoad": true, "subscribers": 1 }, "sequence": 1 }') +@@||jetpunk.com^$script,1p +@@||jetpunk.com^$ghide +||jetpunk.com/resources/asc.js^$script,1p,important +jetpunk.com##.banner-ad-outer +jetpunk.com##.box-ad-inner +jetpunk.com##.box-ad-outer +jetpunk.com##.banner-x-outer +jetpunk.com##.support-beg +imgur.com##+js(set, ADBLOCKED, false) +! reported +imgur.com,imgur-com.translate.goog##+js(set-cookie, WHITELISTED_CLOSED, 1) +||sascdn.com/diff/$script,redirect=noopjs,domain=imgur.com +imgur.com##a[href].Post-item:has(.Post-item-external-ad):style(opacity: 0 !important; cursor: unset !important; pointer-events: none !important;) +imgur.com##+js(set, Object.prototype.adsEnabled, false) +@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$xhr,domain=comidoc.net +comidoc.net#@#.googlead +@@||doubleclick.net^$xhr,domain=comidoc.net +comidoc.net##div[style="text-align: center; margin-left: auto; margin-right: auto; min-height: 266px; max-width: 100vw;"] +comidoc.net##div:has(> .adsbygoogle) +comidoc.net##div[style="text-align:center;margin-left:auto;margin-right:auto;min-height:266px;max-width:90vw"] +forum.gigabyte.us###ad1 +forum.gigabyte.us##[id^="ad-desktop-bottom"] +forum.gigabyte.us###remove_ads_link +! 1primewire .com popups ads +||1primewire.com/addons/$image +1primewire.com##[id]:has(> [class="close ico"]) +! cyberdefensemagazine.com anti-adb +cyberdefensemagazine.com##[href^="https://www.coresecurity.com/"] +cyberdefensemagazine.com###bsaIframe +! kisahdunia.com anti-adb +kisahdunia.com##+js(aeld, DOMContentLoaded, adsBlocked) +kisahdunia.com##+js(aost, setTimeout, adsBlocked) +kisahdunia.com##.textwidget +kisahdunia.com##[href^="https://www.samsung.com/"] +hentaicomics.pro##+js(set, adb, 0) +hentaicomics.pro##+js(nowoif) +||hentaicomics.pro/*?code=$doc,other,removeparam=code +withukor.com##+js(acs, document.addEventListener, google_ad_client) +taming.io##+js(no-xhr-if, ads) +taming.io###preroll +taming.io###left-bbb +taming.io###bottom-bbb +! todaypk related +todaypk.*,todaypktv.*,1todaypk.*##+js(nowoif) +1todaypk.*,todaypk.*##[href="/watchnow.php"] +todaypk.*##[href="/watchfree.php"] +todaypktv.*##.ad_watch_now +todaypktv.*##.hd-buttons1 +faptitans.com##.cross-promo-bnr +||faptitans.com^*/rc/logo.jpg +||theonlygames.com/ps_banner/ +world4.eu##+js(aost, String.prototype.charCodeAt, ai_) +world4.eu##+js(aopr, ai_run_scripts) +||doubleclick.net/tag/js/gpt.js$object,redirect=noop.js,domain=world4.eu +*$image,3p,redirect-rule=1x1.gif,domain=world4.eu +laptrinhx.com##+js(nosiif, clearInterval(i), 1000) +laptrinhx.com##.ads +@@||imasdk.googleapis.com/js/sdkloader/ima3.js$script,domain=bbcamerica.com +babestube.com,momvids.com,porndr.com##+js(aopr, decodeURI) +babestube.com,momvids.com,porndr.com##div[style="position: absolute; inset: 0px; overflow: hidden; z-index: 160; background: transparent none repeat scroll 0% 0%; display: block;"] +babestube.com##[src^="https://www.babestube.com/player/html.php"] +babestube.com,momvids.com##.aside +babestube.com,momvids.com##.spot > div +momvids.com##[src^="https://www.momvids.com/player/html.php"] +porndr.com##div.opt +porndr.com##.we_are_sorry +||porndr.com/*/*.php^ +||babestube.com/bt*/bt.js +||momvids.com/mm*/mv.js +! Mostly taken from AG and seen on various NSFW sites +/_a_ta/s/s/* +/a/ipn/js/* +/a/pop/js/* +/local_p.js^ +/local_ssu.js| +/s/js/ssu.v2.js?v= +/s/s/sui.php +/s/s/suo.php +/s/s/supc.php +/s/s/supv.php +/s/su.php?t= +/javascript/fropo.js +/s/s/js/m/custom.js? +/s/s/js/m/custom_advanced.js? +/s/s/js/m/im.js? +/s/s/js/ssu.v2. +/s/s/js/m/push.js? +/a/na/js/*$3p +deviants.com##+js(aopr, decodeURI) +deviants.com##div[style="position: absolute; inset: 0px; overflow: hidden; z-index: 160; background: transparent none repeat scroll 0% 0%; display: block;"] +deviants.com##.aside +deviants.com##.spot > div +||deviants.com/player/html.php^ +||deviants.com/dv*/dv.js +totv.org###ad +manhwa18.cc##+js(aopr, exoNoExternalUI38djdkjDDJsio96) +||a.realsrv.com/nativeads-v2.js$xhr,redirect=noop.txt +! healthelia .com anti adb +healthelia.com##+js(nostif, google_jobrunner) +! happypenguin.altervista .org anti adb +happypenguin.altervista.org##+js(nostif, adb) +elektrikmen.com##+js(aopr, b2a) +||wheelwheel.space^$3p +love4porn.com##+js(rpnt, script, document.head.appendChild, xxx) +love4porn.com##+js(set, flashvars.popunder_url, '') +love4porn.com##div[style="position: absolute; inset: 0px; overflow: hidden; z-index: 160; background: transparent none repeat scroll 0% 0%; display: block;"] +love4porn.com##.sponsor +love4porn.com##.table +crazyporn.xxx##div[style="position: absolute; inset: 0px; overflow: hidden; z-index: 160; background: transparent none repeat scroll 0% 0%; display: block;"] +crazyporn.xxx##.table +crazyporn.xxx##.sponsor +crazyporn.xxx##.item:has(> script[src^="/ai/"]) +freehardcore.com##+js(aopr, decodeURI) +! down.fast-down.com anti adb +@@||down.fast-down.com^$ghide +down.fast-down.com##div[style="width:336px; height:280px; background-color:#ffffff; text-align:center"] +usagoals.*##+js(nowoif) +@@||foxgreat.com^$ghide +haoweichi.com##+js(aopr, onload) +haoweichi.com##.ad2 +okteve.com##+js(set, xpv, {}) +okteve.com##+js(set, xpv.v, true) +okteve.com##+js(acs, EventTarget.prototype.addEventListener, .clientHeight===0) +arab4media.com##+js(acs, addEventListener, nextFunction) +! pinoyalbums. com anti adb +*$script,redirect-rule=noopjs,domain=pinoyalbums.com +pinoyalbums.com##+js(aeld, , adb) +easylinkref.com##+js(nano-sib, , , 0) +easylinkref.com##center > a[href][target=_blank] > img +w3layouts.com##+js(nostif, show) +||getsexgames.com/templates/sexgames/$image,1p +getsexgames.com##.center > table[cellspacing="5"] > tbody > tr:last-child:has(> td > h1) +getsexgames.com##.center > table[cellspacing="0"]:last-child > tbody > tr:last-child +getsexgames.com##.leftMenu .menuHeadline:has-text(3D) +getsexgames.com##.menuAff +getsexgames.com##.menuPointPic +! hd-pornos. com => info +hd-pornos.*##.vjs-overlayed +hd-pornos.*###spezial_column +hd-pornos.*##div[id="wrapper_content"] > aside +! kickass sites +*$script,1p,domain=~kat.ai|~kat.pink|~kat.computer|~kat.am|~kat.at|~kat.directory|~kat.rip|~kat.software|~kat.studio|~kickass.codes|~kickass.website|kat.*|katbay.*|kickass.*|kickasshydra.*|kickasskat.*|kickass2.*|kickasstorrents.*|kat2.*|kattracker.*|thekat.*|thekickass.*|kickassz.*|kickasstorrents2.*|topkickass.*|kickassgo.*|kkickass.*|kkat.*|kickasst.*|kick4ss.*|kickassbay.*|torrentkat.*|kickassuk.*|torrentskickass.*|kickasspk.*|kickasstrusty.*|katkickass.*|kickassindia.*|kickass-usa.*|kickassaustralia.*|kickassdb.*|kathydra.*|kickassminds.*|katkickass.*|kickassunlocked.*|kickassmovies.*|kickassfull.*|bigkickass.*|kickasstracker.*|katfreak.* +kat.*,kickass.*,kickass2.*,kickasstorrents.*,kat2.*,kattracker.*,thekat.*,thekickass.*,kickassz.*,kickasstorrents2.*,topkickass.*,kickassgo.*,kkickass.*,kkat.*,kickasst.*,kick4ss.*,katbay.*,kickasshydra.*,kickasskat.*,kickassbay.*,torrentkat.*,kickassuk.*,torrentskickass.*,kickasspk.*,kickasstrusty.*,katkickass.*,kickassindia.*,kickass-usa.*,kickassaustralia.*,kickassdb.*,kathydra.*,kickassminds.*,katkickass.*,kickassunlocked.*,kickassmovies.*,kickassfull.*,bigkickass.*,kickasstracker.*,katfreak.*##[style*="decoration"]:not([style^="width"]) +kat.*,katbay.*,kickass.*,kickasshydra.*,kickasskat.*,kickass2.*,kickasstorrents.*,kat2.*,kattracker.*,thekat.*,thekickass.*,kickassz.*,kickasstorrents2.*,topkickass.*,kickassgo.*,kkickass.*,kkat.*,kickasst.*,kick4ss.*##[href="/k.php?q=q"] +@@||kickasstorrents.*/static/js/all.js$script,1p +kickass.*###notification-bar +kickass.*##.alert +kickass.*##+js(rmnt, style, text-decoration) +kickass.*##[id]:matches-attr(id=/[a-zA-Z]{40,}/) +kat.*,katbay.*,kickass.*,kickasshydra.*,kickasskat.*,kickass2.*,kickasstorrents.*,kat2.*,kattracker.*,thekat.*,thekickass.*,kickassz.*,kickasstorrents2.*,topkickass.*,kickassgo.*,kkickass.*,kkat.*,kickasst.*,kick4ss.*##+js(aeld, , break;case $.) +kat.*,katbay.*,kickass.*,kickasshydra.*,kickasskat.*,kickass2.*,kickasstorrents.*,kat2.*,kattracker.*,thekat.*,thekickass.*,kickassz.*,kickasstorrents2.*,topkickass.*,kickassgo.*,kkickass.*,kkat.*,kickasst.*,kick4ss.*##+js(aopw, ospen) +*.js|$script,1p,domain=isohuntz.*|isohunt.*|isohunts.*|isohuntx.*|isohunthydra.*|isohunters.*|isohunting.*|myisohunt.* +*$csp=script-src *,domain=isohuntz.*|isohunt.*|isohunts.*|isohuntx.*|isohunthydra.*|isohunters.*|isohunting.*|myisohunt.* +*$frame,domain=isohuntz.*|isohunt.*|isohunts.*|isohuntx.*|isohunthydra.*|isohunters.*|isohunting.*|myisohunt.* +*$script,1p,domain=torrentproject2.* +*$csp=script-src *,domain=torrentproject2.* +*$frame,domain=torrentproject2.* +/istripper.js +convert2mp3.club##+js(nowoif) +convert2mp3.club###idIframe +! mylegalporno.com popup, ads +mylegalporno.com##+js(aeld, click, pu_count) +mylegalporno.com##.rmedia +mylegalporno.com##.zone +||mylegalporno.com^$frame,1p +winaero.com#@#.entry-content > div > div +winaero.com##[href^="/idx.php"] +javporn18.com##+js(acs, mypop) +javporn18.com###contentDiv +javporn18.com##.player_box +vrporngalaxy.com##+js(nowoif) +123unblock.*##+js(acs, atob, decodeURIComponent) +123unblock.*##+js(acs, adcashMacros) +123unblock.*##.alert-dismissible +||binomo.com/en/promo/*$doc +simply-hentai.com##.cam-container +simply-hentai.com##.reader > div.mb-3 > div.mt-3 +animesa.*##+js(set, adblock_use, false) +*$frame,3p,denyallow=cbox.ws,domain=animesa.* +subtitleone.cc##+js(set, Object.prototype.adblockFound, false) +||wixstatic.com/media/*~mv2.gif$domain=taxi-point.co.uk +taxi-point.co.uk##div[id^="comp-"]:has(> a[data-testid="linkElement"] > wix-image[data-src$="~mv2.gif"]) +taxi-point.co.uk##div[id^="comp-"][class^="_"] > div[class^="_"][style^="padding-left"] +! javynow.com popup +javynow.com##+js(nowoif) +javynow.com##.videos-ad__wrap:style(background-color: transparent !important) +@@||escapegames24.com^$ghide +escapegames24.com##ins.adsbygoogle +escapegames24.com###HTML13 +escapegames24.com###HTML3 +escapegames24.com###HTML2 +escapegames24.com###HTML11 +escapegames24.com###HTML6 > .widget-content b +escapegames24.com##div[id^="post-"] b +*$script,redirect-rule=noopjs,domain=jnckmedia.com +! zdravenportal. eu anti adb +zdravenportal.eu##+js(acs, jQuery, ads) +best18porn.com##+js(aopr, exoNoExternalUI38djdkjDDJsio96) +best18porn.com##.banner +best18porn.com##.in-player-spot +||best18porn.com/best18.js +shooshtime.com##+js(acs, document.getElementsByTagName, adn) +! th-world. com anti adb +th-world.com##+js(nostif, nextFunction, 250) +actionviewphotography.com,exporntoons.net,mat6tube.*,noodlemagazine.com,exporntoons.net,whatisareverseauction.com,sibtok.com,ukdevilz.com,tyler-brown.com##div[style]:has(> ins) +actionviewphotography.com,exporntoons.net,mat6tube.*,noodlemagazine.com,exporntoons.net,whatisareverseauction.com,sibtok.com,ukdevilz.com,tyler-brown.com##div[style]:has(> [id*="_ad_native_"]) +actionviewphotography.com,exporntoons.net,mat6tube.*,noodlemagazine.com,exporntoons.net,whatisareverseauction.com,sibtok.com,ukdevilz.com,tyler-brown.com##noindex +actionviewphotography.com,exporntoons.net,mat6tube.*,noodlemagazine.com,exporntoons.net,whatisareverseauction.com,sibtok.com,ukdevilz.com,tyler-brown.com##+js(nano-stb, download, 1100) +||ipvertnet.com/clickunder/ +||binpartner.com^$3p +||olymptrade.com^$3p +mysexgames.com##+js(aopr, loadTool) +mysexgames.com##+js(set, createCanvas, noopFunc) +ebookbb.com##^script:has-text('shift') +ebookbb.com##^script:has-text(\'shift\') +*$3p,script,denyallow=google.com|gstatic.com|recaptcha.net|hcaptcha.com,domain=ebookbb.com +romaniataramea.com##.sgpb-popup-dialog-main-div-wrapper +romaniataramea.com##.sgpb-popup-overlay +romaniataramea.com##html:style(overflow: auto !important;) +romaniataramea.com##+js(aopr, bizpanda) +*/wp-content/plugins/sociallocker-next-premium/$script,css +techjunkie.com##.home-page.main-section, html > body:style(margin-top: 0px !important;) +techjunkie.com##.slideMenu:style(top: -7px !important;) +techjunkie.com##body:style(padding-top: 0px !important;) +techjunkie.com##header:style(top: 0px !important;) +celebritynakeds.com##.show-over-1000.async-reklam-placeholder +oyohd.*##+js(nowoif) +vidohd.com##+js(aopr, __Y) +||oyohd.*/cdn-cgi/trace$xhr,1p +lesbian8.com##+js(aopr, decodeURI) +amateur8.com,bigtitslust.com,ebony8.com,freeporn8.com,lesbian8.com,maturetubehere.com,sortporn.com##+js(set, flashvars.adv_pre_vast, '') +amateur8.com,bigtitslust.com,dafreeporn.com,ebony8.com,freeporn8.com,lesbian8.com,maturetubehere.com,shemalesin.com,sortporn.com##+js(aopw, __spotSettings) +amateur8.com,bigtitslust.com,freeporn8.com,lesbian8.com,maturetubehere.com,sortporn.com##.footer-margin +amateur8.com,ebony8.com,lesbian8.com,maturetubehere.com,shemalesin.com##.table +ebony8.com,lesbian8.com,maturetubehere.com,shemalesin.com##.sponsor +bigtitslust.com##[href^="https://www.bigtitslust.com/link/"] +lesbian8.com##[href^="https://www.lesbian8.com/link/"] +sortporn.com##[href^="https://www.sortporn.com/link/"] +bigtitslust.com,freeporn8.com,lesbian8.com,sortporn.com##.mitaru +amateur8.com,bigtitslust.com,freeporn8.com,lesbian8.com,sortporn.com##.calibro +/s/s/js/i-top.js?v= +/sum.js?i=*&v= +@@||services.brid.tv/player/$script,domain=babylonbee.com +boobsrealm.com##+js(acs, puShown, /doOpen|popundr/) +||boobsrealm.com/wp-content/uploads/*-banner$image,1p +||bustyporn.com/*.php?src=$frame,3p +boobsrealm.com##iframe[style$="height: 250px;"] +720pstream.*##+js(nowoif) +720pstream.*##+js(nostif, "admc") +*$script,3p,denyallow=chatango.com|cloudfront.net|sharethis.com,domain=720pstream.* +720pstream.*,embedsports.me,embedstream.me,reliabletv.me##.bg-dark.position-absolute +!#if cap_html_filtering +720pstream.*,embedsports.me,embedstream.me,reliabletv.me##^script:has-text(adserverDomain) +embedsports.me,embedstream.me,reliabletv.me##^script:has-text(/break;case|FingerprintJS/) +!#else +720pstream.*,embedsports.me,embedstream.me,reliabletv.me##+js(rmnt, script, adserverDomain) +embedsports.me,embedstream.me,reliabletv.me##+js(rmnt, script, /break;case|FingerprintJS/) +embedsports.me,embedstream.me,reliabletv.me##+js(aeld, message) +!#endif +reliabletv.me##html > iframe[style="display: none;"]:remove() +@@/?scode=*&stream=$xhr,domain=reliabletv.me +! ytanime.tv ads +ytanime.tv##^script:has-text(u_cfg) +ytanime.tv##+js(aopr, u_cfg) +ytanime.tv##+js(aopw, adcashMacros) +*$script,3p,denyallow=arc.io|bootstrapcdn.com|chatango.com|cloudflare.com|cloudflare.net|disqus.com|disquscdn.com|facebook.net|fastly.net|fastlylb.net|fbcdn.net|google.com|googleapis.com|gstatic.com|hwcdn.net|jquery.com|jsdelivr.net|jwplatform.com|jwpcdn.com|recaptcha.net,domain=ytanime.tv +! guardaserie. name popunder +||googletagmanager.com/gtag/js^$redirect=google-analytics_analytics.js,domain=guardaserie.* +guardaserie.*##+js(aeld, , /pop|_blank/) +!#if env_chromium +||doubleclick.net/gampad/ads?*&output=xml_vmap$xhr,redirect=noopvmap-1.0,important,domain=tver.jp +!#endif +unblocked.name##+js(aopr, GetWindowHeight) +unblocked.name##+js(aopr, decodeURIComponent) +unblocked.name##+js(acs, adcashMacros) +unblocked.name##[style*="decoration"]:not([style^="width"]) +unblocked.name##.cborz-bordered +unblocked.name##.durs-bordered +unblocked.name##+js(aost, Math.random, ) +unblocked.name##[id^="cookie"] +||unblocked.name/zpp/*$script,domain=unblocked.name +/hy.js$script,domain=unblocked.name +||icyporno.com/jss/external_pop.js +||icyporno.com/_ad +icyporno.com###parrot +icyporno.com###embed-overlay +tucsitupdate.blogspot.com##+js(acs, addEventListener, google_ad_client) +*$script,3p,denyallow=cloudflare.com|cloudfront.net|fastly.net|googleapis.com|gstatic.com|jwpcdn.com|sharethis.com|sharethis.net,domain=toonanime.* +garrysmods.org##.blocker.jquery-modal +garrysmods.org##body[style="overflow: hidden;"]:style(overflow: auto!important;) +@@||gaming-style.com^$script,1p +cryptojunkie.net##+js(nobab) +*$script,redirect-rule=noopjs,domain=cryptojunkie.net +jagoanssh.com##+js(nosiif, visibility, 1000) +*$image,redirect-rule=1x1.gif,domain=vpnstunnel.com +tyla.com#@#div[class*="margin-Advert"] +tyla.com##div[class$="-margin-Advert"]:style(height:1px !important;width:1px !important;position:absolute !important;left:-3000px !important) +! scnlog.me popups/ads +*$script,3p,denyallow=cloudflare.com|google.com|gstatic.com|recaptcha.net|hcaptcha.com,from=scnlog.me +ancient-origins.*##+js(set, document.bridCanRunAds, true) +! dekki.com ads +dekki.com##div[pb-serve-label*="advert"]:upward(2) +pcso-lottoresults.com##+js(nosiif, visibility, 1000) +bittools.net##+js(acs, onload, fetch) +otomi-games.com##+js(nano-sib) +otomi-games.com##+js(aopr, popns) +otomi-games.com##a[href^="https://t.trcktr.com/"] +@@*$ghide,domain=fastcoin.ga|dropcoins.xyz|faucetbr.tk|is2btc.com +fastcoin.ga##div[style="height: 90px;"] +fastcoin.ga##div[style="width:728px;height:90px;display: inline-block;margin: 0 auto"] +fastcoin.ga##.justify-content-center.col-sm-12.row > .overflow > center > .slide.carousel +fastcoin.ga##center > .justify-content-center.row +is2btc.com##.text-center.col-sm-3 +is2btc.com##div.col-sm-3:first-child +is2btc.com##ins[class][style="display:inline-block;width:728px;height:90px;"] +is2btc.com##div[class][style="width:300px;height:600px;display: inline-block;margin: 0 auto"] +is2btc.com##div[class][style="width:300px;height:250px;display: inline-block;margin: 0 auto"] +is2btc.com##.overlay +is2btc.com##div.col-sm-3:nth-of-type(3) +is2btc.com##.text-center.col-sm-12 +*$script,3p,denyallow=bootstrapcdn.com|cloudflare.net|consensu.org|fontawesome.com|google.com|gstatic.com|hwcdn.net|jquery.com|jsdelivr.net,domain=dropcoins.xyz|fastcoin.ga|faucetbr.tk|is2btc.com|quickclaims.*|swift4claim.com +sunhope.it##+js(nosiif, document.getElementById, 10000) +! propeller crap +||shortlinkto.*^$csp=default-src 'self' *.favicon.cc *.google.com *.gstatic.com *.googleapis.com +fulltube.*##.mvic-btn +||wifi4games.com/sw.js$script,1p +! vibehubs. com antiadb and ads +vibehubs.com##+js(aost, jQuery, ai_adb) +vibehubs.com##[href^="https://www.star-clicks.com/"] +vibehubs.com##.code-block-4.code-block > [href] +afilmyhouse.blogspot.com##+js(nowoif) +crackevil.com##.pop-ad-wrap +pcgamer.com##+js(aopr, _sp_._networkListenerData) +pcgamer.com##.onesignal-customlink-container +pcgamer.com##div[style="position: fixed; bottom: 0px; left: 0px; width: 100%; min-height: 90px; background-color: rgba(245, 245, 245, 0.8); z-index: 9995;"] +pcgamer.com##.listingResult:has(> div.sponsored-post) +@@||bordeaux.futurecdn.net/bordeaux.js$domain=pcgamer.com +||champagne.futurecdn.net/champagne.js +||freyr.futurecdn.net/freyr.js +gaminggorilla.com##+js(aopr, history.replaceState) +! pagalworld.video ad popups +pagalworld.us,pagalworld.video##+js(nowoif) +codesnail.com##+js(nostif, css_class.show) +codesnail.com##.widget_custom_html +! babytorrent. uno popups +babytorrent.*##+js(aopr, decodeURI) +! pirlotvonlinehd. me +rojadirectatvhd.*##+js(aeld, , _0x) +! anti adb + popups +*$script,3p,domain=tanix.net +tvn.pl##+js(json-prune, movie.advertising.ad_server playlist.movie.advertising.ad_server) +@@||cdntvn.pl/*/advert.js$xhr,domain=tvn.pl +tvn.pl##.on-top.ad-ph +@@||hcdn.online^$ghide +imginn.com##+js(acs, document.createElement, unblocker) +||copyrightcontent.org/unblocker/ +||copyrightcontent.org/ub/ub.js +||googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect=noop.js,domain=anidraw.net +fpo.xxx##+js(set, flashvars.adv_pause_html, '') +fpo.xxx##+js(set, flashvars.adv_pre_src, '') +dogecoin.*##+js(aopr, app_vars.force_disable_adblock) +||coinad.*^$3p +gayforfans.com##+js(aeld, getexoloader) +gayforfans.com##+js(rmnt, script, window.open) +! cinecalidad popups +cinecalidad.*##+js(set, playerAdSettings.adLink, '') +cinecalidad.*##+js(set, playerAdSettings.waitTime, 0) +cine-calidad.*##+js(aeld, click, allclick_Public) +cine-calidad.*##+js(aopw, adcashMacros) +cine-calidad.*##+js(ra, href, #opfk) +cine-calidad.*##.links +cambb.xxx##.thumb div.ad:upward(.thumb) +cambb.xxx,nudecams.xxx##+js(no-xhr-if, googlesyndication) +cambb.xxx,nudecams.xxx###adb +||vexfile.com/sw.js$script,1p +||vexfile.com/img/cofksar.png +vexfile.com##.title-box > [href] > [src] +vexfile.com##+js(rpnt, script, var TIMER_MS = 40000;, var TIMER_MS = 0;) +vexfile.com##+js(rpnt, script, get_offers();, get_offers(); setTimeout(function(){ $('.offer-link:first').trigger('click'); }\, 100);) +manga18fx.com##+js(aopr, exoNoExternalUI38djdkjDDJsio96) +manga18fx.com##+js(nostif, fetch) +manga18fx.com##.kadx +||manga18fx.com/nmme2023/nmme_frend.js +@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$script,domain=sudoku-aktuell.de +sudoku-aktuell.de###ajax +sudoku-aktuell.de###billboard +sudoku-aktuell.de###blockdiv +! host2.jptorrent.org timer +jptorrent.org##+js(nano-stb) +! xtube.com PH +xtube.com##.pageBanner +xtube.com##.panelBottomSpace > li.pull-right +xtube.com##.removeAds +xtube.com##body.desktopView.hasFooterAd .mainSection:style(margin-bottom: 0!important;padding-bottom: 0!important;) +##[href^="https://exi8ef83z9.com/"] +hideandseek.world##+js(set, canRunAds, true) +speedostream.*##+js(aost, JSON.parse, computed) +||s.speedostream.*^$script,1p +discovermagazine.com##a > img + div[class]:last-of-type:has-text(Sponsored):upward(div[sizes]) +discovermagazine.com##div[sizes] > span[class]:has-text(Sponsored):upward(div[sizes]) +sportbible.com#@#div[class*="margin-Advert"] +sportbible.com##div[class$="-margin-Advert"]:style(height:1px !important;width:1px !important;position:absolute !important;left:-3000px !important) +||static.adsafeprotected.com/vans-adapter-google-ima.js^$script,redirect=noopjs,domain=sportbible.com +@@||aniview.com/api/adserver/spt?$script,domain=sportbible.com +@@||player.avplayer.com/script/*/avcplayer.js$domain=sportbible.com +infofuge.com##+js(nostif, disableDeveloperTools) +! codingshiksha.com anti adb +codingshiksha.com##+js(nostif, css_class.show) +! graphicux.com anti adb +graphicux.com##+js(nostif, css_class.show) +pengantartidurkuh.blogspot.com##+js(acs, addEventListener, google_ad_client) +*$script,redirect-rule=noopjs,domain=telegraf.rs|telegraf.tv +! vkspeed ads +vkspeed.com##.overlay_main +vkspeed.com##div.jw-cue-type-ads +@@||acilissaati.com^$ghide +acilissaati.com##ins.adsbygoogle +whowantstuffs.blogspot.com##+js(acs, addEventListener, google_ad_client) +linkpoi.me##+js(acs, Math, replace) +linkpoi.me##+js(aopr, app_vars.force_disable_adblock) +linkpoi.me##+js(set, blurred, false) +linkpoi.me##+js(no-fetch-if, manager) +alohatube.xyz##+js(set, popit, false) +solotrend.net##+js(aopr, b2a) +solotrend.net##[href^="https://www.hoster.co.id/"] +solotrend.net###text-9 > .textwidget > p +freevstplugins.net##+js(acs, document.getElementById, adsBlocked) +@@||freevstplugins.net^$ghide +freevstplugins.net##ins.adsbygoogle +freevstplugins.net##.advert-wrap +||freeuseporn.com/backdrop.js +||freeuseporn.com/*.php^$frame +freeuseporn.com##.homed li:has(iframe) +freeuseporn.com##.homed > ul.grid > li:has(script) +freeuseporn.com##canvas +||bestcripto.xyz^$3p +elitepvpers.com##p > [href^="https://playorigin.com/"] +elitepvpers.com##[href="https://skyredirect1.com/"] +elitepvpers.com##a[href*="utm_medium=banner&utm_campaign=epvp"] +elitepvpers.com##div > .page > div > div[style]:has-text(/^Advertise/i) + a +elitepvpers.com##[href="https://www.skycheats.com/"] +elitepvpers.com##[href^="https://funpay.com/"] +||playorigin.com^$3p +||elitepvpers.com/123/oddeven_btc_de_4x.png$image,1p +@@||gats.io^$ghide +gats.io##+js(nosiif, 0x) +||foxhq.com/gabtab.webm$media,redirect=noop-1s.mp4 +foxhq.com##.full-text:has(> h2 > a[href][target="_blank"] img) +foxhq.com##.menu > ul > li:not(:has(> a[href^="https://www.foxhq.com/"])) +foxhq.com##.menu > ul > li:has(> a.sponsor) +foxhq.com##.bar-items-block +foxhq.com##+js(aeld, load, crakPopInParams) +||com/cams-widget-ext/ +*$script,redirect-rule=noopjs,domain=cozinha.minhasdelicias.com +decomaniacos.es##+js(acs, addEventListener, google_ad_client) +todoseriales1.blogspot.com##+js(nosiif, visibility, 1000) +dbsmanga.com,read7deadlysins.com,readdrstone.com,readfairytail.com,readhxh.com,readkaguyasama.com,readkingdom.com,readmha.com,readnaruto.com,readnoblesse.com,readonepiece.com,readopm.com,readsnk.com,readtowerofgod.com,readvinlandsaga.com##.js-a-container +dbsmanga.com,demonslayermanga.com,read7deadlysins.com,readdrstone.com,readfairytail.com,readhxh.com,readjujutsukaisen.com,readkaguyasama.com,readkingdom.com,readmha.com,readnaruto.com,readnoblesse.com,readonepiece.com,readopm.com,readsnk.com,readtowerofgod.com,readvinlandsaga.com##.justify-center > div > b:first-child, .justify-center > div > br:nth-of-type(-n+5), .justify-center > div > center +eturbonews.com##^responseheader(location) +@@||renault-club.cz^$ghide +||fundingchoicesmessages.google.com/i/pub-$script,redirect=noopjs,domain=renault-club.cz +renault-club.cz##ins.adsbygoogle +||googleads.g.doubleclick.net/pagead/$xhr,redirect=nooptext,domain=danshort.com +||evolok.net/*/authorize/*$xhr,redirect=nooptext,domain=nation.africa +||bohubrihi.com^$3p +bhaskar.com##[id^="Ad"]:upward([style]) +divyabhaskar.co.in##[id^="Ad"]:upward([style]) +! propeller crap/ads +livesport24.net##+js(acs, setTimeout, admc) +livesport24.net##+js(aopr, Adcash) +123moviesme.*##+js(aopr, decodeURI) +saveshared.com,simpledownload.net##+js(aopr, String.fromCharCode) +inextmovies.*##+js(nowoif) +||livesport24.net/*.gif$image +hd44.com##+js(nowoif) +*$script,3p,domain=hwnaturkya.com,denyallow=gstatic.com|recaptcha.net +hindilinks4u.*##.mvic-btn +##[href^="//taghaugh.com/"] +||bhplay.me/player/assets/devtools-detector/*$script,1p +||aragontrack.com^$3p +insidertracking.com##+js(acs, jQuery, length) +*$popunder,3p,domain=mp4porn.space +mp4-porn.space##.href_ +playonlinux.com##h1:has-text(Ads) +latesthdmovies.*##+js(acs, eval, replace) +latesthdmovies.*##+js(acs, document.createElement, 'script') +latesthdmovies.*##[href^="https://bit.ly/"] +! news18. com ad leftovers ,video unblockade +||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=noopjs,domain=news18.com +-contrib-ads.$script,redirect=noopjs,domain=news18.com +/videojs.ads.$script,redirect=noopjs,domain=news18.com +news18.com##[class="Article_article_mad__1sOil"] +news18.com##[style^="min-height:"]:has(.OUTBRAIN) +news18.com##[style^="min-height :90px"] +! popups +mp4moviez.*##+js(nowoif) +sextvx.com##+js(nostif, window.location.href=link) +m.sextvx.com###home_hor_top_ads +m.sextvx.com###home_hor_bot_ads +! ukrainesmodels. com popups +ukrainesmodels.com##+js(aopw, atOptions) +*$script,3p,domain=ukrainesmodels.com +! onlinepornhub. net popups +*$script,3p,domain=onlinepornhub.net,denyallow=k2s.cc +onlinepornhub.net##.header-area +onlinepornhub.net###footer-widget +downloadcursos.top##+js(acs, eval, replace) +platform.adex.network##+js(no-fetch-if, moonicorn.network) +@@||uploadshare.net^$ghide +uploadshare.net##ins.adsbygoogle +uploadshare.net##.advert-wrapper +/js/static/header/sda/ppsuma*.js$script +/vast.php?*&idzone= +/vast.php?*exo* +xnxx.com##.videoad-title +xnxx.*,xvideos.*##+js(aeld, DOMContentLoaded, /dyn\.ads|loadAdsDelayed/) +xnxx.*,xvideos.*##+js(set, xv.sda.pp.init, noopFunc) +xnxx.*,xvideos.*##+js(set, xv.conf.dyn.ads, undefined) +xnxx.*,xvideos.*##+js(set, xv.conf.dyn.excld, undefined) +xnxx.*,xvideos.*##+js(rmnt, script, html5player.enableVideoPreRollAds) +xnxx.*,xvideos.*##+js(rpnt, script, if (typeof html5player.setupVideo === 'function'), if (false)) +xnxx.*###mobile-menu > ul > li:not([class]):has(> a[href^="http"]:not([href*="xnxx"])) +xvideos.*##ul.head__menu-line__main-menu > li:not([class]):has(> a:is(.live-cams, .ignore-popunder, .nutaku-games)) +##.home a[href^="https://s.zline0.com/"] +@@||cache.marieclaire.fr/media/videojs/videojs.ads.min.js$script,domain=marieclaire.fr +@@||imasdk.googleapis.com/js/sdkloader/ima3.js$script,domain=marieclaire.fr +forobasketcatala.com##+js(acs, XMLHttpRequest, onreadystatechange) +itsecuritynews.info##+js(aopr, b2a) +itsecuritynews.info###secondary > .widget_custom_html.widget.widget_text +||pagead2.googlesyndication.com/pagead/$redirect=noopjs,script,domain=overbits.herokuapp.com +cimanow.*,cnvids.com###ad +uvnc.com##+js(acs, addEventListener, nextFunction) +thothub.*,thethothub.com##+js(aost, localStorage, inlineScript) +thothub.*,thethothub.com##.sponsor +thothub.*,thethothub.com##.table +thothub.*,thethothub.com##.prm-wrapper +textovisia.com##+js(aopr, isAdBlockActive) +pewgame.com##+js(aopr, app_vars.force_disable_adblock) +pewgame.com##+js(set, blurred, false) +pewgame.com##section.short .content +pewgame.com##body.captcha-page > .short +||pewgame.com/sw.js^ +||pewgame.com/js/hre.js^ +*$script,redirect-rule=noopjs,domain=pewgame.com +dndsearch.in##+js(acs, $, height) +redhdtube.xxx##+js(aopr, popns) +||redhdtube.xxx/tmp/ +! nudeof.com anti-adb +nudeof.com##div[class^="d-none"] +nudeof.com##.col-xl-4.col-lg-6.col-md-8.col-12.order-xl-1.order-lg-1.order-md-1.order-sm-1.order-1 +nudeof.com##div.happy-section +||rawcdn.githack.com/*/adbdetect.packed.js^$script +@@||skmedix.pl^$ghide +skmedix.pl##+js(trusted-replace-outbound-text, atob, skmedix.com, skmedix.pl) +skmedix.pl##div[align="center"][style="height:250px;"]:has(> ins.adsbygoogle) +kaotic.com##+js(nowoif) +kaotic.com##.video-image > .track_outbound_post:upward(2) +kaotic.com##div.hard-5.col-xs-12.col-sm-3:has(.track_outbound_post) +kaotic.com##.track_outbound_post.grid-item +cargurus.com##[data-cg-ft="sponsored-listing-badge"]:upward(3) +cargurus.com##div:has(> [id^="bannerAdLEADERBOARD_INLINE_"]) +! Anti-adblock https://community.brave.app/t/metro-style-anti-adblock/224281 +@@||metro.style^$ghide +haonguyen.top##+js(set, blurred, false) +haonguyen.top###tp-wait +haonguyen.top##[id^="tp-snp"]:style(display: block !important) +@@||tekfiz.com^$ghide +tekfiz.com##ins.adsbygoogle +files.fm##+js(aopr, canRunAds) +||cdn.flashtalking.com^$media,redirect=noopmp3-0.1s,domain=app.plex.tv +app.plex.tv##+js(json-prune, MediaContainer.Metadata.[].Ad) +!#if env_firefox +imasdk.googleapis.com##+js(no-xhr-if, vod.provider.plex.tv/ad?, war:noop-vast3.xml) +!#else +||vod.provider.plex.tv/ad?$xhr,redirect=noopvast-3.0 +!#endif +watch.plex.tv##+js(no-fetch-if, doubleclick.com, , opaque) +||neonime.*/wp-content/themes/grifus/images/donate/yunita/ +discoveryplus.in##+js(no-fetch-if, ads) +! vipboxtv .se | .sk and sister sites popups +vipboxtv.*##+js(nowoif, //) +vipboxtv.*##+js(aopr, Adcash) +/vppdzdrw.js +nsfwyoutube.com##pp +*$xhr,3p,domain=nsfwyoutube.com +/t.js?i=*&cb=$script,3p +i-bits.io##+js(nano-sib, seconds) +i-bits.io##ins[class][style^="display:inline-block;width:"] +! seriesflv popup +seriesflv.*##.adx > a[href] +omgexploits.com##+js(nosiif, visibility, 1000) +secondlifetranslations.com##.ai-attributes +secondlifetranslations.com##.code-block-17 +studydhaba.com##+js(nostif, ai_) +studydhaba.com##.widget_custom_html +claimbits.io##+js(nano-sib, seconds) +@@||claimbits.io^$ghide +claimbits.io##ins[class][style^="display:inline-block;width:"] +anonymz.com##+js(aost, _pop, _init) +garaveli.de##+js(acs, addEventListener, google_ad_client) +@@||yilmaztv.com^$ghide +||linkvertise.net^$3p +! linkvertise URL manipulation +||publisher.linkvertise.com^$3p,domain=~linkvertise.* +/cdn/linkvertise.js$script,1p +@@||linkvertise.*^$ghide +thumpertalk.com##+js(ra, href|target|data-ipshover-target|data-ipshover|data-autolink|rel, a[href^="https://thumpertalk.com/link/click/"][target="_blank"]) +thumpertalk.com##.ipsType_richText a:style(color:currentcolor !important) +zshort.*##+js(set, blurred, false) +zshort.*###fafsf2:style(display:block !important) +zshort.*###showContainer,.textfk +chapteria.com##+js(acs, document.createElement, ignielAdBlock) +*$script,3p,denyallow=cloudflare.net|gstatic.com|jsdelivr.net,domain=wolfstream.tv +wolfstream.*##+js(nowoif) +eschenker.dbschenker.com##[style*="pointer-events"]:style(pointer-events:auto !important) +||chandrabindu.net^$3p +! cekip. site detection +cekip.site##+js(no-xhr-if, ads) +blog.receivefreesms.co.uk##+js(nostif, show) +||receivefreesms.co.uk^$3p +thecut.com##+js(aeld, /touchstart|mousedown|click/, latest) +unityassetcollection.com##+js(nano-sib, secs) +! freeadultcomix.com ads popups +*$frame,script,3p,domain=freeadultcomix.com +freeadultcomix.com##+js(rmnt, script, window.open) +freeadultcomix.com##+js(nowoif) +ipa-apps.me##+js(nano-sib, timer) +ipa-apps.me##[src="https://ipa-apps.me/Download.GIF"] +novelism.jp##+js(aeld, blur, native code) +alphapolis.co.jp##+js(aeld, blur, event.simulate) +||tinypass.com^$domain=crosswalk.com +||tinypass.com^$domain=christianity.com +manyakan.com##+js(no-xhr-if, adsbygoogle) +crazyblog.in##+js(nosiif, visibility, 1000) +crazyblog.in##+js(aopr, app_vars.force_disable_adblock) +crazyblog.in##+js(nowoif) +crazyblog.in##+js(set, blurred, false) +cblink.crazyblog.in##.banner +crazyblog.in##.floating-banner +crazyblog.in##.box-main > div > p +crazyblog.in,studyuo.com##iframe[width="300"] +crazyblog.in,studyuo.com##div[id*="_"][style^="min-width"] +*$script,3p,denyallow=ampproject.org|google.com|gstatic.com|recaptcha.net,domain=crazyblog.in +cutearn.net##+js(aopr, app_vars.force_disable_adblock) +cutearn.net##+js(aopr, open) +cutearn.net##+js(set, blurred, false) +cutearn.net##section.short +cutearn.net##[src^="https://i.ibb.co/"] +porntn.com##+js(set, flashvars.protect_block, '') +porntn.com#@#.banner_ad +porntn.com##^script[data-cfasync]:has-text(0x) +porntn.com##+js(acs, decodeURIComponent, 0x) +gdr-online.com##+js(set, isAdsLoaded, true) +gdr-online.com##.adv_barra_alto +gadgetguideonline.com##+js(aost, String.prototype.charCodeAt, ai_) +gadgetguideonline.com##.ai-track +@@||imsolo.pro^$ghide +imsolo.pro##.ads-main +imsolo.pro##.center.spacing.text +mmm.dk##+js(set, adblockerAlert, noopFunc) +rshrt.com##+js(aopr, app_vars.force_disable_adblock) +rshrt.com##+js(set, blurred, false) +rshrt.com###headlineatas +samfw.com##[href^="https://samfw.com/clicks/"] +samfw.com##[href^="https://samfw.com/link/"] +||i.imgur.com^$domain=samfw.com +samfw.com##+js(acs, jQuery, banner) +lewdstars.com##.ads-muted-control +lewdstars.com##.widget_custom_html +||biguz.net/vast$xhr,1p +||biguz.net/static/vast$xhr,1p +! extratorrents. it popups +extratorrents.*##+js(aopw, adcashMacros) +pythonmatplotlibtips.blogspot.com##+js(acs, addEventListener, nextFunction) +||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=google-ima.js,domain=10.com.au|10play.com.au +10.com.au,10play.com.au##.content__ad__content +@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$xhr,domain=10.com.au|10play.com.au +@@||global.ssl.fastly.net^$domain=10.com.au|10play.com.au +@@||imasdk.googleapis.com/js/sdkloader/ima3_dai.js$script,domain=10.com.au|10play.com.au +@@||pubads.g.doubleclick.net/ondemand/hls/content/*/streams$xhr,domain=10.com.au|10play.com.au +10.com.au,10play.com.au##+js(m3u-prune, /^https?:\/\/redirector\.googlevideo\.com.*/, /.*m3u8/) +10.com.au,10play.com.au##+js(json-prune, cuepoints, cuepoints.[].start cuepoints.[].end cuepoints.[].start_float cuepoints.[].end_float) +@@||pubads.g.doubleclick.net/ondemand/dash/content/*/streams$xhr,domain=10.com.au|10play.com.au +10.com.au,10play.com.au##+js(xml-prune, Period[id*="-roll-"][id*="-ad-"], , pubads.g.doubleclick.net/ondemand) +10.com.au##+js(no-fetch-if, /ads/banner) +@@||10.com.au^$ghide +@@||analytics.tiktok.com/i18n/pixel/events.js$xhr,domain=10.com.au +||sered.net^$3p +||grab.tc^$3p +||ad-doge.com^$3p +||webmonetiser.com^$3p +! sabishare. com ads +sabishare.com##.cmp-roll +freeiphone.fr,safemodapk.com,threezly.com,truyenbanquyen.com,veganinja.hu##+js(acs, decodeURIComponent, ai_) +ibooks.to##+js(acs, String.fromCharCode, ai_) +! muztext.com auto redirect +muztext.com##+js(nostif, reachGoal) +naijaray.com.ng##+js(aost, Math.floor, ) +naijaray.com.ng##[href^="//ashoupsu.com/"] +hotcleaner.com##+js(aopr, Element.prototype.attachShadow) +hotcleaner.com##div[class]:matches-css-before(content:/Advertisements/) +pornohans.com###wrapper_content > aside[id] +pornohans.com##.spc_height_60 +pornohans.com##.vjs-overlay +pornohans.com###wa_10 +pornohans.com,pornoente.tv,nursexfilme.com,milffabrik.com,pornohirsch.net,pornozebra.com,xhamster-sexvideos.com,pornoschlange.com,xhamsterdeutsch.*,hdpornos.net,gutesexfilme.com,pornotom.com##+js(nostif, Adb) +@@*$ghide,domain=pornohans.com|pornoente.tv|nursexfilme.com|milffabrik.com|pornohirsch.net|pornozebra.com|xhamster-sexvideos.com|pornoschlange.com|xhamsterdeutsch.*|hdpornos.net|gutesexfilme.com|pornotom.com|beeg-pornos.com|hd-sexfilme.com|meinyouporn.com|tube8-pornos.com|momo-net.com +||xhamsterdeutsch.*^*.mp4|$media,1p +xhamster-sexvideos.com##.vjs-overlay +reifporn.de##+js(aeld, getexoloader) +||german-porno-deutsch.info/*.gif$image +german-porno-deutsch.info##[href="/acamateure.html"] +@@||trafficfabrik.com/mine.js$script,domain=movie.momo-net.com +momo-net.com##+js(aeld, contextmenu) +momo-net.com##+js(aopr, document.body.appendChild) +movie.momo-net.com##iframe:upward([style*="visibility"]) +deutschsex.mobi,1milf.com##+js(aost, Math.floor, randStr) +1milf.com##.desktop.aside_media.aside +1milf.com##.desctop.spot +deutschsex.mobi##.default__interest-block +hardwarezone.com.sg##+js(aopr, SPHMoverlay) +hardwarezone.com.sg##.ad +hardwarezone.com.sg###sponsored-links-alt +hardwarezone.com.sg##.hwz-ad-outstream +imagecolorpicker.com##[class^="leftAds-"] +imagecolorpicker.com##[class^="rightAds-"] +! redwap.me,redwap2.com,redwap3.com occasional popup +/realize.js$domain=redwap.me|redwap2.com|redwap3.com +! sextgem.com ads +sextgem.com##div[id][style*="z-index: 999999999;"] +desitab69.sextgem.com##+js(nowoif) +xxxtime.sextgem.com##^script[language="javascript"]:has-text(open) +||xtgem.com/images/influenza/ +||xtgem.com/images/xtvid/ +||sextgem.com^$removeparam=id +*$popup,domain=sextgem.com +rethmic.com##+js(nano-sib, _0x) +! influencersgonewild.com popunder +influencersgonewild.com##+js(aost, Math.round, onload) +! xxxwebdlxxx.top anti-adb, popup +xxxwebdlxxx.top##a[href^="https://hotdating-near1.com/"] +*$frame,script,3p,domain=xxxwebdlxxx.top +courseboat.com##+js(nostif, brave_load_popup) +fantasyfootballgeek.co.uk##+js(acs, String.fromCharCode, ai_) +gledajcrtace.xyz###header-wrap-reklama +gledajcrtace.xyz###HTML8 +javquick.com##+js(nowoif) +lazytranslations.com##+js(aost, String.prototype.charCodeAt, ai_) +lazytranslations.com##.ad-after-postend +lazytranslations.com##.lazyt-adlabel +||interserver.net^$3p +game3rb.com##+js(aeld, DOMContentLoaded, 0x) +game3rb.com##+js(no-fetch-if, method:HEAD) +||game3rb.com/sw.js^$script,1p +game3rb.com###post-footer:has([href*="vpnatlas.com"]) +##a[href*=".click/?z="][href*="&n"] +*$all,domain=ytrqcxat.click +*$script,3p,denyallow=bootstrapcdn.com|cloudflare.com|cloudfront.net|disqus.com|disquscdn.com|fastlylb.net|googleapis.com|wp.com,domain=game3rb.com +||googletagmanager.com/gtag/js$script,redirect=noopjs,domain=rotana.net +getpaste.link##+js(set, isAdBlockActive, false) +! popups 4movierulz1. me / .co +4movierulz1.*,filmygod6.*##+js(nowoif) +4movierulz1.*##[href^="https://api.whatsapp.com/send"] +kitabmarkaz.xyz##+js(aopr, __Y) +@@||flipboard.com/webu/*-contrib-ads*.bundle.js$script,1p +@@||imasdk.googleapis.com/js/sdkloader/ima3.js$script,domain=flipboard.com +! croclix.me anti-adb +@@/viewad.$css,script,domain=short.croclix.me +short.croclix.me##.leaderboard +short.croclix.me##.banner-container +||offers4all.net^$frame,3p +gay4porn.com##+js(set, flashvars.adv_start_html, '') +gay4porn.com##.exbanner +gay4porn.com###int-over:remove() +gay4porn.com###intt-layer:remove() +/s/s/sum.php +charbelnemnom.com##+js(nostif, ai) +@@||charbelnemnom.com^$ghide +charbelnemnom.com##ins.adsbygoogle +charbelnemnom.com##.ezoic-ad +charbelnemnom.com###custom_html-16 +! mizugigurabia.com anti-adb +mizugigurabia.com##+js(acs, document.addEventListener, google_ad_client) +||joinads.me^$3p +||affilixxl.de^$3p +lcpdfr.com##div.ipsMargin_bottom.ipsAreaBackground.ipsPadding\:half +lcpdfr.com##.adSpacing +rodude.com##+js(acs, onload) +! hds-streaming. tv / site popups +hds-streaming.*###fakeplayer +hds-streaming.*##.asgdc +#@#.display_ad +bleepingcomputer.com###bc-home-news-main-wrap > li:has(> a[href$="/deals/"]) +bleepingcomputer.com##a[rel="sponsored noopener"] +@@||getpaidstock.com^$ghide +getpaidstock.com##ins.adsbygoogle +||antiblock.b-cdn.net/banner_ad.png$image,redirect=1x1.gif,domain=getpaidstock.com +*$frame,redirect-rule=noopframe,domain=getpaidstock.com +myabandonware.com##+js(set, canRunAds, true) +myabandonware.com##+js(nostif, AdBlock) +myabandonware.com##[href^="/visual/r-"] +myabandonware.com##.items > .item[id]:not(.itemListGame) +myabandonware.com##div[id*="myabandonware_leaderboard_btf_"]:upward(div[id]) +myabandonware.com##div[id*="myabandonware_medrec_right_"]:upward(div[id]) +myabandonware.com##[id*="myabandonware_"][id$="tf"] +myabandonware.com##a[href^="/visual/"]:upward(.menu > div[id]) +myabandonware.com##div:matches-css-after(content:/Ads/) +myabandonware.com##[onclick*="aff"] +myabandonware.com##style:has-text(justify-content):remove() +myabandonware.com##[src*="banner"] +myabandonware.com##a[target="_top"]:has(img) +myabandonware.com##a[href*="jeroud.com"]:has(img) +gayck.com##+js(set, flashvars.adv_pause_html, '') +! romhustler.org timer +romhustler.org##+js(nano-sib, timer.remove) +romhustler.org##.tower_ad_desktop +@@||filezipa.com^$ghide +filezipa.com##ins.adsbygoogle +filezipa.com##+js(aopr, app_vars.force_disable_adblock) +filezipa.com##+js(set, blurred, false) +filezipa.com##+js(aopr, open) +mrunblock.*##+js(acs, decodeURIComponent, atob) +mrunblock.*###lb-banner +mrunblock.*##[id^="cookieConsent"]:upward(1) +mrunblock.*##.alert-dismissible +addonbiz.com##+js(acs, addEventListener, nextFunction) +b2bhint.com##+js(aopr, google_jobrunner) +b2bhint.com##+js(aopr, popupBlocker) +b2bhint.com##[id^="ad--"] +@@||alrakoba.net^$ghide +alrakoba.net##.adsbygoogle:style(position:absolute !important;left:-3000px !important) +alrakoba.net##.stream-item-widget +akwam.*##+js(acs, addEventListener, blocker) +akwam.*,khsm.io##+js(aopw, afScript) +akwam.*##+js(nosiif, visibility, 1000) +akwam.*##.ads +netpornix.*##div#responseads:style(display:block !important) +netpornix.*###videoadsid +netpornix.*##[href^="https://bit.ly/"] +netpornix.*##.videoads +netxwatch.*##+js(aopr, __Y) +iqiyi.com##+js(set, Object.prototype.parseXML, noopFunc) +iqiyi.com##+js(set, Object.prototype.blackscreenDuration, 1) +iqiyi.com##.black-screen[data-cupid="adblock-blackscreen"] +m.iqiyi.com##+js(set, Object.prototype.adPlayerId, '') +iqiyi.com##.iqp-player > iqpdiv[data-cupid="container"] > div[data-adzone][templatetype="common_pause"] +iqiyi.com##+js(rpnt, script, function defaultTrace, `(()=>{let e=!1;window.qyMesh=window.qyMesh||{},window.qyMesh=new Proxy(window.qyMesh,{get:function(a,t,d){return!e&&a?.preload?.Page_recommend_1?.response?.items&&(a.preload.Page_recommend_1.response.items.forEach((e=>{e.extData?.dataExtAd&&(e.extData.dataExtAd={}),e.video&&e.video.forEach((e=>{e.adverts&&(e.adverts=[]),e.data&&(e.data=e.data.filter((e=>!e.ad)))}))})),e=!0),Reflect.get(a,t,d)}})})(); function defaultTrace`, sedCount, 1) +www.iqiyi.com##+js(rpnt, script, function defaultTrace, `!function(){const e={apply:(e,t,o)=>{const i=o[1];if(!i||"object"!=typeof i.QiyiPlayerProphetData)return Reflect.apply(e,t,o)}};window.Object.defineProperties=new Proxy(window.Object.defineProperties,e)}(); function defaultTrace`, sedCount, 1) +www.iqiyi.com,m.iqiyi.com##+js(rpnt, script, function defaultTrace, `!function(){const s={apply:(c,e,n)=>(n[0]?.adSlots&&(n[0].adSlots=[]),n[1]?.success&&(n[1].success=new Proxy(n[1].success,s)),Reflect.apply(c,e,n))};window.Object.assign=new Proxy(window.Object.assign,s)}(); function defaultTrace`, sedCount, 1) +@@||cupid.iqiyi.com/mixer$script,domain=iqiyi.com +@@||simplebits.io^$ghide +@@||simplebits.io/$script,1p +*$script,redirect-rule=noopjs,domain=simplebits.io +*$xhr,redirect-rule=nooptext,domain=simplebits.io +simplebits.io##.placeholder +simplebits.io##div[class][style="min-height: 250px; height: 250px;"] +simplebits.io##div[class][style="min-height: 90px;"] +simplebits.io##div[class][style="min-height: 60px;"] +@@||satoshilabs.net^$ghide +@@||satoshilabs.net/$script,1p +||satoshilabs.net/sh/ads/$frame +||simplebits.io/sh/ads/ +||simplebits.io/ads/ +simplebits.io##+js(no-xhr-if, /ads) +simplebits.io##+js(no-fetch-if, /ads) +simplebits.io##+js(nostif, , 3000) +hayamimi-gunpla.com##+js(acs, document.addEventListener, google_ad_client) +||prairiemountainmedia.com^$3p +||dailycamera.com^$3p +neos-easygames.com,synk-casualgames.com#@##ad_block +hitproversion.com##.onp-sl-content:style(display:block !important) +hitproversion.com##.onp-sl-social-locker +@@||allsmo.com^$ghide +allsmo.com##[id^="ezoic-pub-ad-placeholder"] +*$xhr,redirect-rule=nooptext,domain=costumbresmexico.com +shemalestube.com##+js(nowoif) +shemalestube.com##.cover:style(background-image: none!important;) +||shemalestube.com/templates/dark/ads/ +||shemalestube.com/templates/dark/js/pop/ +gamingbible.co.uk#@#div[class*="margin-Advert"] +gamingbible.co.uk##div[class$="-margin-Advert"]:style(height:1px !important;width:1px !important;position:absolute !important;left:-3000px !important) +gamingbible.co.uk##.css-1dgm0zi-Advert +||adsafeprotected.com/$script,redirect=noopjs,domain=gamingbible.co.uk +! hxfile. co popups +hxfile.co##+js(nowoif) +hxfile.co##a.btn-block +||storage.de.cloud.ovh.net^*/sarsor/avikingdynamic.js$script,3p +go4kora.com###id-custom_banner +! blog.40ch.net anti-adb +blog.40ch.net##+js(acs, document.addEventListener, nextFunction) +pornissimo.org##+js(set, flashvars.protect_block, '') +pornissimo.org##.table +pornissimo.org##.fp-brand +edn.com###custom_html-3 +edn.com###custom_html-5 +edn.com###footerAdWrap +||omeda.com^$3p +sexywomeninlingerie.com##+js(aopr, exoNoExternalUI38djdkjDDJsio96) +||wafflegirl.com/galleries/banner/$3p +sexywomeninlingerie.com##[href^="http://join.wearehairy.com/track/"] +baikin.net##+js(aopr, google_jobrunner) +/wp-content/plugins/simple-adblock-notice-pro/*$script,css +comixzilla.com##+js(acs, document.createElement, 'script') +unsurcoenlasombra.com##+js(aopr, google_jobrunner) +watchmovierulz.*##+js(nowoif) +! streamsb_galaxy +anigogo.net,fbgo.*,javplaya.com,sbbrisk.com,sbchill.com,sbchip.*,sbflix.*,sbplay.*,sbplay2.*,sbplay3.*,sbrity.com,sbrulz.*,streamsb.*##+js(aopr, __Y) +anigogo.net,fbgo.*,kinoking.cc,sbbrisk.com,sbchill.com,sbchip.*,sbflix.*,sbplay.*,sbplay2.*,sbplay3.*,sbrity.com,sbrulz.*,streamsb.*##+js(aopr, mm) +streamsb.*##+js(nowoif) +streamsb.*##+js(aopr, DoodPop) +streamsb.*##body > div[style*="z-index:"] +sbplay.*##+js(acs, document.addEventListener, offsetHeight) +sbplay.*##+js(set, console.clear, noopFunc) +sbplay.*##^script:has-text(debugger) +sbot.cf##[id^="parentframe"] +sbot.cf##+js(window.open-defuser) +sharetext.me##+js(set, isAdBlockActive, false) +theblissempire.com##+js(aopr, app_vars.force_disable_adblock) +theblissempire.com##+js(set, blurred, false) +theblissempire.com##+js(aopr, open) +||max-adserv.com^$3p +! newsinlevels.com/videosinlevels.com anti-adb +newsinlevels.com,videosinlevels.com##+js(set, sgpbCanRunAds, true) +m2list.com##+js(nostif, debugger) +m2list.com##+js(aopr, Adcash) +*$script,3p,domain=m2list.com,denyallow=ajax.googleapis.com|cdnjs.cloudflare.com +@@||posttrack.com/$xhr,1p +freejav.guru##+js(nostif, disableDeveloperTools) +freejav.guru##+js(acs, eval, replace) +! sexuhot.com popup, redirect on back, ads +sexuhot.com##+js(aopw, atOptions) +sexuhot.com##+js(aopr, history.replaceState) +sexuhot.com###overlay > a +sexuhot.com###abox +||sexufly.com^$frame,domain=sexuhot.com +! pussy.org popup +pussy.org##+js(nowoif) +||pussy.org^$frame,1p +! analsexstars.com popup +analsexstars.com##+js(nowoif) +*$xhr,redirect-rule=nooptext,domain=chiemgau24.de|ovb-online.de|rosenheim24.de|bgland24.de|innsalzach24.de|mangfall24.de|wasserburg24.de +@@*$ghide,domain=chiemgau24.de|ovb-online.de|rosenheim24.de|bgland24.de|innsalzach24.de|mangfall24.de|wasserburg24.de +!pc-offer$script,domain=bgland24.de|chiemgau24.de|innsalzach24.de|mangfall24.de|rosenheim24.de|wasserburg24.de +bgland24.de,chiemgau24.de,innsalzach24.de,mangfall24.de,rosenheim24.de,wasserburg24.de##.wv_story_el_cleverPushWidget +bgland24.de,chiemgau24.de,innsalzach24.de,mangfall24.de,rosenheim24.de,wasserburg24.de##.id-Recommendation +bgland24.de,chiemgau24.de,innsalzach24.de,mangfall24.de,rosenheim24.de,wasserburg24.de##.wv_story_el_pinpoll +||2target.net^$3p +*$script,3p,denyallow=facebook.net|fbcdn.net,domain=sukidesuost.info +sukidesuost.info###custom_html-23 +||iclickcdn.com^$script,redirect=noopjs,domain=gifans.com +gifans.com##+js(nosiif, visibility, 1000) +gifans.com##+js(acs, document.cookie, :visible) +gifans.com###wpsafe-generate, #wpsafe-link:style(display: block !important;) +gifans.com##div[id^="wpsafe-wait"] +berklee.edu##+js(aeld, scroll, undefined) +electricaltechnology.org###stream-item-widget-7 +electricaltechnology.org###stream-item-widget-2 +! uniquetutorialsnew.blogspot.com anti-adb +@@||uniquetutorialsnew.blogspot.com^$ghide +uniquetutorialsnew.blogspot.com##ins.adsbygoogle +foreca.com##main > div > div > div[class]:matches-css(width:350px) +!#if env_mobile +foreca.com##main > div > div > div > div[class]:matches-css(min-height:326px) +foreca.com##main > div > div > div > div > div[class]:matches-css(min-height:326px) +!#endif +/wp-content/plugins/noti-blocker/*$script +filmyhitlink.xyz##+js(acs, mMcreateCookie) +filmyhitlink.xyz##+js(nano-sib, downloadButton) +filmyhitlink.xyz###sidebar-primary > .widget_custom_html +filmyhitlink.xyz###sidebar-secondary > .widget_custom_html +javtsunami.com##+js(aeld, getexoloader) +||javtsunami.com/crimson-unit-$script +descargaspcpro.net##+js(noeval-if, ads) +descargaspcpro.net###AdSense1 +descargaspcpro.net###HTML90 +descargaspcpro.net##.stickywrap +finanzas-vida.com##[href="https://zplayer.live/"] +finanzas-vida.com##+js(set, blurred, false) +! mettablog.com anti-adb + popups +mettablog.com##+js(aost, String.prototype.charCodeAt, ai_) +adurly.cc##+js(aopr, app_vars.force_disable_adblock) +adurly.cc##+js(set, blurred, false) +! ofilmywap. uno / kannadamasti. cc, buyjiocoin. club, filmygod13.in popup +filmywap.*,ofilmywap.*,kannadamasti.*,buyjiocoin.*,filmygod13.*##+js(nowoif) +! verfastdownload .pw popups +veryfastdownload.pw##+js(aopr, SmartPopunder.make) +! ucanwatch. me ads +ucanwatch.*##+js(nowoif) +! sharegdrive.co popups +sharegdrive.com##+js(acs, adcashMacros) +! torrentdownloads.uproxy2.biz popups +uproxy2.biz##+js(aopr, GetWindowHeight) +||uproxy2.biz/zpp/*$script,domain=uproxy2.biz +||uproxy2.biz/helper-js/*$script,1p +uproxy2.biz##+js(aopr, decodeURIComponent) +/hy.js$script,domain=uproxy2.biz +uproxy2.biz##+js(acs, adcashMacros) +uproxy2.*##+js(aost, Math.floor, ) +*$script,3p,domain=uproxy2.biz +! 18tube. sex ads +18tube.sex##+js(aeld, getexoloader) +18tube.sex##.opt +liveschauen.com##.banner +liveschauen.com###werbung +@@||therokuchannel.roku.com/$xhr,1p +nulljungle.com##+js(nostif, innerHTML) +naturalnews.com##.Header +||naturalnews.com^$script +@@||naturalnews.com/*=$script,1p +@@||naturalnews.com/wp-content/themes/$script,1p +civilenggforall.com##+js(aopr, blockAdBlock) +*$script,3p,denyallow=chatango.com|cloudflare.net|cloudfront.net|disqus.com|disquscdn.com|fastlylb.net,domain=rawkuma.com +rawkuma.com##+js(aeld, readystatechange, document.removeEventListener) +.com/btag.min.js|$3p +youwatch.*##[href^="https://minilink.id/"] +youwatch.*##.sgpb-popup-dialog-main-div-wrapper +youwatch.*##.sgpb-popup-overlay +youwatch.*###custom_html-65 +@@||vidomo.xyz^$script,1p +||vidomo.xyz/assets/js/devtools-detector.js$important +! fxstreet. com/jp/etc. PH +fxstreet.*##.fxs_leaderboard +forogore.com##+js(acs, document.addEventListener, google_ad_client) +waploaded.com,meetdownload.com##.advert +waploaded.com,meetdownload.com##a[href*="got-to-be.net"] +waploaded.com,meetdownload.com##a[href^="https://aeroplaneversion.com/"] +waploaded.com,meetdownload.com##a[href^="https://suftanzine.com/"] +waploaded.com##.ad +waploaded.*##+js(aopr, exoJsPop101) +waploaded.*##+js(ra, href, .button[href^="javascript"]) +meetdownload.com#@#.ad-slot:not(.adsbox):not(.adsbygoogle) +@@||motoroids.com^$ghide +motoroids.com##ins.adsbygoogle +motoroids.com##div.AM_SINGLE_STORY_BETWEEN_CONTENT_SECOND_PARAGRAPH_RESPONSIVE +nudeselfiespics.com##+js(noeval-if, popUnderStage) +! zlut.com ads, popup +||zlut.com/_ad$frame +||zlut.com/jss/external_pop.js +zlut.com##.add-bottom +xproxxx.org###custom_html-3 +xproxxx.org###custom_html-5 +! nyaa.unblocked.id + unblocked.id ad +unblocked.id##+js(rmnt, script, push) +unblocked.id,uproxy2.*,unblock2.*##[href^="https://vpnk.net/"] +unblocked.id,uproxy2.*,unblock2.*##[onclick*="vpnk.net/?vpn"] +||searchtv.net/vpn-$doc +||vpnk.net/?vpn$doc +codingnepalweb.com##+js(rpnt, script, (isAdblock), (false)) +codingnepalweb.com##+js(nano-stb, animation) +||juicebarads.com^$3p +drop.download##+js(acs, document.addEventListener, google_ad_client) +drop.download##.row > .col-md-8 +flightsim.to##+js(acs, fetch, status) +flightsim.to##+js(acs, document.getElementById, adsblock) +flightsim.to##+js(nano-sib, timer, 1000, 0.001) +flightsim.to##+js(no-xhr-if, pub.network) +@@||flightsim.to^$script,1p +@@||pub.network/flightsim-to/pubfig.min.js$script,xhr,domain=flightsim.to +@@||flightsim.to^$ghide +flightsim.to##.flightsim-main > div[style="margin:0 auto; position:relative; z-index:10"] > div[align="center"]:empty +moviemakeronline.com##+js(nosiif, adsbygoogle) +moviemakeronline.com##ins.adsbygoogle:upward(1) +cinemakottaga.*##+js(no-xhr-if, googlesyndication) +cinemakottaga.*##+js(aeld, DOMContentLoaded, adsBlocked) +cinemakottaga.*##+js(acs, document.addEventListener, adsbygoogle) +*$image,redirect-rule=1x1.gif,domain=cinemakottaga.* +cinemakottaga.*##+js(nano-sib, timePassed) +*$3p,script,denyallow=arc.io|cloudflare.com|hcaptcha.com|google.com|gstatic.com|recaptcha.net,domain=cinemakottaga.* +mysql2dumpcrypt.de,xn--stream-oe64e.*###abm +webdeyazilim.com##+js(aost, String.prototype.charCodeAt, ai_) +||api.vuukle.com/api/v1/getModal$xhr,3p +devotag.com##+js(acs, document.addEventListener, nextFunction) +! openloading.com popup fakeplayer +openloading.com##+js(ra, href, #clickfakeplayer) +openloading.com###clickfakeplayer +codare.fun##+js(acs, document.addEventListener, google_ad_client) +@@||explosivemenu.com^$ghide +explosivemenu.com##ins.adsbygoogle +||explosivemenu.com^$image,redirect-rule=1x1.gif,1p +@@||code2care.org^$ghide +code2care.org##ins.adsbygoogle +code2care.org##.right-content +allwpworld.com##+js(nano-sib, timeleft) +allwpworld.com##+js(ra, disabled, input[id="button1"][class="btn btn-primary"][disabled]) +wgod.co##+js(acs, $, test) +@@/wp-content/plugins/dh-new-anti-adblocker$script,1p +||javhd.icu/ads/ +lavanguardia.com##+js(aeld, error) +imeteo.sk##+js(aeld, scroll, detect) +imeteo.sk##.page-container__ad-container +sixsave.com##+js(no-fetch-if, method:HEAD) +freebulksmsonline.com##+js(aost, String.prototype.charCodeAt, ai_) +@@||univers-simu.com^$ghide +univers-simu.com##.adsbygoogle:style(max-height: 1px !important;) +univers-simu.com###tie-block_702 +univers-simu.com##.\35 f283c41912bf.widget.container-wrapper +univers-simu.com###stream-item-widget-6 +univers-simu.com###stream-item-widget-3 +kelasexcel.id##div.sacret:style(display:block !important) +kelasexcel.id##.sacret-share +tutflix.org##+js(acs, $, test) +@@||tutflix.org^$ghide +pussy-hub.com##+js(aeld, click, popundr) +||pussy-hub.com/*/stat1_$script,1p +@@||themosvagas.com.br^$ghide +themosvagas.com.br##ins.adsbygoogle +themosvagas.com.br##.ads300x600 +youtubemp3donusturucu.net##+js(aeld, click, t(a)) +maxstream.video##+js(nostif, alert) +maxstream.video##+js(nano-stb, .fadeIn(), 3000) +maxstream.video##+js(nowoif) +@@*$script,1p,domain=maxstream.video +@@||linkonclick.com/*/display.php$script,frame,domain=maxstream.video +@@||ads.host-cdn.net/*.js|$script,domain=maxstream.video|uprot.net +@@/^https:\/\/ads\.host-cdn\.net\/\w+\.js\?\w+$/$script,3p,to=ads.host-cdn.net,from=maxstream.video|uprot.net +host-cdn.net^$image,redirect-rule=32x32.png,domain=maxstream.video +maxstream.video###adsads:style(height: 9px !important;) +maxstream.video##h1:has-text(/adblock|supporter/) +/*.php$doc,domain=maxstream.video +@@||uprot.net^$ghide +uprot.net##*[style="display:none;"]:style(display:block !important) +@@||ads.host-cdn.net/ads2.js$script,domain=maxstream.video|uprot.net +videoseyred.in##+js(nowoif) +!#if !cap_html_filtering +listendata.com##+js(rmnt, script, AdBlocker) +!#else +listendata.com##^script:has-text(AdBlocker) +!#endif +aimasummd.blog.fc2.com,dokuo666.blog98.fc2.com,metamani.blog15.fc2.com,newssokuhou666.blog.fc2.com,touhoudougamatome.blog.fc2.com,xn--k9ja7fb0161b5jtgfm.jp,youkaiwatch2345.blog.fc2.com##+js(acs, document.addEventListener, google_ad_client) +newssokuhou666.blog.fc2.com,youkaiwatch2345.blog.fc2.com##^script:has-text(google_ad_client) +ygoprodeck.com###deck-content-ad +ygoprodeck.com##[id^="frontpage-ad-"] +ygoprodeck.com##[id^="front-ad-"] +archpaper.com##+js(acs, fetch, result) +! tripadvisor.jp, tripadvisor.com etc. placeholder +tripadvisor.*###component_2 > div[class^="_"]:has(> div > div[class^="iab_"][style="min-height:90px"]) +tripadvisor.*##.ui_container > div[class] > div[class^="_"]:has(> .iab_medRec:only-child) +nation.africa##+js(aopr, evolokParams.adblock) +techpowerup.com##body:not([data-template]) a[rel="nofollow"][href^="/reviyuu/b784/"]:style(pointer-events: none !important;) +techpowerup.com##body:not([data-template]) a[rel*="nofollow"][target="_blank"][href$="er/images/gmchjhj.png"] +||www.techpowerup.com/reviyuu/$image,1p +techpowerup.com##div.s--item:has(a[href^="/reviyuu/"]) +@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$xhr,redirect-rule,domain=carousell.* +unblocknow.*##.adstg +unblocknow.*##.alert +unblocknow.*###cookieConsentVPN666 +veoplanet.com##+js(ra, type, [src*="SPOT"], asap stay) +veoplanet.com##^source[src*="SPOT"] +link.asiaon.top##+js(aopr, app_vars.force_disable_adblock) +link.asiaon.top##+js(set, blurred, false) +asiaon.*,asiaontop.com##+js(no-xhr-if, googlesyndication, length:10) +asiaon.*,asiaontop.com##+js(no-xhr-if, doubleclick) +/aot-content/assets/*/cb-ads/*$domain=asiaon.top|asiaontop.com +/\/aot-content\/modules\/[^\.]{40,}\.js\b/$script,1p,domain=asiaon.*|asiaontop.com +@@/aot-content/modules/*/assests$script,1p,domain=asiaon.*|asiaontop.com +asiaon.top,asiaontop.com##+js(no-fetch-if, method:HEAD) +*$script,redirect-rule=noopjs,3p,domain=asiaon.top|asiaontop.com +asiaon.top,asiaontop.com##a[href^="https://theporndude.com/"] +asiaon.top,asiaontop.com##+js(href-sanitizer, a[href^="https://link.asiaon.top/full?api="][href*="&url=aHR0c"], ?url -base64) +||googlesyndication.com^$image,redirect=1x1.gif,domain=asiaontop.com|asiaon.top|asiaon.* +||api.asiaon.top/index.php?graphql&operationName=GetAllSidebars +||api.asiaon.top/index.php?graphql&operationName=GetHeaderAdScripts +||api.asiaon.top/index.php?graphql&operationName=GetModulaGalleryAds +||api.asiaon.top/index.php?graphql&operationName=GetContentWidgets +asiaon.*,asiaontop.com##+js(json-edit-fetch-response, .pageProps.__APOLLO_STATE__.*[?.__typename=="AotSidebar"], propsToMatch, /_next/data) +asiaon.*,asiaontop.com##+js(json-prune-fetch-response, pageProps.__TEMPLATE_QUERY_DATA__.aotFooterWidgets, , propsToMatch, /_next/data) +asiaon.*,asiaontop.com##+js(json-prune, props.pageProps.data.aotHomepageTopBar props.pageProps.data.aotHomepageTopBar props.pageProps.data.aotHeaderAdScripts props.pageProps.data.aotFooterWidgets) +bestgamehack.top##+js(aopr, open) +mangalek.com##+js(acs, String.fromCharCode, decodeURIComponent) +*$script,3p,denyallow=cloudflare.com|mangarc.com,domain=mangalek.com +trzpro.com##+js(nano-sib, counter--) +! silenthub. net anti adb +@@||silenthub.net^$ghide +*$script,3p,denyallow=cloudflare.net|jsdelivr.net|sc.gl|unpkg.com,domain=hitprn.com +openculture.com##+js(nosiif, daadb) +openculture.com##.no-framearound_ad_in_post +! celebwhore.com,sexcams-24.com ads,popunder +celebwhore.com,sexcams-24.com##+js(set, flashvars.popunder_url, '') +sexcams-24.com##+js(set, flashvars.protect_block, '') +celebwhore.com,sexcams-24.com##.table +||wmpics.pics^$domain=sexcams-24.com +zedge.net##+js(nano-sib, l-1) +zetporn.com##+js(aopr, ExoLoader.serve) +zetporn.com##+js(acs, addEventListener, -0x) +zetporn.com##.aside-itempage-col +/\.com\/[A-Za-z]{9,}\/[A-Za-z]{9,}\.js$/$script,1p,domain=zetporn.com +||zetporn.com/*/custom_vast/$xhr +*$script,3p,denyallow=googleapis.com,domain=zetporn.com +blackenterprise.com##.penci-sidebar-widgets.penci-sticky-sidebar.widget-area-1.widget-area > .theiaStickySidebar +blackenterprise.com##.hdrbanart +hog.*##.content__info--vis +hog.*##.content__top +hog.*##.player-block__line +hog.*##.player-block__square +hog.*##.player__line +hog.*##.player__side +hog.*##.related-view > div.title--sm +*$script,3p,denyallow=cloudflare.com|gcdn.co|google.com|gstatic.com|videocdn.name,domain=hog.* +!#if env_mobile +||m.youtube.com/*/ad.js$script +!#endif +keepvid.pw##+js(nowoif) +justcastingporn.com,justfamilyporn.com##+js(acs, document.createElement, _htas) +@@||smallseo.tools^$ghide +smallseo.tools##.category_box > .col-md-6 > p +smallseo.tools##.category_box > p +smallseo.tools##.sidebar_adds +smallseo.tools##ins.adsbygoogle +smallseo.tools##.text-center.col-md-8 > p +smallseo.tools##[href^="https://grammarchecker.io/grammarly"] +smallseo.tools##.border.p25.tracktool_banner .text-center > p +itsguider.com##+js(aeld, load, nextFunction) +@@||itsguider.com^$ghide +*$script,3p,denyallow=cloudflare.com|google.com|gstatic.com,domain=itsguider.com +viserve.com##^responseheader(location) +@@||leaklinks.com^$script,1p +*.gif$domain=leaklinks.com,image +! ||lowendbox.com^$3p +||lowendbox.com/media/banner/$frame +lowendbox.com##a[href][rel=noreferrer] > img[height="250"][width="300"] +lowendbox.com##[href="https://vpsdime.com/"] +lowendbox.com##iframe +lowendbox.com##div.block:has([id^="bsa"]) +lowendtalk.com###Panel > .BoxFilter ~ div:not([class], [id]):has(a[target="_blank"] img) +lowendtalk.com###Foot > ul[style] ~ a[href*="?"]:has(img[style]:not([title])) +*$script,3p,denyallow=cloudflare.com,domain=reddit.tube +nbcolympics.com##+js(set, adblockDetect, noopFunc) +qz.com##.e76xF.bJlt-:style(padding-top:0px !important) +qz.com##.article-content-ad +qz.com###engage-1 +xanimehub.com##+js(nosiif, visibility, 1000) +! crackevil.com anti adb +crackevil.com##+js(acs, mMcreateCookie) +buydekhke.com##+js(aost, String.prototype.charCodeAt, ai_) +talkjarvis.com##+js(nostif, css_class.show) +cardiagn.com##+js(acs, eval, replace) +@@||cardiagn.com^$script,1p +privatemoviez.*##+js(aeld, DOMContentLoaded, adsBlocked) +privatemoviez.*##+js(nostif, magnificPopup) +msn.cn##msft-article[id^="native_ad_nativead"] +msn.cn##.eastday-post-article-container +@@||club-opel.com^$ghide +club-opel.com##.side_ad_left_160 +club-opel.com##.side_ad_right_160 +club-opel.com##ins.adsbygoogle +||nothingtoxic.com/aff/chaturbate/ +||painaltube.com/min/747b35c9/painaltube/p/ +||painaltube.com/widget/chaturbate_cam.php? +painaltube.com##.widget > div.widget +techilife.com##+js(acs, jQuery, adblocker) +tyfloswiat.pl##^responseheader(location) +/demonoid\.is\/[a-z0-9]{24}\.jpg$/$image,1p,match-case,domain=demonoid.is +demonoid.is##+js(rpnt, style, visibility: visible !important;, display: none !important;) +send-anywhere.com##+js(nano-sib, skipOptions) +send-anywhere.com###transfer-reward-ad +!||brightcove.com/playback/*/*?ad_config_id$removeparam=ad_config_id,xhr,domain=tvnz.co.nz +!||brightcovecdn.com/playback/*/*?ad_config_id$removeparam=ad_config_id,xhr,domain=tvnz.co.nz +tvnz.co.nz##+js(no-fetch-if, method:HEAD url:doubleclick.net) +tvnz.co.nz##+js(xml-prune, 'xpath(//*[name()="Period"][.//*[name()="BaseURL" and contains(text(),"https:")]])', '', .mpd) +@@||pharmacyreviewer.com^$ghide +@@||pharmacyreviewer.com/forum/js/$script,1p +247sports.com##body:not(.skybox-loaded) .topnav:style(margin-top:0px !important) +247sports.com##.nav-bar:style(top:0px !important) +samehadaku.*###playVideo:style(display: block !important; visibility: visible !important;) +samehadaku.*###player_embed:style(display: block !important; visibility: visible !important;) +samehadaku.*###skipbtn +samehadaku.*##.box_item_berlangganan_popup +*$script,3p,denyallow=cloudflare.com|cloudfront.net|disqus.com|disquscdn.com|fastlylb.net|sharethis.com,domain=samehadaku.* +||yimg.com/nn/lib/metro/g/sda/$domain=yahoo.com +mediapemersatubangsa.com##+js(acs, document.addEventListener, google_ad_client) +pornofan.pl###inplayerADS +pornofan.pl##.PublicitaDestra +||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=noopjs,domain=howstuffworks.com +userload.*##+js(aeld, , _0x) +userload.*##+js(nowoif) +userload.*##+js(acs, document.getElementById, style.display) +||userload.*/maroc.js$script,1p +@@||userload.*/ad-banner.js +*$image,redirect-rule=1x1.gif,domain=userload.* +userload.*##div[style="position: fixed; display: block; width: 100%; height: 100%; inset: 0px; background-color: rgba(0, 0, 0, 0); z-index: 300000;"] +userload.*##.adp-underlay +||zetadeo.com^$all +||binomo.com^$3p +||0x01n2ptpuz3.com^$all +||imasdk.googleapis.com/js/sdkloader/$script,redirect=noopjs,domain=timesnowhindi.com|timesnowmarathi.com|tvid.in +timesnowhindi.com##.ad-section-three +timesnowhindi.com##.ad-section-one +timesnowhindi.com##.right-block > .section-one +timesnowhindi.com##.add-wrap +timesnowhindi.com##div.square-adv +timesnowhindi.com##.right-block > .section-four +timesnowhindi.com##.ad-panel-wrap +timesnowhindi.com##.bggrayAd +timesnowhindi.com##div:not([class]) > div:has(> .atfAdContainer) +timesnowhindi.com##div:not([class]) > div:empty +timesnowhindi.com,timesnowmarathi.com,timesofindia.com##+js(no-fetch-if, tvid.in/log) +timesnowmarathi.com##[class^="section"]:has(> .ad-div) +isekaisubs.web.id##+js(aost, String.prototype.charCodeAt, ai_) +@@||cheat.hax4you.net^$ghide +! manganelo. tv popups +manganelo.tv##+js(aopr, JSON.parse) +! movizland. top + players => popups +movizland.*##+js(aopr, open) +upstore.net##+js(nano-sib, countDown, 1150, 0.5) +player.stv.tv##+js(json-prune, testadtags ad) +player.stv.tv##div.vjs-cue-point +||sumologic.stv.tv^ +||brightcove.com^$removeparam=ad_config_id,domain=player.stv.tv +@@||tvnation.me^$ghide +tvnation.me##.adsbyvli +tvnation.me##div[style="float:left;text-align:center; width:300px; height:300px"] +tvnation.me##td[style="width:165px;"] +tvnation.me##td[style="width:160px;"] +tvlogy.to##+js(nostif, 0x) +javhoho.com##+js(aost, String.prototype.charCodeAt, ai_) +javhoho.com###text-2 +javhoho.com###text-3 +javhoho.com###text-4 +javhoho.com###text-5 +javhoho.com###text-6 +javhoho.com###text-7 +javhoho.com##a[href="https://50per-cent.com/"] +javhoho.com##.img-ads-footer +javhoho.com##.popmake +javhoho.com##.pum-overlay +javhoho.com##html:style(overflow: auto !important) +! udoyoshi.com anti adb +udoyoshi.com##+js(aost, String.prototype.charCodeAt, ai_) +vermoegen.org##+js(aopr, document.referrer) +mobile.de##.sticky-billboard +m.mobile.de##[data-label="Anzeige"] +m.mobile.de##div.He1bX +@@||user.pnetlab.com/store/advs/check +oosex.net,xteensex.net##+js(aopr, exoNoExternalUI38djdkjDDJsio96) +##div#spot-holder.spot-holder[style="display: block;"] +##.gallery-bns-bl +/askdrej/*$script,1p +/askrej/*$script,1p +imslp.org##+js(nano-sib, timer) +nudes7.com##+js(acs, document.addEventListener, adsbygoogle) +||d1q4kshf6f0axi.cloudfront.net/main/prebid-$script +fapnado.*##+js(acs, Math.floor, ExoLoader) +fapnado.*##.pause-ad-pullup +fapnado.*##[class^="zpot"] +||fapnado.*/bump/ +||oi.fapnado.xxx^ +pogolinks.*##+js(nostif, showModal) +pogolinks.*##+js(acs, setTimeout, admc) +!||cdn.applixir.com^$script,3p +ilifehacks.com##+js(aost, String.prototype.charCodeAt, ai_) +pclicious.net##+js(acs, quadsOptions) +pclicious.net###text-3 +85po.com##+js(set, flashvars.protect_block, '') +85po.com##+js(set, console.clear, noopFunc) +pastebin.com##div[style]:not([class]):not([id]):has(> .adsbyvli:first-child) +@@||feyorra.top^$ghide +feyorra.top##.ads +feyorra.top##+js(aeld, load, 'block') +@@||temporarymail.com^$script,1p +gamingsym.in##+js(aost, String.prototype.charCodeAt, ai_) +motherporno.com##+js(set, flashvars.adv_start_html, '') +motherporno.com##+js(set, flashvars.adv_pause_html, '') +motherporno.com##+js(set, flashvars.adv_pre_vast, '') +motherporno.com##+js(set, flashvars.adv_pre_vast_alt, '') +motherporno.com##.aside +motherporno.com##.spot +@@||v.fwmrm.net/ad/$script,xhr,domain=viafree.* +apkhex.com##+js(set, style, noopFunc) +indiansexstories2.net,issstories.xyz##+js(set, history.pushState, noopFunc) +indiansexstories2.net##[href^="https://a.videobaba.xyz/geoip/link.php"] +indiansexstories2.net##[href="https://www.theporndude.com/"] +||dsccams.com^$3p +mypornhere.com##+js(acs, document.createElement, loadjscssfile) +mypornhere.com##.item > [href^="https://www.mrporngeek.com/"] +*$xhr,redirect-rule=nooptext,domain=shaalaa.com +shaalaa.com##div.zxc_wrap +@@||cyberbunkers.com^$ghide +cyberbunkers.com##ins.adsbygoogle +freeiphone.fr##+js(aost, Math, ai_) +eductin.com##+js(nostif, show) +*$xhr,removeparam=ad_config_id,domain=telequebec.tv +ear-phone-review.com##+js(nostif, nextFunction) +@@||ear-phone-review.com^$ghide +switch520.com##+js(acs, eval, replace) +||4u2movie.com^$3p,media,redirect=noopmp3-0.1s +embed.nana2play.com##.click_block +embed.nana2play.com##+js(nostif, debugger) +embed.nana2play.com##+js(nano-stb, load_ads) +||googles.video^ +||ad.mail.ru^$3p +ask4movie.*##+js(aopr, AaDetector) +ask4movie.*##+js(nowoif) +riotbits.com##+js(aost, String.prototype.charCodeAt, ai_) +semprot.com##.semprotnenenmontok_adalah_pujaan_hatiku +semprot.com##a[href^="/yum.php"] +elahmad.com##+js(nostif, /debugger|offsetParent/) +*$image,redirect-rule=1x1.gif,domain=elahmad.com +*$redirect-rule=noopjs,script,domain=elahmad.com +@@||imasdk.googleapis.com/js/sdkloader/ima3.js$script,domain=elahmad.com +elahmad.com###ad_asd +@@||elahmad.com/tv/videojs/packages/blockadblock.min.js$script,1p +@@||elahmad.com/tv/videojs/packages/videojs-analytics/videojs-analytics.min.js$script,1p +elahmad.com##+js(no-fetch-if, /ads|imasdk/) +elahmad.com##div[id^="ads"] +kendam.com##+js(set, canRunAds, true) +1340kbbr.com,gorgeradio.com,kduk.com,kedoam.com,kejoam.com,kelaam.com,khsn1230.com,kjmx.rocks,kloo.com,klooam.com,klykradio.com,kmed.com,kmnt.com,kpnw.com,kppk983.com,krktcountry.com,ktee.com,kwro.com,kxbxfm.com,thevalley.fm##+js(set, google_unique_id, 6) +convert2mp3.cx##+js(nowoif) +megawypas.com##+js(acs, document.addEventListener, google_ad_client) +tryvaga.com##+js(acs, document.addEventListener, adsBlocked) +||tryvaga.com/wp-content/themes/retrotube/assets/img/banners$image +/images/ads.$image,redirect-rule=1x1.gif +wttw.com##+js(set, canRunAds, true) +@@||adsuite.io^$ghide +worldofbin.com##+js(aopr, adBlockDetected) +tamilbrahmins.com##+js(acs, $, test) +@@||panelist.cint.com/assets/embed.min.js^$script,domain=surveyrewardz.com +@@||panelist.cint.com/$frame,domain=surveyrewardz.com +gab.com#?#:matches-path(/\/posts/) div[data-comment*="gab-ad"]:has(span[class]:has-text(Sponsored)) +quizlet.com##.SetPageTerms-embeddedDesktopAdWrapper +quizlet.com##.StickyAdz +quizlet.com##+js(rc, has-sidebar-adz|DashboardPage-inner, div[class^="DashboardPage-inner"], stay) +quizlet.com##+js(rc, hasStickyAd, div.hasStickyAd[class^="SetPage"], stay) +quizlet.com##+js(nano-stb) +quizlet.com##+js(set, __NEXT_DATA__.props.pageProps.adsConfig, undefined) +oneotv.com##+js(acs, document.addEventListener, google_ad_client) +@@/wp-content/plugins/dh-anti-adblocker/*$script,1p +linkfly.*##+js(set, blurred, false) +@@||dinamalar.com^$ghide +dinamalar.com###taboola-below-article-thumbnails +dinamalar.com##.topadtxt300 +dinamalar.com##div[style=" color: #999999;font-family: arial;font-size:10px;padding-right: 5px;text-align: right;width:640px;"] +dinamalar.com##div[style^="width:728px; margin-right:2px; height:90px;"] +dinamalar.com##.topadtxt728 +dinamalar.com###rladvt +gagaltotal666.my.id##+js(acs, addEventListener, nextFunction) +owlzo.com##+js(nostif, adblockEnabled) +kumparan.com##.adunitContainer:upward([data-qa-id]) +1tamilmv.*##+js(acs, document.createElement, cookie) +1tamilmv.*##+js(aopr, mm) +beingtek.com##+js(aopr, app_vars.force_disable_adblock) +beingtek.com##+js(set, blurred, false) +*$script,3p,denyallow=gstatic.com|recaptcha.net,domain=beingtek.com +pcbeta.com##+js(aost, document.createElement, make_rand_div) +sqlserveregitimleri.com##+js(aeld, DOMContentLoaded, adsBlocked) +sqlserveregitimleri.com##.ai_widget +*$3p,script,denyallow=cloudflare.com|cloudflare.net|hwcdn.net|jquery.com|fontawesome.com,domain=dekhobd.com +dsocker1234.blogspot.com##+js(acs, String.prototype.charCodeAt, 'replace') +dsocker1234.blogspot.com##+js(set, new_config.timedown, 0) +dsocker1234.blogspot.com##.mb-3.order-last.col-md-3.col-12 +dottech.org###Azadify +ttsfree.com##div[id^="ezoic-pub-ad-"] +stiflersmoms.com##+js(aopr, exoNoExternalUI38djdkjDDJsio96) +||stiflersmoms.com/yes/ +stiflersmoms.com##.line3 +@@||wallpapers.ispazio.net^$ghide +wallpapers.ispazio.net##.box-apples_single_reclame +ispazio.net##.stream-item +ispazio.net##.stream-item-widget +/nb/f_ls.js +||bluffyporn.com^$3p +||quinporn.com^$3p +###stop_ad +###stop_ad2 +tutcourse.com##+js(aeld, DOMContentLoaded, adsBlocked) +tutcourse.com##.text-html +tutcourse.com##.ai-attributes +@@||videovard.*^$xhr,1p +videovard.*##+js(nowoif) +videovard.*##+js(aeld, mouseup, catch) +videovard.*##+js(nosiif, 0x) +videovard.*##.jw-reset.jw-wrapper:style(z-index:2147483647 !important) +videovard.*###nux > div > div > div[id] +videovard.*##+js(aopr, FuckAdBlock) +burakgoc.com##+js(aost, String.prototype.charCodeAt, ai_) +||tvshows4mobile.org^$csp=script-src 'self' 'unsafe-eval' *.google.com +tvshows4mobile.org##+js(set-cookie, downloadbypass, 1) +tvshows4mobile.*##body:style(visibility:visible !important) +tvshows4mobile.org##[href*="starmeetonline.com/"] +tvshows4mobile.org##[href^="https://oabaubsutha.com/"] +tvshows4mobile.org##.gsc-promotion +tvshows4mobile.*##[href="http://bit.ly/indianwebseriesv2"] +tvshows4mobile.*##.prop_native1 +||i.imgur.com/D6RfMoV.png^$3p +wcofun.*##+js(nostif, AdBlock) +wcofun.*##+js(set, isAdBlockActive, false) +wcofun.*##.anti-ad +wcofun.*##.reklam_kapat +q1003.com##+js(nostif, google_ad) +||adbox.lv^$script,redirect=noop.js,domain=mail.ee +@@||automodeler.com^$ghide +automodeler.com##ins.adsbygoogle +automodeler.com##.banner +@@||armorama.com^$ghide +xemales.com##+js(aopr, document.dispatchEvent) +xemales.com##[href="https://myteenwebcam.com/"] +! cluset.com ads, popunder +cluset.com##+js(set, flashvars.popunder_url, '') +cluset.com##+js(aeld, click, clickCount) +cluset.com##.item:has(> div.spot) +cluset.com##.item.romina.tumba +cluset.com##.table +##[href^="https://join.enjoyx.com/track/"] +tumblr.com##header[role="banner"] > div > a[href="/docs/en/relevantads"]:upward(3) +tumblr.com##a[href^="https://www.bonecoin.com/"] +tumblr.com##.Yc2Sp h1, .Yc2Sp a:style(font-size: 0 !important;) +tumblr.com##+js(json-prune-fetch-response, response.timeline.elements.[-].advertiserId, , propsToMatch, url:/api/v2/tabs/for_you) +||gazzettaobjects.it/rcs_anti-adblocker/$3p +rincondelsazon.com##+js(nano-sib, timercounter) +tattoosbeauty.com##+js(nano-sib, timercounter) +||i.imgur.com^$image,domain=myflixer.* +myflixer.*###gift-middle +myflixer.*##.premodal.modal +myflixer.*##.show.modal-backdrop +myflixer.*##body:style(overflow: auto !important;) +apfelpatient.de##+js(nostif, css_class) +myfirstname.rocks##.xcontent.container +szexkepek.net##+js(aopr, document.dispatchEvent) +szexkepek.net##div[style="display:inline;float:left;width:300px;height:250px;margin-left:15px;"] +szexkepek.net##div[style="width:728px;height:90px;"] +teensexvideos.me##+js(aopr, ExoLoader) +wife-home-videos.com##+js(aopr, document.dispatchEvent) +wife-home-videos.com##.happy-footer +pornicom.com##+js(aopr, document.dispatchEvent) +pornicom.com##.thumbs-holder > .thumb_aside +pornicom.com##.bottom.thumb_aside +pornicom.com##a[href^="https://s.zlinkm.com/"] +pornicom.com##a[href^="https://s.zlinkv.com/"] +pornicom.com##a[href^="https://claring-loccelkin.com/"] +sexmadeathome.com##+js(aopr, document.dispatchEvent) +sexmadeathome.com###dclm_modal_content +sexmadeathome.com##*:style(filter: none !important) +sexmadeathome.com###dclm_modal_screen +nylondolls.com##+js(aopr, document.dispatchEvent) +sidereel.com###netaktion_ad +techymedies.com##+js(acs, eval, replace) +techymedies.com###wpsafe-generate,#wpsafe-link,.bt-success:style(display: block !important;) +techymedies.com###wpsafe-time:upward([id^="wpsafe-wait"]) +disheye.com##+js(no-fetch-if, googlesyndication) +disheye.com##+js(nano-sib, count, *) +disheye.com,techymedies.com##+js(set, blurred, false) +blogpascher.com##+js(nostif, document.location) +za.gl##+js(set, blurred, false) +notformembersonly.com##+js(aost, _pop) +notformembersonly.com###post-separate > p > .local-link +@@||cdn.jsdelivr.net/npm/*/fuckadblock.min.js$script,3p +unsplash.com##div[style^="--row-gutter"] > div a[href="/brands"]:upward(div[style^="--row-gutter"] > div) +unsplash.com##div[data-test="SearchInFeedAd-AffiliateFallback-Container"] +unsplash.com##div[data-test^="masonry-grid"] > div[style^="--row"] > div:not([itemprop="image"]) +milanworld.net##+js(acs, $, test) +chess.com##.board-layout-ad +chess.com##body.board-layout.with-und:style(margin-right:0px!important) +chess.com##.game-over-ad-legacy-component:style(height: 0 !important) +funker530.com##+js(rc, cnx-ad-container|cnx-ad-bid-slot) +uyduportal.net##+js(acs, document.addEventListener, nextFunction) +businessinsider.fr##[id^="bin-ads"] +testserver.pro##+js(nostif, google) +warddogs.com##+js(aeld, load, checkAdblock) +warddogs.com##.main-money-01 +warddogs.com##.single-aside > div.flex +telefullenvivo.com##+js(nostif, nextFunction) +gomoviz.*##.mvic-btn +gomoviz.*##.mobile-btn +gomoviz.*##div.content-kuss +! everyeye. it anti adb +everyeye.it##+js(nostif, adb) +nodejs.libhunt.com##[data-ref="saashub"]:upward(div.feed-item) +alueviesti.fi,kiuruvesilehti.fi,lempaala.ideapark.fi,olutposti.fi,urjalansanomat.fi##+js(aeld, scroll, innerHeight) +watashiwasugoidesu.com##.watas-adlabel +watashiwasugoidesu.com##.watas-bottom-vi +@@||freereceivesms.com^$script,1p +freereceivesms.com##+js(nosiif, 0x) +! non-bait wp-banners.js +/wp-content/plugins/wp-banners/js/wp-banners.js +pobre.*###messageModal +pobre.*##.generalModal +||pobre.*/wp-banners.js +||cloclo60.datacloudmail.ru/public/view/*.mp4|$media,domain=pobre.*,redirect=noopmp3-0.1s +@@||windowsbulletin.com^$ghide +fifaultimateteam.it##+js(aost, Math, inlineScript) +fifaultimateteam.it##+js(nowoif) +||fifaultimateteam.it/*skin$image +fifaultimateteam.it##.ai_widget +reddit.com,reddittorjg6rue252oqsxryoxengawnmo46qy4kyii5wtqnwfj4ooad.onion##.adLinkBar:upward(article[style="z-index: 1;"]) +@@||xtremestream.co^$ghide +blick.ch##.fKZLNI:style(width:120% !important) +blick.ch##+js(cookie-remover, __adblocker) +blick.ch##[class*="_ad_"] +blick.ch##aside:has(> div[id^="ad-placement"]) +bblink.com##+js(set, blurred, false) +bblink.com##.banner-img-promotion +javhub.net##+js(aeld, DOMContentLoaded, 0x) +javhub.net##+js(aopr, cainPopUp) +javhub.net##+js(aopr, pURL) +javhub.net##.fel-playclose +javhub.net##[class^="banner-"] +novsport.com##+js(refresh-defuser) +yifysub.net##+js(nano-sib, #timer) +theloadout.com###nn_bfa_wrapper +theloadout.com##.legion_primiswrapper +theloadout.com##header:style(top:0 !important) +theloadout.com###nn_astro_wrapper:has(.ad) +theloadout.com##.nn_mobile_mpu_wrapper +ceylonssh.com##+js(acs, $, adsbygoogle) +bowfile.com##+js(nowoif, !bowfile.com) +*$script,redirect-rule=noopjs,domain=bowfile.com +*$frame,redirect-rule=noopframe,domain=bowfile.com +||d192r5l88wrng7.cloudfront.net^$frame,redirect=noopframe +bowfile.com##+js(no-fetch-if, cloudfront.net/?) +bowfile.com##+js(no-fetch-if, method:HEAD) +bowfile.com##+js(ra, href|target|data-onclick, a[id="dl"][data-onclick^="window.open"], stay) +bowfile.com##^script:has-text(FingerprintJS) +! antiadb/download button not showing +bowfile.com##+js(trusted-prevent-xhr, googlesyndication, 'a.getAttribute("data-ad-client")||""') +*$xhr,redirect-rule=nooptext,domain=bowfile.com +javfor.tv##+js(acs, addEventListener, -0x) +! myad.biz,vklinks.com ads, anti-adb, focus detection +myad.biz##+js(set, blurred, false) +vklinks.com##.banner-inner +||myezads.com^$3p +schoolcheats.net##+js(set, truex, {}) +schoolcheats.net##+js(set, truex.client, noopFunc) +schoolcheats.net##.blur-sm:style(filter: none !important;) +schoolcheats.net##+js(nostif, answers) +kisscos.net##+js(acs, addEventListener, -0x) +kisscos.net##span[id$="related"] > div[id^="container-"] +kisscos.net##[id$="-overlay"] +1cloudfile.com##+js(trusted-prevent-xhr, googlesyndication, 'a.getAttribute("data-ad-client")||""') +1cloudfile.com##+js(nosiif, !display) +1cloudfile.com##+js(nowoif) +1cloudfile.com##+js(no-fetch-if, /nerveheels/) +||1cloudfile.com/sw.js$script +1cloudfile.com#@#.advert-wrapper +1cloudfile.com##.advert-wrapper:style(clip-path: circle(0) !important;) +1cloudfile.com##.preview-download-wrapper +1cloudfile.com##.content-preview-wrapper +||browsingcontredir.com^ +straatosphere.com##+js(nostif, showModal) +straatosphere.com##html:style(overflow: auto !important;) +liveonsat.com##+js(acs, document.getElementById, 'No') +liveonsat.com##td[width="100%"][height="50"] +4everproxy.com##+js(aost, foreverJQ, /document.createElement|stackDepth:2/) +1bitspace.com,mgnet.xyz##+js(acs, addEventListener, -0x) +mgnet.xyz##+js(acs, document.addEventListener, container.innerHTML) +mgnet.xyz##+js(nostif, top-right, 2000) +mgnet.xyz##+js(set, hiddenProxyDetected, false) +mgnet.xyz##+js(nano-stb, _0x, 15000) +1bitspace.com##+js(nano-stb, location.href, 8000) +1bitspace.com,mgnet.xyz##.modal__overlay +mgnet.xyz##.active.bnsLayers.is-block-touch.is-grid > .col_12.article-center +mgnet.xyz##.bounceIn.animated.bnsLayers.is-block-touch.is-grid +dealsfinders.blog##+js(no-fetch-if, method:HEAD) +dealsfinders.blog##+js(nostif, show) +dirproxy.com##+js(aost, Math, ) +*$3p,script,denyallow=cloudflare.com|jquery.com,domain=dirproxy.com +torrentdownloads.dirproxy.com##.left_shadow:has-text(Fast) +torrentdownloads.dirproxy.com##[id^="cookieConsent"] +torrentdownload.info##.thleft:has-text(Fast):upward(2) +dirproxy.com##[src="/logo_d.jpg"] +dirproxy.com##[src="/logo_d3.jpg"] +dirproxy.com##+js(nowoif) +electomania.es##+js(acs, eval, replace) +electomania.es##.td-pb-row.wpb_row.tdi_73.vc_row +5dwallpaper.com##.__fdw__adspot-title-container +5dwallpaper.com##.__fdw__adv-block +swzz.xyz##+js(aopr, app_vars.force_disable_adblock) +swzz.xyz##+js(set, blurred, false) +@@||c.adsco.re/|$script,domain=hotfrog.* +! pirate4all.com popup +pirate4all.com##.e3lan-top.e3lan +pirate4all.com##.pirat-before-content +||edge.api.brightcove.com^$xhr,removeparam=ad_config_id,domain=9now.com.au|mech-plus.com|threenow.co.nz +threenow.co.nz##.EpisodeAdBlockerWarning +9now.com.au##.vjs-cuepoint +designtagebuch.de##+js(set, SteadyWidgetSettings.adblockActive, false) +@@*$xhr,domain=designtagebuch.de +designtagebuch.de##[id^="desig-"]:has-text(ANZEIGE) +designtagebuch.de##.zwischen-posts-wrapper +designtagebuch.de###desig-widget-59 +designtagebuch.de##.seitenende-wrapper +vfxdownload.net##+js(acs, eval, replace) +vfxdownload.net##[href^="https://aejuice.com"] +vfxdownload.net###custom_html-35 +vfxdownload.net###custom_html-40 +gatexplore.com###tie-block_640 +gatexplore.com###tie-block_669 +nbcsportsedge.com##.edge-max-marketing-banner +audiobooks4soul.com##+js(nostif, show) +audiobooks4soul.com##[href^="https://ezaudiobooks.com/"] +||audiobooks4soul.com/*.custom-ads-block-detector. +concienciaradio.com,kontasas.gr##.stream-item +juazeiro.ba.gov.br###tie-block_1735 +juazeiro.ba.gov.br###tie-block_3287 +rtilinks.com##+js(acs, eval, replace) +mp3juices.*##+js(aost, Math.random, computed) +mp3juices.*,mp3juice.*##+js(nowoif) +mp3juices.*##[class^="result_two__"][target="_blank"] +mp3juices.icu##+js(nano-sib, temp) +fapguru.com##+js(aost, $, inlineScript) +##[href="https://clickaine.com"] +fapguru.com##.underplayer_banner +iphonechecker.herokuapp.com##+js(no-fetch-if, method:HEAD) +iphonechecker.herokuapp.com##.iad +inhumanity.com##+js(aopr, inhumanity_pop_var_name) +fapcat.com##+js(nowoif) +fapcat.com##.fade.top +fapcat.com##.spot-horizontal +fapcat.com##.spot-list +||a.fapcat.com^ +||s.fapcat.com/static/js/goldfish.js +||gamefz.com/c.asp$frame +rp5.*##+js(nostif, 0x) +rp5.*##.adsbygoogle:upward(1) +5ggyan.com##+js(acs, document.addEventListener, google_ad_client) +5ggyan.com##^script:has-text(google_ad_client) +5ggyan.com###sidebar1 > .HTML:has(> .widget-content > .adsbygoogle) +5ggyan.com##+js(nano-sib, countDown) +5ggyan.com##.progress +5ggyan.com##button:style(display: inline-block !important) +mydramalist.com##.is-desktop-ads +mydramalist.com##.app-body > div[class]:not([data-component]):has(.htlad-header_top) +mydramalist.com##div.fqmr_right_2639:has(.ad-removal-info) +stardeos.com##+js(no-xhr-if, url:googlesyndication) +stooq.*##div[style="position:relative;width:970px;height:250px"] +stooq.*##div[style="position:relative;width:300px;height:250px"] +stooq.*###f13 > table > tbody > tr > td > .f13 +stooq.*###f13 > b:has-text(Sponsor):upward(4) +stooq.*##td#f13:nth-of-type(3) > table:nth-of-type(4):has(> tbody > tr > td) +myshopify.com##+js(acs, document.addEventListener, adsBlocked) +moddedguru.com##+js(acs, eval, replace) +moddedguru.com##div.banner +vevioz.com##+js(aopr, app_vars.force_disable_adblock) +vevioz.com##+js(aopr, open) +vevioz.com##+js(set, blurred, false) +advertiserandtimes.co.uk##+js(nostif, enforceAdStatus) +advertiserandtimes.co.uk###nagBG +advertiserandtimes.co.uk##body:style(overflow: auto !important;) +advertiserandtimes.co.uk##.advert +advertiserandtimes.co.uk##.MPU +advertiserandtimes.co.uk##.TaboolaSide +milfnut.*##+js(set, console.clear, noopFunc) +milfnut.*##+js(aeld, contextmenu) +milfnut.*##+js(acs, onload, onclick) +milfnut.*##+js(nowoif) +charexempire.com##+js(aopr, app_vars.please_disable_adblock) +charexempire.com##+js(aopr, open) +charexempire.com##+js(set, blurred, false) +||i.imgur.com/*.gif$image,domain=charexempire.com +charexempire.com##.banner +synonyms.com##+js(set, canRunAds, true) +pcgamesn.com##header:style(top:0 !important) +pcgamesn.com##.legion_primiswrapper +! anxcinema. com / website popups +anxcinema.*##+js(ra, href, #clickfakeplayer) +anxcinema.*##+js(aopr, __Y) +definitions.net##+js(set, canRunAds, true) +uploady.io##+js(set, timeleft, 0) +uploady.io##+js(nowoif) +uploady.io##+js(noeval-if, replace) +uploady.io###downloadbtn[style$="z-index: 99999;"] +uploady.io###dlnk +uploady.io###iframe_id +toxicwap.us##+js(aost, Math, https) +toxicwap.us##+js(aopr, mm) +||babup.com^$3p +||toxicwap.us/sw.js$script,1p +dvdgayonline.com##+js(aost, setTimeout, ads) +dotadostube.com,taradinhos.com##+js(noeval-if, ads) +dvdgayporn.com###clickfakeplayer[href]:remove-attr(href) +dotadostube.com,taradinhos.com##div:has(> .video-block-happy) +dotadostube.com##.happy-player-beside +dvdgayporn.com,taradinhos.com##.widget_custom_html +taradinhos.com##.under-player-ad +||dvdgayonline.com^$3p +||taradinhos.com^$3p +! buffstream. io/fun popups +buffstream.*##+js(aopr, mm) +*$script,3p,denyallow=cloudflare.com,domain=ytmp3eu.net +subedlc.com##+js(acs, document.addEventListener, nextFunction) +iimanga.com##+js(aeld, DOMContentLoaded, adsBlocked) +iimanga.com##div[id^="teaser"] +@@||thevideome.com^$ghide +! sites anti adb "interfering with this page" +chicksonright.com##+js(aost, Math.random, inlineScript) +curseforge.com##+js(nano-sib) +deckbandit.com##+js(refresh-defuser) +deckbandit.com##^meta[http-equiv="refresh"] +1stream.*##+js(acs, setTimeout, admc) +1stream.*##+js(acs, document.createElement, "script") +1stream.*##+js(nostif, "admc") +1stream.*##^script[type]:has-text(c=document.createElement) +stocktwits.com##div[class*="AdBanner_"] +stocktwits.com##.LazyLoad.is-visible:has([data-aa-adunit]) +stocktwits.com##p[class^="Disclosure_disclosure"]:has([class^="Disclosure_removeAdsLink"]) +stocktwits.com##[class^="FooterAd_container"] +stocktwits.com##[class^="Primis_container"] +stocktwits.com###ad_sidebar_top_offset +xxxdl.net##.banners +||xxxdl.net/nothing.aspx? +@@||thetruedefender.com^$ghide +thetruedefender.com##.adsbyvli +thetruedefender.com###text-4 +m4news.com##.demand-supply +m4news.com###id-custom_banner +@@||tv247.us^$ghide +tv247.us##.afc_popup +calculator-online.net##+js(no-fetch-if, ads) +calculator-online.net##+js(set, load_ads, trueFunc) +calculator-online.net##.sticky_ad +calculator-online.net##.related_box:has(.adds):style(height: 1px !important;) +onionplay.*###clickfkplayer[href]:remove-attr(href) +onionplay.io###fakeplayer +onionplay.io###dooplay_player_content .source-box:style(display: block !important;) +onionplay.io##+js(set-attr, #dooplay_player_content .source-box iframe.metaframe[data-src]:not([src]), src, [data-src]) +! afScript popups +iguarras.com,iputitas.net##+js(aopr, afScript) +messitv.net##+js(aopw, atOptions) +||clk.asia/sw.js$script,1p +clk.asia,imperialstudy.com##+js(nosiif, visibility, 1000) +clk.asia##+js(nowoif) +clk.asia##+js(set, blurred, false) +||clk.asia/ads/*$frame +||clicksfly.com/img/ref/clicksglygifbanner2.gif +bigwank.com###mobile_pop +bigwank.com##.underplayer_banner +||bigwank.com/extension/aine/ +||bigwank.com/sw.js$script,1p +coloringpage.eu,juegosdetiempolibre.org,karaokegratis.com.ar,mammaebambini.it,riazor.org,rinconpsicologia.com,sempredirebanzai.it,vectogravic.com##+js(no-fetch-if, method:HEAD) +googledrivelinks.com##+js(aost, String.prototype.charCodeAt, ai_) +googledrivelinks.com##+js(aopr, adBlockDetected) +porngames.club,sexgames.xxx##+js(set, starPop, 1) +bit-shares.com##+js(aeld, load, onload) +mytoolz.net##+js(acs, document.createElement, adb) +gamingdeputy.com##+js(nostif, ai_adb) +alphagames4u.com##+js(acs, addEventListener, ai_) +wikirise.com##+js(acs, decodeURIComponent, ai_) +gotxx.*##+js(nostif, getComputedStyle, 250) +gotxx.*##+js(aost, Element.prototype.matches, litespeed) +gotxx.*##div[class][style^="position: absolute; cursor: pointer; z-index: 2147483646"] +edealinfo.com##+js(acs, $, offsetHeight) +edealinfo.com##+js(no-xhr-if, googlesyndication) +! popups https://forums.lanik.us/viewtopic.php?t=46951 +bfclive.com##+js(nowoif) +bfclive.com##+js(rmnt, script, /adb/i) +cinebaz.*##div.dlbtn > a[href*="?key"] +*$script,3p,denyallow=bootstrapcdn.com|google.com|googleapis.com|gstatic.com,domain=fx2.ink +*$xhr,redirect-rule=nooptext,domain=paraphrasetool.com +paraphraser.io##body > .justify-content-center +@@||paraphraser.io^$ghide +paraphraser.io##.adsenbox:not(#detect) +rephrase.info##.text-center:not([id]) [id^="adngin-"]:upward(.text-center:not([id])) +wouterplanet.com##+js(rmnt, script, clicky) +@@||wouterplanet.com/scripts/ads-front.min.js$script,1p +freexcafe.com##+js(acs, __PoSettings) +freexcafe.com##.left-col-gal-br +freexcafe.com###rightcolumn +freexcafe.com###banner +freexcafe.com###join +freexcafe.com##.hotdeal +freexcafe.com##div.bottom-300x250 +freexcafe.com###txtbanner +! paramountnetwork video ads +||mtvnservices.com/aria/bentojs.js +*$media,redirect=noopmp3-0.1s,domain=paramountnetwork.com +pcworld.es##.stickyAdWrapper +*$popunder,domain=ouo.io +nowtolove.com.au##.page__content-header:style(height: 50px !important) +@@||anime-king.com^$ghide +! cdnondemand.org variants +/^https?:\/\/[a-z]{5,7}\.com\/script\/[-_0-9A-Za-z]+(\.min)?\.js$/$script,3p,match-case,from=~edu|~gov,header=x-guploader-uploadid +.php?*&sadbl=1&$xhr,3p +##a[dontfo=""][style$="position: absolute; z-index: 2147483647;"] +sexlist.tv##+js(disable-newtab-links) +sexlist.tv##+js(set, flashvars.popunder_url, '') +sexlist.tv##.link-premium +sexlist.tv##.camitems +||sexlist.tv/player/html.php$frame +readgraphicnovels.blogspot.com##+js(nobab) +@@||washingtoninformer.com^$ghide +washingtoninformer.com##.widget a.gofollow:upward(.widget) +washingtoninformer.com##.a-772 +xozilla.xxx##+js(aost, HTMLSelectElement, Object) +||xozilla.xxx/player/html.php$frame,1p +||xxxbule.com^$csp=script-src +mobitool.net##+js(acs, decodeURIComponent, ai_) +letsmakeiteasy.tech###quads-myModal +||ytsubme.com/assets/adblock/ +ytsubme.com##+js(nowoif, youtube) +ytsubme.com##+js(nano-stb, aTagChange, 12000) +@@||filmpertutti.*^$ghide +dragontranslation.com##+js(aost, String.prototype.charCodeAt, https) +dragontranslation.com###teaser2 +dragontranslation.com##div[style$="position: fixed;"][style*="z-index: 2147483647;"] +thecustomrom.com##+js(acs, decodeURIComponent, ai_) +thecustomrom.com##+js(nano-stb, window.location.href, *) +111.90.159.132##+js(set, Object.prototype.ads, noopFunc) +111.90.159.132##+js(nowoif, _blank) +/wp-content/plugins/catfish-advert-banner/*$script +*/wp-content/plugins/lnw-ad-blocker-detector/$script,1p +111.90.159.132##.lna-livescore-home-tabs-widget +111.90.159.132##.slot-machine-wrapper +111.90.159.132##.idmuvi-rp-widget.widget +homeairquality.org,techtrim.tech##+js(no-fetch-if, googlesyndication) +homeairquality.org,techtrim.tech##+js(no-xhr-if, googlesyndication) +techsolveprac.com##+js(nostif, display, 5000) +! insider.com PH +insider.com##.in-post-sticky:has(> .ad-wrapper) +myshrinker.com##+js(set, blurred, false) +myshrinker.com##.banner-inner +cricstream.*,cricstreams.re##.w-100.position-absolute.h-100 +watch.cricstream.*,cricstreams.re##button:has-text(/Watch|🎟|👉/) +downloadfreecourse.com##+js(aost, fetch, inlineScript) +@@||downloadfreecourse.com^$ghide +! popmagic crap (classic popmagic filter does not work => blocking videos) +pornpapa.com,videojav.com##+js(aost, $, inlineScript) +pornpapa.com##.underplayer_banner +||surinenglish.com/adbd^ +av01.*##+js(nowoif) +av01.*##+js(ra, onclick, a[onclick^="setTimeout"]) +av01.*##div[style="width: 100%; height: 100%; top: 0px; position: fixed; z-index: 1; background-color: rgba(0, 0, 0, 0.8); overflow-x: hidden; transition: all 0.2s ease 0s; padding: 5%;"] +av01.*##+js(rc, vjs-hidden, .vjs-control-bar, stay) +freewp.io##+js(no-xhr-if, /^/) +||gospeljingle.com^$csp=default-src 'unsafe-inline' 'self' data: *.ytimg.com *.facebook.com *.google.com *.gstatic.com *.youtube.com *.googleapis.com *.wp.com *.gospeljingle.com *.googletagmanager.com +studybullet.com##+js(set, adsBlocked, false) +studybullet.com##+js(acs, b2a) +@@||driveup.in^$ghide +driveup.in##+js(nowoif, /^/, 0) +@@||scatfap.com/scat-porn/modules/vids/misc_static/adverts.js +freecourse.tech##+js(nostif, ai_) +weszlo.com##+js(no-fetch-if, ad) +@@||weszlo.com^$ghide +weszlo.com##.ad-placeholder-bg +! moviemad. vip popups +moviemad.*##+js(nowoif) +cotravinh.blogspot.com##+js(aeld, load, nextFunction) +chicagobearshq.com,chicagobullshq.com,chicagosportshq.com,cubshq.com,tigernet.com##+js(acs, document.getElementById, JSON) +! ytube2dl. com popups +ytube2dl.com##+js(aeld, , pop) +xenvn.com##+js(rmnt, script, XV) +xenvn.com##.ad_block:style(visibility: hidden !important;) +/script/ncsu.js$3p +/script/nbsu.js$3p +/script/ndsu.js$3p +/^https?:\/\/[a-z]{6,12}\.com\/script\/n[a-z]su\.js$/$script,3p +arabincest.com##+js(acs, $, test) +isi7.net##+js(no-fetch-if, adsbygoogle) +isi7.net###wpsafe-wait1 +isi7.net###wpsafe-generate:style(display: block !important;) +||d1t4ekjh9ps4ob.cloudfront.net^ +@@||coinpayz.xyz^$ghide +coinpayz.xyz##.ads +||coinpayz.xyz/*.php$frame +masstamilans.com,mymp3song.*,okmusi.com##+js(nowoif) +xnxx-sex-videos.com##+js(nostif, /out.php) +##.stream-item-widget +@@||printablebricks.com^$ghide +! orgasmatrix. com popmagic +orgasmatrix.com##.card.post:has([href*="landing."]) +gifhq.com##+js(acs, document.dispatchEvent, myEl) +gifhq.com##+js(aopr, exoNoExternalUI38djdkjDDJsio96) +gifhq.com##+js(acs, $, open) +||gifhq.com/d2.js +itdmusics.com##+js(aeld, load, onload) +itdmusics.com##+js(acs, eval, replace) +bullfrag.com##+js(acs, eval, replace) +pdfaid.com##+js(nostif, offsetHeight) +persianhive.com##+js(no-xhr-if, adsbygoogle) +lootup.me##+js(acs, document.getElementById, stop) +||mobile-tracker-free.com/dashboard/scripts/detectBlockAds/isPremiumDemo.php +mobile-tracker-free.com##+js(set, detectBlockAds, noopFunc) +wyze.com##+js(no-fetch-if, analytics) +*$script,domain=wyze.com,redirect-rule=noopjs +studyflix.de##.huge-notification +camstreams.tv##div[style="position: absolute; inset: 0px; overflow: hidden; z-index: 160; background: transparent none repeat scroll 0% 0%; display: block;"] +||camplethora.com^ +camstreams.tv###sliderBox +burnbutt.com##+js(acs, document.addEventListener, google_ad_client) +||filma24.*/*.gif$image +filma24.*###vidad +filma24.*##[href^="https://bit.ly/"] +filma24.*##[href="https://codeit.al/services/"] +/reclama/ads.js$script,redirect=prebid-ads.js +joomlabeginner.com##+js(nostif, eb) +joomlabeginner.com##.bannergroup +learnclax.com##+js(acs, $, fetch) +newsmondo.it##+js(acs, document.getElementById, "detect") +*$xhr,redirect-rule=nooptext,domain=zwielkopolski24.pl +goduke.com##+js(no-xhr-if, /analytics|livestats/) +itudong.com##+js(aeld, load, nextFunction) +tainhanhvn.com##+js(aeld, load, /nextFunction|2000/) +claimtrx.com##+js(aeld, load, 'block') +claimtrx.com##.ads +! 4kporn. xxx popunder +4kporn.xxx##+js(set, flashvars.popunder_url, '') +4kporn.xxx##+js(rmnt, script, Popunder) +arhplyrics.in##+js(nano-sib) +arhplyrics.in##+js(no-fetch-if, googlesyndication) +scrolller.com##.ad-block-popup:upward(2) +scrolller.com##.native-ad-item-panel:upward(.vertical-view__item) +||photon.scrolller.com/categories/$image,media +||photon.scrolller.com/scrolller/$media +scrolller.com##+js(no-fetch-if, doubleclick) +||dirp.me^$csp=default-src 'unsafe-inline' 'self' https://extraimage.net *.extraimage.info *.imgur.com *.wikimedia.org *.dyncdn.cc *.picturedent.org https://checkmy.pictures *.dirp.me *.googleapis.com *.gstatic.com +dirp.me##+js(aopr, puShown) +dirp.me##[data-href^="/vpn"] +dirp.me##[id]:has-text(Provider) +boainformacao.com.br##+js(no-xhr-if, adsbygoogle) +pinterest.*##a[href*="&epik="]:upward([data-grid-item]) +!pinterest.*##[data-grid-item]:has([aria-label]:not([aria-label*="pinterest"])[href^="http"]) +!#if !env_mobile +! pinterest.*##[data-grid-item]:has([data-test-pin-id] [data-test-id^="one-tap-desktop"] > a[href^="http"][rel="nofollow"]) +!#else +pinterest.*##[data-grid-item]:has([data-test-pin-id] a[href^="http"][rel] [data-test-id="pincard-oneTap-with-link"]) +pinterest.*##div[role="listitem"]:has(div[data-test-id="related-pins-name"] > div[role="button"] > div + div > div[style="-webkit-line-clamp: 1;"]):not(:has(a[href*="/pin/"])) +pinterest.*##+js(trusted-replace-fetch-response, '/\{"node":\{"__typename":"Pin"[^}]+"board":\{[^}]+"owner":\{[^}]+\}[^}]+\}[^}]+"isPromoted":true.+?"cursor":null\},/g', '', /stream) +!#endif +pinterest.*##+js(json-prune, resource_response.data.[-].pin_promotion_id resource_response.data.results.[-].pin_promotion_id) +pinterest.*##+js(json-prune, initialReduxState.pins.{-}.pin_promotion_id initialReduxState.resources.UserHomefeedResource.*.data.[-].pin_promotion_id) +@@*$ghide,domain=pinterest.* +distrowatch.org##[href*="3cx"]:upward(tbody) +distrowatch.org##[href^="https://pbxinaflash.com/"] +! ubuntudde.com anti-adb +ubuntudde.com##+js(aopw, b2a) +@@||elwood.io^$ehide +pigeonburger.xyz##+js(no-xhr-if, googlesyndication) +autofaucet.dutchycorp.space##[href*="banner"] +autofaucet.dutchycorp.space##[src^="blob:https://autofaucet.dutchycorp.space/"]:remove() +@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$xhr,domain=coin-free.com|chinhnhacoban.com|tremamnon.com|95news.com +*$script,3p,domain=coin-free.com|chinhnhacoban.com|95news.com,denyallow=iconify.design|cloudflare.com +coin-free.com##[id^="wpsafe-wait"] +coin-free.com###wpsafe-generate, #wpsafe-link:style(display: block !important) +*$script,redirect-rule=noopjs,domain=coin-free.com|chinhnhacoban.com|95news.com +tremamnon.com##+js(aeld, DOMContentLoaded, adsBlocked) +chinhnhacoban.com,tremamnon.com##[id^="wpsafe-generate"], #continue:style(display: block !important;) +coin-free.com,tremamnon.com##^script:has-text(htmls) +!#if !cap_html_filtering +coin-free.com,tremamnon.com##+js(rmnt, script, htmls) +!#endif +actresstoday.com##+js(acs, eval, replace) +! fastream. to popups + anti adb +fastream.to##+js(aopr, afScript) +@@||fastream.to^$script,1p +! telenord. it videos +telenord.it##+js(nano-sib) +snlookup.com##+js(no-xhr-if, ads) +snlookup.com##+js(rmnt, script, deblocker) +epainfo.pl##+js(acs, document.addEventListener, adsBlocked) +titantv.com##+js(aeld, load, player) +@@||ntv.io/serve/load.js$script,domain=titantv.com +titantv.com###sidebox +1apple.xyz##+js(no-xhr-if, mahimeta) +helpdice.com##+js(acs, onload, "iframe") +gomoviefree.*##.mobile-btn +vidoo.org##.banner +otakukan.com##+js(nostif, innerHTML) +otakukan.com##.ai-attributes +latinohentai.com##+js(ra, href, #clickfakeplayer) +latinohentai.com##+js(acs, document.createElement, __htas) +||adclixx.net^$script,3p,redirect=nobab2.js:10 +||adnetasia.com^$script,3p,redirect=nobab2.js:10 +||adtrackers.net^$script,3p,redirect=nobab2.js:10 +||bannertrack.net^$script,3p,redirect=nobab2.js:10 +||ads.twitter.com/favicon.ico$image,3p,redirect=32x32.png +||advertising.yahoo.com/favicon.ico$image,3p,redirect=32x32.png +||doubleclickbygoogle.com/favicon.ico$image,3p,redirect=32x32.png +||google.com/adsense/start/images/favicon.ico$image,3p,redirect=32x32.png +||gstatic.com/adx/doubleclick.ico$image,3p,redirect=32x32.png +#@##ad_300 +#@##ad_728 +#@##ad_area +#@##ad_big +#@##ad_footer +#@##ad_slot +#@##ad_space +#@##adframe:not(frameset) +#@##adheader +#@##ads-1 +#@##ads-banner +#@##ads-footer +#@##adspace +#@##adsquare +#@##banner468 +#@##banner728x90 +###ad_300:not([style^="position: absolute; left: -5000px"]) +###ad_728:not([style^="position: absolute; left: -5000px"]) +###ad_area:not([style^="position: absolute; left: -5000px"]) +###ad_big:not([style^="position: absolute; left: -5000px"]) +###ad_footer:not([style^="position: absolute; left: -5000px"]) +###ad_slot:not([style^="position: absolute; left: -5000px"]) +###ad_space:not([style^="position: absolute; left: -5000px"]) +musmus.main.jp,streetinsider.com#@##ad_space:not([style^="position: absolute; left: -5000px"]) +###adframe:not(frameset):not([style^="position: absolute; left: -5000px"]) +freehostbox.net,hatenablog.com,puzzle-ch.com#@##adframe:not(frameset):not([style^="position: absolute; left: -5000px"]) +###adheader:not([style^="position: absolute; left: -5000px"]) +###ads-1:not([style^="position: absolute; left: -5000px"]) +###ads-banner:not([style^="position: absolute; left: -5000px"]) +###ads-footer:not([style^="position: absolute; left: -5000px"]) +###adsquare:not([style^="position: absolute; left: -5000px"]) +###banner468:not([style^="position: absolute; left: -5000px"]) +###banner728x90:not([style^="position: absolute; left: -5000px"]) +! temp specific rules +xnxx.*,xvideos.*###ad-footer +#@#.google-ad +##.google-ad:not(.testAd) +genshin-soku.com,monhan-soku.com,xn--gckdevd5myivf.site,yamiisoku.com,mmiyue.com#@#.google-ad:not(.testAd) +/ads-prebid.js$script,redirect=prebid-ads.js +/prebid-ads.js$script,redirect=prebid-ads.js,domain=~exey.io +! www.gamedeveloper.com +/prebid-ads/adsensebase.js$script,redirect=prebid-ads.js +! www.hero-wars.com +/prebid-article-ad-ad-300x250.js$script,redirect=prebid-ads.js +@@/js/prebid-ads.js$script,1p +#@#.adslot +#@#.adslot_1 +#@#.ad_slot +#@#.adunit +~apkmirror.com,~tuxpi.com##.adslot:not(.text-ad) +##.adslot_1:not(.text-ad) +##.ad_slot:not(.text-ad) +##.adunit:not(.text-ad) +! CHP Ads Block Detector +#@#.ad-link +##.ad-link:not(.adsbox) +#@#.ad-unit +#@#.ad_unit +~lamire.jp,~tinhte.vn##.ad-unit:not(.adsbox, .text-ad, .textads):not([style^="width: 1px; height: 1px; position: absolute;"]) +##.ad_unit:not(.text-ad, .adsbox) +#@#[data-ad-module] +#@#[data-ad-width] +#@#[data-ad-manager-id] +##[data-ad-module]:not([style$="left: -10000px !important; top: -1000px !important;"]):not(.adsbygoogle) +##[data-ad-width]:not([style$="left: -10000px !important; top: -1000px !important;"]):not(.adsbygoogle) +##[data-ad-manager-id]:not([style$="left: -10000px !important; top: -1000px !important;"]):not(.adsbygoogle) +#@#.ad-slot +##.ad-slot:not(.adsbox):not(.adsbygoogle) +#@#.ad-300x250 +##.ad-300x250:not(.ads) +||doubleclick.net^$xhr,redirect=noop.txt +||media.fastclick.net/|$xhr,3p,redirect=noop.txt +||ads.facebook.com/|$xhr,3p,redirect=noop.txt +||advice-ads.s3.amazonaws.com/|$xhr,3p,redirect=noop.txt +||ads.youtube.com/|$xhr,3p,redirect=noop.txt +||ads.reddit.com/|$xhr,3p,redirect=noop.txt +||ads-api.twitter.com/|$xhr,3p,redirect=nooptext +||ads.pinterest.com/|$xhr,3p,redirect=noop.txt +||adversal.com/|$xhr,3p,redirect=noop.txt +||sovrn.com/|$xhr,3p,redirect=noop.txt +||ads.tiktok.com/|$xhr,3p,redirect=noop.txt +||propellerads.com/|$xhr,3p,redirect=noop.txt +||infolinks.com/|$xhr,3p,redirect=noop.txt +||realsrv.com/popunder1000.js$xhr,3p,redirect=noop.txt +||exdynsrv.com/video-slider.js$xhr,3p,redirect=noop.txt +mymusicreviews.com##+js(aopr, chp_adblock_browser) +nj.com##.ad-unit[id] +kiplinger.com##.ad-unit, .fake +livescience.com##.widget-ads +globfone.com##+js(no-xhr-if, ads) +! tv-sport-hd. com ads popups +tv-sport-hd.com##[src="/rcl/reclama.php"] +tv-sport-hd.com###reklama1 +@@||androidacy.com^$ghide +m4ufree.*##+js(aopr, BetterJsPop) +glosbe.com###topBannerContainer +||www.sfr.fr^$script,redirect-rule=noop.js,domain=red-by-sfr.fr +publicflashing.me##+js(aost, console, onload) +@@||cdn.dqst.pl/assets/ads.js$xhr,domain=tko.pl +plotaroute.com###RightPanelAds +plotaroute.com###AdPanelRight +plotaroute.com###Page:style(right: 0px !important;) +katmoviefix.*##+js(aopr, Request) +katmoviefix.*##+js(noeval-if, ads) +g3g.*##.text-center.alert-danger.alert-dismissible.alert +sanet.st##+js(aost, document.createElement, onerror) +sanet.st##.lsB +sportsdark.com##+js(acs, eval, replace) +askpaccosi.com##+js(nostif, /adb/i) +askpaccosi.com##+js(noeval) +askpaccosi.com##+js(no-fetch-if, googlesyndication) +askpaccosi.com##+js(no-xhr-if, googlesyndication) +askpaccosi.com##+js(no-xhr-if, ad) +askpaccosi.com##[id^="wpsafe-wait"] +askpaccosi.com###wpsafe-generate, #wpsafe-link:style(display: block !important) +askpaccosi.com###wcfloatDiv4 +askpaccosi.com##.av_pop_modals_1 +techsignin.com##+js(acs, document.getElementsByTagName, tdBlock) +techsignin.com###td-outer-wrap:style(cursor: default !important) +firstpost.com##+js(ra, href, .t-out-span [href*="utm_source"], stay) +firstpost.com##+js(ra, src, .t-out-span [src*=".gif"], stay) +/apis-2.js^$1p +/pub/js_min.js| +@@||daihatsu-club.net^$ghide +daihatsu-club.net##[class^="side_ad_left_"] +daihatsu-club.net##[class^="side_ad_right_"] +vaa.jp,yonelabo.com###nankafix +svetserialu.to##+js(nowoif) +onlytech.com##+js(acs, $, test) +/fret/meow4/*$script,3p +scjhg5oh.fun,a-b-f-dd-aa-bb-cctwd3a.fun,mjukb26l.fun,ghajini-4urg44yg.lol##+js(nowoif) +scjhg5oh.fun,a-b-f-dd-aa-bb-cctwd3a.fun,mjukb26l.fun,ghajini-4urg44yg.lol##+js(acs, Math, localStorage['\x) +@@?*=$xhr,1p,strict1p,method=get,domain=mjukb26l.fun|ghajini-4urg44yg.lol|scjhg5oh.fun|a-b-f-dd-aa-bb-cctwd3a.fun +! *** uAssets:filters/filters-2022.txt *** +akoam.*##+js(nowoif) +porner.tv##.sources +porner.tv##.show.mobileSources +porner.tv##[href^="https://a.medfoodsafety.com/loader"] +porner.tv##.container > .HeaderLinks +porner.tv##.HeaderBanner +porner.tv##.defaultAd +pornocomics.*###dclm_modal_screen +pornocomics.*###dclm_modal_content +pornocomics.*##*:style(filter: none !important) +pornocomics.*##+js(aeld, , pop) +@@||dosgamezone.com^$image,1p +423down.com##+js(aeld, DOMContentLoaded, adsBlocked) +blu-ray.com##+js(nowoif) +rosefile.net##+js(acs, document.addEventListener, nextFunction) +ac-illust.com,photo-ac.com###eachDownloadedModal:has(.ac-btn[href^="https://premium."]) +ac-illust.com,photo-ac.com##.modal-backdrop +ac-illust.com,photo-ac.com##body.modal-open *:style(filter: none!important;) +freebie-ac.jp##+js(trusted-rpnt, script, currentTime = 1500 * 2, currentTime = 0) +! D4zz-sites +alluretube.com,anyxvideos.com,fetishtube.cc,italianporn.com.es,japanporn.tv,lovefap.com,mommysucks.com,mzansinudes.com,napiszar.com,of-model.com,onlineporn24.com,porntube15.com,sexavgo.com,sexdiaryz.*##+js(acs, decodeURI, decodeURIComponent) +japanporn.tv##+js(acs, Math.floor, ExoLoader) +##div[style^="z-index: 999999; background-image: url(\"data:image/gif;base64,"][style$="position: absolute;"] +||a.b.napiszar.com^ +||japanporn.tv/rg3y/*$script +! from pp moved to filters 2020 +9xmovie.*##+js(nowoif) +! AaDetector-sites +123movies-org.*,gayteam.club,sflix.*##+js(aopr, AaDetector) +lavanguardia.com##+js(no-xhr-if, notifier) +appsmodz.com##+js(no-xhr-if, googlesyndication) +appsmodz.com##.sticky-ads +appsmodz.com##+js(rc, hidden, button) +appsmodz.com##+js(ra, disabled, button) +appsmodz.com###timer +bingotingo.com##+js(rmnt, script, deblocker) +bingotingo.com##+js(no-xhr-if, googlesyndication) +bingotingo.com##+js(nano-sib, counter, , 0.02) +bingotingo.com###please-wait +||watchporn.to/banners.php +watchporn.to##.table +watchporn.to##[href^="https://go.gkrtmc.com/"] +dotabuff.com##+js(no-fetch-if, ads) +dotabuff.com##.retaliate.mana-void +||dotabuff.com/cargo.js +! mrgay. com popunder, popups, ads +mrgay.com##+js(aopr, mz) +mrgay.com##+js(nowoif) +mrgay.com##.headline.wrapper:has-text(Advertisement) +mrgay.com##.headline.wrapper:has-text(Advertisement) + div +mrgay.com###und_ban +mrgay.com##.video-info > section:has-text(Adv) +mrgay.com##article > .headline:has-text(Suggested) +mrgay.com##article > .headline:has-text(Suggested) + section +||revive.3wayint.com^ +cdn.gamemonetize.com###imaContainer +superpsx.com##+js(no-xhr-if, googlesyndication) +superpsx.com##+js(aost, document.getElementById, adsBlocked) +superpsx.com##+js(no-fetch-if, /googlesyndication|doubleclick/, length:10, {"type": "cors"}) +superpsx.com##+js(set, penciBlocksArray, []) +superpsx.com##+js(acs, b2a) +so1.asia##+js(nano-stb, , , 0.02) +so1.asia##+js(nano-sib, , , 0.02) +so1.asia##+js(rc, hidden, .panel-body > .text-center > button) +so1.asia##+js(ra, disabled, .panel-body > .text-center > button) +so1.asia##.pietimer +*$image,redirect-rule=2x2.png,domain=searchenginereports.net +searchenginereports.net##[id^="adboxx"] +osmanonline.co.uk##.is-sticky +osmanonline.co.uk##.adfoxly-wrapper +osmanonline.co.uk##+js(acs, $, modal-window) +quizack.com##+js(no-fetch-if, googlesyndication) +quizack.com##+js(nano-stb, isScrexed, 5000) +quizack.com##[class*="_mosori"] +goshow.tv##+js(aopr, ExoLoader) +cocomanga.com##+js(aeld, load, popMagic) +@@||cocomanga.com^$xhr,1p +primeos.in##.elementor-popup-modal +primeos.in##body:style(overflow: auto !important;) +||primeos.in/wp-content/uploads/*/Sidebar-Ad*$image +sarapbabe.com##+js(acs, document.querySelector, _0x) +sarapbabe.com##+js(aopr, decodeURI) +@@||sarapbabe.com^$ghide +sarapbabe.com##.has-text-danger +sarapbabe.com##.navbar-start > a.navbar-item:nth-of-type(4) +sarapbabe.com##.porn_sites_list +sarapbabe.com##.is-3.column +integral-calculator.com##+js(aopr, fallbackAds) +victor-mochere.com##+js(nostif, ai_) +! buondua.com leftover +buondua.com##.main-body > div > div[class]:not([class^="item"]):not([class^="article"]):has-text(/^Sponsored ads$/) +buondua.com##.main-body div[class]:has(> .adsbyexoclick) +buondua.com##.pagination + br + div[class] +buondua.com##div[class*="article"] > div:not([class]) > div[class]:has-text(/^Sponsored ads$/) +buondua.com##.view-list > div:not([class]):has(iframe) +buondua.com##+js(aeld, click, popurl) +1apple.xyz###wpsafe-generate, #wpsafe-link:style(display: block !important;) +1apple.xyz##div[id^="wpsafe-wait"] +||rat.xxx/xdman/* +rat.xxx##+js(aopr, popns) +rat.xxx##+js(acs, document.write, iframe) +@@||lablue.de^$ghide +sourceforge.net##+js(set, SF.adblock, true) +sourceforge.net##+js(nano-stb) +sourceforge.net##.can-truncate +sourceforge.net###mirror +sourceforge.net###nels +||a.slashdotmedia.com^ +nova.cz##div.vjs-marker-ad +||ads-twitter.com^$frame,redirect=noopframe +! Slow starting +media.cms.nova.cz##+js(nano-stb, () => n(t), *) +mediatn.cms.nova.cz##+js(nano-stb, () => t(), *) +wplink.*##+js(set, blurred, false) +samfirms.com##+js(set, startfrom, 0) +lbprate.com##^script:has-text(Math.imul) +lbprate.com##+js(acs, Math.imul) +lbprate.com##[id^="Ad"] +cefirates.com##.most-top-bar +||geoplugin.net^$xhr,redirect-rule=noop.txt,domain=taotronics.com +||raw.githack.com/*/SpiderBlogging/main/antiadblock/$3p +virpe.cc##+js(acs, document.write) +suzihaza.com##+js(aopr, __Y) +||static.sunmedia.tv/AdBlockDetection/$script +freecoursesites.com##+js(acs, eval, replace) +freecoursesites.com##.herald_adsense_widget +derivative-calculator.net##+js(aopr, fallbackAds) +apkandroidhub.in##+js(no-fetch-if, googlesyndication) +apkandroidhub.in##.g-recaptcha:style(margin-top:60px !important) +apkandroidhub.in###wpsafe-generate:style(display: block !important;) +apkandroidhub.in##div[id^="wpsafe-wait"] +apkandroidhub.in###wpsafe-link:style(display: block !important;) +rocklink.in##+js(set, blurred, false) +@@||noviny.sk^$xhr,1p +*$frame,domain=noviny.sk,redirect-rule=noopframe +digminecraft.com##div > [id$="_slot"]:upward(div) +rabbitstream.net##+js(set, console.clear, undefined) +himovies.*##+js(nowoif) +||i.imgur.com/*.gif$image,domain=rabbitstream.net +! pastemytxt.com popup, ad +||pastemytxt.com/downloadad.jpg +||imgbox.com^$domain=pastemytxt.com +hispasexy.org##+js(acs, decodeURI, decodeURIComponent) +hispasexy.org##+js(aopr, _cpp) +hispasexy.org##+js(aopr, popns) +javplaya.com##+js(aopr, __Y) +javfindx.com###previewBox +||javfindx.com/sw.js +masterduelmeta.com##:xpath('//*[contains(text(),"allow ads")]'):upward(3) +masterduelmeta.com##html,body:style(overflow: auto !important;) +*$xhr,redirect-rule=nooptext,domain=masterduelmeta.com +gcertificationcourse.com##+js(acs, eval, replace) +gcertificationcourse.com##[id*="PAds_"] +gcertificationcourse.com##[id*="PAds-"] +gcertificationcourse.com##+js(no-xhr-if, adsbygoogle) +@@||getfree.co.in^$script,1p +*$script,3p,redirect=noop.js,domain=shorttrick.in +shorttrick.in###wpsafe-generate, #wpsafe-link:style(display: block !important;) +shorttrick.in##+js(aost, fetch, https) +shorttrick.in##+js(aopr, checkAdsStatus) +shorttrick.in##+js(rmnt, script, /mdp|adb/i) +diglink.blogspot.com##+js(nano-sib) +gamingvital.com##+js(acs, decodeURIComponent, ai_) +gamingvital.com###tdi_132 +pornoborshch.com##+js(ra, onclick) +pornoborshch.com##.on-player-wrap3 +btcadspace.com##+js(acs, document.getElementById, AdBlock) +mmorpg.org.pl##+js(no-fetch-if, wtg-ads) +mmorpg.org.pl##div.bABcMb.sc-5odcub-0 +hostmath.com##+js(set, canRunAds, true) +playmyopinion.com##+js(acs, $, modal) +foodsdictionary.co.il##+js(no-xhr-if, /ad-) +pherotruth.com##+js(acs, setTimeout, void 0) +*$xhr,redirect-rule=nooptext,domain=stol.it +@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$xhr,domain=yhocdata.com +yhocdata.com##+js(nano-stb, /__ez|window.location.href/, *) +rapelust.com##+js(set, D4zz, noopFunc) +logikfx.com##.wix-blog-print-in-full-width[data-testid="mesh-container-content"] > div[class^="_"] > div[style="padding-left: 30px;"] +logikfx.com##p[style="font-size:12px; text-align:center;"] > span:has-text(Advertisement) +logikfx.com##section.wix-blog-hide-in-print p[style="font-size:12px; text-align:center;"] > span:has-text(Advertisement):upward(section) +logikfx.com##div[style="width:740px"] +javplay.me##+js(aopr, popns) +! note.sieuthuthuat.com anti-adb +note.sieuthuthuat.com##+js(set, isAdBlockActive, false) +etsy.com##body.no-touch li.wt-list-unstyled div.v2-listing-card__info > div.wt-text-caption.wt-text-grey > span:not(.wt-icon):not([aria-role]):matches-css(display:inline-block):has-text(/^Ad/i):upward(li):remove() +etsy.com##li:not(#ad-ubo) .listing-link[href*="ref=sc_gallery"]:upward(li) +www.etsy.com##[data-results-grid-container] > li > div:not([data-appears-event-data*="listing_ids"]):not([data-appears-component-name="search2_organic_listings_group"]) +javleaked.com##+js(aopr, __Y) +drydenwire.com##.modal +drydenwire.com##.modal-backdrop +drydenwire.com##[data-track-category="Sponsors"] +drydenwire.com##.promogrid +banned.video,madmaxworld.tv##+js(set, Object.prototype.ads.nopreroll_, true) +faselhd.*##.alert-danger.alert +faselhd.*###popup +||cdn.stroeerdigitalgroup.de/metatag/live/$script,domain=mittelhessen.de,redirect=noopjs +mittelhessen.de##[class*="banner"] +mittelhessen.de##[class*="Banner"] +mittelhessen.de##.adSlot +getcopy.link##+js(aopr, document.write) +getcopy.link##+js(refresh-defuser) +largescaleforums.com##+js(nostif, ).show()) +crunchyscan.fr##.col-sm-8.col-md-8.main-col > .c-sidebar +crunchyscan.fr##.widget_custom_html +*$script,redirect-rule=noopjs,domain=crunchyscan.fr +crunchyscan.fr##+js(aopr, open) +crunchyscan.fr##+js(trusted-prevent-fetch, googlesyndication, function, {"type": "cors"}) +||crunchyscan.fr/js/safe_user.js +||crunchyscan.fr/build/assets/sjs_ +||crunchyscan.fr/build/assets/module| +crunchyscan.fr##+js(aeld, DOMContentLoaded, adbl) +! 4stream.* popups +4stream.*##+js(nowoif) +techgeek.digital##+js(aopr, adblockDetector) +techgeek.digital##+js(nowoif) +techgeek.digital##+js(set, blurred, false) +techgeek.digital##.espaciodos +||raw.githubusercontent.com/expertad^$3p +||firebasestorage.googleapis.com/v0/b/gosyndication.appspot.com^ +bestpornflix.com##.table +bestpornflix.com##+js(rmnt, script, popunder) +bestpornflix.com##+js(set, flashvars.protect_block, '') +h-flash.com##+js(nowoif) +@@||h-flash.com^$ghide +h-flash.com##[href^="https://chaturbate.com/in/"] +h-flash.com###topzone +*$popunder,domain=h-flash.com +*$frame,redirect-rule=noopframe,domain=h-flash.com +h-flash.com##[href^="https://t.aagm.link/"] +h-flash.com#@#.google-ads +||imobileporn.com/premium/ +||h-flash.com/data/image/mcs/chat*$image,1p +||h-flash.com/data/image/mcs/*.gif$image,1p +||h-flash.com/data/image/candyai/$frame,1p +h-flash.com##div[style$="overflow:hidden"]:has(> a[alt="CandyAI"]) +h-flash.com##a[href^="https://a.candyai.love/"] +h-flash.com##a[style*="/data/image/mcs/chat"] +h-flash.com##.pagebody:style(height: auto !important;) +clickscoin.com##.d-sm-block.d-none +safe.elektroupdate.com#@#ins.adsbygoogle[data-ad-slot] +safe.elektroupdate.com#@#ins.adsbygoogle[data-ad-client] +safe.elektroupdate.com##.adsbygoogle:style(height: 1px !important;) +eroticity.net##+js(aopr, loadTool) +||eroticity.net/clientscript/popcode_ +||eroticity.net/clientscript/poptrigger_ +||eroticity.net/*.gif$image +dev2qa.com##+js(acs, decodeURIComponent, ai_) +ponselharian.com##+js(nowoif) +||ponselharian.com/img/download_ +! nsfw fullxxxporn. net popups +fullxxxporn.net##+js(aopr, decodeURI) +check-plagiarism.com##[id^="topads_"] +! cine. to popups +cine.to##+js(aeld, , /open.*_blank/) +thebharatexpressnews.com##+js(aopr, b2a) +jav247.top##+js(aopr, __Y) +! vtube .to/vtplay .net ads +vtube.to##+js(nowoif) +vtube.to##+js(acs, RegExp, debugger) +vtube.to##+js(aeld, popstate) +vtube.to##+js(set, D4zz, noopFunc) +/vtu_*.js$script,domain=vtbe.*|vtube.to|vtube.network +98zero.com##+js(rmnt, script, adbl) +! vumoo.cc fake player +vumoo.cc##+js(ra, href, #clickfakeplayer) +vumoo.cc###fakeplayer +vumoo.cc##a.btn-adv.btn +fashionunited.*##.adunitContainer:upward(3) +jugomobile.com##+js(aeld, DOMContentLoaded, adsBlocked) +m.liputan6.com##+js(aeld, scroll) +! papunika. com anti adb +papunika.com##+js(nostif, ai_) +basic-tutorials.de##+js(aopr, advanced_ads_ready) +! xxxvideohd.net popup +||xxxvideohd.net/js/main.course.js +||xxxvideohd.net/js/sellito.js +*$xhr,redirect-rule=noop.txt,domain=thingiverse.com +coverapi.store,tenies-online.*##+js(aopr, mm) +coverapi.store##.close00 +@@||coverapi.store^$script,1p +*$script,redirect-rule=noopjs,domain=mrlabtest.com +infinityblogger.in##+js(acs, eval, replace) +magdownload.org##+js(nostif, _0x) +magdownload.org##.home-jumbotron +*$script,domain=multiclaim.net,redirect-rule=noopjs +prepostseo.com##+js(acs, loadAdBlocker) +prepostseo.com##+js(no-fetch-if, googlesyndication) +prepostseo.com###top-head-ad +prepostseo.com###after_button_ad_desktop_2 +prepostseo.com###after_title_ad +prepostseo.com###after_title_ad_2 +prepostseo.com###above_button_ad +prepostseo.com###sidebar_ad_big +prepostseo.com###floorad-wrapper +prepostseo.com##div[id^="bsa-zone_"] +prepostseo.com##span:has-text(ADVERTISEMENT) +bluemoon-mcfc.co.uk##div.stickyContainer +bluemoon-mcfc.co.uk##[id^="snack_"] +worldtravelling.com##+js(nostif, ads) +order-order.com##+js(acs, Math.random, bait) +order-order.com###stickyfooterad +cacfutures.org,comexlive.org,daxfutures.org,dollarindex.org,dowfutures.org,ftsefutures.org,mcxlive.org,nasdaqfutures.org,ncdexlive.org,niftyfutures.org,nikkeifutures.org,sgxnifty.org,spfutures.org##+js(acs, jQuery, "No") +cacfutures.org,comexlive.org,daxfutures.org,dollarindex.org,dowfutures.org,ftsefutures.org,mcxlive.org,nasdaqfutures.org,ncdexlive.org,niftyfutures.org,nikkeifutures.org,sgxnifty.org,spfutures.org##.ads +huffpost.com##+js(set, HP_Scout.adBlocked, false) +ingles.com,spanishdict.com##+js(set, SD_IS_BLOCKING, false) +ingles.com,spanishdict.com##+js(aeld, , isBlocking) +ingles.com,spanishdict.com###adTopLarge-container +ingles.com,spanishdict.com##[id^="adSide"] +@@||d1q4kshf6f0axi.cloudfront.net/main/prebid-min-2022.js$script,domain=spanishdict.com +ikuhentai.net##div[style="position: fixed; display: block; width: 100%; height: 100%; inset: 0px; background-color: rgba(0, 0, 0, 0); z-index: 300000;"] +zeroupload.com##+js(rmnt, script, adblock) +*$script,redirect-rule=noopjs,domain=vimm.net +vimm.net###footerContainer +vimm.net###main:style(bottom: 0px !important) +vimm.net###headerAdContainerInline +surfline.com##+js(nano-stb, adFreePopup, 15000, 0.02) +surfline.com##+js(set, Object.prototype.isPremium, true) +*$script,domain=surfline.com,redirect-rule=noopjs +surfline.com##+js(set, __BACKPLANE_API__.renderOptions.showAdBlock, '') +surfline.com#@#.ad-box:not(#ad-banner):not(:empty) +surfline.com##+js(aeld, timeupdate, , elements, .quiver-cam-player--ad-not-running.quiver-cam-player--free video) +||cdn-surfline.com/*/preroll_$image,3p,domain=surfline.com +||cdn-surfline.com/*/preroll_$media,3p,redirect=noopmp3-0.1s,domain=surfline.com +! NSFW faps. club - popunder +faps.club##+js(acs, onload, open) +aspdotnet-suresh.com,tudo-para-android.com##+js(aeld, load, onload) +*.png#$image,redirect-rule=1x1.gif +*.gif#$image,redirect-rule=1x1.gif +*.jpg#$image,redirect-rule=1x1.gif +*.svg#$image,redirect-rule=1x1.gif +! thedigitalfix .com PH +thedigitalfix.com###nn_bfa_wrapper:remove() +thedigitalfix.com##+js(nosiif, debug) +thedigitalfix.com##.sticky_rail600:remove() +||bigpixel.cn/libs/plugins/blocker.js^ +bigpixel.cn##.portal_ad +striptube.net##+js(aopr, loadTool) +dulichkhanhhoa.net,noithatmyphu.vn##+js(no-fetch-if, googlesyndication) +dulichkhanhhoa.net,noithatmyphu.vn###wpsafe-generate:style(display: block !important;) +dulichkhanhhoa.net,noithatmyphu.vn###wpsafe-link:style(display: block !important;) +dulichkhanhhoa.net,noithatmyphu.vn##div[id^="wpsafe-wait"] +chiangraitimes.com##+js(acs, eval, replace) +! exo ads +desixxxtube.org,dirtyindianporn.*,freeindianporn2.com,indianpornvideos.*,kashtanka.*,kashtanka2.com,kompoz2.com,onlyindianporn.*,pakistaniporn2.com,porno18.*,xxnx.*,xxxindianporn.*##+js(aopr, exoJsPop101) +xxxhdvideo.*##+js(aopr, decodeURI) +indianporn365.net##+js(acs, document.createElement, 'script') +||dirtyindianporn.info/js/friends.sv.js +||pakistaniporn2.com/js/friends.minz.js +! amateur-couples.com,slutdump.com popunder, ads +amateur-couples.com##+js(aopr, exoNoExternalUI38djdkjDDJsio96) +amateur-couples.com,slutdump.com##+js(set, dclm_ajax_var.disclaimer_redirect_url, '') +boombj.com##+js(aost, Math, _0x) +||easyads29.*^ +! xxxextreme.org popup +xxxextreme.org##+js(aeld, getexoloader) +! desitelugusex. com ads +desitelugusex.com##+js(set, D4zz, noopFunc) +mobilanyheter.net##+js(nostif, ai_) +! a8ix .live/atishmkv aliases +a8ix.*,atishmkv.*,mkv.*##.idmuvi-bannerplayer +a8ix.*,atishmkv.*,mkv.*##.idmuvi-center-ads +a8ix.*,atishmkv.*##.idmuvi-topbanner-aftermenu +a8ix.*,atishmkv.*##.inner-floatbanner-bottom +a8ix.*,atishmkv.*##.idmuvi-footerbanner +a8ix.*,atishmkv.*###custom_html-21 +xcity.org##+js(aopr, loadTool) +xcity.org##+js(set-cookie, popunder, 1) +! Counter ads and requests inside doubleclick. net iFrames (general fix) +googleads.g.doubleclick.net###google-center-div +googleads.g.doubleclick.net###abgc +googleads.g.doubleclick.net##html[i-amphtml-no-boilerplate][amp4ads][class="i-amphtml-inabox"] +googleads.g.doubleclick.net###mys-wrapper +googleads.g.doubleclick.net##.jar +*$domain=googleads.g.doubleclick.net +stringreveals.com##+js(no-xhr-if, googlesyndication) +! mavavid. com popups +mavavid.com##+js(aopr, __Y) +! dvdplay. guru|sbs popups +*$script,3p,domain=dvdplay.* +dvdplay.*##+js(set, D4zz, noopFunc) +dvdplay.*##^script[data-cfasync]:has-text(decodeURIComponent) +acervodaputaria.com.br##+js(acs, decodeURI, decodeURIComponent) +! NSFW comicspornow. com popup +comicspornow.com##+js(aopr, decodeURI) +||comicspornow.com/*.php$script,1p +diampokusy.com##+js(aopr, __Y) +@@||shortx.net^$ghide +shortx.net##+js(aeld, load, nextFunction) +shortx.net##+js(set, blurred, false) +! mmopeon.ru popup +mmopeon.ru##+js(acs, decodeURI, decodeURIComponent) +! needrombd.com +needrombd.com##+js(acs, eval, replace) +! teluguonlinemovies. me popups +teluguonlinemovies.*##+js(nowoif) +galaxyfirmware.*#@#.textad +norton.com##+js(window-close-if, /protect?) +@@||play.tv3.lv^$script,1p +*$image,domain=play.tv3.lv,redirect-rule=1x1.gif +*$script,domain=play.tv3.lv,redirect-rule=noopjs +@@||play.tv3.lt^$script,1p +*$image,domain=play.tv3.lt,redirect-rule=1x1.gif +*$media,domain=play.tv3.lt,redirect=noopmp3-0.1s +*$script,domain=play.tv3.lt,redirect-rule=noopjs +*$image,domain=play.tv3.ee,redirect-rule=1x1.gif +*$script,domain=play.tv3.ee,redirect-rule=noopjs +play.tv3.ee,play.tv3.lt,play.tv3.lv,tv3play.skaties.lv##+js(set, Object.prototype.isNoAds, {}) +@@||play.tv3.ee^$script,1p +@@*$ghide,domain=play.tv3.* +play.tv3.lv##+js(set, tv3Cmp.ConsentGiven, true) +! dafontvn.com timer +redirect.dafontvn.com##.progress +redirect.dafontvn.com###btngetlink:style(display: inline-block !important) +redirect.dafontvn.com##+js(nano-sib, distance) +@@||gsmware.com^$ghide +gsmware.com##.adtester-container +gsmware.com##.HTML.widget .adsbygoogle:upward(.widget) +gsmware.com##.kabaradd +gsmware.com##+js(noeval-if, adblock) +gamingforecast.com##+js(acs, addEventListener, popunder) +@@||a.poki.com/prebid/$script,domain=poki-gdn.com|repuls.io +||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=google-ima.js,domain=poki-gdn.com|repuls.io +@@||g.doubleclick.net/gampad/ads?*&url=https%3A%2F%2Fgames.poki.com$xhr,domain=imasdk.googleapis.com +@@||g.doubleclick.net/gampad/ads?*&url=https%3A%2F%2Frepuls.io$xhr,domain=imasdk.googleapis.com +||redirector.gvt1.com/videoplayback/id/*/source/gfp_video_ads/$media,redirect=noop-1s.mp4,domain=poki-gdn.com|repuls.io +poki.*##div[class*="_AdvertisementContainer"] +repuls.io###partnerAd_letter +poki.*##div[width="300"][height="250"]:upward(1) +poki.*##div[width="728"][height="90"]:upward(1) +||ay.delivery/client-v2.js^$script,3p,redirect=noopjs +prajwaldesai.com##+js(nostif, ai_) +prajwaldesai.com##+js(nostif, site-access) +||vlitag.com^$script,redirect-rule=noopjs,domain=mangasco.com +downloadr.in##+js(nostif, show) +downloadr.in##+js(nano-stb, countdown) +drawize.com##+js(acs, chAdblock) +! benzin-preis.ch +@@||benzin-preis.ch^$ghide +!#if cap_html_filtering +topembed.pw##^script:has-text(adserverDomain) +!#else +topembed.pw##+js(rmnt, script, adserverDomain) +!#endif +||ublockpop.com^$all +||drectsearch.com^$all +! hindimovies. to propeller ads +hindimovies.to##+js(acs, Math, String.fromCharCode) +hindimovies.to##+js(nowoif) +hdmovie5.*,hdmovie2.*###clickfakeplayer[href]:remove-attr(href) +@@||bootdey.com^$ghide +bootdey.com##+js(nostif, offsetHeight) +! mult34. com popunder +mult34.com##+js(aopr, decodeURI) +valuable.hatenablog.com##+js(acs, document.addEventListener, google_ad_client) +||berangkasilmu.com^$3p +journaldemontreal.com,tvanouvelles.ca##+js(no-fetch-if, doubleclick) +journaldemontreal.com##+js(no-xhr-if, doubleclick) +||quebecormedia.com/infojdem/lib/cheezwhiz/$script +||rubiconproject.com^$xhr,3p,redirect-rule=nooptext,domain=journaldemontreal.com +@@||ads.rubiconproject.com/prebid/*_JournalDeMontreal.js$script,3p,domain=journaldemontreal.com +@@||securepubads.g.doubleclick.net/tag/js/gpt.js$script,3p,domain=journaldemontreal.com +@@||securepubads.g.doubleclick.net/pagead/managed/js/gpt/*/pubads_impl.js$script,3p,domain=journaldemontreal.com +journaldemontreal.com###banner +journaldemontreal.com##.bigbox-container +fox.com##+js(no-xhr-if, googlesyndication) +fox.com,foxsports.com##+js(json-prune, ads) +fox.com,foxsports.com##+js(m3u-prune, /\,ad\n.+?(?=#UPLYNK-SEGMENT)/gm, /uplynk\.com\/.*?\.m3u8/) +||link.theplatform.com/s/*/media/*=m3u&*_webdesktop_vod*$xhr,domain=foxsports.com,removeparam=/^((?!formats|profile).)*$/ +://foxvideo-sports$xhr,3p,removeparam=ad.prof,domain=foxsports.com +||digitalvideoplatform.com/vod/*/index.m3u8$xhr,removeparam=platform,domain=fox.com +@@||wintub.com^$ghide +poki-gdn.com##+js(aopr, alert) +||static.gamezop.com/creatives^$image,3p +chimicamo.org##+js(no-fetch-if, googlesyndication) +chimicamo.org##+js(no-xhr-if, ads) +chimicamo.org##.widget:has-text(Adv) +xhand.com##+js(set, flashvars.adv_start_html, '') +xhand.com##+js(set, flashvars.adv_pause_html, '') +/js/ppndr. +inwepo.co##+js(aopr, b2a) +! anti adb initBlocked +||ssl.geoplugin.net/javascript.gp$xhr,redirect-rule=noopjs +*#*/ad/$image,redirect-rule=1x1.gif +xubster.com##+js(nano-stb, remaining, 1000, 0.001) +xubster.com###countdown +! ghior. com anti adblock +ghior.com##+js(rmnt, script, deblocker) +obutecodanet.ig.com.br##+js(no-xhr-if, googlesyndication) +eztv.*##+js(nowoif) +eztv.*##+js(nostif, adb) +eztv.*##table:has-text(VPN) +eztv.*##^script:has-text(admc) +firmwarex.net##+js(no-xhr-if, googlesyndication) +firmwarex.net##+js(aost, setTimeout, adsBlocked) +firmwarex.net##+js(no-fetch-if, googlesyndication, length:10, {"type":"cors"}) +! proxy torrent sites popups +piraproxy.app,theproxy.*##+js(nowoif) +piraproxy.app,theproxy.*##+js(aopr, _wm) +unblocksite.pw##+js(aopr, XMLHttpRequest) +unblocksite.pw##+js(aopr, open) +unblocksite.pw##div[id][onclick^="window.open('https://vpn-offers.com/"] +unblocksite.pw##.antoic +unblocksite.pw##.all-linked +*$script,denyallow=cloudflare.com|hwcdn.net|jquery.com,domain=piraproxy.app|theproxy.*|unblocksite.pw +||adblockultra.com^$all +/j/m/qqqq.js? +.com/1?z=$script,3p +.com/2?z=$script,3p +.net/1?z=$script,3p +.net/2?z=$script,3p +/app/apx14.js +/app/x12.js +/hy.js?q22q2q2 +/zpp/zpp4.js +! whats-on-netflix.com anti adb +whats-on-netflix.com##+js(acs, eval, replace) +dongknows.com##+js(no-fetch-if, /ads|doubleclick/) +dongknows.com##+js(nostif, /Ads|adbl|offsetHeight/) +dongknows.com##+js(acs, eval, replace) +dongknows.com##+js(aeld, load, .innerHTML) +dongknows.com##body > div > [href^="https://www.amazon.com/deals/"] +dongknows.com##.dkt-amz-bottom > [href^="https://www.amazon.com/deals/"] +dongknows.com##.dkt-amz-head +@@||dongknows.com^$ghide +tlin.me##+js(set, blurred, false) +! mypornhere.com popup, ads +mypornhere.com##+js(set, flashvars.adv_start_html, '') +mypornhere.com##.item[style="text-align:center !important;"] +welt.de##[id^="outbrain_widget_"].OUTBRAIN[data-src]:has(> .ob-widget > .ob-widget-header > span.ob-grid-header-text:has-text(/^MEHR AUS DEM WEB|MEHR AUS DEM NETZ|AUCH INTERESSANT$/)) +welt.de##[id^="outbrain_widget_"].OUTBRAIN[data-src]:has(> .ob-widget > .ob-widget-items-container > .ob-dynamic-rec-container > a[data-adv-id][rel*="sponsored"]) +welt.de##[id^="outbrain_widget_"].OUTBRAIN[data-src]:has(:shadow(.ob-widget > .ob-widget-items-container > .ob-dynamic-rec-container > a[data-adv-id][rel*="sponsored"])) +welt.de##.c-ad-container +welt.de##+js(ra, onmousedown, .ob-dynamic-rec-link, stay) +welt.de##.q-advertisement-banner +welt.de##[id^="superbanner"] +driveplayer.net##+js(nowoif) +bulbagarden.net##+js(set, setupSkin, noopFunc) +filmeserialegratis.*,fsplayer.*##+js(nowoif) +filessrc.com,srcimdb.com##+js(nano-sib, counter) +! jav.re popup +jav.re##+js(aost, onload, /app.js) +##.adsbyrunactive +mangahub.io###adblock-notice +mangahub.io##.ads-container +*$script,3p,denyallow=cloudfront.net|disqus.com|disquscdn.com|facebook.net|fastlylb.net|fbcdn.net|google.com|onesignal.com,domain=mangahub.io +||blocksly.org^$all +forsal.pl##+js(no-fetch-if, dqst.pl) +note1s.com##.countdown +note1s.com##+js(ra, disabled, button) +rintor.*##+js(aopr, loadTool) +! nsfw watchomovies. life ads +watchomovies.*##+js(rmnt, script, popunder) +||a.streamoupload.$script +###tabVideo > .rmedia +/go/*?ident=$frame,1p +/api/popv2.php$xhr,1p +pornwhite.com##.bottom-banners +pornwhite.com##.player-spots +||pornwhite.com/js/customscript.js +! playtamil. tube ads +!#if env_mobile +||playtamil.*^$csp=script-src 'self' +!#endif +! antiadb iptvjournal. com +iptvjournal.com##+js(no-fetch-if, googlesyndication) +iptvjournal.com###wpsafe-generate, #wpsafe-link:style(display: block !important;) +iptvjournal.com##div[id^="wpsafe-wait"] +coloredmanga.com##+js(aost, Math.random, inlineScript) +||desirefx.com^$frame,redirect=noopframe,domain=uploadcloud.pro +uploadcloud.pro##+js(nano-stb, show, 4000) +! coolmoviez. skin ads +||coolmoviez.*^$csp=default-src 'self' +akumanimes.com##+js(acs, eval, replace) +m4uhd.*##+js(aopr, mm) +||minochinos.com/assets/jquery/player.js +depvailon.com##+js(aopr, PvVideoSlider) +depvailon.com##+js(aopw, _chjeuHenj) +depvailon.com##.spots +depvailon.com##.c-normdenomination-output +*$script,redirect-rule=noopjs,domain=elkjop.no +younetu.*##+js(nowoif) +younetu.*##+js(aopr, doSecondPop) +younetu.*##+js(set, adblockcheck, false) +||younetu.co/cdn-cgi/trace$xhr,1p +! animehub.ac,animeflv.ac popup +||animehub.ac/api/pop.php +autotrader.co.uk##.search-page__products > [data-is-promoted-listing] +autotrader.co.uk##.search-page__result .listings-standout:upward(.search-page__result) +autotrader.co.uk##.searchResults .product-card__ad-copy:upward(li) +autotrader.co.uk##section[data-testid="desktop-search"] .infinite-scroll-component > ul > li:has(span[data-testid="GPT_LISTING"]) +autotrader.co.uk##+js(json-prune, [].data.searchResults.listings.[-].targetingSegments) +! tiki.vn search ads +tiki.vn##div[class^="SearchAutocomplete"] > div[class^="style__StyledSuggestion"] > div:has(> a.brand-ad) +||111.90.150.10/wp-content/uploads/*.gif$image,1p +111.90.150.10##+js(acs, $, noConflict) +111.90.150.10##+js(aopr, preroll_helper.advs) +111.90.150.10###secondary > .widget_custom_html +! repelishd. cx popups +repelishd.*##+js(nowoif) +hdhub4u.*,hblinks.pro##+js(aopr, mm) +hdhub4u.*##+js(nowoif) +hdhub4u.*##.watch-hd +hdhub4u.*##.hd-links +hdhub4u.*##[href*="?aff"], [href*="snvhost.com"] +*$script,3p,domain=hdhub4u.*,denyallow=fastlylb.net|googleapis.com|disqus.com|disquscdn.com|cloudfront.net +sushi-scan.*##+js(nostif, show) +traderepublic.community##+js(nostif, /show|innerHTML/) +! watchseries9. cc popups +watchseries9.*##+js(aopr, mm) +coromon.wiki.gg##+js(aost, document.createElement, create_ad) +#@##adContext +#@##ad_img +#@##downloadAd +#@##topBannerAd +#@##topbannerad +#@##weatherad +###adContext:not(:empty) +###ad_img:not(:empty) +###downloadAd:not(:empty) +###topBannerAd:not(:empty) +###topbannerad:not(:empty) +###weatherad:not(:empty) +||bitfly.io/js/nt.js +k1nk.co##+js(aeld, click, popunder) +k1nk.co##+js(nowoif) +k1nk.co##+js(set, console.clear, noopFunc) +||k1nk.co/videos/*/_.pagespeed.$script,1p +y2mate.com##+js(aopr, open) +@@||anonigviewer.com/assets/js/peelad.js$script,1p +khsm.io##+js(nostif, getComputedStyle) +||amazon-adsystem.com/aax2/apstag.js$domain=tasteofhome.com,important +descargatepelis.com##+js(nano-sib, contador) +descargatepelis.com##+js(aeld, DOMContentLoaded, window.open) +descargatepelis.com##a[href^="http://1winpb.com/"] +teen-hd-sex.com,tube-teen-18.com,xxx-asian-tube.com##+js(aopr, exoNoExternalUI38djdkjDDJsio96) +/\.com\/[0-9a-z]{12,}\/[0-9a-z]{12,}\.js$/$script,1p,domain=tube-teen-18.com|teen-hd-sex.com|xxx-asian-tube.com +! videofilms /prosongs .link popups +videofilms.*,prosongs.*##+js(aopr, __Y) +hollywoodlife.com##+js(set, Object.prototype.enableInterstitial, false) +entireweb.com##+js(acs, setInterval, addAds) +||mathwarehouse.com/sitefiles/*/js/fixblock.js?$script,1p +babia.to##+js(acs, $, adsBlocked) +babia.to##+js(nostif, /show|document\.createElement/) +babia.to##body > div[id][style="display: block;"] +! sex-amateur-clips.com => exo ads + popups +sex-amateur-clips.com##+js(acs, document.querySelectorAll, popMagic) +sex-amateur-clips.com##+js(aeld, getexoloader) +sex-amateur-clips.com###dclm_modal_content +sex-amateur-clips.com##*:style(filter: none !important) +sex-amateur-clips.com###dclm_modal_screen +! javqis. com popunder +javqis.com##+js(aopr, decodeURI) +/vast-new/src/videojs-preroll.js$script +nsfwzone.xyz##+js(aopr, __Y) +sdefx.cloud##+js(set, D4zz, noopFunc) +edufileshare.com##+js(nano-sib, display) +xhomealone.com##+js(set, flashvars.popunder_url, '') +watchasians.cc##+js(aeld, click, popunder) +watchasians.cc##+js(set, console.clear, noopFunc) +! afdah2. com ads +afdah2.com##+js(aopr, mm) +@@||thinktibits.blogspot.com^$ghide +! proxy site ads +androidapks.biz,androidsite.net,animesite.net,computercrack.com,crackedsoftware.biz,crackfree.org,downloadgames.info,downloadsite.org,ebooksite.org,emulatorsite.com,freeflix.info,freemoviesu4.com,freesoccer.net,fseries.org,gamefast.org,gamesite.info,gostreamon.net,hindisite.net,isosite.org,macsite.info,mangasite.org,megamovies.org,moviefree2.com,moviesite.app,moviesx.org,musicsite.biz,patchsite.net,pdfsite.net,play1002.com,productkeysite.com,romsite.org,seriesite.net,siteapk.net,siteflix.org,sitegames.net,sitekeys.net,sitepdf.com,sitesunblocked.*,sitetorrent.com,softwaresite.net,superapk.org,tvonlinesports.com,warezsite.net,watchmovies2.com,watchsite.net,youapk.net##+js(aopr, open) +/sw.js$script,domain=androidapks.biz|androidsite.net|animesite.net|computercrack.com|crackedsoftware.biz|crackfree.org|downloadgames.info|downloadsite.org|ebooksite.org|emulatorsite.com|freeflix.info|freemoviesu4.com|freesoccer.net|fseries.org|gamefast.org|gamesite.info|gostreamon.net|hindisite.net|isosite.org|macsite.info|mangasite.org|megamovies.org|moviefree2.com|moviesite.app|moviesx.org|musicsite.biz|patchsite.net|pdfsite.net|play1002.com|productkeysite.com|romsite.org|seriesite.net|siteapk.net|siteflix.org|sitegames.net|sitekeys.net|sitepdf.com|sitesunblocked.*|sitetorrent.com|softwaresite.net|superapk.org|tvonlinesports.com|warezsite.net|watchmovies2.com|watchsite.net|youapk.net +/oho.js$script,domain=androidapks.biz|androidsite.net|animesite.net|computercrack.com|crackedsoftware.biz|crackfree.org|downloadgames.info|downloadsite.org|ebooksite.org|emulatorsite.com|freeflix.info|freemoviesu4.com|freesoccer.net|fseries.org|gamefast.org|gamesite.info|gostreamon.net|hindisite.net|isosite.org|macsite.info|mangasite.org|megamovies.org|moviefree2.com|moviesite.app|moviesx.org|musicsite.biz|patchsite.net|pdfsite.net|play1002.com|productkeysite.com|romsite.org|seriesite.net|siteapk.net|siteflix.org|sitegames.net|sitekeys.net|sitepdf.com|sitesunblocked.*|sitetorrent.com|softwaresite.net|superapk.org|tvonlinesports.com|warezsite.net|watchmovies2.com|watchsite.net|youapk.net +mat6tube.com##+js(set, ads, undefined) +||vbcdn.com/cdn/video_advt/*$media,redirect=noopmp3-0.1s +veblr.com###advt_click_href_link_upper +veblr.com##.advt-content +hotabis.com##+js(set, td_ad_background_click_link, undefined) +hotabis.com##[href^="https://axiadata.co.id"] +||hotabis.com/*/ads$image +||cxm-api.fifa.com/fifaplusweb/api/video/*$xhr,removeparam=adConfig +fifa.com##.theoplayer-ad-overlay-component +fifa.com##[href^="https://pubads.g.doubleclick.net/"] +||imasdk.googleapis.com/js/sdkloader/ima3.js$redirect=google-ima.js,domain=fifa.com +||fifa.com/api/v*/ad-manager/$redirect=nooptext +! popunder-sites +phimmoiaz.cc##+js(aopr, popunder) +mangahentai.xyz##+js(aopr, loadXMLDoc) +player.subespanolvip.com##+js(aopr, BetterJsPop) +racedepartment.com##+js(acs, $, adsBlocked) +||images.outbrainimg.com^$image +! hentaimoe.me popup +hentaimoe.me##+js(acs, Date, 'shift') +! uploadbaz. me ads +uploadbaz.*##+js(acs, onload) +uploadbaz.*##+js(acs, Math.imul) +freecodezilla.net##+js(aeld, DOMContentLoaded, adsBlocked) +freecodezilla.net##+js(no-xhr-if, googlesyndication) +! hdmoviesmaza. pw popups +hdmoviesmaza.*##+js(nowoif) +||111.90.150.149/wp-content/uploads/*.gif$image,1p +111.90.150.149##+js(acs, jQuery, magnificPopup) +111.90.150.149##+js(aopr, preroll_helper.advs) +111.90.150.149##.idmuvi-topbanner-aftermenu +111.90.150.149##[href*="buaksib.in"] +inbbotlist.com##+js(no-fetch-if, googlesyndication) +inbbotlist.com###wpsafe-generate, #wpsafe-link:style(display: block !important;) +inbbotlist.com##div[id^="wpsafe-wait"] +apkmagic.com.ar##+js(no-xhr-if, ads) +@@||gamaniak.com^$script,1p +@@||gamaniak.com^$ghide +! moviesjoy. pw/.best/.plus/ .to /. is popunders +moviesjoy.*##+js(aopr, mm) +moviesjoy.*##+js(nowoif) +moviesjoy.*###fcnbox +moviesjoy.*##[href*="moviesflix4k"] +moviesjoy.*##.premodal.modal +moviesjoy.*##.show.modal-backdrop +moviesjoy.*##body:style(overflow: auto !important;) +currencyconverterx.com##+js(acs, document.createElement, register) +currencyconverterx.com##.block-after-head +currencyconverterx.com##.block-inside-blocks +||imasdk.googleapis.com/js/core/bridge*.html$frame,domain=html5.gamemonetize.co,important +html5.gamemonetize.co##+js(nostif, MobileInGameGames) +gamesfrog.com##.banner > span +/\/img\/(?!new).+\.gif/$image,1p,domain=jennylist.xyz +xxxxvideo.uno##.sticky-elem +xxxxvideo.uno##.place-wink +r3owners.net##+js(acs, $, adsBlocked) +apkmodhub.in##+js(acs, String.fromCharCode, ai_adb) +apkmodhub.in##.sdl_text +apkmodhub.in##.show_download_links:style(display: block !important) +@@||digilibraries.com^$ghide +digilibraries.com##.adsbygoogle:style(height: 0px !important; visibility: collapse;) +@@||imasdk.googleapis.com/js/sdkloader/ima3.js$script,domain=hidive.com +3hentai.net##+js(nowoif) +3hentai.net###header-ban-agsy +gaget.hatenablog.com##+js(acs, document.addEventListener, google_ad_client) +celtadigital.com##+js(nostif, show) +droidmirror.com##+js(nano-sib, counter) +slidesgo.com##.ssm_adunit_container:upward([id^="list_ads"]) +apkmaven.*##+js(no-xhr-if, googlesyndication) +apkmaven.*##+js(aeld, DOMContentLoaded, adsBlocked) +apkmaven.*##+js(set, adBlockDetected, falseFunc) +apkmaven.*###wpsafe-generate, #wpsafe-link:style(display: block !important;) +apkmaven.*##div[id^="wpsafe-wait"] +apkmaven.*###countdown +apkmaven.*###download_link:style(display: block !important;) +photopea.com##div[style]:has(> a[href*="photopea.com"][href*="ads"]) +!#if cap_html_filtering +! ||photopea.com^$doc,replace=// - - diff --git a/popup/popup.js b/popup/popup.js deleted file mode 100644 index 2099129..0000000 --- a/popup/popup.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -const api = typeof browser !== 'undefined' ? browser : chrome; - -const globalToggle = document.getElementById('globalToggle'); -const siteToggle = document.getElementById('siteToggle'); -const siteName = document.getElementById('siteName'); -const updateBanner = document.getElementById('updateBanner'); -const updateText = document.getElementById('updateText'); -const updateLink = document.getElementById('updateLink'); - -let currentHostname = ''; - -// Load current state -api.runtime.sendMessage({ type: 'getState' }, (res) => { - if (!res) return; - - currentHostname = res.hostname; - siteName.textContent = currentHostname || '\u2014'; - - globalToggle.checked = res.enabled; - siteToggle.checked = !res.siteDisabled; - - if (!res.enabled) { - siteToggle.disabled = true; - } - - // Show update banner if available - if (res.updateAvailable) { - updateText.textContent = `v${res.updateAvailable} available`; - updateLink.href = res.updateUrl || '#'; - updateBanner.style.display = 'flex'; - } -}); - -// Global on/off -globalToggle.addEventListener('change', () => { - const enabled = globalToggle.checked; - api.runtime.sendMessage({ type: 'toggleGlobal', enabled }); - siteToggle.disabled = !enabled; -}); - -// Per-site on/off -siteToggle.addEventListener('change', () => { - api.runtime.sendMessage({ - type: 'toggleSite', - hostname: currentHostname, - disable: !siteToggle.checked, - }); -}); - -// Load blocked ad count -api.runtime.sendMessage({ type: 'getAdCount' }, (res) => { - if (res && typeof res.count === 'number') { - document.getElementById('adCount').textContent = res.count; - } -}); diff --git a/rules/rules.json b/rules/rules.json deleted file mode 100644 index ced7902..0000000 --- a/rules/rules.json +++ /dev/null @@ -1,610 +0,0 @@ -[ - { - "id": 1, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "doubleclick.net", - "googlesyndication.com", - "googleadservices.com", - "googletagservices.com", - "google-analytics.com", - "2mdn.net", - "adservice.google.com", - "imasdk.googleapis.com", - "ads.google.com", - "pagead2.googlesyndication.com" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 2, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "adnxs.com", - "rubiconproject.com", - "pubmatic.com", - "openx.net", - "casalemedia.com", - "indexexchange.com", - "bidswitch.net", - "smartadserver.com", - "advertising.com", - "adform.net", - "yieldmanager.com", - "adsrvr.org", - "contextweb.com", - "lijit.com" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 3, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "spotxchange.com", - "springserve.com", - "teads.tv", - "triplelift.com", - "33across.com", - "sharethrough.com", - "sovrn.com", - "gumgum.com", - "rhythmone.com", - "undertone.com", - "yieldmo.com", - "sonobi.com", - "districtm.io", - "beeswax.com" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 4, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "taboola.com", - "outbrain.com", - "revcontent.com", - "mgid.com", - "zergnet.com", - "nativo.com", - "dianomi.com", - "adblade.com", - "content-ad.net", - "adthrive.com", - "mediavine.com" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 5, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "amazon-adsystem.com", - "media.net", - "criteo.com", - "criteo.net", - "adroll.com", - "tradedoubler.com", - "ezoic.com", - "monumetric.com" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 6, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "scorecardresearch.com", - "quantserve.com", - "bluekai.com", - "exelator.com", - "demdex.net", - "krxd.net", - "rlcdn.com", - "dotomi.com", - "mathtag.com", - "nexac.com", - "tapad.com", - "agkn.com", - "eyeota.net", - "addthis.com" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 7, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "hotjar.com", - "crazyegg.com", - "mouseflow.com", - "luckyorange.com", - "fullstory.com", - "heapanalytics.com", - "clarity.ms", - "inspectlet.com", - "logrocket.com" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 8, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "doubleverify.com", - "moatads.com", - "iasds01.com", - "serving-sys.com", - "moat.com", - "adsafeprotected.com" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 9, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "popads.net", - "popcash.net", - "propellerads.com", - "revenuehits.com", - "onclickads.net", - "clicksor.com", - "adf.ly", - "popmyads.com", - "clickadu.com", - "hilltopads.net", - "richpush.co", - "pushengage.com", - "pushwoosh.com" - ], - "resourceTypes": ["main_frame", "sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 10, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "infolinks.com", - "buysellads.com", - "carbonads.com", - "bidtellect.com", - "pixfuture.com", - "adkernel.com", - "brightcom.com", - "smaato.com", - "liveintent.com", - "kevel.com", - "adzerk.net" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 11, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "admob.com", - "adcolony.com", - "applovin.com", - "chartboost.com", - "vungle.com", - "fyber.com", - "ironsrc.com", - "startapp.com", - "mopub.com", - "mintegral.com", - "unityads.unity3d.com" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 12, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "innovid.com", - "freewheel.com", - "fwmrm.net", - "spotx.tv", - "connatix.com", - "vidoomy.com", - "primis.tech", - "ex.co" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 13, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "bat.bing.com", - "pixel.quantserve.com", - "pixel.adsafeprotected.com", - "ct.pinterest.com", - "analytics.twitter.com", - "ads.linkedin.com", - "snap.licdn.com", - "px.ads.linkedin.com", - "analytics.tiktok.com", - "ads-api.twitter.com" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 14, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "turn.com", - "bidtellect.com", - "connectad.io", - "conversantmedia.com", - "justpremium.com", - "adyoulike.com", - "seedtag.com", - "inskinmedia.com", - "aralego.com", - "marfeel.com", - "navegg.com", - "themoneytizer.com" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 15, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "onesignal.com", - "pushnami.com", - "subscribers.com", - "webpushnotifications.com", - "notix.io", - "pushcrew.com", - "gravitec.net" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 16, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "zedo.com", - "adtech.de", - "flashtalking.com", - "sizmek.com", - "eyereturn.com", - "adition.com", - "adspirit.de", - "intelliad.de", - "adscale.de", - "addefend.com" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "font", "stylesheet", "other"] - } - }, - { - "id": 17, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "newrelic.com", - "nr-data.net", - "bugsnag.com", - "sentry.io" - ], - "excludedInitiatorDomains": [ - "newrelic.com", - "bugsnag.com", - "sentry.io" - ], - "resourceTypes": ["script", "xmlhttprequest", "ping"] - } - }, - { - "id": 18, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "cookiebot.com", - "cookielaw.org", - "onetrust.com", - "trustarc.com", - "cookiepro.com", - "consent.cookiebot.com", - "usercentrics.eu", - "quantcast.com" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "stylesheet", "other"] - } - }, - { - "id": 19, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "bounceexchange.com", - "bouncex.com", - "optinmonster.com", - "sumo.com", - "privy.com", - "sleeknote.com", - "wisepops.com", - "optimonk.com", - "justuno.com", - "popupsmart.com" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "stylesheet", "other"] - } - }, - { - "id": 20, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "branch.io", - "app.link", - "adjust.com", - "appsflyer.com", - "kochava.com", - "singular.net", - "tenjin.io" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "other"] - } - }, - { - "id": 21, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "petametrics.com", - "eum-appdynamics.com", - "omtrdc.net", - "2o7.net", - "hitbox.com", - "statcounter.com", - "histats.com", - "webtrends.com", - "clicktale.net", - "contentsquare.net" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "media", "websocket", "other"] - } - }, - { - "id": 22, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "adlightning.com", - "geoedge.be", - "confiant.com", - "cleanad.io", - "themediagrid.com", - "adagio.io", - "prebid.org" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "other"] - } - }, - { - "id": 23, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "tinypass.com", - "piano.io", - "chargebee.com", - "poool.fr", - "pelcro.com" - ], - "resourceTypes": ["sub_frame", "script", "xmlhttprequest"] - } - }, - { - "id": 24, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "ampproject.org", - "cdn.ampproject.org", - "ampproject.net" - ], - "resourceTypes": ["script", "xmlhttprequest"] - } - }, - { - "id": 25, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "requestDomains": [ - "zemanta.com", - "advertising.yahoo.com", - "adtech.yahooinc.com", - "ads.yahoo.com" - ], - "resourceTypes": ["sub_frame", "script", "image", "object", "xmlhttprequest", "ping", "other"] - } - }, - { - "id": 26, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "urlFilter": "*://*/*prebid*", - "resourceTypes": ["script", "xmlhttprequest"] - } - }, - { - "id": 27, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "urlFilter": "*://*/*/adsbygoogle.js", - "resourceTypes": ["script"] - } - }, - { - "id": 28, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "urlFilter": "*://*/*/show_ads_impl*", - "resourceTypes": ["script"] - } - }, - { - "id": 29, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "urlFilter": "*pagead/js/*", - "resourceTypes": ["script"] - } - }, - { - "id": 30, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "urlFilter": "*/ads/ga-audiences*", - "resourceTypes": ["image", "xmlhttprequest", "ping"] - } - }, - - { - "id": 31, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "urlFilter": "*/gtag/js", - "resourceTypes": ["script"] - } - }, - { - "id": 32, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "urlFilter": "*/gtm.js", - "resourceTypes": ["script"] - } - }, - { - "id": 33, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "urlFilter": "*/g/collect", - "resourceTypes": ["image", "xmlhttprequest", "ping", "other"] - } - }, - { - "id": 34, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "urlFilter": "*/j/collect", - "resourceTypes": ["image", "xmlhttprequest", "ping", "other"] - } - }, - { - "id": 35, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "urlFilter": "*/r/collect", - "resourceTypes": ["image", "xmlhttprequest", "ping", "other"] - } - }, - { - "id": 36, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "urlFilter": "*/gtag/destination", - "resourceTypes": ["script", "xmlhttprequest"] - } - }, - { - "id": 37, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "urlFilter": "*/pagead/viewthroughconversion/*", - "resourceTypes": ["image", "xmlhttprequest", "ping", "script"] - } - }, - { - "id": 38, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "urlFilter": "*/pagead/landing*", - "resourceTypes": ["image", "xmlhttprequest", "ping", "script"] - } - }, - { - "id": 40, - "priority": 1, - "action": { "type": "block" }, - "condition": { - "urlFilter": "*/td?*&tid=G-*", - "resourceTypes": ["image", "xmlhttprequest", "ping", "other"] - } - } -] diff --git a/scripts/build.mjs b/scripts/build.mjs new file mode 100644 index 0000000..28c8a44 --- /dev/null +++ b/scripts/build.mjs @@ -0,0 +1,308 @@ +// Builds dist/chrome and dist/firefox from src/ and the filter lists. +// +// node scripts/build.mjs full build, selectors validated in headless Chromium +// node scripts/build.mjs --no-validate skip browser validation (faster, CI without a browser) +import { readFile, writeFile, mkdir, rm, cp } from 'node:fs/promises'; +import path from 'node:path'; +import { preprocess } from './lib/preprocess.mjs'; +import { parseLine, badfilterKey } from './lib/parse.mjs'; +import { networkToRule, mergeRules, assignIds, ALLOW_ID_BASE } from './lib/network.mjs'; +import { CosmeticCompiler, FLAG } from './lib/cosmetic.mjs'; +import { ScriptletCompiler } from './lib/scriptlets.mjs'; +import { RESOURCES } from './lib/resources.mjs'; +import { PopupCompiler, isPopupFilter, withoutPopup } from './lib/popups.mjs'; +import { validateSelectors, validateRegexes } from './lib/validate-selectors.mjs'; + +const root = path.resolve(import.meta.dirname, '..'); +const args = new Set(process.argv.slice(2)); +const VALIDATE = !args.has('--no-validate'); + +// DNR allows 1000 regex rules across all enabled rulesets; keep headroom. +const REGEX_CAP = { core: 50, ads: 550, privacy: 250, annoyances: 50, security: 50 }; + +const pkg = JSON.parse(await readFile(path.join(root, 'package.json'), 'utf8')); +const config = JSON.parse(await readFile(path.join(root, 'filters/lists.json'), 'utf8')); +let upstreamMeta = {}; +try { upstreamMeta = JSON.parse(await readFile(path.join(root, 'filters/upstream/meta.json'), 'utf8')); } catch { /* none yet */ } +const categories = Object.keys(config.categories); +const t0 = Date.now(); + +// ---- 1. read + preprocess + parse ------------------------------------------------ +const parsed = []; +const listStats = {}; +for (const list of config.lists) { + const text = await readFile(path.join(root, list.file), 'utf8'); + const { lines, includes } = preprocess(text); + let n = 0; + for (const line of lines) { + const p = parseLine(line); + if (!p) continue; + parsed.push({ list, p }); + n++; + } + listStats[list.id] = { filters: n, includesSkipped: includes }; +} + +// ---- 2. $badfilter cancels matching filters in every list ------------------------- +const badfilters = new Set(); +for (const { p } of parsed) { + if (p.type === 'network' && p.options.some((o) => o.name === 'badfilter')) badfilters.add(badfilterKey(p)); +} + +// ---- 3. route filters ---------------------------------------------------------------- +const rulesByCat = Object.fromEntries(categories.map((c) => [c, []])); +const cosmetic = new CosmeticCompiler(categories); +const scriptlets = new ScriptletCompiler(categories); +const popups = Object.fromEntries(categories.map((c) => [c, new PopupCompiler()])); +const securityUrls = {}; // host -> Set(path prefix) +const netStats = {}; +const bump = (o, k) => { o[k] = (o[k] || 0) + 1; }; + +for (const { list, p } of parsed) { + const cat = list.category; + if (p.type === 'skip') { bump(netStats, `skip:${p.reason}`); continue; } + if (p.type === 'cosmetic') { cosmetic.add(cat, p); continue; } + if (p.type === 'scriptlet') { scriptlets.add(cat, p); continue; } + if (badfilters.has(badfilterKey(p))) { bump(netStats, 'badfiltered'); continue; } + let net = p; + if (isPopupFilter(net)) { + // DNR cannot block popups; the service worker closes them (src/background/popups.js). + popups[cat].add(net); + net = withoutPopup(net); // `$script,popup` also blocks the script + if (!net) { bump(netStats, 'popup'); continue; } + } + const r = networkToRule(net, RESOURCES); + if (r.skip) { bump(netStats, `skip:${r.skip}`); continue; } + if (r.flags) { + for (const h of r.flags.hosts) { + if (r.flags.ghide) cosmetic.addFlag(h, FLAG.ghide); + if (r.flags.ehide) cosmetic.addFlag(h, FLAG.ehide); + if (r.flags.shide) cosmetic.addFlag(h, FLAG.shide); + } + } + if (r.rule && cat === 'security') { + const c = r.rule.condition; + // Phishing and malware lists name ~35k individual page URLs. As DNR rules they would + // blow Chrome's 30k static-rule guarantee, and they only matter for pages you open, so + // the service worker checks top-level navigations against them instead. + // Keep a trailing ^ so the worker applies separator semantics (src/shared/url-match.js). + const m = /^\|\|([a-z0-9._-]+)(\/[^*^|]*)(\^?)$/i.exec(c.urlFilter || ''); + if (r.rule.action.type === 'block' && m && (!c.resourceTypes || c.resourceTypes.includes('main_frame'))) { + const host = m[1].toLowerCase(); + (securityUrls[host] ||= new Set()).add(m[2] + m[3]); + bump(netStats, 'security-url'); + continue; + } + // Security beats list exceptions and the user's pause (1000): pausing is about ads. + r.rule.priority = r.rule.action.type === 'allow' || r.rule.action.type === 'allowAllRequests' ? 2001 : 2000; + } + if (r.rule) { rulesByCat[cat].push(r.rule); bump(netStats, 'rule'); } +} + +// ---- 4. network rulesets ---------------------------------------------------------------- +// One regex Chromium rejects fails the whole extension at load, so every regexFilter is +// checked with declarativeNetRequest.isRegexSupported. Without a browser, fall back to a +// conservative heuristic: no counted repetition above 100. +const regexKey = (r) => `${r.condition.regexFilter}${Boolean(r.condition.isUrlFilterCaseSensitive)}`; +let badRegex; +if (VALIDATE) { + const items = new Map(); + for (const cat of categories) for (const r of rulesByCat[cat]) { + if (r.condition.regexFilter) items.set(regexKey(r), { regex: r.condition.regexFilter, isCaseSensitive: Boolean(r.condition.isUrlFilterCaseSensitive) }); + } + badRegex = await validateRegexes([...items.values()]); +} else { + badRegex = new Set(); + for (const cat of categories) for (const r of rulesByCat[cat]) { + const re = r.condition.regexFilter; + if (re && /\{\d*,?(\d{3,}|[2-9]\d{2})\}|\{\d{3,}/.test(re)) badRegex.add(regexKey(r)); + } +} +netStats['regex-rejected'] = 0; +for (const cat of categories) { + rulesByCat[cat] = rulesByCat[cat].filter((r) => { + if (!r.condition.regexFilter || !badRegex.has(regexKey(r))) return true; + netStats['regex-rejected']++; + return false; + }); +} + +const out = {}; // relative path -> string | object +const rulesetSummary = {}; +for (const cat of categories) { + let rules = mergeRules(rulesByCat[cat]); + const regex = rules.filter((r) => r.condition.regexFilter); + if (regex.length > REGEX_CAP[cat]) { + const drop = new Set(regex.slice(REGEX_CAP[cat])); + rules = rules.filter((r) => !drop.has(r)); + netStats[`regex-capped:${cat}`] = drop.size; + } + rules = assignIds(rules); + out[`rules/${cat}.json`] = rules; + rulesetSummary[cat] = { + rules: rules.length, + block: rules.filter((r) => r.id < ALLOW_ID_BASE).length, + allow: rules.filter((r) => r.id >= ALLOW_ID_BASE).length, + regex: rules.filter((r) => r.condition.regexFilter).length, + domains: rules.reduce((n, r) => n + (r.condition.requestDomains?.length || 0), 0), + }; +} + +// ---- 5. selector validation ---------------------------------------------------------------- +if (VALIDATE) { + const all = [...cosmetic.allSelectors()]; + const invalid = await validateSelectors(all); + cosmetic.applyValidation((s) => !invalid.has(s)); +} else { + cosmetic.stats['invalid-selector'] = 'not validated'; +} + +// ---- 6. cosmetic + scriptlet outputs ---------------------------------------------------------- +const cos = cosmetic.emit(); +Object.assign(out, cos.files); + +const unwallCore = await readFile(path.join(root, 'src/shared/unwall-core.js'), 'utf8'); +const library = (await readFile(path.join(root, 'src/scriptlets/library.js'), 'utf8')) + .replace('/*@UNWALL_CORE@*/', unwallCore.replace(/^\/\* eslint.*$/m, '')); +const sl = scriptlets.emit(library); +Object.assign(out, sl.files); + +const hostflags = cos.files['cosmetic/hostflags.json']; +const hostsWith = (mask) => Object.entries(hostflags).filter(([, f]) => f & mask).map(([h]) => h).sort(); +out['registration.json'] = { + // Static complex stylesheet: not on sites with a generic exception we cannot subtract. + complexCssExcludeHosts: hostsWith(FLAG.ghide | FLAG.ehide | FLAG.complexException), + // Token reporter: not on sites that turn generic (or all) cosmetics off. + tokenExcludeHosts: hostsWith(FLAG.ghide | FLAG.ehide), + scriptlets: sl.registrations, +}; + +// Security lookup data for the service worker: every blocked host (to colour the icon red +// when a page touches one, and to show the warning page) and the page-URL list above. +if (rulesByCat.security) { + // Only rules that block a WHOLE host count. A rule like `/c/*?s1=$doc,to=com` becomes + // requestDomains:["com"] plus a urlFilter; copying its requestDomains here flagged every + // .com site as malware (fixed 2026-09-28, pinned by silentblock-security.txt). + const WHOLE_HOST_KEYS = new Set(['requestDomains', 'resourceTypes']); + const hosts = new Set(); + for (const r of rulesByCat.security) { + const c = r.condition; + if (r.action.type !== 'block' || !c.requestDomains) continue; + if (!Object.keys(c).every((k) => WHOLE_HOST_KEYS.has(k))) continue; + if (c.resourceTypes && !c.resourceTypes.includes('main_frame')) continue; // e.g. $script only: not a dangerous page + for (const h of c.requestDomains) if (h.includes('.')) hosts.add(h); + } + if ([...hosts].some((h) => !h.includes('.'))) throw new Error('security/hosts.json would contain a bare TLD'); + // Tripwire: one bad upstream entry for a major site or a shared platform would put a + // malware warning on thousands of legitimate sites. Fail the build instead of shipping it. + const NEVER_WHOLE_HOST = [ + 'google.com', 'youtube.com', 'facebook.com', 'instagram.com', 'amazon.com', 'microsoft.com', 'live.com', + 'office.com', 'apple.com', 'icloud.com', 'github.com', 'linkedin.com', 'wikipedia.org', 'reddit.com', + 'cloudflare.com', 'workers.dev', 'pages.dev', 'github.io', 'gitlab.io', 'netlify.app', 'vercel.app', + 'herokuapp.com', 'firebaseapp.com', 'web.app', 'appspot.com', 'blogspot.com', 'wordpress.com', 'weebly.com', + 'wixsite.com', 'squarespace.com', 'godaddysites.com', 'googleapis.com', 'amazonaws.com', 'azurewebsites.net', + 'windows.net', 'dropbox.com', 'sharepoint.com', 'bit.ly', 't.co', 'tinyurl.com', 'linktr.ee', 'myshopify.com', + 'clickclickmedia.com.au', 'paladine.com.au', + ]; + for (const site of NEVER_WHOLE_HOST) { + for (let h = site; h; h = h.includes('.') ? h.slice(h.indexOf('.') + 1) : '') { + if (hosts.has(h)) throw new Error(`security/hosts.json would flag all of ${site} (entry "${h}"): check the upstream lists`); + } + } + for (const [h, set] of Object.entries(securityUrls)) { + for (const p of set) if (p === '/' || p === '/^') throw new Error(`security page-URL entry "${h}${p}" would flag the whole site`); + } + out['security/hosts.json'] = [...hosts].sort(); + out['security/urls.json'] = Object.fromEntries(Object.entries(securityUrls).sort().map(([h, set]) => [h, [...set].sort()])); + rulesetSummary.security.pageUrls = Object.values(securityUrls).reduce((n, s) => n + s.size, 0); +} + +const popupSummary = {}; +for (const cat of categories) { + const data = popups[cat].emit(); + out[`popups/${cat}.json`] = data; + popupSummary[cat] = { hosts: data.hosts.length + data.hosts3p.length, rules: data.rules.length, allow: data.allow.length }; +} + +out['content/unwall.js'] = `// Built from src/shared/unwall-core.js. Injected on demand by the popup and on +// per-site "always kill nag walls" hosts. Wrapped so a second injection is harmless. +(() => { +${unwallCore} +unwallWatch(15000, () => chrome.runtime.sendMessage({ type: 'wall' }).catch(() => {})); +})(); +`; + +// ---- 7. meta -------------------------------------------------------------------------------- +const meta = { + version: pkg.version, + builtAt: new Date().toISOString(), + categories: config.categories, + lists: config.lists.map((l) => ({ + id: l.id, title: l.title, category: l.category, url: l.url || null, license: l.license || null, + snapshot: upstreamMeta[l.id]?.fetchedAt || null, version: upstreamMeta[l.id]?.version || null, + filters: listStats[l.id].filters, + })), + rulesets: rulesetSummary, + cosmetic: cos.summary, + scriptlets: sl.summary, + popups: popupSummary, + allowIdBase: ALLOW_ID_BASE, +}; +out['meta.json'] = meta; + +// ---- 8. write dist/ ------------------------------------------------------------------- +const manifestBase = JSON.parse(await readFile(path.join(root, 'src/manifest.json'), 'utf8')); + +function manifestFor(target) { + const m = structuredClone(manifestBase); + m.version = pkg.version; + m.declarative_net_request = { + rule_resources: categories.map((cat) => ({ + id: cat, + enabled: config.categories[cat].alwaysOn || config.categories[cat].default === true, + path: `rules/${cat}.json`, + })), + }; + if (target === 'firefox') { + m.background = { scripts: ['background/main.js'], type: 'module' }; + m.browser_specific_settings = { gecko: { id: 'silentblock@clickclickmedia.com.au', strict_min_version: '128.0' } }; + delete m.minimum_chrome_version; + } + return m; +} + +const report = []; +for (const target of ['chrome', 'firefox']) { + const dist = path.join(root, 'dist', target); + await rm(dist, { recursive: true, force: true }); + await mkdir(dist, { recursive: true }); + for (const dir of ['background', 'popup', 'options', 'warning', 'content', 'shared', 'icons', 'resources']) { + await cp(path.join(root, 'src', dir), path.join(dist, dir), { recursive: true }); + } + await rm(path.join(dist, 'shared/unwall-core.js'), { force: true }); + for (const [rel, data] of Object.entries(out)) { + const file = path.join(dist, rel); + await mkdir(path.dirname(file), { recursive: true }); + await writeFile(file, typeof data === 'string' ? data : JSON.stringify(data)); + } + await writeFile(path.join(dist, 'manifest.json'), JSON.stringify(manifestFor(target), null, 2)); + report.push(target); +} + +// ---- 9. report ------------------------------------------------------------------------------------ +const totalRules = Object.values(rulesetSummary).reduce((n, s) => n + s.rules, 0); +console.log(`SilentBlock ${pkg.version} built for ${report.join(' + ')} in ${((Date.now() - t0) / 1000).toFixed(1)}s`); +console.table(rulesetSummary); +console.log(`Static rules: ${totalRules} (Chrome guarantees 30000 per extension)`); +console.table(cos.summary); +console.table(sl.summary); +console.table(popupSummary); +const top = (o) => Object.entries(o).sort((a, b) => b[1] - a[1]).slice(0, 12).map(([k, v]) => `${k}=${v}`).join(' '); +console.log(`network: ${top(netStats)}`); +console.log(`cosmetic: ${top(cosmetic.stats)}`); +console.log(`scriptlets: ${top(scriptlets.stats)}`); +await writeFile(path.join(root, 'dist/build-report.json'), JSON.stringify({ meta, netStats, cosmeticStats: cosmetic.stats, scriptletStats: scriptlets.stats }, null, 2)); +if (totalRules > 30000) { + console.error(`\nERROR: ${totalRules} static rules exceeds the 30000 guaranteed minimum.`); + process.exitCode = 1; +} diff --git a/scripts/bump.mjs b/scripts/bump.mjs new file mode 100644 index 0000000..a60d06a --- /dev/null +++ b/scripts/bump.mjs @@ -0,0 +1,43 @@ +// Bumps the version in package.json (the build writes it into the manifest) and turns the +// CHANGELOG "Unreleased" section into a dated release heading. +// node scripts/bump.mjs patch | minor | major | 2.3.4 +// Git is left to you: stage the files by name, never `git add -A`. +import { readFile, writeFile } from 'node:fs/promises'; +import path from 'node:path'; + +const root = path.resolve(import.meta.dirname, '..'); +const arg = process.argv[2] || 'patch'; +const pkgPath = path.join(root, 'package.json'); +const pkg = JSON.parse(await readFile(pkgPath, 'utf8')); +const [maj, min, pat] = pkg.version.split('.').map(Number); + +let next; +if (/^\d+\.\d+\.\d+$/.test(arg)) next = arg; +else if (arg === 'major') next = `${maj + 1}.0.0`; +else if (arg === 'minor') next = `${maj}.${min + 1}.0`; +else if (arg === 'patch') next = `${maj}.${min}.${pat + 1}`; +else throw new Error(`Usage: bump.mjs patch|minor|major|x.y.z (got "${arg}")`); + +pkg.version = next; +await writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\n'); + +const lockPath = path.join(root, 'package-lock.json'); +try { + const lock = JSON.parse(await readFile(lockPath, 'utf8')); + lock.version = next; + if (lock.packages?.['']) lock.packages[''].version = next; + await writeFile(lockPath, JSON.stringify(lock, null, 2) + '\n'); +} catch { /* no lockfile */ } + +const clPath = path.join(root, 'CHANGELOG.md'); +const today = new Intl.DateTimeFormat('en-CA', { timeZone: 'Australia/Sydney' }).format(new Date()); +let cl = await readFile(clPath, 'utf8'); +if (cl.includes('## [Unreleased]')) { + cl = cl.replace('## [Unreleased]', `## [Unreleased]\n\n## [${next}] - ${today}`); + await writeFile(clPath, cl); +} else { + console.warn('CHANGELOG.md has no "## [Unreleased]" section; add the release notes by hand.'); +} + +console.log(`${pkg.name} ${[maj, min, pat].join('.')} -> ${next}`); +console.log('Next: npm run check && npm run package, then commit package.json package-lock.json CHANGELOG.md and tag v' + next); diff --git a/scripts/icons.mjs b/scripts/icons.mjs new file mode 100644 index 0000000..6ca4fc7 --- /dev/null +++ b/scripts/icons.mjs @@ -0,0 +1,62 @@ +// Renders the toolbar icons: one shield, five states. +// node scripts/icons.mjs +// Writes assets/icons/.svg (sources) and src/icons/-.png (shipped). +// +// The shield is "Tidewater": faceted, with the hand cut clean through so the toolbar itself +// makes the gesture. That only reads if the shield colour is mid-tone (a white finger on a +// light toolbar, a dark one on a dark toolbar), so keep new colours in that band. +import { writeFile, mkdir } from 'node:fs/promises'; +import path from 'node:path'; +import { chromium } from '@playwright/test'; + +const root = path.resolve(import.meta.dirname, '..'); + +export const STATES = { + idle: { body: '#4A6FA5', facet: '#3A5886', meaning: 'Idle, or nothing on this page needed blocking (slate blue)' }, + protected: { body: '#15986A', facet: '#107A55', meaning: 'Ads or trackers blocked (jade)' }, + caution: { body: '#E39B1F', facet: '#BF7F14', meaning: 'Pushy site: pop-under, tab-under or nag wall dealt with (amber)' }, + danger: { body: '#A4243B', facet: '#831C2F', meaning: 'Known malware, phishing or scam host (garnet)' }, + paused: { body: '#8A919A', facet: '#727982', meaning: 'Paused on this site, or protection off (grey)' }, +}; +const SIZES = [16, 32, 48, 128]; + +// Hand in local coordinates, middle finger centred on x=32. The thumb grows out of the +// palm's lower-left along the index finger so it reads as one fist at 16px. +const HAND = [ + '', + '', + '', + '', + '', + '', + '', +].join(''); +const SHIELD = 'M64 10 L110 22 L104 80 L64 118 L24 80 L18 22 Z'; + +export function shieldSvg({ body, facet }, title) { + return `${title}` + + `` + + `` + + `` + + `${HAND}` + + `` + + `\n`; +} + +if (import.meta.url === `file:///${process.argv[1].replace(/\\/g, '/')}` || process.argv[1].endsWith('icons.mjs')) { + await mkdir(path.join(root, 'assets/icons'), { recursive: true }); + await mkdir(path.join(root, 'src/icons'), { recursive: true }); + const browser = await chromium.launch(); + const page = await browser.newPage(); + for (const [state, colours] of Object.entries(STATES)) { + const svg = shieldSvg(colours, `SilentBlock: ${colours.meaning}`); + await writeFile(path.join(root, `assets/icons/${state}.svg`), svg); + for (const size of SIZES) { + await page.setViewportSize({ width: size, height: size }); + await page.setContent(``); + await page.locator('img').screenshot({ path: path.join(root, `src/icons/${state}-${size}.png`), omitBackground: true }); + } + console.log(`${state.padEnd(10)} ${colours.body} ${colours.meaning}`); + } + await browser.close(); +} diff --git a/scripts/lib/cosmetic.mjs b/scripts/lib/cosmetic.mjs new file mode 100644 index 0000000..32c7faf --- /dev/null +++ b/scripts/lib/cosmetic.mjs @@ -0,0 +1,195 @@ +// Turns parsed cosmetic filters into the data files the runtime injects. +// +// Generic filters split two ways: +// token `.cls` / `#id` 27k+ of these. Never shipped as a stylesheet: the content script +// reports the class/id tokens it sees and the service worker injects +// only the matching ones (this is what keeps memory flat per frame). +// complex everything else ~1k selectors, shipped as a small static stylesheet. +// Specific filters (`site##sel`) are sharded by hostname and injected per frame on commit. + +import { shardOf } from '../../src/shared/hostnames.js'; + +// uBO/ABP procedural operators that need a JS engine to evaluate. Filters using them are +// skipped. `:-abp-has()` is rewritten to native `:has()` before this check. +const PROCEDURAL_RE = /:(?:has-text|upward|xpath|matches-css(?:-before|-after)?|min-text-length|watch-attr|matches-path|matches-attr|matches-prop|matches-media|others|remove-attr|remove-class|-abp-contains|-abp-properties|contains|if|if-not|nth-ancestor|properties|shadow|style|remove)\(/; + +export const TOKEN_RE = /^[#.][A-Za-z_][\w-]*$/; + +export const FLAG = { ghide: 1, ehide: 2, shide: 4, complexException: 8 }; + +function isSafeSelector(sel) { + if (sel.length > 1000) return false; + // Anything that could escape the rule we wrap it in. + if (/[{}]|\/\*|\*\/|\\$|[\x00-\x1f]/.test(sel)) return false; + return true; +} + +// Only plain declarations; nothing that loads a resource or escapes the block. +function sanitiseDeclarations(decl) { + if (/[{}\\]|\/\*|url\(|image-set\(|expression\(|@import|javascript:/i.test(decl)) return null; + const parts = decl.split(';').map((d) => d.trim()).filter(Boolean); + if (!parts.length) return null; + const out = []; + for (const p of parts) { + if (!/^-?[a-z-]+\s*:\s*[^:]+$/i.test(p) && !/^-?[a-z-]+\s*:\s*.+$/i.test(p)) return null; + out.push(/!important\s*$/i.test(p) ? p : `${p} !important`); + } + return out.join('; '); +} + +/** + * @returns {{ kind: 'hide'|'style', selector: string, decl?: string } | { skip: string }} + */ +export function processSelector(raw, procedural) { + let sel = raw.trim(); + let kind = 'hide'; + let decl; + if (sel.endsWith(':remove()')) { + sel = sel.slice(0, -':remove()'.length); + } else { + const m = /:style\((.*)\)$/.exec(sel); + if (m) { + decl = sanitiseDeclarations(m[1]); + if (!decl) return { skip: 'style-unsafe' }; + sel = sel.slice(0, m.index); + kind = 'style'; + } + } + sel = sel.replace(/:-abp-has\(/g, ':has('); + if (PROCEDURAL_RE.test(sel)) return { skip: 'procedural' }; + if (procedural && /:-abp-/.test(sel)) return { skip: 'procedural' }; + if (!sel || !isSafeSelector(sel)) return { skip: 'selector-unsafe' }; + return kind === 'style' ? { kind, selector: sel, decl } : { kind, selector: sel }; +} + +export class CosmeticCompiler { + constructor(categories) { + this.categories = categories; + this.generic = Object.fromEntries(categories.map((c) => [c, new Set()])); + // specific[cat]: Map(host -> { h: Set, s: Map(sel -> decl) }) + this.specific = Object.fromEntries(categories.map((c) => [c, new Map()])); + this.exceptions = new Map(); // host -> Set(selector) (site#@#sel, ~site##sel) + this.globalExceptions = new Set(); // #@#sel + this.hostFlags = new Map(); // host -> bitmask + this.stats = {}; + } + + count(reason) { this.stats[reason] = (this.stats[reason] || 0) + 1; } + + addFlag(host, bit) { this.hostFlags.set(host, (this.hostFlags.get(host) || 0) | bit); } + + addException(host, sel) { + let s = this.exceptions.get(host); + if (!s) this.exceptions.set(host, (s = new Set())); + s.add(sel); + } + + add(cat, f) { + const p = processSelector(f.selector, f.procedural); + if (p.skip) return this.count(p.skip); + + if (f.exception) { + if (!f.include.length) this.globalExceptions.add(p.selector); + for (const h of f.include) this.addException(h, p.selector); + return this.count('exception'); + } + + // `~a.com##.ad`: generic everywhere except a.com. + for (const h of f.exclude) this.addException(h, p.selector); + + if (!f.include.length) { + if (p.kind === 'style') return this.count('generic-style-skipped'); + this.generic[cat].add(p.selector); + return this.count('generic'); + } + const map = this.specific[cat]; + for (const h of f.include) { + let e = map.get(h); + if (!e) map.set(h, (e = { h: new Set(), s: new Map() })); + if (p.kind === 'style') e.s.set(p.selector, p.decl); + else e.h.add(p.selector); + } + this.count('specific'); + } + + // Validation drops selectors Chromium rejects. It runs after all lists are added. + applyValidation(isValid) { + let dropped = 0; + for (const cat of this.categories) { + for (const sel of this.generic[cat]) if (!isValid(sel)) { this.generic[cat].delete(sel); dropped++; } + for (const e of this.specific[cat].values()) { + for (const sel of e.h) if (!isValid(sel)) { e.h.delete(sel); dropped++; } + for (const sel of e.s.keys()) if (!isValid(sel)) { e.s.delete(sel); dropped++; } + } + } + this.stats['invalid-selector'] = dropped; + } + + allSelectors() { + const all = new Set(); + for (const cat of this.categories) { + for (const s of this.generic[cat]) all.add(s); + for (const e of this.specific[cat].values()) { + for (const s of e.h) all.add(s); + for (const s of e.s.keys()) all.add(s); + } + } + return all; + } + + /** Returns a map of output file path -> contents (string or JSON-able). */ + emit() { + const files = {}; + const complexAll = new Set(); + const summary = {}; + + for (const cat of this.categories) { + const tokens = []; + const complex = []; + for (const sel of this.generic[cat]) { + if (this.globalExceptions.has(sel)) continue; + (TOKEN_RE.test(sel) ? tokens : complex).push(sel); + } + tokens.sort(); + complex.sort(); + complex.forEach((s) => complexAll.add(s)); + files[`cosmetic/tokens-${cat}.json`] = tokens; + files[`cosmetic/complex-${cat}.json`] = complex; + files[`cosmetic/generic-${cat}.css`] = cssHide(complex); + + const shards = Array.from({ length: 32 }, () => ({})); + let hosts = 0; + for (const [host, e] of this.specific[cat]) { + const h = [...e.h].filter((s) => !this.globalExceptions.has(s)).sort(); + const s = [...e.s].filter(([sel]) => !this.globalExceptions.has(sel)).sort(); + if (!h.length && !s.length) continue; + const entry = {}; + if (h.length) entry.h = h; + if (s.length) entry.s = s; + shards[shardOf(host)][host] = entry; + hosts++; + } + shards.forEach((data, i) => { files[`cosmetic/specific-${cat}-${String(i).padStart(2, '0')}.json`] = data; }); + summary[cat] = { tokens: tokens.length, complex: complex.length, specificHosts: hosts }; + } + + // Hosts with an exception for a complex generic selector cannot take the shared static + // stylesheet; the service worker injects "complex minus exceptions" for them instead. + const exceptions = {}; + for (const [host, sels] of this.exceptions) { + exceptions[host] = [...sels].sort(); + if ([...sels].some((s) => complexAll.has(s))) this.addFlag(host, FLAG.complexException); + } + files['cosmetic/exceptions.json'] = exceptions; + files['cosmetic/hostflags.json'] = Object.fromEntries([...this.hostFlags].sort(([a], [b]) => (a < b ? -1 : 1))); + return { files, summary }; + } +} + +export function cssHide(selectors, chunk = 50) { + const out = []; + for (let i = 0; i < selectors.length; i += chunk) { + out.push(`${selectors.slice(i, i + chunk).join(',\n')}\n{display:none!important}`); + } + return out.join('\n'); +} diff --git a/scripts/lib/network.mjs b/scripts/lib/network.mjs new file mode 100644 index 0000000..d54e654 --- /dev/null +++ b/scripts/lib/network.mjs @@ -0,0 +1,298 @@ +// Converts parsed network filters into declarativeNetRequest rules. +// +// Priority ladder (higher wins; at equal priority DNR prefers allow > block > redirect): +// 10 block +// 11 redirect beats a plain block of the same URL, loses to an exception +// 20 allow / allowAllRequests from list exceptions (@@) +// 30 $important block beats list exceptions, like uBO +// 31 $important redirect +// 1000 user allowlist (dynamic rule, see src/background/apply.js) +import { isValidHostname } from '../../src/shared/hostnames.js'; +import { parseDomainList } from './parse.mjs'; + +export const PRIORITY = { block: 10, redirect: 11, allow: 20, important: 30, importantRedirect: 31 }; + +// Rule ids at or above this are allow rules. The popup counter uses it to count only blocks. +export const ALLOW_ID_BASE = 1_000_000; + +const TYPE_MAP = { + script: ['script'], + image: ['image'], + stylesheet: ['stylesheet'], + css: ['stylesheet'], + object: ['object'], + 'object-subrequest': ['object'], + xmlhttprequest: ['xmlhttprequest'], + xhr: ['xmlhttprequest'], + subdocument: ['sub_frame'], + frame: ['sub_frame'], + ping: ['ping'], + beacon: ['ping'], + websocket: ['websocket'], + font: ['font'], + media: ['media'], + other: ['other'], + document: ['main_frame'], + doc: ['main_frame'], +}; +const ALL_TYPES = ['main_frame', 'sub_frame', 'stylesheet', 'script', 'image', 'font', 'object', 'xmlhttprequest', 'ping', 'media', 'websocket', 'other']; + +const COSMETIC_FLAG_OPTIONS = { + generichide: 'ghide', ghide: 'ghide', + elemhide: 'ehide', ehide: 'ehide', + specifichide: 'shide', shide: 'shide', +}; + +// Options that change nothing we can express and can be ignored safely. +const IGNORED_OPTIONS = new Set(['collapse', 'reason', 'empty', 'mp4']); + +// Options whose semantics DNR cannot express. A filter using them is dropped rather than +// approximated, because an approximation blocks things the list author never meant to. +const UNSUPPORTED_OPTIONS = new Set([ + 'csp', 'permissions', 'removeparam', 'replace', 'urlskip', 'uritransform', 'urltransform', + 'header', 'ipaddress', 'cname', 'rewrite', 'inline-script', 'inline-font', 'sitekey', 'webrtc', + 'genericblock', 'redirect-rule', 'popup', 'popunder', +]); + +export const METHODS = new Set(['connect', 'delete', 'get', 'head', 'options', 'patch', 'post', 'put']); + +// `||host^` is exactly "this host and its subdomains", which is what requestDomains means. +// `||host` without `^` also matches `hostile.com`, so it must stay a urlFilter. The loose +// form is only used to find the page host of cosmetic exceptions (`@@||site$ghide`). +function hostFromPattern(pattern, loose = false) { + const m = (loose ? /^\|\|([a-z0-9._-]+)\^?\|?$/i : /^\|\|([a-z0-9._-]+)\^\|?$/i).exec(pattern); + return m && isValidHostname(m[1].toLowerCase()) ? m[1].toLowerCase() : null; +} + +// A regex that is really a literal ("/banner/ads/" or "/\/ads\//") becomes a cheap urlFilter. +function literalFromRegex(body) { + if (!/^(?:[\w\-=&%]|\\[\/.?\-])+$/.test(body)) return null; + return body.replace(/\\(.)/g, '$1'); +} + +// RE2 (used by DNR) has no lookaround or backreferences. +function isRe2Compatible(body) { + if (body.length > 400) return false; + if (/\(\?[=!<]/.test(body)) return false; + if (/\\[1-9]/.test(body)) return false; + try { new RegExp(body); } catch { return false; } + return true; +} + +/** + * @returns {{ rule?: object, flags?: object, skip?: string }} + * rule - DNR rule without id + * flags - cosmetic exception flags ({ hosts: [...], ghide, ehide, shide }) + * skip - reason the filter was dropped + */ +export function networkToRule(net, resources) { + const condition = {}; + let types = null; // positive resource types + const negTypes = []; // excluded resource types + let important = false; + let redirect = null; + let allowDocument = false; + const cosmeticFlags = {}; + + for (const opt of net.options) { + const { name, value, negated } = opt; + if (TYPE_MAP[name]) { + if (name === 'document' || name === 'doc') { + if (net.allow && !negated) { allowDocument = true; continue; } + } + if (negated) negTypes.push(...TYPE_MAP[name]); + else (types ||= []).push(...TYPE_MAP[name]); + continue; + } + if (COSMETIC_FLAG_OPTIONS[name]) { + if (!net.allow) return { skip: 'cosmetic-flag-on-block' }; + cosmeticFlags[COSMETIC_FLAG_OPTIONS[name]] = true; + continue; + } + switch (name) { + case 'all': + (types ||= []).push(...ALL_TYPES); + continue; + case 'third-party': case '3p': case 'strict3p': + condition.domainType = negated ? 'firstParty' : 'thirdParty'; + continue; + case 'first-party': case '1p': case 'strict1p': + condition.domainType = negated ? 'thirdParty' : 'firstParty'; + continue; + case 'domain': case 'from': { + const d = parseDomainList(value || '', '|'); + if (d.hadInclude && d.include.length === 0) return { skip: 'domain-entity-only' }; + if (d.include.length) condition.initiatorDomains = d.include; + if (d.exclude.length) condition.excludedInitiatorDomains = d.exclude; + continue; + } + case 'to': { + const d = parseDomainList(value || '', '|'); + if (d.hadInclude && d.include.length === 0) return { skip: 'to-entity-only' }; + if (d.include.length) condition.requestDomains = d.include; + if (d.exclude.length) condition.excludedRequestDomains = d.exclude; + continue; + } + case 'denyallow': { + const d = parseDomainList(value || '', '|'); + if (d.include.length) condition.excludedRequestDomains = [...(condition.excludedRequestDomains || []), ...d.include]; + continue; + } + case 'method': { + const inc = []; const exc = []; + for (let m of (value || '').toLowerCase().split('|')) { + const n = m.startsWith('~'); + if (n) m = m.slice(1); + if (!METHODS.has(m)) return { skip: 'method-unknown' }; + (n ? exc : inc).push(m); + } + if (inc.length) condition.requestMethods = inc; + if (exc.length) condition.excludedRequestMethods = exc; + continue; + } + case 'match-case': + condition.isUrlFilterCaseSensitive = true; + continue; + case 'important': + if (!net.allow) important = true; + continue; + case 'redirect': { + const resName = (value || '').split(':')[0]; + redirect = resources[resName] || null; // unknown resource: uBO blocks, so do we + if (!redirect && !resName) return { skip: 'redirect-empty' }; + continue; + } + case 'badfilter': + return { skip: 'badfilter' }; + default: + if (IGNORED_OPTIONS.has(name)) continue; + if (UNSUPPORTED_OPTIONS.has(name)) return { skip: `option-${name}` }; + return { skip: 'option-unknown' }; + } + } + + // A `$document` exception switches off element hiding too (ABP semantics). + if (allowDocument) cosmeticFlags.ehide = true; + let flags = null; + if (Object.keys(cosmeticFlags).length) { + const hosts = []; + const h = hostFromPattern(net.pattern, true); + if (h) hosts.push(h); + if (condition.initiatorDomains) hosts.push(...condition.initiatorDomains); + if (hosts.length) flags = { hosts, ...cosmeticFlags }; + // Pure cosmetic exception (@@||site^$ghide): not a network rule at all. + if (!allowDocument && !types) return flags ? { flags } : { skip: 'cosmetic-flag-no-host' }; + } + + // URL pattern + let pattern = net.pattern; + if (net.isRegex) { + const body = pattern.slice(1, -1); + const lit = literalFromRegex(body); + if (lit !== null) condition.urlFilter = lit; + else if (isRe2Compatible(body)) condition.regexFilter = body; + else return { skip: 'regex-unsupported' }; + } else { + if (!/^[\x20-\x7e]*$/.test(pattern)) return { skip: 'non-ascii-pattern' }; + if (pattern.startsWith('||*')) pattern = pattern.slice(2); + if (pattern.length > 1) pattern = pattern.replace(/^\*+/, '').replace(/\*+$/, ''); + if (pattern === '*') pattern = ''; + const host = hostFromPattern(pattern); + if (host && !condition.requestDomains) { + condition.requestDomains = [host]; + } else if (pattern) { + condition.urlFilter = pattern; + } + } + + const hasTarget = condition.urlFilter || condition.regexFilter || condition.requestDomains; + if (!hasTarget && !condition.initiatorDomains) return { skip: 'match-everything' }; + + // Resource types + if (types) { + let t = [...new Set(types)].filter((x) => !negTypes.includes(x)); + if (!t.length) return { skip: 'no-resource-types' }; + condition.resourceTypes = t.sort(); + } else if (negTypes.length) { + condition.excludedResourceTypes = [...new Set(negTypes)].sort(); + } + + let action; + let priority; + if (net.allow) { + if (allowDocument) { + action = { type: 'allowAllRequests' }; + condition.resourceTypes = ['main_frame', 'sub_frame']; + delete condition.excludedResourceTypes; + } else { + action = { type: 'allow' }; + } + priority = PRIORITY.allow; + } else if (redirect) { + action = { type: 'redirect', redirect: { extensionPath: `/resources/${redirect}` } }; + priority = important ? PRIORITY.importantRedirect : PRIORITY.redirect; + // A redirect with no type would swap images and frames for a script stub. + if (!condition.resourceTypes) return { skip: 'redirect-without-type' }; + } else { + action = { type: 'block' }; + priority = important ? PRIORITY.important : PRIORITY.block; + } + + return flags ? { rule: { priority, action, condition }, flags } : { rule: { priority, action, condition } }; +} + +function sortedKey(obj) { + return JSON.stringify(obj, Object.keys(obj).sort()); +} + +// Folds rules that differ only in `requestDomains` into one rule with a combined list. +// EasyList + EasyPrivacy are ~99k `||host^` filters that collapse to a few dozen rules. +export function mergeRules(rules) { + const merged = new Map(); + const out = []; + for (const r of rules) { + const c = r.condition; + const mergeable = c.requestDomains && !c.urlFilter && !c.regexFilter && !c.excludedRequestDomains; + if (!mergeable) { out.push(r); continue; } + const { requestDomains, ...rest } = c; + const key = sortedKey({ p: r.priority, a: sortedKey(r.action), c: sortedKey(rest) }); + let m = merged.get(key); + if (!m) { + m = { priority: r.priority, action: r.action, condition: { ...rest, requestDomains: new Set() } }; + merged.set(key, m); + out.push(m); + } + for (const d of requestDomains) m.condition.requestDomains.add(d); + } + for (const m of merged.values()) { + // Drop domains already covered by a parent in the same rule (ads.x.com under x.com). + const set = m.condition.requestDomains; + const kept = [...set].filter((d) => { + let i = d.indexOf('.'); + while (i !== -1) { + if (set.has(d.slice(i + 1))) return false; + i = d.indexOf('.', i + 1); + } + return true; + }); + m.condition.requestDomains = kept.sort(); + } + // Exact duplicates (the same filter in two lists) collapse too. + const seen = new Set(); + return out.filter((r) => { + const k = sortedKey({ p: r.priority, a: sortedKey(r.action), c: sortedKey(r.condition) }); + if (seen.has(k)) return false; + seen.add(k); + return true; + }); +} + +// Assigns ids: blocks/redirects from 1, allow rules from ALLOW_ID_BASE. +export function assignIds(rules) { + let blockId = 1; + let allowId = ALLOW_ID_BASE; + return rules.map((r) => { + const isAllow = r.action.type === 'allow' || r.action.type === 'allowAllRequests'; + return { id: isAllow ? allowId++ : blockId++, ...r }; + }); +} diff --git a/scripts/lib/parse.mjs b/scripts/lib/parse.mjs new file mode 100644 index 0000000..0c169e1 --- /dev/null +++ b/scripts/lib/parse.mjs @@ -0,0 +1,162 @@ +// Parses individual filter lines (ABP / uBO syntax) into plain objects. +// Anything we cannot faithfully represent returns { type: 'skip', reason } so the build +// can report exactly what was dropped instead of silently guessing. +import { domainToASCII } from 'node:url'; +import { isValidHostname } from '../../src/shared/hostnames.js'; + +const COSMETIC_SEP_RE = /#@?(?:\?|\$\??|%)?#/; + +export function parseLine(line) { + if (!line) return null; + if (line.startsWith('!') || line.startsWith('[')) return null; + if (line.startsWith('#') && !COSMETIC_SEP_RE.test(line.slice(0, 5))) return null; // hosts-file comment + + const m = COSMETIC_SEP_RE.exec(line); + if (m) { + const before = line.slice(0, m.index); + // A `#` inside a URL pattern (`||a.com/#!/ads$script`) is not a cosmetic filter. + if (!/[|^$=]/.test(before)) return parseCosmetic(before, m[0], line.slice(m.index + m[0].length)); + } + return parseNetwork(line); +} + +// --------------------------------------------------------------------------- +// Domains + +// Parses a cosmetic domain list ("a.com,~b.a.com,c.*") or a network `domain=` value +// ("a.com|~b.a.com"). Entities (`c.*`) and regex domains cannot be expressed in DNR or +// match patterns, so they are dropped; `hadInclude` lets callers refuse to turn a +// site-specific filter into a global one when every include was dropped. +export function parseDomainList(value, sep) { + const include = []; + const exclude = []; + let hadInclude = false; + let dropped = 0; + for (let part of value.split(sep)) { + part = part.trim().toLowerCase(); + if (!part) continue; + const negated = part.startsWith('~'); + if (negated) part = part.slice(1); + if (!negated) hadInclude = true; + if (part.startsWith('/') || part.endsWith('.*') || part.includes('*')) { dropped++; continue; } + const ascii = /^[\x00-\x7f]*$/.test(part) ? part : domainToASCII(part); + if (!ascii || !isValidHostname(ascii)) { dropped++; continue; } + (negated ? exclude : include).push(ascii); + } + return { include, exclude, hadInclude, dropped }; +} + +// --------------------------------------------------------------------------- +// Cosmetic + scriptlets + +function parseCosmetic(domainPart, sep, body) { + const exception = sep.includes('@'); + const domains = parseDomainList(domainPart, ','); + if (domains.hadInclude && domains.include.length === 0) { + return { type: 'skip', reason: 'cosmetic-entity-or-regex-domain' }; + } + const base = { exception, include: domains.include, exclude: domains.exclude }; + + if (sep === '#$#' || sep === '#@$#' || sep === '#$?#' || sep === '#@$?#') return { type: 'skip', reason: 'abp-snippet' }; + if (sep === '#%#' || sep === '#@%#') return { type: 'skip', reason: 'adguard-scriptlet' }; + + if (sep === '##' || sep === '#@#') { + if (body.startsWith('+js(')) return parseScriptlet(base, body); + if (body.startsWith('^')) return { type: 'skip', reason: 'html-filter' }; + } + if (!body) return { type: 'skip', reason: 'empty-selector' }; + return { type: 'cosmetic', procedural: sep.includes('?'), ...base, selector: body }; +} + +function unquote(arg) { + if (arg.length >= 2) { + const q = arg[0]; + if ((q === '"' || q === "'" || q === '`') && arg[arg.length - 1] === q) return arg.slice(1, -1); + } + return arg; +} + +// Splits scriptlet arguments on unescaped commas. `\,` is a literal comma, and an +// argument wrapped in quotes may contain commas: set, a, "x, y". +export function splitScriptletArgs(inner) { + const args = []; + let cur = ''; + let quote = ''; + for (let i = 0; i < inner.length; i++) { + const c = inner[i]; + if (quote) { + if (c === '\\' && inner[i + 1] === quote) { cur += quote; i++; continue; } + cur += c; + if (c === quote) quote = ''; + continue; + } + if ((c === '"' || c === "'" || c === '`') && cur.trim() === '') { cur = c; quote = c; continue; } + if (c === '\\' && inner[i + 1] === ',') { cur += ','; i++; continue; } + if (c === ',') { args.push(cur); cur = ''; continue; } + cur += c; + } + args.push(cur); + return args.map((a) => unquote(a.trim())); +} + +function parseScriptlet(base, body) { + if (!body.endsWith(')')) return { type: 'skip', reason: 'scriptlet-malformed' }; + const inner = body.slice(4, -1); + if (inner.trim() === '') return { type: 'scriptlet', ...base, name: '', args: [] }; + const [rawName, ...args] = splitScriptletArgs(inner); + const name = rawName.replace(/\.js$/, ''); + // Trim trailing empty args so "set, a, 1," and "set, a, 1" compare equal for exceptions. + while (args.length && args[args.length - 1] === '') args.pop(); + return { type: 'scriptlet', ...base, name, args }; +} + +// --------------------------------------------------------------------------- +// Network + +// Finds the `$` that starts the options. Regex filters (`/re$/$script`) and URLs with a +// literal `$` need care: options must look like `[~]name[=...]`. +function findOptionsStart(s) { + let from = s.length; + const minIdx = s.startsWith('/') ? s.lastIndexOf('/') : 0; + while (true) { + const i = s.lastIndexOf('$', from - 1); + if (i < minIdx || i < 0) return -1; + if (/^~?[a-z0-9_-]+(=|,|$)/i.test(s.slice(i + 1))) return i; + from = i; + if (from <= 0) return -1; + } +} + +function parseNetwork(line) { + let s = line; + const allow = s.startsWith('@@'); + if (allow) s = s.slice(2); + let optionsText = ''; + const oi = findOptionsStart(s); + if (oi !== -1) { + optionsText = s.slice(oi + 1); + s = s.slice(0, oi); + } + const options = optionsText + ? optionsText.split(',').map((o) => { + const negated = o.startsWith('~'); + const body = negated ? o.slice(1) : o; + const eq = body.indexOf('='); + return eq === -1 + ? { name: body.toLowerCase(), value: null, negated } + : { name: body.slice(0, eq).toLowerCase(), value: body.slice(eq + 1), negated }; + }) + : []; + const isRegex = s.length > 2 && s.startsWith('/') && s.endsWith('/'); + return { type: 'network', allow, pattern: s, isRegex, options, optionsText, raw: line }; +} + +// Canonical text used to match `$badfilter` against the filter it cancels. +export function badfilterKey(net) { + const opts = net.optionsText + .split(',') + .filter((o) => o && o.toLowerCase() !== 'badfilter') + .sort() + .join(','); + return `${net.allow ? '@@' : ''}${net.pattern}${opts ? '$' + opts : ''}`; +} diff --git a/scripts/lib/popups.mjs b/scripts/lib/popups.mjs new file mode 100644 index 0000000..72aa286 --- /dev/null +++ b/scripts/lib/popups.mjs @@ -0,0 +1,103 @@ +// Compiles `$popup` filters. DNR cannot block a popup, so the service worker watches new +// tabs a page opens and closes any that land on a matching URL (src/background/popups.js). +// +// Output (popups.json): +// hosts "||host^$popup" any opener +// hosts3p "||host^$popup,third-party" only when the opener is another site +// rules everything else: [regexSource, openerInclude[], openerExclude[], party] +// allow exceptions, same shape as rules +import { parseDomainList } from './parse.mjs'; +import { isValidHostname } from '../../src/shared/hostnames.js'; + +const POPUP_OPTIONS = new Set(['popup']); +const PARTY = { 'third-party': 3, '3p': 3, 'first-party': 1, '1p': 1 }; +// Options that don't change which popups match and can be ignored for the popup half. +const IGNORABLE = new Set(['important', 'match-case', 'reason', 'badfilter']); + +// ABP pattern -> JS regex source. Same semantics as DNR urlFilter. +export function patternToRegexSource(pattern) { + let p = pattern; + let prefix = ''; + let suffix = ''; + if (p.startsWith('||')) { prefix = '^[a-z][a-z0-9+.-]*:\\/\\/(?:[^/?#]*\\.)?'; p = p.slice(2); } + else if (p.startsWith('|')) { prefix = '^'; p = p.slice(1); } + if (p.endsWith('|')) { suffix = '$'; p = p.slice(0, -1); } + const body = p + .replace(/[.+?${}()[\]\\/]/g, '\\$&') + .replace(/\*/g, '.*') + .replace(/\^/g, '(?:[^\\w.%-]|$)'); + return prefix + body + suffix; +} + +/** True if the filter carries `$popup`. */ +export function isPopupFilter(net) { + return net.options.some((o) => POPUP_OPTIONS.has(o.name) && !o.negated); +} + +// The network filter left after removing `popup`, if it still names resource types +// (`$script,popup` is both a popup filter and a script filter). Null when nothing is left. +export function withoutPopup(net) { + const rest = net.options.filter((o) => !POPUP_OPTIONS.has(o.name)); + const TYPES = new Set(['script', 'image', 'stylesheet', 'css', 'object', 'xmlhttprequest', 'xhr', 'subdocument', 'frame', 'ping', 'websocket', 'font', 'media', 'other', 'document', 'doc', 'all']); + if (!rest.some((o) => TYPES.has(o.name) && !o.negated)) return null; + return { ...net, options: rest, optionsText: rest.map((o) => `${o.negated ? '~' : ''}${o.name}${o.value !== null ? '=' + o.value : ''}`).join(',') }; +} + +export class PopupCompiler { + constructor() { + this.hosts = new Set(); + this.hosts3p = new Set(); + this.rules = []; + this.allow = []; + this.stats = {}; + } + + count(k) { this.stats[k] = (this.stats[k] || 0) + 1; } + + add(net) { + let include = []; + let exclude = []; + let party = 0; + for (const o of net.options) { + if (POPUP_OPTIONS.has(o.name) || IGNORABLE.has(o.name)) continue; + if (PARTY[o.name]) { party = o.negated ? (PARTY[o.name] === 3 ? 1 : 3) : PARTY[o.name]; continue; } + if (o.name === 'domain' || o.name === 'from') { + const d = parseDomainList(o.value || '', '|'); + if (d.hadInclude && !d.include.length) return this.count('entity-only'); + include = d.include; + exclude = d.exclude; + continue; + } + // Resource types belong to the network half; anything else we don't model here. + if (/^(script|image|stylesheet|css|object|xmlhttprequest|xhr|subdocument|frame|ping|websocket|font|media|other|document|doc|all)$/.test(o.name)) continue; + return this.count(`unsupported-${o.name}`); + } + if (net.isRegex) return this.count('regex-skipped'); + let pattern = net.pattern; + if (!/^[\x20-\x7e]*$/.test(pattern)) return this.count('non-ascii'); + if (pattern === '' || pattern === '*') { + if (!include.length) return this.count('match-everything'); + pattern = '*'; + } + + const host = /^\|\|([a-z0-9._-]+)\^$/.exec(pattern)?.[1]; + const simple = host && isValidHostname(host) && !include.length && !exclude.length; + if (net.allow) { + this.allow.push([patternToRegexSource(pattern), include, exclude, party]); + return this.count('allow'); + } + if (simple && party === 0) { this.hosts.add(host); return this.count('host'); } + if (simple && party === 3) { this.hosts3p.add(host); return this.count('host-3p'); } + this.rules.push([patternToRegexSource(pattern), include, exclude, party]); + this.count('rule'); + } + + emit() { + return { + hosts: [...this.hosts].sort(), + hosts3p: [...this.hosts3p].sort(), + rules: this.rules, + allow: this.allow, + }; + } +} diff --git a/scripts/lib/preprocess.mjs b/scripts/lib/preprocess.mjs new file mode 100644 index 0000000..1ebd5ce --- /dev/null +++ b/scripts/lib/preprocess.mjs @@ -0,0 +1,70 @@ +// Evaluates uBO-style `!#if` / `!#else` / `!#endif` preprocessor blocks. +// SilentBlock is an MV3 Chromium blocker without HTML filtering, so the environment +// below mirrors what uBO Lite reports for itself. + +export const ENV = { + ext_ublock: true, + ext_ubol: true, + ext_devbuild: false, + env_chromium: true, + env_mv3: true, + env_edge: false, + env_firefox: false, + env_legacy: false, + env_mobile: false, + env_safari: false, + cap_html_filtering: false, + cap_ipaddress: false, + cap_user_stylesheet: true, + false: false, + true: true, +}; + +// Tiny recursive-descent evaluator for expressions like `env_chromium && !(cap_html_filtering || false)`. +export function evaluate(expr, env = ENV) { + const tokens = expr.match(/\(|\)|!|&&|\|\||[A-Za-z0-9_]+/g) || []; + let i = 0; + const peek = () => tokens[i]; + const next = () => tokens[i++]; + function primary() { + const t = next(); + if (t === '!') return !primary(); + if (t === '(') { const v = or(); next(); return v; } + return t in env ? Boolean(env[t]) : false; + } + function and() { let v = primary(); while (peek() === '&&') { next(); const r = primary(); v = v && r; } return v; } + function or() { let v = and(); while (peek() === '||') { next(); const r = and(); v = v || r; } return v; } + return tokens.length ? or() : false; +} + +// Returns the lines that survive preprocessing. `!#include` is dropped (we only use +// pre-expanded .min lists), which is logged by the caller via the returned stats. +export function preprocess(text, env = ENV) { + const out = []; + const stack = []; // each entry: { active: bool, parentActive: bool, taken: bool } + let active = true; + let includes = 0; + for (const raw of text.split(/\r?\n/)) { + const line = raw.trim(); + if (line.startsWith('!#if ')) { + const cond = evaluate(line.slice(5)); + stack.push({ parentActive: active, taken: cond }); + active = active && cond; + continue; + } + if (line === '!#else') { + const top = stack[stack.length - 1]; + if (top) { active = top.parentActive && !top.taken; top.taken = true; } + continue; + } + if (line === '!#endif') { + const top = stack.pop(); + active = top ? top.parentActive : true; + continue; + } + if (!active) continue; + if (line.startsWith('!#include')) { includes++; continue; } + out.push(line); + } + return { lines: out, includes }; +} diff --git a/scripts/lib/resources.mjs b/scripts/lib/resources.mjs new file mode 100644 index 0000000..7e73f1d --- /dev/null +++ b/scripts/lib/resources.mjs @@ -0,0 +1,32 @@ +// Redirect resource names used by filter lists (`$redirect=`) mapped to the stub +// files in src/resources/. A name not listed here falls back to a plain block. +export const RESOURCES = {}; + +const FILES = { + 'noop.js': ['noopjs', 'abp-resource:blank-js'], + 'noop.txt': ['nooptext', 'empty', 'abp-resource:blank-text'], + 'noop.css': ['noopcss', 'abp-resource:blank-css'], + 'noop.html': ['noopframe', 'abp-resource:blank-html'], + '1x1.gif': ['1x1-transparent.gif', 'abp-resource:1x1-transparent-gif'], + '2x2.png': ['2x2-transparent.png', 'abp-resource:2x2-transparent-png'], + '3x2.png': ['3x2-transparent.png', 'abp-resource:3x2-transparent-png'], + '32x32.png': ['32x32-transparent.png', 'abp-resource:32x32-transparent-png'], + 'noopvast-2.0.xml': ['noopvast-2.0'], + 'noopvast-3.0.xml': ['noopvast-3.0'], + 'noopvast-4.0.xml': ['noopvast-4.0'], + 'noopvmap-1.0.xml': ['noopvmap-1.0'], + 'googletagservices_gpt.js': ['googletagservices.com/gpt.js', 'googletagservices-gpt'], + 'googlesyndication_adsbygoogle.js': ['googlesyndication.com/adsbygoogle.js', 'googlesyndication-adsbygoogle'], + 'google-analytics_analytics.js': ['google-analytics.com/analytics.js', 'google-analytics-analytics'], + 'google-analytics_ga.js': ['google-analytics.com/ga.js', 'google-analytics-ga'], + 'googletagmanager_gtm.js': ['googletagmanager.com/gtm.js', 'googletagmanager-gtm', 'googletagmanager_gtag.js', 'googletagmanager.com/gtag.js'], + 'amazon_apstag.js': ['amazon-adsystem.com/aax2/apstag.js', 'amazon-apstag'], + 'scorecardresearch_beacon.js': ['scorecardresearch.com/beacon.js', 'scorecardresearch-beacon'], + 'doubleclick_instream_ad_status.js': ['doubleclick.net/instream/ad_status.js', 'doubleclick-instream-ad-status'], + 'prebid-ads.js': ['prebid-ads'], +}; + +for (const [file, aliases] of Object.entries(FILES)) { + RESOURCES[file] = file; + for (const a of aliases) RESOURCES[a] = file; +} diff --git a/scripts/lib/scriptlets.mjs b/scripts/lib/scriptlets.mjs new file mode 100644 index 0000000..8ae0735 --- /dev/null +++ b/scripts/lib/scriptlets.mjs @@ -0,0 +1,164 @@ +// Compiles `site##+js(name, args...)` filters into MAIN-world bucket scripts. +// +// Each bucket is one self-contained file: the scriptlet library + a host table. It is +// registered with `matches` for exactly its hosts, so a site with no scriptlets never +// parses any of this. Hosts are spread over buckets by hash to keep each file small. +import { fnv1a, hostnameToMatchPatterns } from '../../src/shared/hostnames.js'; + +const ALIASES = { + 'set-constant': ['set'], + 'abort-on-property-read': ['aopr'], + 'abort-on-property-write': ['aopw'], + 'abort-current-script': ['acs', 'abort-current-inline-script', 'acis'], + 'abort-on-stack-trace': ['aost'], + 'prevent-window-open': ['nowoif', 'no-window-open-if', 'window.open-defuser'], + 'prevent-setTimeout': ['nostif', 'no-setTimeout-if', 'setTimeout-defuser'], + 'prevent-setInterval': ['nosiif', 'no-setInterval-if', 'setInterval-defuser'], + 'adjust-setTimeout': ['nano-stb', 'nano-setTimeout-booster'], + 'adjust-setInterval': ['nano-sib', 'nano-setInterval-booster'], + 'prevent-addEventListener': ['aeld', 'addEventListener-defuser'], + 'remove-node-text': ['rmnt'], + 'prevent-fetch': ['no-fetch-if'], + 'prevent-xhr': ['no-xhr-if'], + 'json-prune': [], + 'json-prune-fetch-response': [], + 'json-prune-xhr-response': [], + 'noeval-if': ['prevent-eval-if'], + 'noeval': ['silent-noeval'], + 'remove-attr': ['ra'], + 'remove-class': ['rc'], + 'set-attr': [], + 'set-cookie': [], + 'remove-cookie': ['cookie-remover'], + 'set-local-storage-item': [], + 'set-session-storage-item': [], + 'nobab': ['nobab2', 'bab-defuser'], + 'nofab': ['fuckadblock.js-3.2.0'], + 'nowebrtc': [], + 'refresh-defuser': [], + 'popads-dummy': [], + 'sb-unwall': [], +}; + +export const CANONICAL = new Map(); +for (const [name, aliases] of Object.entries(ALIASES)) { + CANONICAL.set(name, name); + for (const a of aliases) CANONICAL.set(a, name); +} + +const HOSTS_PER_BUCKET = 400; + +export class ScriptletCompiler { + constructor(categories) { + this.categories = categories; + this.table = Object.fromEntries(categories.map((c) => [c, new Map()])); // host -> Map(key -> [name,...args]) + this.exclusions = new Map(); // host -> Set(key | '*') + this.globalExclusions = new Set(); + this.stats = {}; + } + + count(reason) { this.stats[reason] = (this.stats[reason] || 0) + 1; } + + static key(name, args) { return [name, ...args].join('\u0001'); } + + addExclusion(host, key) { + let s = this.exclusions.get(host); + if (!s) this.exclusions.set(host, (s = new Set())); + s.add(key); + } + + add(cat, f) { + // `site#@#+js()` disables every scriptlet on the site. + if (f.exception && f.name === '') { + for (const h of f.include) this.addExclusion(h, '*'); + return this.count('exception-all'); + } + const name = CANONICAL.get(f.name); + if (!name) return this.count(f.name.startsWith('trusted-') ? 'trusted-skipped' : 'unsupported'); + const key = ScriptletCompiler.key(name, f.args); + if (f.exception) { + if (!f.include.length) this.globalExclusions.add(key); + for (const h of f.include) this.addExclusion(h, key); + return this.count('exception'); + } + if (!f.include.length) return this.count('generic-skipped'); // never run a scriptlet on every site + for (const h of f.exclude) this.addExclusion(h, key); + const map = this.table[cat]; + for (const h of f.include) { + let e = map.get(h); + if (!e) map.set(h, (e = new Map())); + e.set(key, [name, ...f.args]); + } + this.count('ok'); + } + + /** + * @param {string} librarySource contents of src/scriptlets/library.js (with unwall core inlined) + * @returns {{ files: object, registrations: object, summary: object }} + */ + emit(librarySource) { + const files = {}; + const registrations = {}; + const summary = {}; + const exclusions = {}; + for (const [h, set] of this.exclusions) exclusions[h] = [...set].sort(); + + for (const cat of this.categories) { + const hosts = [...this.table[cat].keys()].filter((h) => { + const entries = [...this.table[cat].get(h).entries()].filter(([k]) => !this.globalExclusions.has(k)); + this.table[cat].set(h, new Map(entries)); + return entries.length > 0; + }).sort(); + const nBuckets = Math.max(1, Math.ceil(hosts.length / HOSTS_PER_BUCKET)); + const buckets = Array.from({ length: nBuckets }, () => []); + for (const h of hosts) buckets[fnv1a(h) % nBuckets].push(h); + + registrations[cat] = []; + buckets.forEach((bucketHosts, i) => { + if (!bucketHosts.length) return; + const table = {}; + for (const h of bucketHosts) table[h] = [...this.table[cat].get(h).values()]; + const file = `scriptlets/${cat}-${String(i).padStart(2, '0')}.js`; + files[file] = bucketSource(librarySource, table, exclusions); + registrations[cat].push({ file, matches: bucketHosts.flatMap(hostnameToMatchPatterns) }); + }); + summary[cat] = { hosts: hosts.length, buckets: registrations[cat].length }; + } + return { files, registrations, summary }; + } +} + +function bucketSource(librarySource, table, exclusions) { + // The host lookup runs first so a frame that matched only by parent domain exits + // before the library is even evaluated. + return `(function () { +'use strict'; +const TABLE = ${JSON.stringify(table)}; +const EXCLUSIONS = ${JSON.stringify(exclusions)}; +const hostname = location.hostname; +if (!hostname) return; +const parents = []; +for (let h = hostname; ; ) { parents.push(h); const i = h.indexOf('.'); if (i === -1) break; h = h.slice(i + 1); } +const excluded = new Set(); +for (const h of parents) { const e = EXCLUSIONS[h]; if (e) for (const k of e) excluded.add(k); } +if (excluded.has('*')) return; +const todo = []; +const seen = new Set(); +for (const h of parents) { + const list = TABLE[h]; + if (!list) continue; + for (const entry of list) { + const key = entry.join('\\u0001'); + if (seen.has(key) || excluded.has(key)) continue; + seen.add(key); + todo.push(entry); + } +} +if (!todo.length) return; +${librarySource} +for (const [name, ...args] of todo) { + try { SCRIPTLETS[name](...args); } catch (e) { /* one broken scriptlet must not stop the rest */ } +} +})(); +`; +} diff --git a/scripts/lib/validate-selectors.mjs b/scripts/lib/validate-selectors.mjs new file mode 100644 index 0000000..ab847a3 --- /dev/null +++ b/scripts/lib/validate-selectors.mjs @@ -0,0 +1,71 @@ +// Build-time validation in real Chromium, because Chromium is the only authority on what +// it accepts: +// - CSS selectors: one invalid selector voids a whole grouped rule. +// - DNR regexFilter: a single regex RE2 rejects (e.g. `{200,1300}` blows the 2KB +// compiled-size limit) makes Chrome refuse to load the ENTIRE extension. +import { mkdtemp, writeFile, rm } from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; + +async function playwright() { + try { + return (await import('@playwright/test')).chromium; + } catch { + throw new Error('Validation needs @playwright/test (npm install), or build with --no-validate.'); + } +} + +export async function validateSelectors(selectors) { + const chromium = await playwright(); + const browser = await chromium.launch(); + try { + const page = await browser.newPage(); + await page.setContent(''); + const invalid = new Set(); + const CHUNK = 5000; + for (let i = 0; i < selectors.length; i += CHUNK) { + const bad = await page.evaluate((chunk) => { + const frag = document.createDocumentFragment(); + return chunk.filter((s) => { + try { frag.querySelector(s); return false; } catch { return true; } + }); + }, selectors.slice(i, i + CHUNK)); + bad.forEach((s) => invalid.add(s)); + } + return invalid; + } finally { + await browser.close(); + } +} + +// items: [{ regex, isCaseSensitive }]. Returns a Set of "regex\u0001caseSensitive" keys +// that Chromium's declarativeNetRequest rejects. +export async function validateRegexes(items) { + if (!items.length) return new Set(); + const chromium = await playwright(); + const dir = await mkdtemp(path.join(os.tmpdir(), 'sb-regex-')); + await writeFile(path.join(dir, 'manifest.json'), JSON.stringify({ + manifest_version: 3, name: 'regex-validator', version: '1', + permissions: ['declarativeNetRequest'], background: { service_worker: 'sw.js' }, + })); + await writeFile(path.join(dir, 'sw.js'), ''); + const ctx = await chromium.launchPersistentContext('', { + channel: 'chromium', headless: true, + args: [`--disable-extensions-except=${dir}`, `--load-extension=${dir}`], + }); + try { + const sw = ctx.serviceWorkers()[0] || await ctx.waitForEvent('serviceworker', { timeout: 20000 }); + const bad = await sw.evaluate(async (list) => { + const out = []; + for (const { regex, isCaseSensitive } of list) { + const r = await chrome.declarativeNetRequest.isRegexSupported({ regex, isCaseSensitive }); + if (!r.isSupported) out.push(`${regex}\u0001${isCaseSensitive}`); + } + return out; + }, items); + return new Set(bad); + } finally { + await ctx.close(); + await rm(dir, { recursive: true, force: true }); + } +} diff --git a/scripts/package.mjs b/scripts/package.mjs new file mode 100644 index 0000000..c36ea5b --- /dev/null +++ b/scripts/package.mjs @@ -0,0 +1,90 @@ +// Zips dist/chrome and dist/firefox into release/. manifest.json sits at the zip root, +// which is what the Chrome Web Store and addons.mozilla.org expect. +// node scripts/package.mjs +import { readdir, readFile, writeFile, mkdir, stat } from 'node:fs/promises'; +import path from 'node:path'; +import zlib from 'node:zlib'; + +const root = path.resolve(import.meta.dirname, '..'); +const pkg = JSON.parse(await readFile(path.join(root, 'package.json'), 'utf8')); + +async function walk(dir, base = dir) { + const out = []; + for (const entry of await readdir(dir, { withFileTypes: true })) { + // Chrome writes _metadata/ into an unpacked folder it has loaded; stores reject "_" paths. + if (entry.name.startsWith('_')) continue; + const full = path.join(dir, entry.name); + if (entry.isDirectory()) out.push(...await walk(full, base)); + else out.push(path.relative(base, full).split(path.sep).join('/')); + } + return out.sort(); +} + +// Minimal zip writer (deflate + CRC32 from node:zlib). Timestamps are fixed so the same +// build produces the same bytes. +function zip(files) { + const local = []; + const central = []; + let offset = 0; + const DOS_TIME = 0; + const DOS_DATE = (1 << 5) | 1; // 1980-01-01 + for (const { name, data } of files) { + const nameBuf = Buffer.from(name, 'utf8'); + const deflated = zlib.deflateRawSync(data, { level: 9 }); + const useDeflate = deflated.length < data.length; + const body = useDeflate ? deflated : data; + const crc = zlib.crc32(data); + const header = Buffer.alloc(30); + header.writeUInt32LE(0x04034b50, 0); + header.writeUInt16LE(20, 4); + header.writeUInt16LE(0x0800, 6); // UTF-8 names + header.writeUInt16LE(useDeflate ? 8 : 0, 8); + header.writeUInt16LE(DOS_TIME, 10); + header.writeUInt16LE(DOS_DATE, 12); + header.writeUInt32LE(crc, 14); + header.writeUInt32LE(body.length, 18); + header.writeUInt32LE(data.length, 22); + header.writeUInt16LE(nameBuf.length, 26); + header.writeUInt16LE(0, 28); + local.push(header, nameBuf, body); + + const cd = Buffer.alloc(46); + cd.writeUInt32LE(0x02014b50, 0); + cd.writeUInt16LE(20, 4); + cd.writeUInt16LE(20, 6); + cd.writeUInt16LE(0x0800, 8); + cd.writeUInt16LE(useDeflate ? 8 : 0, 10); + cd.writeUInt16LE(DOS_TIME, 12); + cd.writeUInt16LE(DOS_DATE, 14); + cd.writeUInt32LE(crc, 16); + cd.writeUInt32LE(body.length, 20); + cd.writeUInt32LE(data.length, 24); + cd.writeUInt16LE(nameBuf.length, 28); + cd.writeUInt32LE(offset, 42); + central.push(cd, nameBuf); + offset += header.length + nameBuf.length + body.length; + } + const cdBuf = Buffer.concat(central); + const end = Buffer.alloc(22); + end.writeUInt32LE(0x06054b50, 0); + end.writeUInt16LE(files.length, 8); + end.writeUInt16LE(files.length, 10); + end.writeUInt32LE(cdBuf.length, 12); + end.writeUInt32LE(offset, 16); + return Buffer.concat([...local, cdBuf, end]); +} + +const outDir = path.join(root, 'release'); +await mkdir(outDir, { recursive: true }); +for (const target of ['chrome', 'firefox']) { + const dir = path.join(root, 'dist', target); + try { await stat(path.join(dir, 'manifest.json')); } catch { throw new Error(`dist/${target} missing: run npm run build first`); } + const manifest = JSON.parse(await readFile(path.join(dir, 'manifest.json'), 'utf8')); + if (manifest.version !== pkg.version) throw new Error(`dist/${target} is ${manifest.version}, package.json is ${pkg.version}: rebuild`); + const names = await walk(dir); + const files = await Promise.all(names.map(async (name) => ({ name, data: await readFile(path.join(dir, name)) }))); + const file = path.join(outDir, `SilentBlock-${pkg.version}-${target}.zip`); + await writeFile(file, zip(files)); + const size = (await stat(file)).size; + console.log(`${path.relative(root, file)} ${names.length} files, ${(size / 1024 / 1024).toFixed(1)} MB`); +} diff --git a/scripts/update-lists.mjs b/scripts/update-lists.mjs new file mode 100644 index 0000000..15fbae9 --- /dev/null +++ b/scripts/update-lists.mjs @@ -0,0 +1,43 @@ +// Refreshes the upstream filter list snapshots in filters/upstream/. +// The extension never fetches lists at runtime: snapshots are committed so builds are +// reproducible and every list change shows up as a reviewable diff. +import { readFile, writeFile } from 'node:fs/promises'; +import { createHash } from 'node:crypto'; +import path from 'node:path'; + +const root = path.resolve(import.meta.dirname, '..'); +const config = JSON.parse(await readFile(path.join(root, 'filters/lists.json'), 'utf8')); +const metaPath = path.join(root, 'filters/upstream/meta.json'); +let meta = {}; +try { meta = JSON.parse(await readFile(metaPath, 'utf8')); } catch { /* first run */ } + +let failed = 0; +for (const list of config.lists.filter((l) => l.url)) { + process.stdout.write(`${list.id.padEnd(18)} `); + try { + const res = await fetch(list.url, { headers: { 'user-agent': 'SilentBlock list updater' } }); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + const text = await res.text(); + const lines = text.split('\n').length; + // A truncated or HTML error page must never replace a good snapshot. + if (lines < 100 || /^\s*<(!doctype|html)/i.test(text)) throw new Error(`suspicious body (${lines} lines)`); + await writeFile(path.join(root, list.file), text); + meta[list.id] = { + url: list.url, + fetchedAt: new Date().toISOString(), + lines, + sha256: createHash('sha256').update(text).digest('hex'), + version: (text.match(/^! (?:Version|Last modified):\s*(.+)$/m) || [])[1]?.trim() || null, + }; + console.log(`ok ${lines} lines`); + } catch (err) { + failed++; + console.log(`FAILED ${err.message} (kept previous snapshot)`); + } +} + +await writeFile(metaPath, JSON.stringify(meta, null, 2) + '\n'); +if (failed) { + console.error(`\n${failed} list(s) failed to update.`); + process.exitCode = 1; +} diff --git a/scripts/verify-load.mjs b/scripts/verify-load.mjs new file mode 100644 index 0000000..6011084 --- /dev/null +++ b/scripts/verify-load.mjs @@ -0,0 +1,17 @@ +// Loads dist/ into headless Chromium through CDP, which reports the exact error +// Chrome would show on chrome://extensions. `--load-extension` just fails silently. +import { chromium } from '@playwright/test'; +import path from 'node:path'; + +const dir = path.resolve(import.meta.dirname, '..', 'dist', process.argv[2] || 'chrome'); +const ctx = await chromium.launchPersistentContext('', { channel: 'chromium', headless: true, args: ['--enable-unsafe-extension-debugging'] }); +try { + const cdp = await ctx.browser().newBrowserCDPSession(); + const { id } = await cdp.send('Extensions.loadUnpacked', { path: dir }); + console.log(`OK: loaded ${dir} as ${id}`); +} catch (err) { + console.error(`FAILED to load ${dir}:\n ${err.message.split('\n')[0]}`); + process.exitCode = 1; +} finally { + await ctx.close(); +} diff --git a/src/background/apply.js b/src/background/apply.js new file mode 100644 index 0000000..83892b5 --- /dev/null +++ b/src/background/apply.js @@ -0,0 +1,170 @@ +// Makes the browser match the saved state: enabled rulesets, the allowlist rule, the +// registered content scripts, the toolbar icon. Idempotent, so it is safe to call on +// install, update, startup and after every settings change. +// +// Everything a paused site must not get (scriptlets, generic CSS, the token reporter) is +// registered with `excludeMatches` built from the allowlist. That is the whole off switch: +// v1 used a DOM event any page could fire to switch SilentBlock off. +import { hostnameToMatchPatterns } from '../shared/hostnames.js'; +import { getMeta, getRegistration } from './data.js'; +import { iconPaths, repaintAll } from './status.js'; + +export const ALLOWLIST_RULE_ID = 1; +export const ALLOWLIST_PRIORITY = 1000; +const HTTP = ['http://*/*', 'https://*/*']; + + +export function activeCategories(state, meta) { + if (!state.enabled) return []; + return Object.keys(meta.categories).filter((c) => meta.categories[c].alwaysOn || state.categories[c]); +} + +async function applyRulesets(state, meta) { + const all = Object.keys(meta.categories); + const on = activeCategories(state, meta); + const current = new Set(await chrome.declarativeNetRequest.getEnabledRulesets()); + const enableRulesetIds = on.filter((c) => !current.has(c)); + const disableRulesetIds = all.filter((c) => !on.includes(c) && current.has(c)); + if (enableRulesetIds.length || disableRulesetIds.length) { + await chrome.declarativeNetRequest.updateEnabledRulesets({ enableRulesetIds, disableRulesetIds }); + } +} + +async function applyDynamicRules(state) { + const existing = await chrome.declarativeNetRequest.getDynamicRules(); + const addRules = []; + if (state.enabled && state.allowlist.length) { + // allowAllRequests on the top-level document covers every request in its frame tree. + addRules.push({ + id: ALLOWLIST_RULE_ID, + priority: ALLOWLIST_PRIORITY, + action: { type: 'allowAllRequests' }, + condition: { requestDomains: state.allowlist, resourceTypes: ['main_frame'] }, + }); + } + // Removing every existing id also clears v1's per-site hashed rules on upgrade. + await chrome.declarativeNetRequest.updateDynamicRules({ removeRuleIds: existing.map((r) => r.id), addRules }); +} + +export async function desiredContentScripts(state) { + if (!state.enabled) return []; + const [meta, reg] = await Promise.all([getMeta(), getRegistration()]); + const cats = activeCategories(state, meta); + const paused = state.allowlist.flatMap(hostnameToMatchPatterns); + const scripts = []; + + const complexExclude = [...paused, ...reg.complexCssExcludeHosts.flatMap(hostnameToMatchPatterns)]; + for (const cat of cats) { + if (!meta.cosmetic[cat]?.complex) continue; + scripts.push({ + id: `sb-generic-${cat}`, + css: [`cosmetic/generic-${cat}.css`], + matches: HTTP, + excludeMatches: complexExclude, + allFrames: true, + matchOriginAsFallback: true, + runAt: 'document_start', + }); + } + + if (cats.some((c) => meta.cosmetic[c]?.tokens)) { + scripts.push({ + id: 'sb-tokens', + js: ['content/generic.js'], + matches: HTTP, + excludeMatches: [...paused, ...reg.tokenExcludeHosts.flatMap(hostnameToMatchPatterns)], + allFrames: true, + matchOriginAsFallback: true, + runAt: 'document_start', + }); + } + + for (const cat of cats) { + (reg.scriptlets[cat] || []).forEach((bucket, i) => { + scripts.push({ + id: `sb-sl-${cat}-${i}`, + js: [bucket.file], + matches: bucket.matches, + excludeMatches: paused, + allFrames: true, + runAt: 'document_start', + world: 'MAIN', + }); + }); + } + + if (cats.includes('ads')) { + scripts.push({ + id: 'sb-facebook', + js: ['content/facebook.js'], + matches: ['*://*.facebook.com/*'], + excludeMatches: paused, + runAt: 'document_idle', + }); + } + + if (state.unwallSites.length) { + scripts.push({ + id: 'sb-unwall', + js: ['content/unwall.js'], + matches: state.unwallSites.flatMap(hostnameToMatchPatterns), + excludeMatches: paused, + runAt: 'document_start', + }); + } + return scripts; +} + +async function registerBatch(scripts) { + try { + await chrome.scripting.registerContentScripts(scripts); + } catch (err) { + // Firefox (and older Chromium) reject matchOriginAsFallback; retry without it. + if (!/matchOriginAsFallback/i.test(String(err))) throw err; + await chrome.scripting.registerContentScripts(scripts.map(({ matchOriginAsFallback, ...s }) => s)); + } +} + +// The batch call is all-or-nothing. If it fails, register one by one so a single bad +// script (say, a pattern some browser rejects) cannot switch off every other layer. +async function register(scripts) { + try { + await registerBatch(scripts); + } catch (err) { + console.warn('SilentBlock: batch registration failed, registering individually:', err); + await chrome.scripting.unregisterContentScripts().catch(() => {}); + for (const s of scripts) { + try { await registerBatch([s]); } catch (e) { console.error(`SilentBlock: could not register ${s.id}:`, e); } + } + } +} + +async function applyContentScripts(state) { + const scripts = await desiredContentScripts(state); + await chrome.scripting.unregisterContentScripts(); + if (scripts.length) await register(scripts); +} + +export async function applyAction(state) { + // Global default (new tabs, pages we cannot touch); each tab is then painted by status.js. + await chrome.action.setIcon({ path: iconPaths(state.enabled ? 'idle' : 'paused') }); + await chrome.action.setTitle({ title: state.enabled ? 'SilentBlock' : 'SilentBlock (off)' }); + await repaintAll(state).catch(() => {}); + try { + await chrome.declarativeNetRequest.setExtensionActionOptions({ displayActionCountAsBadgeText: state.enabled && state.badge }); + } catch { /* not supported everywhere */ } +} + +// Serialise applies: two quick toggles must not interleave unregister/register calls. +let chain = Promise.resolve(); +export function applyAll(state, parts = { rulesets: true, dynamic: true, scripts: true, action: true }) { + const run = async () => { + const meta = await getMeta(); + if (parts.rulesets) await applyRulesets(state, meta); + if (parts.dynamic) await applyDynamicRules(state); + if (parts.scripts) await applyContentScripts(state); + if (parts.action) await applyAction(state); + }; + chain = chain.then(run, run); + return chain; +} diff --git a/src/background/cosmetic.js b/src/background/cosmetic.js new file mode 100644 index 0000000..28fbe7e --- /dev/null +++ b/src/background/cosmetic.js @@ -0,0 +1,148 @@ +// Cosmetic filtering that needs the service worker: +// - site-specific CSS, injected into each frame when its document commits +// - generic token CSS, injected when the content script reports classes/ids it saw +// All CSS goes in with origin USER: the page cannot see it, restyle it, or block it with CSP. +import { hostnameAndParents, shardOf } from '../shared/hostnames.js'; +import { loadJSON, getMeta } from './data.js'; +import { activeCategories } from './apply.js'; +import { isPaused } from './state.js'; + +const FLAG = { ghide: 1, ehide: 2, shide: 4, complexException: 8 }; + +const tokenSets = new Map(); +async function tokens(cat) { + let p = tokenSets.get(cat); + if (!p) { + p = loadJSON(`cosmetic/tokens-${cat}.json`).then((list) => new Set(list)); + tokenSets.set(cat, p); + } + return p; +} + +async function hostFlags(hostname) { + const flags = await loadJSON('cosmetic/hostflags.json'); + let f = 0; + for (const h of hostnameAndParents(hostname)) f |= flags[h] || 0; + return f; +} + +async function exceptionsFor(hostname) { + const all = await loadJSON('cosmetic/exceptions.json'); + const out = new Set(); + for (const h of hostnameAndParents(hostname)) for (const s of all[h] || []) out.add(s); + return out; +} + +async function specificEntries(cat, hostname) { + const out = []; + for (const h of hostnameAndParents(hostname)) { + const shard = await loadJSON(`cosmetic/specific-${cat}-${String(shardOf(h)).padStart(2, '0')}.json`); + if (shard[h]) out.push(shard[h]); + } + return out; +} + +function hideRule(selectors) { + return selectors.length ? `${selectors.join(',\n')}\n{display:none!important}\n` : ''; +} + +// One bad selector voids a whole selector list, so specific selectors (validated at build, +// but browsers differ) are grouped in small chunks. +function hideRules(selectors, chunk = 25) { + let css = ''; + for (let i = 0; i < selectors.length; i += chunk) css += hideRule(selectors.slice(i, i + chunk)); + return css; +} + +async function insert(tabId, frameId, documentId, css) { + if (!css) return; + const target = documentId ? { tabId, documentIds: [documentId] } : { tabId, frameIds: [frameId] }; + try { + await chrome.scripting.insertCSS({ target, css, origin: 'USER' }); + } catch (err) { + // The frame navigated away or the browser rejected documentIds (Firefox): one retry by frameId. + if (documentId && !/No frame|No tab|removed/i.test(String(err))) { + try { await chrome.scripting.insertCSS({ target: { tabId, frameIds: [frameId] }, css, origin: 'USER' }); } catch { /* gone */ } + } + } +} + +// Top-level hostname per tab, so subframes of a paused site are left alone too. +const topHosts = new Map(); + +export function rememberTop(tabId, hostname) { + topHosts.set(tabId, hostname); +} + +export function forgetTab(tabId) { + topHosts.delete(tabId); +} + +async function topHostOf(tabId, fallbackUrl) { + if (topHosts.has(tabId)) return topHosts.get(tabId); + try { + const frame = await chrome.webNavigation.getFrame({ tabId, frameId: 0 }); + const h = new URL(frame.url).hostname; + topHosts.set(tabId, h); + return h; + } catch { + try { return new URL(fallbackUrl).hostname; } catch { return ''; } + } +} + +export async function onCommitted({ tabId, frameId, documentId, url }, state) { + if (!state.enabled || !/^https?:/.test(url)) return; + const hostname = new URL(url).hostname; + const top = frameId === 0 ? hostname : await topHostOf(tabId, url); + if (isPaused(top, state)) return; + + const flags = await hostFlags(hostname); + if (flags & FLAG.ehide) return; + const meta = await getMeta(); + const cats = activeCategories(state, meta); + const exc = await exceptionsFor(hostname); + + const hide = new Set(); + let css = ''; + if (!(flags & FLAG.shide)) { + for (const cat of cats) { + if (!meta.cosmetic[cat]?.specificHosts) continue; + for (const entry of await specificEntries(cat, hostname)) { + for (const s of entry.h || []) if (!exc.has(s)) hide.add(s); + for (const [s, decl] of entry.s || []) if (!exc.has(s)) css += `${s}{${decl}}\n`; + } + } + } + // Sites excluded from the shared complex stylesheet because of an exception get + // "complex minus exceptions" here instead. + if ((flags & FLAG.complexException) && !(flags & FLAG.ghide)) { + for (const cat of cats) { + if (!meta.cosmetic[cat]?.complex) continue; + for (const s of await loadJSON(`cosmetic/complex-${cat}.json`)) if (!exc.has(s)) hide.add(s); + } + } + css = hideRules([...hide]) + css; + await insert(tabId, frameId, documentId, css); +} + +export async function onTokens(message, sender, state) { + if (!state.enabled || !sender.tab || !sender.url || !/^https?:/.test(sender.url)) return; + if (!Array.isArray(message.tokens) || !message.tokens.length) return; + const hostname = new URL(sender.url).hostname; + const top = await topHostOf(sender.tab.id, sender.tab.url || sender.url); + if (isPaused(top, state)) return; + const flags = await hostFlags(hostname); + if (flags & (FLAG.ghide | FLAG.ehide)) return; + + const meta = await getMeta(); + const sets = await Promise.all(activeCategories(state, meta).filter((c) => meta.cosmetic[c]?.tokens).map(tokens)); + const exc = await exceptionsFor(hostname); + // Only strings that exist in our own lists ever reach the CSS: page-supplied class + // names are used as lookup keys, never interpolated. + const hits = []; + for (const t of message.tokens.slice(0, 5000)) { + if (typeof t !== 'string' || exc.has(t)) continue; + if (sets.some((s) => s.has(t))) hits.push(t); + } + if (hits.length) await insert(sender.tab.id, sender.frameId, sender.documentId, hideRule(hits)); +} diff --git a/src/background/data.js b/src/background/data.js new file mode 100644 index 0000000..14e1eb0 --- /dev/null +++ b/src/background/data.js @@ -0,0 +1,19 @@ +// Lazy, memoised access to the build output (meta, registration, cosmetic data). +// The service worker can be torn down at any time, so nothing here is assumed warm. +const cache = new Map(); + +export function loadJSON(path) { + let p = cache.get(path); + if (!p) { + p = fetch(chrome.runtime.getURL(path)).then((r) => { + if (!r.ok) throw new Error(`${path}: HTTP ${r.status}`); + return r.json(); + }); + p.catch(() => cache.delete(path)); + cache.set(path, p); + } + return p; +} + +export const getMeta = () => loadJSON('meta.json'); +export const getRegistration = () => loadJSON('registration.json'); diff --git a/src/background/main.js b/src/background/main.js new file mode 100644 index 0000000..125fb6f --- /dev/null +++ b/src/background/main.js @@ -0,0 +1,204 @@ +// SilentBlock service worker. +// +// All listeners are registered synchronously at top level so Chrome can wake the worker +// for them. State lives in chrome.storage; nothing here relies on the worker staying alive. +import { loadState, saveState, migrate, allowlistEntryFor, normalise } from './state.js'; +import { applyAll, applyAction, desiredContentScripts } from './apply.js'; +import { onCommitted, onTokens, rememberTop, forgetTab } from './cosmetic.js'; +import { onCreatedNavigationTarget, onTopNavigation, onNavigationError, forgetPopupTab, noteCommitted, lastUrlOf } from './popups.js'; +import { resetTab, record, getStatus, levelOf, iconStateFor, forgetStatus } from './status.js'; +import { checkNavigation, dangerHost, securityOn, bypass } from './security.js'; +import { getMeta } from './data.js'; +import { hostnameAndParents, normaliseHostname } from '../shared/hostnames.js'; + +const EXTENSION_ORIGIN = chrome.runtime.getURL(''); + +// ---- lifecycle ---------------------------------------------------------------------- + +chrome.runtime.onInstalled.addListener(async () => { + await migrate(); + // Extension updates reset the enabled static rulesets to the manifest defaults, and + // registered scripts must be rebuilt for the new build's files, so always re-apply. + await applyAll(await loadState()); +}); + +chrome.runtime.onStartup.addListener(async () => { + const state = await loadState(); + // Toolbar icons are not persisted across browser restarts. + await applyAction(state); + // Registered scripts and dynamic rules persist, but self-heal if something was lost. + const registered = await chrome.scripting.getRegisteredContentScripts(); + if (registered.length !== (await desiredContentScripts(state)).length) await applyAll(state); +}); + +// ---- navigation --------------------------------------------------------------------- + +chrome.webNavigation.onCreatedNavigationTarget.addListener((details) => { + // Pass the promise, not the state: registration must happen before any await. + onCreatedNavigationTarget(details, loadState()); +}); + +chrome.webNavigation.onBeforeNavigate.addListener(async (details) => { + if (details.frameId !== 0) return; + const back = lastUrlOf(details.tabId); + const state = await loadState(); + const host = await checkNavigation(details.tabId, details.url, state, back); + if (host) { await record(details.tabId, 'danger', host, state); return; } + await onTopNavigation(details.tabId, details.url, state); +}); + +chrome.webNavigation.onErrorOccurred.addListener(async (details) => { + const state = await loadState(); + onNavigationError(details, state); + // Backstop: DNR blocked a listed page before the navigation check could redirect it. + if (details.frameId === 0 && /BLOCKED_BY_CLIENT/.test(details.error || '')) { + const host = await checkNavigation(details.tabId, details.url, state, lastUrlOf(details.tabId)); + if (host) await record(details.tabId, 'danger', host, state); + } +}); + +chrome.webNavigation.onCommitted.addListener(async (details) => { + if (!/^https?:/.test(details.url)) return; + if (details.frameId === 0) noteCommitted(details.tabId, details.url); // before any await + const state = await loadState(); + if (details.frameId === 0) { + await onTopNavigation(details.tabId, details.url, state); + const hostname = new URL(details.url).hostname; + rememberTop(details.tabId, hostname); + await resetTab(details.tabId, hostname, state); + } + await onCommitted(details, state); +}); + +chrome.tabs.onRemoved.addListener((tabId) => { + forgetTab(tabId); + forgetPopupTab(tabId); + forgetStatus(tabId); +}); + +// ---- live request watching (read-only) ----------------------------------------------- + +// Every request SilentBlock (or anything else) blocked shows up here as ERR_BLOCKED_BY_CLIENT. +chrome.webRequest.onErrorOccurred.addListener(async (d) => { + if (d.tabId < 0 || d.type === 'main_frame' || !/BLOCKED_BY_CLIENT/.test(d.error)) return; + const state = await loadState(); + let host = ''; + try { host = new URL(d.url).hostname; } catch { return; } + const listed = securityOn(state) ? await dangerHost(host) : null; + await record(d.tabId, listed ? 'danger' : 'blocked', listed, state); +}, { urls: [''] }); + +// Requests swapped for a local stub (GPT, gtag, analytics.js, ...) were blocked too. +chrome.webRequest.onBeforeRedirect.addListener(async (d) => { + if (d.tabId < 0 || !/^(chrome|moz)-extension:\/\/[^/]+\/resources\//.test(d.redirectUrl)) return; + await record(d.tabId, 'blocked', null, await loadState()); +}, { urls: [''] }); + +// ---- messages ----------------------------------------------------------------------- + +chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + if (!message || typeof message.type !== 'string' || sender.id !== chrome.runtime.id) return false; + const fromExtensionPage = typeof sender.url === 'string' && sender.url.startsWith(EXTENSION_ORIGIN); + + // Content scripts may say two things: "these classes/ids are on my page", and + // "I removed a nag wall". Neither changes settings. + if (!fromExtensionPage && sender.tab) { + if (message.type === 'tokens') loadState().then((s) => onTokens(message, sender, s)).catch(() => {}); + if (message.type === 'wall') loadState().then((s) => record(sender.tab.id, 'wall', null, s)).catch(() => {}); + return false; + } + + // Everything else must come from our own popup, options or warning page. + if (!fromExtensionPage) return false; + handle(message).then(sendResponse, (err) => sendResponse({ error: String(err?.message || err) })); + return true; +}); + +async function tabInfo(tabId) { + let tab; + try { tab = await chrome.tabs.get(tabId); } catch { return { supported: false }; } + let url; + try { url = new URL(tab.url || ''); } catch { return { supported: false }; } + if (!/^https?:$/.test(url.protocol)) return { supported: false }; + return { supported: true, hostname: url.hostname }; +} + +async function handle(msg) { + switch (msg.type) { + case 'popup:get': { + const [state, meta, info] = await Promise.all([loadState(), getMeta(), tabInfo(msg.tabId)]); + const out = { enabled: state.enabled, version: meta.version, ...info }; + if (info.supported) { + const status = await getStatus(msg.tabId); + out.pausedBy = allowlistEntryFor(info.hostname, state); + out.unwall = hostnameAndParents(info.hostname).some((h) => state.unwallSites.includes(h)); + out.status = { ...status, level: levelOf(status), icon: iconStateFor({ ...status, host: info.hostname }, state) }; + } + return out; + } + + case 'setEnabled': { + const state = await saveState({ enabled: Boolean(msg.enabled) }); + await applyAll(state); + return { ok: true }; + } + + case 'setSitePaused': { + const hostname = normaliseHostname(msg.hostname); + if (!hostname) throw new Error('Not a valid hostname'); + const cur = await loadState(); + // Resuming removes every entry that covers the site, so the toggle always does + // what it says even if a parent domain was paused. + const covering = new Set(hostnameAndParents(hostname)); + const allowlist = msg.paused + ? [...cur.allowlist, hostname] + : cur.allowlist.filter((h) => !covering.has(h)); + const state = await saveState({ allowlist }); + await applyAll(state, { dynamic: true, scripts: true, action: true }); + return { ok: true, pausedBy: allowlistEntryFor(hostname, state) }; + } + + case 'unwallNow': { + // Every frame: walls also turn up inside embedded players and sandboxed page frames. + await chrome.scripting.executeScript({ target: { tabId: msg.tabId, allFrames: true }, files: ['content/unwall.js'] }); + return { ok: true }; + } + + case 'setUnwallSite': { + const hostname = normaliseHostname(msg.hostname); + if (!hostname) throw new Error('Not a valid hostname'); + const cur = await loadState(); + const covering = new Set(hostnameAndParents(hostname)); + const unwallSites = msg.on ? [...cur.unwallSites, hostname] : cur.unwallSites.filter((h) => !covering.has(h)); + const state = await saveState({ unwallSites }); + await applyAll(state, { scripts: true }); + return { ok: true }; + } + + case 'security:bypass': + return { url: await bypass(msg.url) }; + + case 'settings:get': { + const [state, meta] = await Promise.all([loadState(), getMeta()]); + return { state, meta }; + } + + case 'settings:set': { + const before = await loadState(); + const state = await saveState(msg.patch || {}); + const rulesetsChanged = before.enabled !== state.enabled || JSON.stringify(before.categories) !== JSON.stringify(state.categories); + await applyAll(state, { rulesets: rulesetsChanged, dynamic: true, scripts: true, action: true }); + return { state }; + } + + case 'settings:import': { + const incoming = normalise(msg.data); + await chrome.storage.local.set(incoming); + await applyAll(incoming); + return { state: incoming }; + } + + default: + throw new Error(`Unknown message ${msg.type}`); + } +} diff --git a/src/background/popups.js b/src/background/popups.js new file mode 100644 index 0000000..d00b3eb --- /dev/null +++ b/src/background/popups.js @@ -0,0 +1,151 @@ +// Popup and tab-under blocking. DNR cannot block a popup, so this watches the tabs a page +// opens and closes any that land on a URL matched by a `$popup` filter, following the new +// tab through its first few hops (ad popups usually start at about:blank and redirect). +// +// Tab-under: the page opens itself in a new tab and sends *your* tab to the ad. If a tab +// that just opened a popup is navigated to an ad, it is sent back and the copy is closed. +import { hostnameAndParents } from '../shared/hostnames.js'; +import { loadJSON, getMeta } from './data.js'; +import { activeCategories } from './apply.js'; +import { isPaused } from './state.js'; +import { record } from './status.js'; + +const WATCH_MS = 8000; // how long a new tab is followed +const MAX_HOPS = 8; // navigations followed per new tab +const TAB_UNDER_MS = 3000; // how long after opening a popup the opener is guarded + +const watched = new Map(); // popup tabId -> { openerTabId, openerHost, until, hops } +const openers = new Map(); // opener tabId -> { url, host, popupTabId, until } + +// Registrable-domain approximation for first/third-party checks (no PSL in the worker). +const SECOND_LEVEL = new Set(['co', 'com', 'net', 'org', 'gov', 'edu', 'ac', 'id', 'asn']); +export function siteOf(host) { + const parts = host.split('.'); + if (parts.length > 2 && parts[parts.length - 1].length === 2 && SECOND_LEVEL.has(parts[parts.length - 2])) { + return parts.slice(-3).join('.'); + } + return parts.slice(-2).join('.'); +} + +let compiled = null; +let compiledKey = ''; +async function filtersFor(state) { + const meta = await getMeta(); + const cats = activeCategories(state, meta).filter((c) => meta.popups?.[c]); + const key = cats.join(','); + if (compiled && compiledKey === key) return compiled; + const c = { hosts: new Set(), hosts3p: new Set(), rules: [], allow: [] }; + const toRule = ([re, inc, exc, party]) => ({ re: new RegExp(re, 'i'), inc, exc, party }); + for (const cat of cats) { + const data = await loadJSON(`popups/${cat}.json`); + data.hosts.forEach((h) => c.hosts.add(h)); + data.hosts3p.forEach((h) => c.hosts3p.add(h)); + c.rules.push(...data.rules.map(toRule)); + c.allow.push(...data.allow.map(toRule)); + } + compiled = c; + compiledKey = key; + return c; +} + +function ruleMatches(r, url, host, openerHost) { + if (!r.re.test(url)) return false; + const openerChain = hostnameAndParents(openerHost); + if (r.inc.length && !openerChain.some((h) => r.inc.includes(h))) return false; + if (r.exc.length && openerChain.some((h) => r.exc.includes(h))) return false; + if (r.party === 3 && siteOf(host) === siteOf(openerHost)) return false; + if (r.party === 1 && siteOf(host) !== siteOf(openerHost)) return false; + return true; +} + +export async function isAdPopup(url, openerHost, state) { + if (!/^https?:/i.test(url)) return false; + const c = await filtersFor(state); + const host = new URL(url).hostname; + if (c.allow.some((r) => ruleMatches(r, url, host, openerHost))) return false; + const chain = hostnameAndParents(host); + if (chain.some((h) => c.hosts.has(h))) return true; + if (siteOf(host) !== siteOf(openerHost) && chain.some((h) => c.hosts3p.has(h))) return true; + return c.rules.some((r) => ruleMatches(r, url, host, openerHost)); +} + +function hostOf(url) { + try { return new URL(url).hostname; } catch { return ''; } +} + +async function topUrl(tabId) { + try { return (await chrome.webNavigation.getFrame({ tabId, frameId: 0 })).url; } catch { return ''; } +} + +// Last committed http(s) URL per tab. Kept synchronously from onCommitted so a popup's +// opener can be registered before any await: a tab-under sends the opener to the ad +// immediately after window.open, and an async lookup here would lose that race. +const lastCommitted = new Map(); +export function noteCommitted(tabId, url) { lastCommitted.set(tabId, url); } +export function lastUrlOf(tabId) { return lastCommitted.get(tabId) || ''; } + +function register(d, openerUrl) { + const now = Date.now(); + const openerHost = hostOf(openerUrl); + watched.set(d.tabId, { openerTabId: d.sourceTabId, openerHost, until: now + WATCH_MS, hops: 0 }); + openers.set(d.sourceTabId, { url: openerUrl, host: openerHost, popupTabId: d.tabId, until: now + TAB_UNDER_MS }); +} + +export async function onCreatedNavigationTarget(d, statePromise) { + let openerUrl = lastCommitted.get(d.sourceTabId) || ''; + if (/^https?:/i.test(openerUrl)) register(d, openerUrl); // synchronous, before any await + const state = await statePromise; + if (!openerUrl) { + openerUrl = await topUrl(d.sourceTabId); // worker was asleep: ask the browser + if (/^https?:/i.test(openerUrl)) register(d, openerUrl); + } + const openerHost = hostOf(openerUrl); + if (!state.enabled || !/^https?:/i.test(openerUrl) || !openerHost || isPaused(openerHost, state)) { + watched.delete(d.tabId); + openers.delete(d.sourceTabId); + return; + } + await onTopNavigation(d.tabId, d.url, state); +} + +// Called for every top-level navigation (before it starts, and when it commits, which also +// catches server-side redirects). +export async function onTopNavigation(tabId, url, state) { + const w = watched.get(tabId); + if (w) { + if (Date.now() > w.until || ++w.hops > MAX_HOPS) { + watched.delete(tabId); + } else if (await isAdPopup(url, w.openerHost, state)) { + watched.delete(tabId); + await chrome.tabs.remove(tabId).catch(() => {}); + await record(w.openerTabId, 'popup', null, state); + return; + } + } + + const o = openers.get(tabId); + if (!o) return; + if (Date.now() > o.until) { openers.delete(tabId); return; } + if (url === o.url || !(await isAdPopup(url, o.host, state))) return; + openers.delete(tabId); + await chrome.tabs.update(tabId, { url: o.url }).catch(() => {}); + setTimeout(() => { record(tabId, 'popup', null, state); }, 1500); // after the restored page resets its status + // The popup is usually the page itself, opened so it survives the redirect. Close it. + const popup = await chrome.tabs.get(o.popupTabId).catch(() => null); + if (popup && hostOf(popup.pendingUrl || popup.url) === o.host) await chrome.tabs.remove(popup.id).catch(() => {}); +} + +// A watched popup whose navigation DNR blocked outright is just an error page: close it. +export async function onNavigationError(d, state) { + if (d.frameId !== 0 || !watched.has(d.tabId) || !/BLOCKED_BY_CLIENT/.test(d.error || '')) return; + const w = watched.get(d.tabId); + watched.delete(d.tabId); + await chrome.tabs.remove(d.tabId).catch(() => {}); + if (state) await record(w.openerTabId, 'popup', null, state); +} + +export function forgetPopupTab(tabId) { + watched.delete(tabId); + openers.delete(tabId); + lastCommitted.delete(tabId); +} diff --git a/src/background/security.js b/src/background/security.js new file mode 100644 index 0000000..e080316 --- /dev/null +++ b/src/background/security.js @@ -0,0 +1,93 @@ +// Malware, phishing and scam protection. +// +// Hosts on the security lists are blocked by DNR at priority 2000, above list exceptions +// and above a user's pause (1000): pausing a site is about ads, not safety. The ~35k +// individual page URLs from the phishing and URLhaus lists are too many for DNR, so top-level +// navigations are checked against them here. Either way the tab is sent to a warning page, +// where the user can go back or continue for the rest of the browser session. +import { hostnameAndParents } from '../shared/hostnames.js'; +import { pathMatches } from '../shared/url-match.js'; +import { loadJSON } from './data.js'; + +const BYPASS_KEY = 'secBypass'; +const BYPASS_RULE_BASE = 900000; + +let hostSet = null; +async function hosts() { + if (!hostSet) hostSet = loadJSON('security/hosts.json').then((list) => new Set(list)); + return hostSet; +} + +export function securityOn(settings) { + return settings.enabled && settings.categories.security !== false; +} + +// The listed host covering `hostname`, or null. +export async function dangerHost(hostname) { + const set = await hosts(); + // Never match on a bare TLD, whatever the data says: that would flag every site in it. + for (const h of hostnameAndParents(hostname)) if (h.includes('.') && set.has(h)) return h; + return null; +} + +async function dangerPage(url) { + let u; + try { u = new URL(url); } catch { return null; } + const host = await dangerHost(u.hostname); + if (host) return host; + const urls = await loadJSON('security/urls.json'); + const path = u.pathname + u.search; + for (const h of hostnameAndParents(u.hostname)) { + const prefixes = urls[h]; + if (prefixes && prefixes.some((p) => pathMatches(path, p))) return u.hostname; + } + return null; +} + +async function bypassed(hostname) { + const list = (await chrome.storage.session.get(BYPASS_KEY))[BYPASS_KEY] || []; + return hostnameAndParents(hostname).some((h) => list.includes(h)); +} + +export function warningUrl(url, host, back = '') { + const b = /^https?:/i.test(back) ? `&b=${encodeURIComponent(back)}` : ''; + return chrome.runtime.getURL(`warning/warning.html?u=${encodeURIComponent(url)}&h=${encodeURIComponent(host)}${b}`); +} + +const recentlyWarned = new Map(); // tabId -> url, so the DNR backstop doesn't warn twice + +// Called for top-level navigations before they start. Returns the listed host if the tab +// was sent to the warning page. +// `back` is the page the tab was on, for the warning page's "Back to safety". +export async function checkNavigation(tabId, url, settings, back = '') { + if (!securityOn(settings) || !/^https?:/i.test(url)) return null; + const host = await dangerPage(url); + if (!host || await bypassed(new URL(url).hostname)) return null; + if (recentlyWarned.get(tabId) === url) return host; + recentlyWarned.set(tabId, url); + setTimeout(() => { if (recentlyWarned.get(tabId) === url) recentlyWarned.delete(tabId); }, 5000); + await chrome.tabs.update(tabId, { url: warningUrl(url, host, back) }).catch(() => {}); + return host; +} + +// "Continue anyway": allow the host (and its subdomains) until the browser closes. +export async function bypass(url) { + let u; + try { u = new URL(url); } catch { throw new Error('Not a valid URL'); } + if (!/^https?:$/.test(u.protocol)) throw new Error('Not a web page'); + const host = u.hostname; + const list = (await chrome.storage.session.get(BYPASS_KEY))[BYPASS_KEY] || []; + if (!list.includes(host)) list.push(host); + await chrome.storage.session.set({ [BYPASS_KEY]: list }); + const existing = await chrome.declarativeNetRequest.getSessionRules(); + await chrome.declarativeNetRequest.updateSessionRules({ + removeRuleIds: existing.map((r) => r.id), + addRules: [{ + id: BYPASS_RULE_BASE, + priority: 3000, + action: { type: 'allowAllRequests' }, + condition: { requestDomains: list, resourceTypes: ['main_frame', 'sub_frame'] }, + }], + }); + return url; +} diff --git a/src/background/state.js b/src/background/state.js new file mode 100644 index 0000000..7e8a5bf --- /dev/null +++ b/src/background/state.js @@ -0,0 +1,105 @@ +// Persistent settings. One normalised shape, validated on every read and write. +// +// v1 wiped settings on every extension AND browser update (onInstalled reset them +// unconditionally). Here install writes defaults only when nothing is stored, and update +// migrates in place. +import { normaliseHostname } from '../shared/hostnames.js'; + +export const SCHEMA = 2; + +export const TOGGLEABLE = ['ads', 'privacy', 'annoyances', 'security']; + +export function defaults() { + return { + schema: SCHEMA, + enabled: true, + allowlist: [], + categories: { ads: true, privacy: true, annoyances: true, security: true }, + unwallSites: [], + badge: false, + statusIcon: true, + }; +} + +function hostList(value) { + if (!Array.isArray(value)) return []; + const out = new Set(); + for (const v of value) { + const h = normaliseHostname(v); + if (h) out.add(h); + } + return [...out].sort(); +} + +export function normalise(raw) { + const d = defaults(); + const r = raw && typeof raw === 'object' ? raw : {}; + const categories = { ...d.categories }; + if (r.categories && typeof r.categories === 'object') { + for (const c of TOGGLEABLE) if (typeof r.categories[c] === 'boolean') categories[c] = r.categories[c]; + } + return { + schema: SCHEMA, + enabled: typeof r.enabled === 'boolean' ? r.enabled : d.enabled, + allowlist: hostList(r.allowlist), + categories, + unwallSites: hostList(r.unwallSites), + badge: typeof r.badge === 'boolean' ? r.badge : d.badge, + statusIcon: typeof r.statusIcon === 'boolean' ? r.statusIcon : d.statusIcon, + }; +} + +// Cached: the worker reads settings on every blocked request, so keep a copy and drop it +// whenever storage changes. +let cached = null; +chrome.storage.onChanged.addListener((_changes, area) => { if (area === 'local') cached = null; }); + +export async function loadState() { + if (!cached) cached = chrome.storage.local.get(null).then(normalise); + return cached; +} + +export async function saveState(patch) { + const next = normalise({ ...(await loadState()), ...patch }); + await chrome.storage.local.set(next); + cached = Promise.resolve(next); + return next; +} + +// Called from runtime.onInstalled for every reason (install, update, browser update). +export async function migrate() { + const raw = await chrome.storage.local.get(null); + if (raw.schema === SCHEMA) { + // Still normalise, in case an older build of this schema wrote something odd. + await chrome.storage.local.set(normalise(raw)); + return; + } + // v1.x stored { enabled, disabledSites, updateAvailable, updateUrl }. + const next = normalise({ + enabled: raw.enabled, + allowlist: raw.allowlist || raw.disabledSites, + categories: raw.categories, + unwallSites: raw.unwallSites, + badge: raw.badge, + statusIcon: raw.statusIcon, + }); + await chrome.storage.local.clear(); + await chrome.storage.local.set(next); +} + +// Allowlisting a hostname covers its subdomains, matching DNR `requestDomains` and the +// `*://*.host/*` match patterns used for content scripts. +export function allowlistEntryFor(hostname, state) { + if (!hostname) return null; + let h = hostname; + for (;;) { + if (state.allowlist.includes(h)) return h; + const i = h.indexOf('.'); + if (i === -1) return null; + h = h.slice(i + 1); + } +} + +export function isPaused(hostname, state) { + return allowlistEntryFor(hostname, state) !== null; +} diff --git a/src/background/status.js b/src/background/status.js new file mode 100644 index 0000000..6662322 --- /dev/null +++ b/src/background/status.js @@ -0,0 +1,107 @@ +// Per-tab page status. It drives the toolbar icon colour and the popup's status line. +// +// idle nothing on this page needed blocking (slate blue, also the brand colour) +// protected ads or trackers blocked (jade) +// caution a pushy site: pop-under, tab-under or nag wall dealt with (amber) +// danger a known malware, phishing or scam host (garnet) +// paused site paused or protection off (grey) +// +// Counts come from watching requests fail with ERR_BLOCKED_BY_CLIENT (webRequest, read-only) +// and from redirects to our stubs, so they are live and need no activeTab grant. They are +// kept in memory and mirrored to storage.session, because the worker can stop mid-page. +import { isPaused } from './state.js'; + +const RANK = { idle: 0, protected: 1, caution: 2, danger: 3 }; +const tabs = new Map(); // tabId -> status +const painted = new Map(); // tabId -> icon state last set +const flushTimers = new Map(); + +function blank(host = '') { + return { host, blocked: 0, popups: 0, walls: 0, danger: 0, dangerHosts: [] }; +} + +export function levelOf(s) { + if (s.danger) return 'danger'; + if (s.popups || s.walls) return 'caution'; + if (s.blocked) return 'protected'; + return 'idle'; +} + +export function iconPaths(state) { + return Object.fromEntries([16, 32, 48, 128].map((n) => [n, `/icons/${state}-${n}.png`])); +} + +// What the icon shows for a tab, given settings. Paused and off always win; with the status +// colours switched off the icon stays slate blue. +export function iconStateFor(status, settings) { + if (!settings.enabled || (status.host && isPaused(status.host, settings))) return 'paused'; + if (!settings.statusIcon) return 'idle'; + return levelOf(status); +} + +async function load(tabId) { + if (tabs.has(tabId)) return tabs.get(tabId); + const key = `st:${tabId}`; + const saved = (await chrome.storage.session.get(key))[key]; + const s = saved || blank(); + tabs.set(tabId, s); + return s; +} + +function persist(tabId) { + if (flushTimers.has(tabId)) return; + flushTimers.set(tabId, setTimeout(() => { + flushTimers.delete(tabId); + const s = tabs.get(tabId); + if (s) chrome.storage.session.set({ [`st:${tabId}`]: s }).catch(() => {}); + }, 300)); +} + +export async function paint(tabId, settings) { + const s = await load(tabId); + const state = iconStateFor(s, settings); + if (painted.get(tabId) === state) return; + painted.set(tabId, state); + const title = { idle: 'SilentBlock', protected: 'SilentBlock: protected', caution: 'SilentBlock: pushy site handled', danger: 'SilentBlock: dangerous content blocked', paused: 'SilentBlock: paused' }[state]; + await chrome.action.setIcon({ tabId, path: iconPaths(state) }).catch(() => {}); + await chrome.action.setTitle({ tabId, title }).catch(() => {}); +} + +// A new top-level document: counts start again. +export async function resetTab(tabId, host, settings) { + tabs.set(tabId, blank(host)); + painted.delete(tabId); + persist(tabId); + await paint(tabId, settings); +} + +export async function record(tabId, kind, detail, settings) { + if (tabId < 0) return; + const s = await load(tabId); + if (kind === 'blocked') s.blocked++; + else if (kind === 'popup') s.popups++; + else if (kind === 'wall') s.walls++; + else if (kind === 'danger') { + s.danger++; + if (detail && !s.dangerHosts.includes(detail) && s.dangerHosts.length < 10) s.dangerHosts.push(detail); + } + persist(tabId); + if (RANK[levelOf(s)] >= RANK.protected) await paint(tabId, settings); +} + +export async function getStatus(tabId) { + return { ...(await load(tabId)) }; +} + +export function forgetStatus(tabId) { + tabs.delete(tabId); + painted.delete(tabId); + chrome.storage.session.remove(`st:${tabId}`).catch(() => {}); +} + +// Settings changed (pause, off, status colours): repaint what is on screen. +export async function repaintAll(settings) { + painted.clear(); + const open = await chrome.tabs.query({}); + await Promise.all(open.map((t) => paint(t.id, settings))); +} diff --git a/src/content/facebook.js b/src/content/facebook.js new file mode 100644 index 0000000..38e5c83 --- /dev/null +++ b/src/content/facebook.js @@ -0,0 +1,85 @@ +// Hides sponsored posts in the Facebook feed. +// +// Facebook scrambles the "Sponsored" label (split spans, invisible characters, CSS-hidden +// decoy letters), so this uses structural markers first and reads rendered text only for +// posts it has not judged yet. v1 re-scanned every span on the page, with a layout call +// each, on every mutation, every 2s and every scroll. +(() => { + 'use strict'; + if (globalThis.__silentblockFacebook) return; + globalThis.__silentblockFacebook = true; + + const LABELS = new Set([ + 'sponsored', 'gesponsert', 'sponsorisé', 'sponsorisée', 'patrocinado', 'patrocinada', 'sponsorizzato', + 'gesponsord', 'sponsrad', 'sponsoreret', 'sponset', 'sponsoroitu', 'sponsorowane', 'реклама', '広告', + '赞助内容', '贊助', '광고', 'sponzorováno', 'hirdetés', 'χορηγούμενη', 'reklam', 'bersponsor', + ]); + const INVISIBLE = /[­͏؜ᅟᅠ឴឵᠎​-‏‪-‮⁠-⁤-ㅤᅠ\s]/g; + const MARKERS = [ + 'a[href*="/ads/about"]', + 'a[href*="/ad_center/"]', + 'a[attributionsrc*="privacy_sandbox"]', + '[aria-label="Sponsored"]', + ].join(','); + const POST_SELECTOR = '[role="feed"] > div, div[data-pagelet^="FeedUnit"], [role="article"]'; + + const hidden = new WeakSet(); + const lastChecked = new WeakMap(); + + function postOf(el) { + let node = el; + for (let depth = 0; node && node !== document.body && depth < 40; depth++) { + const parent = node.parentElement; + if (parent && parent.getAttribute('role') === 'feed') return node; + const pagelet = node.getAttribute && node.getAttribute('data-pagelet'); + if (pagelet && pagelet.startsWith('FeedUnit')) return node; + node = parent; + } + return null; // no structural marker: never guess, or we might hide the whole feed + } + + function isLabel(el) { + const text = (el.innerText || '').replace(INVISIBLE, '').toLowerCase(); + return text.length > 0 && text.length < 24 && LABELS.has(text); + } + + function judge(post) { + if (hidden.has(post)) return; + const now = Date.now(); + if (now - (lastChecked.get(post) || 0) < 800) return; + lastChecked.set(post, now); + let sponsored = post.querySelector(MARKERS) !== null; + if (!sponsored) { + // The label sits in the post header, among the first few links. + const candidates = post.querySelectorAll('a[role="link"], span[dir="auto"] > span, a[href="#"]'); + for (let i = 0; i < candidates.length && i < 30 && !sponsored; i++) sponsored = isLabel(candidates[i]); + } + if (sponsored) { + hidden.add(post); + post.style.setProperty('display', 'none', 'important'); + } + } + + const queue = new Set(); + let scheduled = false; + const run = () => { + scheduled = false; + for (const post of queue) judge(post); + queue.clear(); + }; + const enqueue = (node) => { + if (node.nodeType !== 1) return; + const own = postOf(node); + if (own) queue.add(own); + else for (const p of node.querySelectorAll(POST_SELECTOR)) { const post = postOf(p) || p; queue.add(post); } + if (!scheduled && queue.size) { + scheduled = true; + (window.requestIdleCallback || setTimeout)(run, { timeout: 300 }); + } + }; + + new MutationObserver((records) => { + for (const r of records) for (const n of r.addedNodes) enqueue(n); + }).observe(document.body || document.documentElement, { childList: true, subtree: true }); + enqueue(document.body || document.documentElement); +})(); diff --git a/src/content/generic.js b/src/content/generic.js new file mode 100644 index 0000000..8da98f2 --- /dev/null +++ b/src/content/generic.js @@ -0,0 +1,67 @@ +// Reports the class and id tokens present in this frame to the service worker, which +// answers by injecting CSS for the ones our generic filters target. +// +// This replaces shipping ~28k generic selectors as a stylesheet into every frame. The +// only work here is collecting new tokens; matching and CSS happen in the worker. +(() => { + 'use strict'; + if (globalThis.__silentblockTokens) return; + globalThis.__silentblockTokens = true; + + const seen = new Set(); + let pending = []; + let timer = 0; + let dead = false; + let observer; + + const push = (t) => { + if (seen.has(t)) return; + seen.add(t); + pending.push(t); + }; + + const collect = (el) => { + const id = el.id; + if (id && typeof id === 'string') push('#' + id); + const cl = el.classList; + if (cl) for (let i = 0; i < cl.length; i++) push('.' + cl[i]); + }; + + const scan = (root) => { + if (root.nodeType !== 1) return; + collect(root); + const els = root.querySelectorAll('[id],[class]'); + for (let i = 0; i < els.length; i++) collect(els[i]); + }; + + const flush = () => { + timer = 0; + if (!pending.length || dead) return; + const tokens = pending; + pending = []; + try { + chrome.runtime.sendMessage({ type: 'tokens', tokens }).catch(() => {}); + } catch { + // Extension reloaded or removed: this copy is orphaned, stop working. + dead = true; + observer?.disconnect(); + } + }; + + // First batch goes quickly so ads are hidden near first paint; later ones are batched. + const schedule = () => { + if (!timer) timer = setTimeout(flush, seen.size < 3000 ? 40 : 250); + }; + + observer = new MutationObserver((records) => { + for (const r of records) { + if (r.type === 'attributes') collect(r.target); + else for (const n of r.addedNodes) if (n.nodeType === 1) scan(n); + } + if (pending.length) schedule(); + }); + observer.observe(document, { childList: true, subtree: true, attributes: true, attributeFilter: ['class', 'id'] }); + + if (document.documentElement) scan(document.documentElement); + if (pending.length) schedule(); +})(); diff --git a/src/icons/caution-128.png b/src/icons/caution-128.png new file mode 100644 index 0000000..26588ee Binary files /dev/null and b/src/icons/caution-128.png differ diff --git a/src/icons/caution-16.png b/src/icons/caution-16.png new file mode 100644 index 0000000..e1da83c Binary files /dev/null and b/src/icons/caution-16.png differ diff --git a/src/icons/caution-32.png b/src/icons/caution-32.png new file mode 100644 index 0000000..91fff59 Binary files /dev/null and b/src/icons/caution-32.png differ diff --git a/src/icons/caution-48.png b/src/icons/caution-48.png new file mode 100644 index 0000000..d38748a Binary files /dev/null and b/src/icons/caution-48.png differ diff --git a/src/icons/danger-128.png b/src/icons/danger-128.png new file mode 100644 index 0000000..15e4a41 Binary files /dev/null and b/src/icons/danger-128.png differ diff --git a/src/icons/danger-16.png b/src/icons/danger-16.png new file mode 100644 index 0000000..fadf8c3 Binary files /dev/null and b/src/icons/danger-16.png differ diff --git a/src/icons/danger-32.png b/src/icons/danger-32.png new file mode 100644 index 0000000..3caf159 Binary files /dev/null and b/src/icons/danger-32.png differ diff --git a/src/icons/danger-48.png b/src/icons/danger-48.png new file mode 100644 index 0000000..2f0591a Binary files /dev/null and b/src/icons/danger-48.png differ diff --git a/src/icons/idle-128.png b/src/icons/idle-128.png new file mode 100644 index 0000000..8b10a58 Binary files /dev/null and b/src/icons/idle-128.png differ diff --git a/src/icons/idle-16.png b/src/icons/idle-16.png new file mode 100644 index 0000000..a8a923c Binary files /dev/null and b/src/icons/idle-16.png differ diff --git a/src/icons/idle-32.png b/src/icons/idle-32.png new file mode 100644 index 0000000..1f0002e Binary files /dev/null and b/src/icons/idle-32.png differ diff --git a/src/icons/idle-48.png b/src/icons/idle-48.png new file mode 100644 index 0000000..979f585 Binary files /dev/null and b/src/icons/idle-48.png differ diff --git a/src/icons/paused-128.png b/src/icons/paused-128.png new file mode 100644 index 0000000..422f73e Binary files /dev/null and b/src/icons/paused-128.png differ diff --git a/src/icons/paused-16.png b/src/icons/paused-16.png new file mode 100644 index 0000000..d694a5f Binary files /dev/null and b/src/icons/paused-16.png differ diff --git a/src/icons/paused-32.png b/src/icons/paused-32.png new file mode 100644 index 0000000..ab88f10 Binary files /dev/null and b/src/icons/paused-32.png differ diff --git a/src/icons/paused-48.png b/src/icons/paused-48.png new file mode 100644 index 0000000..506df9d Binary files /dev/null and b/src/icons/paused-48.png differ diff --git a/src/icons/protected-128.png b/src/icons/protected-128.png new file mode 100644 index 0000000..30fbfb4 Binary files /dev/null and b/src/icons/protected-128.png differ diff --git a/src/icons/protected-16.png b/src/icons/protected-16.png new file mode 100644 index 0000000..f3c34a1 Binary files /dev/null and b/src/icons/protected-16.png differ diff --git a/src/icons/protected-32.png b/src/icons/protected-32.png new file mode 100644 index 0000000..5696659 Binary files /dev/null and b/src/icons/protected-32.png differ diff --git a/src/icons/protected-48.png b/src/icons/protected-48.png new file mode 100644 index 0000000..5c6c1c4 Binary files /dev/null and b/src/icons/protected-48.png differ diff --git a/src/manifest.json b/src/manifest.json new file mode 100644 index 0000000..1604c66 --- /dev/null +++ b/src/manifest.json @@ -0,0 +1,52 @@ +{ + "manifest_version": 3, + "name": "SilentBlock", + "version": "0.0.0", + "description": "Free, silent ad blocker. No ads, no nags, no subscriptions. Ever.", + "minimum_chrome_version": "120", + "permissions": [ + "declarativeNetRequest", + "scripting", + "storage", + "webNavigation", + "webRequest" + ], + "host_permissions": [ + "" + ], + "background": { + "service_worker": "background/main.js", + "type": "module" + }, + "action": { + "default_popup": "popup/popup.html", + "default_title": "SilentBlock", + "default_icon": { + "16": "icons/idle-16.png", + "32": "icons/idle-32.png", + "48": "icons/idle-48.png", + "128": "icons/idle-128.png" + } + }, + "options_ui": { + "page": "options/options.html", + "open_in_tab": true + }, + "icons": { + "16": "icons/idle-16.png", + "32": "icons/idle-32.png", + "48": "icons/idle-48.png", + "128": "icons/idle-128.png" + }, + "web_accessible_resources": [ + { + "resources": [ + "resources/*" + ], + "matches": [ + "" + ], + "use_dynamic_url": true + } + ] +} diff --git a/src/options/options.css b/src/options/options.css new file mode 100644 index 0000000..65f55a5 --- /dev/null +++ b/src/options/options.css @@ -0,0 +1,40 @@ +body { padding: 24px 16px 48px; font-size: 14px; } +.wrap { max-width: 720px; margin: 0 auto; display: flex; flex-direction: column; gap: 16px; } + +.top { display: flex; align-items: center; gap: 12px; } +.top .shield { flex: none; display: block; } +h1 { margin: 0; font-size: 22px; } +h2 { margin: 0 0 2px; font-size: 15px; } +.top .hint { margin: 2px 0 0; } + +.card { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius); padding: 16px; box-shadow: var(--shadow); } +.card > .hint { margin: 0 0 12px; } +.card .hint { margin-top: 0; } +.row { display: flex; align-items: center; justify-content: space-between; gap: 16px; } +.row p { margin: 0; } +.note { margin: 12px 0 0 !important; } + +#categories { margin-top: 12px; border-top: 1px solid var(--line); } +.cat { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 0; border-bottom: 1px solid var(--line); } +.cat:last-child { border-bottom: 0; } +.cat .meta { color: var(--muted); font-size: 12px; margin-top: 2px; } + +.add { display: flex; gap: 8px; } +.add input { flex: 1; min-width: 0; padding: 7px 10px; border: 1px solid var(--line); border-radius: 8px; background: var(--bg); } +.error { color: var(--danger); margin: 8px 0 0; font-size: 13px; } + +.list { list-style: none; margin: 12px 0 0; padding: 0; border: 1px solid var(--line); border-radius: 8px; } +.list:empty::before { content: "None yet."; display: block; padding: 10px 12px; color: var(--muted); } +.list li { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 6px 6px 6px 12px; border-bottom: 1px solid var(--line); word-break: break-all; } +.list li:last-child { border-bottom: 0; } +.list button { flex: none; border: 0; background: none; color: var(--danger); cursor: pointer; padding: 4px 8px; border-radius: 6px; font-weight: 600; } +.list button:hover { background: var(--bg); } + +.buttons { display: flex; flex-wrap: wrap; gap: 8px; } + +.table-wrap { overflow-x: auto; } +.lists { width: 100%; border-collapse: collapse; font-size: 13px; } +.lists th, .lists td { text-align: left; padding: 7px 8px; border-bottom: 1px solid var(--line); white-space: nowrap; } +.lists th { color: var(--muted); font-weight: 600; } +.lists td:first-child { white-space: normal; } +#ruleSummary { margin: 12px 0 0; } diff --git a/src/options/options.html b/src/options/options.html new file mode 100644 index 0000000..fff4012 --- /dev/null +++ b/src/options/options.html @@ -0,0 +1,94 @@ + + + + + + SilentBlock settings + + + + +
+
+ +
+

SilentBlock

+

 

+
+
+ +
+
+
+

Protection

+

Turns every filter on or off, everywhere.

+
+ +
+
+

Changes apply to pages as they load. Reload open tabs to see them.

+
+ +
+

Paused sites

+

SilentBlock does nothing on these sites or their subdomains. Pausing is also the fix when a site breaks.

+
+ + +
+ +
    +
    + +
    +

    Nag-wall sites

    +

    On these sites SilentBlock watches for "turn off your ad blocker" walls and removes them as the page loads. Add one from the popup with "Always on this site".

    +
      +
      + +
      +
      +
      +

      Colour the icon by page status

      +

      Blue: nothing to block. Green: ads and trackers blocked. Amber: a pushy site, pop-ups or nag walls stopped. Red: malware or scam hosts blocked. Grey: paused. Off keeps the icon blue.

      +
      + +
      +
      + +
      +
      +
      +

      Show count on icon

      +

      Show the number of blocked requests on the toolbar icon.

      +
      + +
      +
      + +
      +

      Backup

      +

      Settings live only in this browser. Export them to move to another browser or keep a copy.

      +
      + + + +
      +

      +
      + +
      +

      Filter lists

      +

      Lists are bundled with each release and never downloaded at runtime.

      +
      + + + +
      ListCategorySnapshotLicense
      +
      +

      +
      +
      + + + diff --git a/src/options/options.js b/src/options/options.js new file mode 100644 index 0000000..baa5ffa --- /dev/null +++ b/src/options/options.js @@ -0,0 +1,130 @@ +// Options page. Every change goes through the service worker, which validates it. +import { normaliseHostname } from '../shared/hostnames.js'; + +const $ = (id) => document.getElementById(id); + +async function send(message) { + const res = await chrome.runtime.sendMessage(message); + if (res && res.error) throw new Error(res.error); + return res; +} + +let state; +let meta; + +function el(tag, props = {}, ...children) { + const node = document.createElement(tag); + Object.assign(node, props); + for (const c of children) node.append(c); + return node; +} + +function fmtDate(iso) { + if (!iso) return '-'; + return new Date(iso).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' }); +} + +function renderCategories() { + const box = $('categories'); + box.replaceChildren(); + for (const [id, cat] of Object.entries(meta.categories)) { + if (cat.alwaysOn) continue; + const input = el('input', { type: 'checkbox', checked: state.categories[id], disabled: !state.enabled }); + input.setAttribute('aria-label', cat.title); + input.addEventListener('change', () => save({ categories: { ...state.categories, [id]: input.checked } })); + const rules = meta.rulesets[id]; + const cos = meta.cosmetic[id]; + const detail = `${rules.rules.toLocaleString()} network rules, ${(rules.domains).toLocaleString()} domains, ${(cos.tokens + cos.complex).toLocaleString()} generic and ${cos.specificHosts.toLocaleString()} site-specific hiding rules`; + box.append(el('div', { className: 'cat' }, + el('div', {}, el('div', { className: 'label', textContent: cat.title }), el('div', { className: 'hint', textContent: cat.description }), el('div', { className: 'meta', textContent: detail })), + el('label', { className: 'switch' }, input, el('span')), + )); + } +} + +function renderList(listId, hosts, onRemove) { + const ul = $(listId); + ul.replaceChildren(); + for (const h of hosts) { + const btn = el('button', { type: 'button', textContent: 'Remove' }); + btn.setAttribute('aria-label', `Remove ${h}`); + btn.addEventListener('click', () => onRemove(h)); + ul.append(el('li', {}, el('span', { textContent: h }), btn)); + } +} + +function render() { + $('subtitle').textContent = `Version ${meta.version}, lists built ${fmtDate(meta.builtAt)}`; + $('enabled').checked = state.enabled; + $('badge').checked = state.badge; + $('statusIcon').checked = state.statusIcon; + renderCategories(); + renderList('pausedList', state.allowlist, (h) => save({ allowlist: state.allowlist.filter((x) => x !== h) })); + renderList('unwallList', state.unwallSites, (h) => save({ unwallSites: state.unwallSites.filter((x) => x !== h) })); + + const rows = $('listRows'); + rows.replaceChildren(); + for (const l of meta.lists) { + const name = l.url ? el('a', { href: l.url, textContent: l.title, target: '_blank', rel: 'noreferrer' }) : l.title; + rows.append(el('tr', {}, + el('td', {}, name), + el('td', { textContent: meta.categories[l.category].title }), + el('td', { textContent: l.snapshot ? fmtDate(l.snapshot) : (l.url ? '-' : 'built in') }), + el('td', { textContent: l.license || '-' }), + )); + } + const total = Object.values(meta.rulesets).reduce((n, r) => n + r.rules, 0); + $('ruleSummary').textContent = `${total.toLocaleString()} network rules across ${Object.keys(meta.rulesets).length} rulesets.`; +} + +async function save(patch) { + ({ state } = await send({ type: 'settings:set', patch })); + render(); +} + +$('enabled').addEventListener('change', (e) => save({ enabled: e.target.checked })); +$('badge').addEventListener('change', (e) => save({ badge: e.target.checked })); +$('statusIcon').addEventListener('change', (e) => save({ statusIcon: e.target.checked })); + +$('addPaused').addEventListener('submit', async (e) => { + e.preventDefault(); + const input = $('pausedInput'); + const host = normaliseHostname(input.value); + const err = $('pausedError'); + if (!host) { + err.textContent = 'Enter a site like example.com'; + err.hidden = false; + return; + } + err.hidden = true; + input.value = ''; + await save({ allowlist: [...state.allowlist, host] }); +}); + +$('export').addEventListener('click', () => { + const data = { silentblock: meta.version, exportedAt: new Date().toISOString(), ...state }; + const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' }); + const a = el('a', { href: URL.createObjectURL(blob), download: `silentblock-settings-${new Date().toISOString().slice(0, 10)}.json` }); + a.click(); + setTimeout(() => URL.revokeObjectURL(a.href), 1000); + $('backupStatus').textContent = 'Exported.'; +}); + +$('importFile').addEventListener('change', async (e) => { + const file = e.target.files[0]; + e.target.value = ''; + if (!file) return; + try { + const data = JSON.parse(await file.text()); + if (!data || typeof data !== 'object' || !('allowlist' in data || 'enabled' in data)) throw new Error('not a SilentBlock settings file'); + ({ state } = await send({ type: 'settings:import', data })); + render(); + $('backupStatus').textContent = `Imported ${state.allowlist.length} paused site(s).`; + } catch (err) { + $('backupStatus').textContent = `Import failed: ${err.message}`; + } +}); + +({ state, meta } = await send({ type: 'settings:get' })); +render(); +requestAnimationFrame(() => requestAnimationFrame(() => document.documentElement.classList.add('animate'))); diff --git a/src/popup/popup.css b/src/popup/popup.css new file mode 100644 index 0000000..2dcc974 --- /dev/null +++ b/src/popup/popup.css @@ -0,0 +1,48 @@ +body { width: 300px; } +.popup { display: flex; flex-direction: column; background: var(--panel); } +.popup[data-state="loading"] { visibility: hidden; } + +.head { display: flex; align-items: center; gap: 8px; padding: 12px 14px; border-bottom: 1px solid var(--line); } +.shield { display: block; } +.brand { font-weight: 700; font-size: 14px; } +.version { margin-left: auto; color: var(--muted); font-size: 11px; } + +.row { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 14px; } +.site { border-top: 1px solid var(--line); padding-top: 10px; } +.host { padding: 0 14px; font-size: 13px; font-weight: 600; word-break: break-all; } +.site .row { padding-top: 6px; } +.popup[data-paused="true"] #siteHint { color: var(--paused); } +.reload { margin: 0 14px 12px; } + +.stat { display: flex; flex-direction: column; gap: 6px; padding: 12px 14px; border-top: 1px solid var(--line); } +.count { display: flex; align-items: baseline; gap: 8px; } +.num { font-size: 22px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--level); } +.cap { font-size: 12px; color: var(--muted); } +.status-line { margin: 0; display: flex; align-items: flex-start; gap: 7px; font-size: 12px; line-height: 1.4; } +.status-line .dot { flex: none; width: 8px; height: 8px; margin-top: 4px; border-radius: 50%; background: var(--level); } +/* Level colours match the toolbar icon. */ +.popup { --level: #4A6FA5; } +.popup[data-level="protected"] { --level: #15986A; } +.popup[data-level="caution"] { --level: #C9820F; } +.popup[data-level="danger"] { --level: #A4243B; } +@media (prefers-color-scheme: dark) { + .popup { --level: #7D9FD3; } + .popup[data-level="protected"] { --level: #3CC48F; } + .popup[data-level="caution"] { --level: #F0B042; } + .popup[data-level="danger"] { --level: #F07A8E; } +} + +.actions { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 12px 14px; border-top: 1px solid var(--line); } +.check { display: inline-flex; align-items: center; gap: 6px; color: var(--muted); cursor: pointer; } +.check input { margin: 0; accent-color: var(--accent); } + +.foot { padding: 10px 14px; border-top: 1px solid var(--line); background: var(--bg); } +.foot a { text-decoration: none; font-weight: 600; } +.foot a:hover { text-decoration: underline; } + +/* Pages SilentBlock cannot touch (chrome://, the Web Store, local files). */ +.popup[data-supported="false"] #siteRow, +.popup[data-supported="false"] #stat, +.popup[data-supported="false"] #actions { display: none; } +.popup[data-supported="false"] .host { color: var(--muted); font-weight: 400; padding-bottom: 12px; } +.popup[data-enabled="false"] #stat, .popup[data-enabled="false"] #actions { display: none; } diff --git a/src/popup/popup.html b/src/popup/popup.html new file mode 100644 index 0000000..77ae397 --- /dev/null +++ b/src/popup/popup.html @@ -0,0 +1,59 @@ + + + + + SilentBlock + + + + +
      +
      + + SilentBlock + +
      + +
      +
      +
      Protection
      +
       
      +
      + +
      + +
      +
       
      +
      +
      +
      Block on this site
      +
       
      +
      + +
      + +
      + +
      +
      0blocked on this page
      +

       

      +
      + +
      + + +
      + +
      +
      + + + diff --git a/src/popup/popup.js b/src/popup/popup.js new file mode 100644 index 0000000..2e74f28 --- /dev/null +++ b/src/popup/popup.js @@ -0,0 +1,130 @@ +// Popup. Talks only to the service worker; holds no state of its own. +const $ = (id) => document.getElementById(id); +const root = $('popup'); + +// ?tabId= lets the e2e tests open the popup as a normal page against a chosen tab. +const params = new URLSearchParams(location.search); + +async function send(message) { + const res = await chrome.runtime.sendMessage(message); + if (res && res.error) throw new Error(res.error); + return res; +} + +async function currentTabId() { + if (params.has('tabId')) return Number(params.get('tabId')); + const [tab] = await chrome.tabs.query({ active: true, currentWindow: true }); + return tab ? tab.id : null; +} + +let tabId = null; +let info = null; + +function render() { + root.dataset.state = 'ready'; + root.dataset.enabled = String(info.enabled); + root.dataset.supported = String(Boolean(info.supported)); + root.dataset.paused = String(Boolean(info.pausedBy)); + if (!info.supported || !info.enabled) $('stateIcon').src = `../icons/${info.enabled ? 'idle' : 'paused'}-32.png`; + $('version').textContent = `v${info.version}`; + + $('enabled').checked = info.enabled; + $('protectionHint').textContent = info.enabled ? 'On everywhere' : 'Off everywhere'; + + if (!info.supported) { + $('hostname').textContent = "SilentBlock doesn't run on this page."; + return; + } + $('hostname').textContent = info.hostname; + $('siteOn').checked = !info.pausedBy; + $('siteOn').disabled = !info.enabled; + let hint = 'Ads and trackers are blocked here'; + if (!info.enabled) hint = 'Protection is off'; + else if (info.pausedBy && info.pausedBy !== info.hostname) hint = `Paused for all of ${info.pausedBy}`; + else if (info.pausedBy) hint = 'Paused on this site'; + $('siteHint').textContent = hint; + + $('unwallAlways').checked = Boolean(info.unwall); + renderStatus(info.status); +} + +const plural = (n, one, many) => `${n} ${n === 1 ? one : many}`; + +function renderStatus(st) { + if (!st) return; + root.dataset.level = st.level; + $('stateIcon').src = `../icons/${st.icon}-32.png`; + $('blocked').textContent = String(st.level === 'danger' ? st.danger : st.blocked); + $('cap').textContent = st.level === 'danger' ? 'dangerous requests blocked' : 'ads and trackers blocked'; + let text; + if (st.level === 'danger') { + text = `Known malware or scam hosts here: ${st.dangerHosts.join(', ')}`; + if (st.blocked) text += `. Also blocked ${plural(st.blocked, 'ad or tracker', 'ads and trackers')}.`; + } else if (st.level === 'caution') { + const bits = []; + if (st.popups) bits.push(`stopped ${plural(st.popups, 'pop-up', 'pop-ups')}`); + if (st.walls) bits.push('removed a nag wall'); + text = `Pushy site: ${bits.join(' and ')}.`; + } else if (st.level === 'protected') { + text = 'Protected: ads and trackers stopped before they loaded.'; + } else { + text = 'Nothing to block on this page.'; + } + if (st.icon === 'paused') text = info.enabled ? 'Paused here. Malware protection is still on.' : text; + $('statusText').textContent = text; +} + +async function refresh() { + info = await send({ type: 'popup:get', tabId }); + render(); +} + +function needsReload() { + $('reload').hidden = false; +} + +$('enabled').addEventListener('change', async (e) => { + await send({ type: 'setEnabled', enabled: e.target.checked }); + await refresh(); + if (info.supported) needsReload(); +}); + +$('siteOn').addEventListener('change', async (e) => { + await send({ type: 'setSitePaused', hostname: info.hostname, paused: !e.target.checked }); + await refresh(); + needsReload(); +}); + +$('reload').addEventListener('click', async () => { + await chrome.tabs.reload(tabId); + window.close(); +}); + +$('unwall').addEventListener('click', async () => { + const btn = $('unwall'); + btn.disabled = true; + try { + await send({ type: 'unwallNow', tabId }); + btn.textContent = 'Done'; + } catch { + btn.textContent = "Couldn't run here"; + } + setTimeout(() => { btn.textContent = 'Kill nag wall'; btn.disabled = false; }, 1500); +}); + +$('unwallAlways').addEventListener('change', async (e) => { + await send({ type: 'setUnwallSite', hostname: info.hostname, on: e.target.checked }); + if (e.target.checked) await send({ type: 'unwallNow', tabId }); +}); + +$('settings').addEventListener('click', (e) => { + e.preventDefault(); + chrome.runtime.openOptionsPage(); + window.close(); +}); + +tabId = await currentTabId(); +await refresh(); +// Counts climb while the page loads; keep the popup current while it is open. +setInterval(() => { refresh().catch(() => {}); }, 1000); +requestAnimationFrame(() => requestAnimationFrame(() => document.documentElement.classList.add('animate'))); diff --git a/src/resources/1x1.gif b/src/resources/1x1.gif new file mode 100644 index 0000000..f191b28 Binary files /dev/null and b/src/resources/1x1.gif differ diff --git a/src/resources/2x2.png b/src/resources/2x2.png new file mode 100644 index 0000000..116afca Binary files /dev/null and b/src/resources/2x2.png differ diff --git a/src/resources/32x32.png b/src/resources/32x32.png new file mode 100644 index 0000000..6e3cb09 Binary files /dev/null and b/src/resources/32x32.png differ diff --git a/src/resources/3x2.png b/src/resources/3x2.png new file mode 100644 index 0000000..13e2c79 Binary files /dev/null and b/src/resources/3x2.png differ diff --git a/src/resources/amazon_apstag.js b/src/resources/amazon_apstag.js new file mode 100644 index 0000000..c573f67 --- /dev/null +++ b/src/resources/amazon_apstag.js @@ -0,0 +1,15 @@ +// Stand-in for Amazon's apstag.js when blocked: bids come back empty, callbacks still run. +(function () { + 'use strict'; + const w = window; + const noop = function () {}; + const q = (w.apstag && Array.isArray(w.apstag._Q)) ? w.apstag._Q : []; + const apstag = { + _Q: [], + fetchBids: function (config, cb) { if (typeof cb === 'function') { try { cb([]); } catch (e) { /* page code */ } } }, + init: noop, setDisplayBids: noop, targetingKeys: function () { return []; }, + }; + apstag._Q.push = function (prefix, args) { if (prefix === 'f') apstag.fetchBids.apply(apstag, args || []); return 0; }; + w.apstag = apstag; + for (const entry of q) { if (Array.isArray(entry)) apstag._Q.push(entry[0], entry[1]); } +})(); diff --git a/src/resources/doubleclick_instream_ad_status.js b/src/resources/doubleclick_instream_ad_status.js new file mode 100644 index 0000000..366a7df --- /dev/null +++ b/src/resources/doubleclick_instream_ad_status.js @@ -0,0 +1,2 @@ +// Stand-in for doubleclick.net/instream/ad_status.js: reports ads as available. +window.google_ad_status = 1; diff --git a/src/resources/google-analytics_analytics.js b/src/resources/google-analytics_analytics.js new file mode 100644 index 0000000..c6830ac --- /dev/null +++ b/src/resources/google-analytics_analytics.js @@ -0,0 +1,43 @@ +// Stand-in for google-analytics.com/analytics.js (Universal Analytics) when blocked. +// Runs every hitCallback so "send the hit, then navigate" links still navigate. +(function () { + 'use strict'; + const noop = function () {}; + const Tracker = function () {}; + Tracker.prototype.get = noop; + Tracker.prototype.set = noop; + Tracker.prototype.send = noop; + const w = window; + const gaName = w.GoogleAnalyticsObject || 'ga'; + const queued = w[gaName]; + const ga = function () { + const args = Array.from(arguments); + if (!args.length) return; + const last = args[args.length - 1]; + let fn; + if (last instanceof Object && typeof last.hitCallback === 'function') fn = last.hitCallback; + else if (typeof last === 'function') fn = function () { last(ga.create()); }; + else { + const i = args.indexOf('hitCallback'); + if (i !== -1 && typeof args[i + 1] === 'function') fn = args[i + 1]; + } + if (typeof fn === 'function') { try { fn(); } catch (e) { /* page callback */ } } + }; + ga.create = function () { return new Tracker(); }; + ga.getByName = function () { return new Tracker(); }; + ga.getAll = function () { return [new Tracker()]; }; + ga.remove = noop; + ga.loaded = true; + w[gaName] = ga; + + const dl = w.dataLayer; + if (dl instanceof Object && dl.hide instanceof Object && typeof dl.hide.end === 'function') { + dl.hide.end(); + dl.hide.end = noop; + } + if (typeof queued === 'function' && Array.isArray(queued.q)) { + const q = queued.q.slice(); + queued.q.length = 0; + for (const entry of q) ga.apply(null, Array.from(entry)); + } +})(); diff --git a/src/resources/google-analytics_ga.js b/src/resources/google-analytics_ga.js new file mode 100644 index 0000000..cb621d1 --- /dev/null +++ b/src/resources/google-analytics_ga.js @@ -0,0 +1,12 @@ +// Stand-in for the legacy google-analytics.com/ga.js (_gaq) when blocked. +(function () { + 'use strict'; + const noop = function () {}; + const tracker = new Proxy({}, { get: function () { return noop; } }); + const w = window; + const queued = Array.isArray(w._gaq) ? w._gaq : []; + const run = function (item) { if (typeof item === 'function') { try { item(); } catch (e) { /* page code */ } } }; + w._gaq = { push: function () { for (const item of arguments) run(item); return 0; } }; + w._gat = { _createTracker: function () { return tracker; }, _getTracker: function () { return tracker; }, _getTrackerByName: function () { return tracker; }, _anonymizeIp: noop }; + for (const item of queued) run(item); +})(); diff --git a/src/resources/googlesyndication_adsbygoogle.js b/src/resources/googlesyndication_adsbygoogle.js new file mode 100644 index 0000000..1225431 --- /dev/null +++ b/src/resources/googlesyndication_adsbygoogle.js @@ -0,0 +1,14 @@ +// Stand-in for pagead2.googlesyndication.com/pagead/js/adsbygoogle.js when blocked. +// Pages push slot configs into `adsbygoogle`; accept them so page code keeps running. +(function () { + 'use strict'; + const w = window; + const queued = Array.isArray(w.adsbygoogle) ? w.adsbygoogle : []; + const markDone = function () { + for (const el of document.querySelectorAll('ins.adsbygoogle:not([data-adsbygoogle-status])')) { + el.setAttribute('data-adsbygoogle-status', 'done'); + } + }; + w.adsbygoogle = { loaded: true, push: function () { markDone(); } }; + if (queued.length) markDone(); +})(); diff --git a/src/resources/googletagmanager_gtm.js b/src/resources/googletagmanager_gtm.js new file mode 100644 index 0000000..a9456b5 --- /dev/null +++ b/src/resources/googletagmanager_gtm.js @@ -0,0 +1,38 @@ +// Stand-in for googletagmanager.com/gtm.js and /gtag/js when they are blocked. +// Pages often wait on a tag's callback before navigating ("track the click, then go"), or +// hide themselves until GTM loads (the anti-flicker snippet). Without this stub those +// pages hang. We fire the callbacks and lift the hide, and send nothing anywhere. +(function () { + 'use strict'; + const w = window; + w.ga = w.ga || function () {}; + const dl = w.dataLayer; + if (!(dl instanceof Object)) return; + if (dl.hide instanceof Object && typeof dl.hide.end === 'function') { + dl.hide.end(); + dl.hide.end = function () {}; + } + if (typeof dl.push !== 'function') return; + const fire = function (fn) { if (typeof fn === 'function') setTimeout(fn, 1); }; + const doCallback = function (item) { + if (!(item instanceof Object)) return; + // GTM style: dataLayer.push({ event, eventCallback }) + if (typeof item.eventCallback === 'function') { + fire(item.eventCallback); + item.eventCallback = function () {}; + } + // gtag style: gtag('event', name, { event_callback }) pushes the arguments object + const params = item[2]; + if (item[0] === 'event' && params instanceof Object && typeof params.event_callback === 'function') { + fire(params.event_callback); + params.event_callback = function () {}; + } + }; + dl.push = new Proxy(dl.push, { + apply(target, thisArg, args) { + doCallback(args[0]); + return Reflect.apply(target, thisArg, args); + }, + }); + if (Array.isArray(dl)) for (const item of dl.slice()) doCallback(item); +})(); diff --git a/src/resources/googletagservices_gpt.js b/src/resources/googletagservices_gpt.js new file mode 100644 index 0000000..59f98b6 --- /dev/null +++ b/src/resources/googletagservices_gpt.js @@ -0,0 +1,64 @@ +// Stand-in for Google Publisher Tag (gpt.js) when blocked. Implements the googletag API +// as no-ops and drains `googletag.cmd`, so pages that queue ad code keep running. +(function () { + 'use strict'; + const noop = function () {}; + const self = function () { return this; }; + const nul = function () { return null; }; + const arr = function () { return []; }; + const str = function () { return ''; }; + + const Slot = function (path, size, divId) { + this._path = path || ''; + this._divId = divId || ''; + }; + Object.assign(Slot.prototype, { + addService: self, clearCategoryExclusions: self, clearTargeting: self, defineSizeMapping: self, + get: nul, getAdUnitPath() { return this._path; }, getAttributeKeys: arr, getCategoryExclusions: arr, + getDomId() { return this._divId; }, getResponseInformation: nul, getSlotElementId() { return this._divId; }, + getSlotId: self, getTargeting: arr, getTargetingKeys: arr, set: self, setCategoryExclusion: self, + setClickUrl: self, setCollapseEmptyDiv: self, setConfig: self, setForceSafeFrame: self, + setSafeFrameConfig: self, setTargeting: self, updateTargetingFromMap: self, + }); + const Passback = function () {}; + Object.assign(Passback.prototype, { + display: noop, get: nul, set: self, setClickUrl: self, setTagForChildDirectedTreatment: self, + setTargeting: self, updateTargetingFromMap: self, + }); + const SizeMapping = function () {}; + SizeMapping.prototype.addSize = self; + SizeMapping.prototype.build = nul; + + const pubads = { + addEventListener: self, clear: noop, clearCategoryExclusions: self, clearTagForChildDirectedTreatment: self, + clearTargeting: self, collapseEmptyDivs: noop, defineOutOfPagePassback() { return new Passback(); }, + definePassback() { return new Passback(); }, disableInitialLoad: noop, display: noop, + enableAsyncRendering: noop, enableLazyLoad: noop, enableSingleRequest: noop, enableSyncRendering: noop, + enableVideoAds: noop, get: nul, getAttributeKeys: arr, getSlots: arr, getTargeting: arr, + getTargetingKeys: arr, isInitialLoadDisabled() { return false; }, refresh: noop, removeEventListener: noop, + set: self, setCategoryExclusion: self, setCentering: noop, setCookieOptions: self, setForceSafeFrame: self, + setLocation: self, setPrivacySettings: self, setPublisherProvidedId: self, setRequestNonPersonalizedAds: self, + setSafeFrameConfig: self, setTagForChildDirectedTreatment: self, setTargeting: self, setVideoContent: self, + updateCorrelator: noop, + }; + + const w = window; + const gt = w.googletag || {}; + const cmd = Array.isArray(gt.cmd) ? gt.cmd : []; + const run = function (fn) { if (typeof fn === 'function') { try { fn.call(w); } catch (e) { /* page code */ } } }; + Object.assign(gt, { + apiReady: true, + pubadsReady: true, + companionAds() { return { addEventListener: self, enableSyncLoading: noop, setRefreshUnfilledSlots: noop }; }, + content() { return { addEventListener: self, setContent: noop }; }, + defineOutOfPageSlot(path, divId) { return new Slot(path, null, divId); }, + defineSlot(path, size, divId) { return new Slot(path, size, divId); }, + destroySlots: noop, disablePublisherConsole: noop, display: noop, enableServices: noop, + getVersion: str, pubads() { return pubads; }, setAdIframeTitle: noop, setConfig: noop, + sizeMapping() { return new SizeMapping(); }, + }); + gt.cmd = []; + gt.cmd.push = function () { for (const fn of arguments) run(fn); return 1; }; + w.googletag = gt; + for (const fn of cmd) run(fn); +})(); diff --git a/src/resources/noop.css b/src/resources/noop.css new file mode 100644 index 0000000..e69de29 diff --git a/src/resources/noop.html b/src/resources/noop.html new file mode 100644 index 0000000..e0723ed --- /dev/null +++ b/src/resources/noop.html @@ -0,0 +1 @@ + diff --git a/src/resources/noop.js b/src/resources/noop.js new file mode 100644 index 0000000..01b1552 --- /dev/null +++ b/src/resources/noop.js @@ -0,0 +1 @@ +(function(){})(); diff --git a/src/resources/noop.txt b/src/resources/noop.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/resources/noopvast-2.0.xml b/src/resources/noopvast-2.0.xml new file mode 100644 index 0000000..d3474d5 --- /dev/null +++ b/src/resources/noopvast-2.0.xml @@ -0,0 +1 @@ + diff --git a/src/resources/noopvast-3.0.xml b/src/resources/noopvast-3.0.xml new file mode 100644 index 0000000..89bdaac --- /dev/null +++ b/src/resources/noopvast-3.0.xml @@ -0,0 +1 @@ + diff --git a/src/resources/noopvast-4.0.xml b/src/resources/noopvast-4.0.xml new file mode 100644 index 0000000..b31f60f --- /dev/null +++ b/src/resources/noopvast-4.0.xml @@ -0,0 +1 @@ + diff --git a/src/resources/noopvmap-1.0.xml b/src/resources/noopvmap-1.0.xml new file mode 100644 index 0000000..2a3f34a --- /dev/null +++ b/src/resources/noopvmap-1.0.xml @@ -0,0 +1 @@ + diff --git a/src/resources/prebid-ads.js b/src/resources/prebid-ads.js new file mode 100644 index 0000000..93788aa --- /dev/null +++ b/src/resources/prebid-ads.js @@ -0,0 +1,6 @@ +// Stand-in for bait "ads.js" scripts that detection code expects to set these flags. +(function () { + 'use strict'; + window.canRunAds = true; + window.isAdBlockActive = false; +})(); diff --git a/src/resources/scorecardresearch_beacon.js b/src/resources/scorecardresearch_beacon.js new file mode 100644 index 0000000..6808a72 --- /dev/null +++ b/src/resources/scorecardresearch_beacon.js @@ -0,0 +1,5 @@ +// Stand-in for scorecardresearch.com/beacon.js (comScore) when blocked. +(function () { + 'use strict'; + window.COMSCORE = { purge: function () { window._comscore = []; }, beacon: function () {} }; +})(); diff --git a/src/scriptlets/library.js b/src/scriptlets/library.js new file mode 100644 index 0000000..739bf45 --- /dev/null +++ b/src/scriptlets/library.js @@ -0,0 +1,844 @@ +// SilentBlock scriptlet library. +// +// NOT a module: the build embeds this file verbatim into each MAIN-world scriptlet bucket +// (dist/.../scriptlets/-.js). It evaluates to `SCRIPTLETS`, an object of +// name -> function(...args). Argument semantics follow uBlock Origin's scriptlets of the +// same name so its filter lists work unchanged. Only the untrusted scriptlets are +// implemented; `trusted-*` ones are skipped at build time. +// +// Everything page-visible is wrapped in a Proxy so `fn.toString()` still reports +// native code, and natives are captured before any page script runs. + +const SCRIPTLETS = (() => { + const W = window; + const safe = { + Object: W.Object, + defineProperty: W.Object.defineProperty.bind(W.Object), + getOwnPropertyDescriptor: W.Object.getOwnPropertyDescriptor.bind(W.Object), + RegExp: W.RegExp, + JSON_parse: W.JSON.parse.bind(W.JSON), + JSON_stringify: W.JSON.stringify.bind(W.JSON), + Reflect_apply: W.Reflect.apply, + Proxy: W.Proxy, + Error: W.Error, + Response: W.Response, + Promise: W.Promise, + MutationObserver: W.MutationObserver, + setTimeout: W.setTimeout.bind(W), + fnToString: W.Function.prototype.toString, + addEventListener: W.EventTarget.prototype.addEventListener, + }; + + const noop = function () {}; + + // ---- patterns ------------------------------------------------------------- + + function escapeRegex(s) { + return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } + + // "" matches everything, "/re/flags" is a regex, anything else is a literal substring. + function patternToRegex(pattern, flags) { + if (pattern === undefined || pattern === '') return /^/; + const m = /^\/(.+)\/([gimsu]*)$/.exec(pattern); + if (m) { + try { return new safe.RegExp(m[1], m[2] || flags || ''); } catch { return /(?!)/; } + } + return new safe.RegExp(escapeRegex(pattern), flags || ''); + } + + // Supports a leading "!" to invert the match, as uBO does. + function matcher(pattern) { + let not = false; + if (typeof pattern === 'string' && pattern.startsWith('!')) { not = true; pattern = pattern.slice(1); } + const re = patternToRegex(pattern); + return { empty: !pattern, test: (s) => re.test(s) !== not }; + } + + function fnText(fn) { + if (typeof fn === 'function') { + try { return safe.Reflect_apply(safe.fnToString, fn, []); } catch { return ''; } + } + return String(fn); + } + + // Extra scriptlet args come as key/value pairs: (set, a.b, 1, as, function). + function pairs(args) { + const out = {}; + for (let i = 0; i + 1 < args.length; i += 2) out[args[i]] = args[i + 1]; + return out; + } + + // A thrown ReferenceError that is swallowed by our own error handler, so aborting a + // page script does not spam the console or trip "uncaught error" detectors. + let exceptionToken; + function getExceptionToken() { + if (exceptionToken) return exceptionToken; + exceptionToken = String.fromCharCode(Date.now() % 26 + 97) + Math.floor(Math.random() * 982451653 + 982451653).toString(36); + const oe = W.onerror; + W.onerror = function (msg, ...rest) { + if (typeof msg === 'string' && msg.includes(exceptionToken)) return true; + if (oe instanceof Function) return oe.call(this, msg, ...rest); + }; + return exceptionToken; + } + + function onReady(fn, when = 'interactive') { + const states = ['loading', 'interactive', 'complete']; + if (states.indexOf(document.readyState) >= states.indexOf(when)) { fn(); return; } + const ev = when === 'complete' ? 'load' : 'DOMContentLoaded'; + safe.Reflect_apply(safe.addEventListener, when === 'complete' ? W : document, [ev, fn, { once: true, capture: true }]); + } + + // ---- constants ------------------------------------------------------------- + + const SKIP = Symbol('skip'); + function constantValue(raw) { + switch (raw) { + case 'undefined': return undefined; + case 'false': return false; + case 'true': return true; + case 'null': return null; + case "''": case '""': case 'emptyStr': case '': return ''; + case '[]': case 'emptyArr': return []; + case '{}': case 'emptyObj': return {}; + case 'noopFunc': return function () {}; + case 'trueFunc': return function () { return true; }; + case 'falseFunc': return function () { return false; }; + case 'throwFunc': return function () { throw new safe.Error(); }; + case 'noopCallbackFunc': return function () { return function () {}; }; + case 'yes': case 'no': case 'on': case 'off': return raw; + case 'NaN': return NaN; + case 'Infinity': return Infinity; + case '-Infinity': return -Infinity; + } + if (/^-?\d+$/.test(raw)) { + const n = parseInt(raw, 10); + if (Math.abs(n) <= 0x7fff) return n; + } + return SKIP; + } + + // ---- property-chain traps -------------------------------------------------- + + // Walks "a.b.c" from `root`, waiting for missing intermediates to be assigned, and + // calls onFinal(owner, prop) once the last owner exists. + function trapChain(root, chain, onFinal) { + const pos = chain.indexOf('.'); + if (pos === -1) { onFinal(root, chain); return; } + const prop = chain.slice(0, pos); + const rest = chain.slice(pos + 1); + const v = root[prop]; + if (v instanceof safe.Object || (typeof v === 'object' && v !== null)) { trapChain(v, rest, onFinal); return; } + if (v !== undefined) return; + const desc = safe.getOwnPropertyDescriptor(root, prop); + if (desc && desc.configurable === false) return; + let value = v; + try { + safe.defineProperty(root, prop, { + configurable: true, + enumerable: true, + get() { return value; }, + set(a) { + value = a; + if (a instanceof safe.Object) trapChain(a, rest, onFinal); + }, + }); + } catch { /* non-extensible */ } + } + + function normaliseChain(chain) { + return chain.startsWith('window.') ? chain.slice(7) : chain; + } + + // ---- scriptlets -------------------------------------------------------------- + + const S = {}; + + // set-constant: pin a property to a harmless value before the page reads it. + S['set-constant'] = function (chain = '', rawValue = '', ...extra) { + if (!chain) return; + let cValue = constantValue(rawValue); + if (cValue === SKIP) return; + const opts = pairs(extra); + if (opts.as === 'function') { const v = cValue; cValue = function () { return v; }; } + else if (opts.as === 'callback') { const v = cValue; cValue = function () { return function () { return v; }; }; } + else if (opts.as === 'resolved') cValue = safe.Promise.resolve(cValue); + else if (opts.as === 'rejected') cValue = safe.Promise.reject(cValue); + + let aborted = false; + const mustAbort = (v) => { + if (aborted) return true; + aborted = v !== undefined && v !== null && cValue !== undefined && cValue !== null && typeof v !== typeof cValue; + return aborted; + }; + trapChain(W, normaliseChain(chain), (owner, prop) => { + let desc; + try { desc = safe.getOwnPropertyDescriptor(owner, prop); } catch { return; } + if (desc && desc.configurable === false) return; + const current = desc && 'value' in desc ? desc.value : undefined; + if (mustAbort(current)) return; + const prevGet = desc && desc.get; + const prevSet = desc && desc.set; + try { + safe.defineProperty(owner, prop, { + configurable: false, + enumerable: desc ? desc.enumerable : true, + get() { + if (prevGet) { try { prevGet.call(owner); } catch { /* keep constant */ } } + return cValue; + }, + set(a) { + if (prevSet) { try { prevSet.call(owner, a); } catch { /* ignore */ } } + // A page assigning a different type is not what the filter expected: let it win. + if (mustAbort(a)) cValue = a; + }, + }); + } catch { /* ignore */ } + }); + }; + + // abort-on-property-read: throw when the page reads the property. + S['abort-on-property-read'] = function (chain = '') { + if (!chain) return; + const token = getExceptionToken(); + trapChain(W, normaliseChain(chain), (owner, prop) => { + const desc = safe.getOwnPropertyDescriptor(owner, prop); + if (desc && desc.configurable === false) return; + try { + safe.defineProperty(owner, prop, { + configurable: false, + get() { throw new ReferenceError(token); }, + set() {}, + }); + } catch { /* ignore */ } + }); + }; + + // abort-on-property-write: throw when the page assigns the property. + S['abort-on-property-write'] = function (prop = '') { + prop = normaliseChain(prop); + if (!prop || prop.includes('.')) return; + const token = getExceptionToken(); + try { + delete W[prop]; + safe.defineProperty(W, prop, { configurable: false, set() { throw new ReferenceError(token); } }); + } catch { /* ignore */ } + }; + + // abort-current-script: throw when the property is touched by an inline script whose + // text matches `needle`. + S['abort-current-script'] = function (target = '', needle = '', context = '') { + if (!target) return; + const reNeedle = patternToRegex(needle); + const reContext = patternToRegex(context); + const thisScript = document.currentScript; + let chain = normaliseChain(target); + let owner = W; + for (;;) { + const pos = chain.indexOf('.'); + if (pos === -1) break; + const v = owner[chain.slice(0, pos)]; + chain = chain.slice(pos + 1); + if (!(v instanceof safe.Object) && (typeof v !== 'object' || v === null)) return; + owner = v; + } + const prop = chain; + let value; + let desc = safe.getOwnPropertyDescriptor(owner, prop); + if (!(desc instanceof safe.Object) || !(desc.get instanceof Function)) { value = owner[prop]; desc = undefined; } + const token = getExceptionToken(); + const scriptTexts = new WeakMap(); + const getScriptText = (el) => { + const text = el.textContent; + if (text.trim() !== '') return text; + if (scriptTexts.has(el)) return scriptTexts.get(el); + const [, mime = '', content = ''] = /^data:([^,]*),(.+)$/.exec(el.src.trim()) || []; + let out = ''; + try { out = mime.endsWith(';base64') ? atob(content) : decodeURIComponent(content); } catch { /* ignore */ } + scriptTexts.set(el, out); + return out; + }; + const validate = () => { + const e = document.currentScript; + if (!(e instanceof HTMLScriptElement) || e === thisScript) return; + if (context !== '' && !reContext.test(e.src)) return; + // Without a context we only judge inline (or data:) scripts, whose text we can read. + if (context === '' && e.src && !e.src.startsWith('data:')) return; + if (!reNeedle.test(getScriptText(e))) return; + throw new ReferenceError(token); + }; + try { + safe.defineProperty(owner, prop, { + get() { validate(); return desc ? desc.get.call(owner) : value; }, + set(a) { validate(); if (desc && desc.set) desc.set.call(owner, a); else value = a; }, + }); + } catch { /* ignore */ } + }; + + // abort-on-stack-trace: throw when the property is touched from a matching call stack. + // Stack lines from the document itself read as "inlineScript", eval'd code as + // "injectedScript", matching uBO's needles. + S['abort-on-stack-trace'] = function (chain = '', needle = '') { + if (!chain) return; + const re = patternToRegex(needle); + const token = getExceptionToken(); + const docURL = location.href.split('#')[0]; + const matchesStack = () => { + const lines = []; + for (const line of String(new safe.Error().stack).split(/[\n\r]+/)) { + if (line.includes('-extension://')) continue; + const m = /(\S+?)(?::\d+:\d+)?\)?$/.exec(line.trim()); + if (!m) continue; + let url = m[1].replace(/^\(/, ''); + if (url === docURL || url.split('#')[0] === docURL) url = 'inlineScript'; + else if (url.startsWith('') || url === 'eval') url = 'injectedScript'; + lines.push(url); + } + return re.test(lines.join('\t')); + }; + trapChain(W, normaliseChain(chain), (owner, prop) => { + let value = owner[prop]; + const desc = safe.getOwnPropertyDescriptor(owner, prop); + if (desc && desc.configurable === false) return; + try { + safe.defineProperty(owner, prop, { + configurable: true, + get() { if (matchesStack()) throw new ReferenceError(token); return value; }, + set(a) { if (matchesStack()) throw new ReferenceError(token); value = a; }, + }); + } catch { /* ignore */ } + }); + }; + + // prevent-window-open: swallow popups whose URL matches. Returns a fake window so + // popunder scripts believe they succeeded and stop retrying. + S['prevent-window-open'] = function (pattern = '') { + const m = matcher(pattern); + const fakeWindow = (url) => { + const doc = { write: noop, writeln: noop, open: noop, close: noop, body: null }; + const fake = { + closed: false, opener: W, document: doc, location: { href: String(url) }, + close() { fake.closed = true; }, focus: noop, blur: noop, postMessage: noop, + moveTo: noop, resizeTo: noop, addEventListener: noop, removeEventListener: noop, + }; + return fake; + }; + W.open = new safe.Proxy(W.open, { + apply(target, thisArg, args) { + const url = args.length ? String(args[0]) : ''; + if (!m.test(url)) return safe.Reflect_apply(target, thisArg, args); + return fakeWindow(url); + }, + }); + }; + + function timerDefuser(name) { + return function (needle = '', delay = '') { + const n = matcher(needle); + let delayNot = false; + if (delay.startsWith('!')) { delayNot = true; delay = delay.slice(1); } + const d = delay === '' ? undefined : parseInt(delay, 10); + W[name] = new safe.Proxy(W[name], { + apply(target, thisArg, args) { + const [cb, ms] = args; + let defuse = n.empty ? true : n.test(fnText(cb)); + if (defuse && d !== undefined) defuse = ((ms | 0) === d) !== delayNot; + if (defuse) args[0] = noop; + return safe.Reflect_apply(target, thisArg, args); + }, + }); + }; + } + S['prevent-setTimeout'] = timerDefuser('setTimeout'); + S['prevent-setInterval'] = timerDefuser('setInterval'); + + function timerBooster(name, defaultDelay) { + return function (needle = '', delay = String(defaultDelay), boost = '0.05') { + const n = matcher(needle === '' ? '' : needle); + const anyDelay = delay === '*'; + const d = anyDelay ? 0 : (parseInt(delay, 10) || defaultDelay); + let b = parseFloat(boost); + if (!Number.isFinite(b)) b = 0.05; + b = Math.min(Math.max(b, 0.001), 50); + W[name] = new safe.Proxy(W[name], { + apply(target, thisArg, args) { + const [cb, ms] = args; + if ((anyDelay || (ms | 0) === d) && n.test(fnText(cb))) args[1] = (ms | 0) * b; + return safe.Reflect_apply(target, thisArg, args); + }, + }); + }; + } + S['adjust-setTimeout'] = timerBooster('setTimeout', 1000); + S['adjust-setInterval'] = timerBooster('setInterval', 1000); + + // prevent-addEventListener: drop listeners whose type and handler text match. + S['prevent-addEventListener'] = function (type = '', pattern = '') { + const t = matcher(type); + const p = matcher(pattern); + const proto = W.EventTarget.prototype; + proto.addEventListener = new safe.Proxy(proto.addEventListener, { + apply(target, thisArg, args) { + const [evType, handler] = args; + let text = ''; + if (typeof handler === 'function') text = fnText(handler); + else if (handler && typeof handler.handleEvent === 'function') text = fnText(handler.handleEvent); + else text = String(handler); + if (t.test(String(evType)) && p.test(text)) return undefined; + return safe.Reflect_apply(target, thisArg, args); + }, + }); + }; + + // remove-node-text: blank out matching text/script nodes as they are parsed. The parser + // runs a microtask checkpoint before executing an inline script, so this lands in time. + S['remove-node-text'] = function (nodeName = '', pattern = '') { + if (!nodeName) return; + const nameRe = /^\/.+\/$/.test(nodeName) ? patternToRegex(nodeName) : new safe.RegExp(`^${escapeRegex(nodeName.toLowerCase())}$`); + const re = patternToRegex(pattern); + const handle = (node) => { + if (!nameRe.test(node.nodeName.toLowerCase())) return; + const text = node.textContent; + if (!text || !re.test(text)) return; + node.textContent = ''; + }; + const walk = (root) => { + if (!root) return; + handle(root); + const tw = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT); + let n; + while ((n = tw.nextNode())) handle(n); + }; + const observer = new safe.MutationObserver((records) => { + for (const r of records) for (const n of r.addedNodes) handle(n); + }); + observer.observe(document, { childList: true, subtree: true }); + if (document.documentElement) walk(document.documentElement); + onReady(() => observer.disconnect(), 'complete'); + }; + + // ---- request details for fetch/xhr matching ------------------------------------ + + // propsToMatch: "url:/ads/ method:POST" or a bare pattern meaning url. + function parseProps(propsToMatch) { + const out = []; + for (const part of propsToMatch.split(/\s+/).filter(Boolean)) { + const i = part.indexOf(':'); + const hasKey = i > 0 && /^[a-z]+$/i.test(part.slice(0, i)) && !/^https?$/i.test(part.slice(0, i)); + out.push(hasKey ? [part.slice(0, i), patternToRegex(part.slice(i + 1))] : ['url', patternToRegex(part)]); + } + return out; + } + function propsMatch(props, details) { + for (const [k, re] of props) { + const v = details[k]; + if (v === undefined || !re.test(String(v))) return false; + } + return true; + } + function responseBodyFor(directive) { + switch (directive) { + case 'emptyObj': case '{}': return '{}'; + case 'emptyArr': case '[]': return '[]'; + case 'true': return Math.random().toString(36).slice(2).repeat(10); + default: return ''; + } + } + + S['prevent-fetch'] = function (propsToMatch = '', responseBody = '', responseType = '') { + if (!propsToMatch) return; + const props = parseProps(propsToMatch); + W.fetch = new safe.Proxy(W.fetch, { + apply(target, thisArg, args) { + const [input, init] = args; + const details = {}; + try { + if (input instanceof W.Request) { + details.url = input.url; details.method = input.method; details.mode = input.mode; details.credentials = input.credentials; + } else { + details.url = String(input); + } + if (init && typeof init === 'object') { + for (const k of ['method', 'mode', 'credentials', 'cache', 'referrer', 'referrerPolicy', 'integrity', 'redirect']) { + if (init[k] !== undefined) details[k] = init[k]; + } + if (typeof init.body === 'string') details.body = init.body; + } + details.method = details.method || 'GET'; + } catch { return safe.Reflect_apply(target, thisArg, args); } + if (!propsMatch(props, details)) return safe.Reflect_apply(target, thisArg, args); + const body = responseBodyFor(responseBody); + const response = new safe.Response(body, { status: 200, statusText: 'OK', headers: { 'Content-Length': String(body.length) } }); + try { + safe.defineProperty(response, 'url', { value: details.url }); + safe.defineProperty(response, 'type', { value: responseType || 'basic' }); + } catch { /* ignore */ } + return safe.Promise.resolve(response); + }, + }); + }; + + // A subclass that can fake a response for chosen requests and pass everything else + // through untouched. Shared by prevent-xhr and json-prune-xhr-response. + function patchXhr({ onOpen, onResponse }) { + const details = new WeakMap(); + const Native = W.XMLHttpRequest; + W.XMLHttpRequest = class XMLHttpRequest extends Native { + open(method, url, ...rest) { + const d = { method: String(method).toUpperCase(), url: String(url) }; + const fake = onOpen ? onOpen(d) : null; + if (fake !== null && fake !== undefined) details.set(this, { ...d, fake }); + else details.set(this, d); + return super.open(method, url, ...rest); + } + send(body) { + const d = details.get(this); + if (!d || d.fake === undefined) return super.send(body); + d.readyState = 1; + safe.setTimeout(() => { + d.readyState = 4; + let response = d.fake; + if (this.responseType === 'json') { try { response = safe.JSON_parse(d.fake); } catch { response = null; } } + d.response = response; + this.dispatchEvent(new Event('readystatechange')); + this.dispatchEvent(new ProgressEvent('load')); + this.dispatchEvent(new ProgressEvent('loadend')); + }, 1); + } + get readyState() { const d = details.get(this); return d && d.readyState !== undefined ? d.readyState : super.readyState; } + get status() { const d = details.get(this); return d && d.fake !== undefined ? 200 : super.status; } + get statusText() { const d = details.get(this); return d && d.fake !== undefined ? 'OK' : super.statusText; } + get responseURL() { const d = details.get(this); return d && d.fake !== undefined ? d.url : super.responseURL; } + get responseXML() { const d = details.get(this); return d && d.fake !== undefined ? null : super.responseXML; } + get response() { + const d = details.get(this); + if (d && d.fake !== undefined) return d.response; + const r = super.response; + return onResponse && d ? onResponse(d, r, this) : r; + } + get responseText() { + const d = details.get(this); + if (d && d.fake !== undefined) return typeof d.fake === 'string' ? d.fake : ''; + const r = super.responseText; + return onResponse && d ? onResponse(d, r, this, true) : r; + } + getResponseHeader(name) { const d = details.get(this); return d && d.fake !== undefined ? null : super.getResponseHeader(name); } + getAllResponseHeaders() { const d = details.get(this); return d && d.fake !== undefined ? '' : super.getAllResponseHeaders(); } + }; + } + + S['prevent-xhr'] = function (propsToMatch = '', directive = '') { + if (!propsToMatch) return; + const props = parseProps(propsToMatch); + patchXhr({ onOpen: (d) => (propsMatch(props, d) ? responseBodyFor(directive) : null) }); + }; + + // ---- json-prune family ----------------------------------------------------------- + + // Paths: "a.b.c", "a.[].b" (every array element / object value), "a.*.b" (any key). + function walkPath(obj, parts, i, onLeaf) { + if (obj === null || typeof obj !== 'object') return; + const key = parts[i]; + const last = i === parts.length - 1; + const keys = key === '[]' || key === '*' ? Object.keys(obj) : [key]; + for (const k of keys) { + if (!(k in obj)) continue; + if (last) onLeaf(obj, k); + else walkPath(obj[k], parts, i + 1, onLeaf); + } + } + function makePruner(rawPrunePaths, rawNeedlePaths) { + const prunePaths = rawPrunePaths.split(/ +/).filter(Boolean).map((p) => p.split('.')); + const needlePaths = rawNeedlePaths.split(/ +/).filter(Boolean).map((p) => p.split('.')); + if (!prunePaths.length) return null; + return (obj) => { + if (obj === null || typeof obj !== 'object') return obj; + for (const np of needlePaths) { + let found = false; + walkPath(obj, np, 0, () => { found = true; }); + if (!found) return obj; + } + for (const pp of prunePaths) walkPath(obj, pp, 0, (owner, k) => { delete owner[k]; }); + return obj; + }; + } + + S['json-prune'] = function (rawPrunePaths = '', rawNeedlePaths = '') { + const prune = makePruner(rawPrunePaths, rawNeedlePaths); + if (!prune) return; + W.JSON.parse = new safe.Proxy(W.JSON.parse, { + apply(target, thisArg, args) { return prune(safe.Reflect_apply(target, thisArg, args)); }, + }); + const proto = W.Response.prototype; + proto.json = new safe.Proxy(proto.json, { + apply(target, thisArg, args) { return safe.Reflect_apply(target, thisArg, args).then(prune); }, + }); + }; + + S['json-prune-fetch-response'] = function (rawPrunePaths = '', rawNeedlePaths = '', ...extra) { + const prune = makePruner(rawPrunePaths, rawNeedlePaths); + if (!prune) return; + const opts = pairs(extra); + const props = opts.propsToMatch ? parseProps(opts.propsToMatch) : []; + W.fetch = new safe.Proxy(W.fetch, { + apply(target, thisArg, args) { + const p = safe.Reflect_apply(target, thisArg, args); + if (props.length) { + const [input, init] = args; + const details = { url: input instanceof W.Request ? input.url : String(input), method: (init && init.method) || (input instanceof W.Request ? input.method : 'GET') }; + if (!propsMatch(props, details)) return p; + } + return p.then((response) => response.clone().text().then((text) => { + let obj; + try { obj = safe.JSON_parse(text); } catch { return response; } + const pruned = new safe.Response(safe.JSON_stringify(prune(obj)), { + status: response.status, statusText: response.statusText, headers: response.headers, + }); + try { + safe.defineProperty(pruned, 'url', { value: response.url }); + safe.defineProperty(pruned, 'type', { value: response.type }); + safe.defineProperty(pruned, 'redirected', { value: response.redirected }); + } catch { /* ignore */ } + return pruned; + }).catch(() => response)); + }, + }); + }; + + S['json-prune-xhr-response'] = function (rawPrunePaths = '', rawNeedlePaths = '', ...extra) { + const prune = makePruner(rawPrunePaths, rawNeedlePaths); + if (!prune) return; + const opts = pairs(extra); + const props = opts.propsToMatch ? parseProps(opts.propsToMatch) : []; + const cache = new WeakMap(); + patchXhr({ + onOpen: () => null, + onResponse: (d, r, xhr, asText) => { + if (xhr.readyState !== 4 || (props.length && !propsMatch(props, d))) return r; + if (cache.has(xhr)) { const c = cache.get(xhr); return asText ? c.text : c.value; } + let value = r; + let text = typeof r === 'string' ? r : ''; + try { + const obj = typeof r === 'string' ? safe.JSON_parse(r) : r; + if (obj && typeof obj === 'object') { const pruned = prune(obj); text = safe.JSON_stringify(pruned); value = typeof r === 'string' ? text : pruned; } + } catch { /* not JSON */ } + cache.set(xhr, { value, text }); + return asText ? text : value; + }, + }); + }; + + // ---- eval ---------------------------------------------------------------------------- + + S['noeval-if'] = function (needle = '') { + const m = matcher(needle); + W.eval = new safe.Proxy(W.eval, { + apply(target, thisArg, args) { + if (m.test(String(args[0]))) return undefined; + return safe.Reflect_apply(target, thisArg, args); + }, + }); + }; + S['noeval'] = function () { + W.eval = new safe.Proxy(W.eval, { apply() { return undefined; } }); + }; + + // ---- DOM attribute/class removal ------------------------------------------------------ + + function domFixer(apply, selector, behavior) { + let timer = 0; + const run = () => { timer = 0; try { document.querySelectorAll(selector).forEach(apply); } catch { /* bad selector */ } }; + const schedule = () => { if (!timer) timer = safe.setTimeout(run, 0); }; + const start = () => { + run(); + if (!/stay/.test(behavior)) return; + new safe.MutationObserver(schedule).observe(document, { childList: true, subtree: true, attributes: true }); + }; + if (/complete/.test(behavior)) onReady(start, 'complete'); + else if (document.readyState === 'loading') { + // Keep fixing while the document loads, then settle. + const mo = new safe.MutationObserver(schedule); + mo.observe(document, { childList: true, subtree: true }); + onReady(() => { if (!/stay/.test(behavior)) mo.disconnect(); start(); }); + } else start(); + } + + S['remove-attr'] = function (rawToken = '', rawSelector = '', behavior = '') { + const attrs = rawToken.split(/\s*\|\s*/).filter(Boolean); + if (!attrs.length) return; + const selector = rawSelector || attrs.map((a) => `[${CSS.escape(a)}]`).join(','); + domFixer((el) => attrs.forEach((a) => el.removeAttribute(a)), selector, behavior); + }; + + S['remove-class'] = function (rawToken = '', rawSelector = '', behavior = '') { + const classes = rawToken.split(/\s*\|\s*/).filter(Boolean); + if (!classes.length) return; + const selector = rawSelector || classes.map((c) => `.${CSS.escape(c)}`).join(','); + domFixer((el) => el.classList.remove(...classes), selector, behavior); + }; + + S['set-attr'] = function (selector = '', attr = '', value = '') { + if (!selector || !attr || /^on/i.test(attr) || /^(src|href|style|srcdoc|action|formaction|data)$/i.test(attr)) return; + // Untrusted values only: empty, booleans, small integers, or a copy of another attribute. + let getValue; + if (value === '' || value === 'true' || value === 'false' || (/^-?\d+$/.test(value) && Math.abs(parseInt(value, 10)) <= 0x7fff)) getValue = () => value; + else if (/^\[[\w-]+\]$/.test(value)) { const src = value.slice(1, -1); getValue = (el) => el.getAttribute(src); } + else return; + domFixer((el) => { const v = getValue(el); if (v !== null && el.getAttribute(attr) !== v) el.setAttribute(attr, v); }, selector, 'stay'); + }; + + // ---- storage / cookies ----------------------------------------------------------------- + + const SAFE_COOKIE_VALUES = new Set([ + '', 'accept', 'accepted', 'agree', 'all', 'allow', 'allowed', 'approved', 'checked', 'closed', 'decline', + 'declined', 'deny', 'denied', 'disable', 'disabled', 'disagree', 'dismiss', 'dismissed', 'done', 'enable', + 'enabled', 'essential', 'f', 'false', 'functional', 'granted', 'hidden', 'hide', 'mandatory', 'n', + 'necessary', 'next', 'no', 'nonessential', 'none', 'off', 'ok', 'on', 'reject', 'rejected', 'required', + 't', 'true', 'unchecked', 'y', 'yes', + ]); + + S['set-cookie'] = function (name = '', value = '', path = '') { + if (!name) return; + const lower = value.toLowerCase(); + if (!SAFE_COOKIE_VALUES.has(lower) && !(/^\d+$/.test(value) && parseInt(value, 10) <= 0x7fff)) return; + const encName = encodeURIComponent(name); + const already = document.cookie.split(/;\s*/).some((c) => c === `${encName}=${encodeURIComponent(value)}`); + if (already) return; + let cookie = `${encName}=${encodeURIComponent(value)}; SameSite=Lax`; + if (path === '' || path === '/') cookie += '; path=/'; + else if (path !== 'none') return; + cookie += `; max-age=${60 * 60 * 24 * 365}`; + try { document.cookie = cookie; } catch { /* sandboxed */ } + }; + + S['remove-cookie'] = function (needle = '') { + const re = patternToRegex(needle); + const remove = () => { + for (const c of document.cookie.split(';')) { + const name = c.split('=')[0].trim(); + if (!name || !re.test(name)) continue; + const expire = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT`; + document.cookie = `${expire}; path=/`; + document.cookie = expire; + let host = location.hostname; + while (host.includes('.')) { + document.cookie = `${expire}; path=/; domain=.${host}`; + host = host.slice(host.indexOf('.') + 1); + } + } + }; + remove(); + safe.Reflect_apply(safe.addEventListener, W, ['beforeunload', remove]); + safe.Reflect_apply(safe.addEventListener, document, ['visibilitychange', () => { if (document.visibilityState === 'hidden') remove(); }]); + }; + + function storageSetter(storageName) { + return function (key = '', value = '') { + if (!key) return; + let storage; + try { storage = W[storageName]; } catch { return; } + if (!storage) return; + if (value === '$remove$' || value === 'undefined') { try { storage.removeItem(key); } catch { /* ignore */ } return; } + let v; + const lower = value.toLowerCase(); + if (['', 'false', 'true', 'null', 'yes', 'no', 'on', 'off', 'accept', 'accepted', 'reject', 'rejected', 'allowed', 'denied', 'ok', 'y', 'n'].includes(lower)) v = value; + else if (value === 'emptyObj' || value === '{}') v = '{}'; + else if (value === 'emptyArr' || value === '[]') v = '[]'; + else if (/^\d+$/.test(value) && parseInt(value, 10) <= 0x7fff) v = value; + else if (value === '$now$') v = String(Date.now()); + else if (value === '$currentDate$') v = String(new Date()); + else if (value === '$currentISODate$') v = new Date().toISOString(); + else return; + try { if (storage.getItem(key) !== v) storage.setItem(key, v); } catch { /* quota / disabled */ } + }; + } + S['set-local-storage-item'] = storageSetter('localStorage'); + S['set-session-storage-item'] = storageSetter('sessionStorage'); + + // ---- anti-adblock library fakes ---------------------------------------------------------- + + // BlockAdBlock / FuckAdBlock / SniffAdBlock: report "not detected" and run the page's + // not-detected callbacks. + function fakeDetector() { + const Fake = function () {}; + const self = function () { return this; }; + Fake.prototype.on = function (detected, fn) { if (!detected && typeof fn === 'function') safe.setTimeout(fn, 1); return this; }; + Fake.prototype.onDetected = self; + Fake.prototype.onNotDetected = function (fn) { if (typeof fn === 'function') safe.setTimeout(fn, 1); return this; }; + Fake.prototype.setOption = self; + Fake.prototype.check = function () { return false; }; + Fake.prototype.emitEvent = self; + Fake.prototype.clearEvent = self; + Fake.prototype.options = { set: self, get: self }; + return Fake; + } + S['nobab'] = function () { + const Fake = fakeDetector(); + const inst = new Fake(); + for (const [k, v] of [['BlockAdBlock', Fake], ['blockAdBlock', inst], ['SniffAdBlock', Fake], ['sniffAdBlock', inst]]) { + try { safe.defineProperty(W, k, { value: v, writable: false, configurable: false }); } catch { /* ignore */ } + } + // The obfuscated "bab" loader evals a blob with recognisable tokens. + const sig = ['getElementById', 'String.fromCharCode', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'charAt', 'DOMContentLoaded', 'AdBlock', 'addEventListener', 'doScroll', 'fromCharCode', '<<2|r>>4', 'sessionStorage', 'clientWidth', 'localStorage', 'Math', 'random']; + W.eval = new safe.Proxy(W.eval, { + apply(target, thisArg, args) { + const a = args[0]; + // Case-sensitive, like uBO: the obfuscated loader uses these exact lowercase tokens. + if (typeof a === 'string' && (a.includes('blockadblock') || a.includes('babasbm') || /getItem\('babn'\)/.test(a) || sig.every((s) => a.includes(s)))) { + if (document.body) document.body.style.removeProperty('visibility'); + return undefined; + } + return safe.Reflect_apply(target, thisArg, args); + }, + }); + }; + S['nofab'] = function () { + const Fake = fakeDetector(); + const inst = new Fake(); + for (const [k, v] of [['FuckAdBlock', Fake], ['fuckAdBlock', inst], ['fAB', inst]]) { + try { safe.defineProperty(W, k, { value: v, writable: false, configurable: false }); } catch { /* ignore */ } + } + }; + + S['nowebrtc'] = function () { + const name = W.RTCPeerConnection ? 'RTCPeerConnection' : W.webkitRTCPeerConnection ? 'webkitRTCPeerConnection' : ''; + if (!name) return; + const Native = W[name]; + const Fake = function () {}; + Fake.prototype = { + close: noop, createDataChannel: () => ({ close: noop, send: noop }), createOffer: () => safe.Promise.resolve({}), + setRemoteDescription: () => safe.Promise.resolve(), setLocalDescription: () => safe.Promise.resolve(), + addIceCandidate: () => safe.Promise.resolve(), addEventListener: noop, removeEventListener: noop, + toString() { return '[object RTCPeerConnection]'; }, + }; + W[name] = new safe.Proxy(Native, { construct() { return new Fake(); } }); + }; + + S['refresh-defuser'] = function (arg = '') { + onReady(() => { + const meta = document.querySelector('meta[http-equiv="refresh" i][content]'); + if (!meta) return; + const s = arg === '' ? meta.getAttribute('content') : arg; + const ms = Math.max(parseFloat(s) || 0, 0) * 1000; + safe.setTimeout(() => W.stop(), ms); + }); + }; + + S['popads-dummy'] = function () { + delete W.PopAds; + delete W.popns; + try { + safe.defineProperty(W, 'PopAds', { value: {} }); + safe.defineProperty(W, 'popns', { value: {} }); + } catch { /* ignore */ } + }; + + // SilentBlock's own: dismiss anti-adblock walls on sites listed in our filters. + S['sb-unwall'] = function () { + /*@UNWALL_CORE@*/ + unwallWatch(20000); + }; + + return S; +})(); diff --git a/src/shared/hostnames.js b/src/shared/hostnames.js new file mode 100644 index 0000000..7d2c072 --- /dev/null +++ b/src/shared/hostnames.js @@ -0,0 +1,61 @@ +// Hostname helpers shared by the build scripts (Node) and the extension runtime. +// Keep this file dependency-free: it is imported by the service worker as-is. + +// "a.b.example.com" -> ["a.b.example.com", "b.example.com", "example.com", "com"] +export function hostnameAndParents(hostname) { + const out = []; + let h = hostname; + while (h) { + out.push(h); + const dot = h.indexOf('.'); + if (dot === -1) break; + h = h.slice(dot + 1); + } + return out; +} + +const HOST_RE = /^(?=.{1,253}$)[a-z0-9_](?:[a-z0-9_-]{0,62}[a-z0-9_])?(?:\.[a-z0-9_](?:[a-z0-9_-]{0,62}[a-z0-9_])?)*$/; + +export function isValidHostname(hostname) { + return typeof hostname === 'string' && HOST_RE.test(hostname); +} + +// Normalise user or list input ("https://WWW.Example.com/x", "example.com.") to a bare hostname, +// or return null if it is not one. +export function normaliseHostname(input) { + if (typeof input !== 'string') return null; + let s = input.trim().toLowerCase(); + if (!s) return null; + if (s.includes('://')) { + try { s = new URL(s).hostname; } catch { return null; } + } + s = s.replace(/^\*\./, '').replace(/\.$/, ''); + if (s.includes('/') || s.includes(':')) return null; + return isValidHostname(s) ? s : null; +} + +// Match patterns that cover a hostname and all of its subdomains, over http and https. +export function hostnameToMatchPatterns(hostname) { + return [`*://${hostname}/*`, `*://*.${hostname}/*`]; +} + +// True when `hostname` is `domain` or a subdomain of it. +export function hostnameIsWithin(hostname, domain) { + return hostname === domain || hostname.endsWith('.' + domain); +} + +// Stable 32-bit FNV-1a, used to shard per-host data files. +export function fnv1a(str) { + let h = 0x811c9dc5; + for (let i = 0; i < str.length; i++) { + h ^= str.charCodeAt(i); + h = Math.imul(h, 0x01000193); + } + return h >>> 0; +} + +export const SPECIFIC_SHARDS = 32; + +export function shardOf(hostname) { + return fnv1a(hostname) % SPECIFIC_SHARDS; +} diff --git a/src/shared/ui.css b/src/shared/ui.css new file mode 100644 index 0000000..52c5a63 --- /dev/null +++ b/src/shared/ui.css @@ -0,0 +1,71 @@ +/* SilentBlock UI tokens, shared by the popup and the options page. */ +:root { + color-scheme: light dark; + --bg: #f5f6f8; + --panel: #ffffff; + --text: #15181d; + --muted: #5b6472; + --line: #e2e5ea; + --accent: #15803d; + --accent-soft: #dcfce7; + --accent-ink: #ffffff; + --paused: #b45309; + --paused-soft: #fef3c7; + --danger: #b91c1c; + --focus: #2563eb; + --radius: 10px; + --shadow: 0 1px 2px rgb(0 0 0 / 6%), 0 4px 16px rgb(0 0 0 / 6%); + font: 13px/1.45 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; +} +@media (prefers-color-scheme: dark) { + :root { + --bg: #101216; + --panel: #191c22; + --text: #e7e9ee; + --muted: #9aa3b1; + --line: #2a2f38; + --accent: #22c55e; + --accent-soft: #12321f; + --accent-ink: #06210f; + --paused: #f59e0b; + --paused-soft: #3a2a0c; + --danger: #f87171; + --focus: #60a5fa; + --shadow: none; + } +} + +* { box-sizing: border-box; } +html, body { margin: 0; background: var(--bg); color: var(--text); } +button, input { font: inherit; color: inherit; } +a { color: var(--accent); } +:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; border-radius: 4px; } +[hidden] { display: none !important; } + +.label { font-size: 13px; font-weight: 600; line-height: 1.35; } +.hint { font-size: 12px; line-height: 1.4; color: var(--muted); } + +/* Toggle switch: a real checkbox, restyled. */ +.switch { position: relative; display: inline-flex; flex: none; width: 38px; height: 22px; cursor: pointer; } +.switch input { position: absolute; inset: 0; margin: 0; opacity: 0; cursor: inherit; } +.switch span { position: absolute; inset: 0; border-radius: 999px; background: var(--line); } +.switch span::after { + content: ""; position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 50%; + background: #fff; box-shadow: 0 1px 2px rgb(0 0 0 / 30%); +} +/* Animate only after the first render, so switches don't slide into their saved state. */ +.animate .switch span { transition: background .15s; } +.animate .switch span::after { transition: transform .15s; } +.switch input:checked + span { background: var(--accent); } +.switch input:checked + span::after { transform: translateX(16px); } +.switch input:disabled + span { opacity: .45; } +.switch input:focus-visible + span { outline: 2px solid var(--focus); outline-offset: 2px; } + +.btn { + display: inline-flex; align-items: center; justify-content: center; gap: 6px; + padding: 7px 12px; border: 1px solid var(--line); border-radius: 8px; + background: var(--panel); cursor: pointer; font-weight: 600; +} +.btn:hover { border-color: var(--muted); } +.btn.primary { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); } +.btn:disabled { opacity: .5; cursor: default; } diff --git a/src/shared/unwall-core.js b/src/shared/unwall-core.js new file mode 100644 index 0000000..1243fa2 --- /dev/null +++ b/src/shared/unwall-core.js @@ -0,0 +1,117 @@ +// Anti-adblock wall remover. Self-contained on purpose: the build pastes this source into +// content/unwall.js (isolated world, run from the popup) and into the `sb-unwall` +// scriptlet (MAIN world, run on sites our filters list). No imports, no exports. +// +// It only runs where someone asked for it (popup button, per-site setting, or a filter), +// and even then it hides rather than removes, and only touches scroll/blur after it has +// actually found a wall. v1 ran a looser version of this on every site and broke admin +// panels that mention "whitelist". + +/* eslint-disable no-unused-vars */ +const UNWALL_TEXT_RE = /\bad[\s-]?block(?:er|ing)?s?\b|\bcontent[\s-]?blockers?\b|\bads? (?:are|is) (?:being )?blocked\b|\b(?:disable|turn off|pause|deactivate) (?:your |the )?(?:ad|content)[\s-]?block|\b(?:whitelist|allowlist|white-list) (?:us|this site|our (?:site|website|domain))\b|\bads aren'?t (?:being )?displayed\b/i; + +const unwallHidden = new WeakSet(); + +function unwallHide(el) { + el.style.setProperty('display', 'none', 'important'); + unwallHidden.add(el); +} + +function unwallArea(el) { + const r = el.getBoundingClientRect(); + return (r.width * r.height) / Math.max(1, innerWidth * innerHeight); +} + +function unwallText(el) { + const t = el.innerText || ''; + return t.length > 6000 ? '' : t; +} + +// Walls sit near the top of the tree; a bounded walk keeps the sweep cheap on big pages. +function unwallCandidates(root, maxDepth) { + const out = []; + const walk = (el, depth) => { + for (let c = el.firstElementChild; c; c = c.nextElementSibling) { + out.push(c); + if (depth < maxDepth) walk(c, depth + 1); + } + }; + walk(root, 1); + return out; +} + +function unwallSweep() { + const body = document.body; + if (!body) return false; + let hit = false; + + for (const d of document.querySelectorAll('dialog[open]')) { + if (unwallHidden.has(d) || !UNWALL_TEXT_RE.test(unwallText(d))) continue; + try { d.close(); } catch { /* not closable */ } + unwallHide(d); + hit = true; + } + + const overlays = []; + for (const el of unwallCandidates(body, 6)) { + if (unwallHidden.has(el)) continue; + const cs = getComputedStyle(el); + if (cs.display === 'none') continue; + const z = parseInt(cs.zIndex, 10) || 0; + const positioned = cs.position === 'fixed' || cs.position === 'sticky' || (cs.position === 'absolute' && z >= 100); + if (!positioned) continue; + overlays.push([el, cs]); + if (unwallArea(el) < 0.08) continue; // a small badge is not a wall + if (UNWALL_TEXT_RE.test(unwallText(el))) { unwallHide(el); hit = true; } + } + + if (!hit) return false; + + // Full-screen dimmers left behind once the message box is gone. + for (const [el, cs] of overlays) { + if (unwallHidden.has(el) || cs.position !== 'fixed' || unwallArea(el) < 0.85) continue; + const text = (el.innerText || '').trim(); + const dim = /rgba\(.+,\s*0?\.\d+\)|rgba\(.+,\s*1\)|rgb\(/.test(cs.backgroundColor) || cs.backdropFilter !== 'none' || parseFloat(cs.opacity) < 1; + if (text.length < 40 && dim) unwallHide(el); + } + + for (const el of [document.documentElement, body]) { + const cs = getComputedStyle(el); + if (cs.overflow === 'hidden' || cs.overflowY === 'hidden') { + el.style.setProperty('overflow', 'auto', 'important'); + el.style.setProperty('overflow-y', 'auto', 'important'); + } + if (el === body && cs.position === 'fixed') el.style.setProperty('position', 'static', 'important'); + if (cs.pointerEvents === 'none') el.style.setProperty('pointer-events', 'auto', 'important'); + } + const blurred = [document.documentElement, body, ...document.querySelectorAll('body > *, main, article, [role="main"]')]; + for (const el of blurred) { + const cs = getComputedStyle(el); + if (cs.filter.includes('blur')) el.style.setProperty('filter', 'none', 'important'); + if (cs.backdropFilter && cs.backdropFilter.includes('blur')) el.style.setProperty('backdrop-filter', 'none', 'important'); + } + return true; +} + +// Sweep now, then keep sweeping (throttled) while the page settles, for `ms` milliseconds. +// `onHit` runs once, the first time a wall is actually removed. +function unwallWatch(ms, onHit) { + let pending = 0; + let reported = false; + const sweep = () => { + pending = 0; + let hit = false; + try { hit = unwallSweep(); } catch { /* page in flux */ } + if (hit && !reported && onHit) { reported = true; try { onHit(); } catch { /* ignore */ } } + }; + const schedule = () => { if (!pending) pending = setTimeout(sweep, 400); }; + const start = () => { + sweep(); + const mo = new MutationObserver(schedule); + mo.observe(document.documentElement, { childList: true, subtree: true, attributes: true, attributeFilter: ['class', 'style', 'open'] }); + setTimeout(() => mo.disconnect(), ms); + addEventListener('load', schedule, { once: true }); + }; + if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start, { once: true }); + else start(); +} diff --git a/src/shared/url-match.js b/src/shared/url-match.js new file mode 100644 index 0000000..c379a05 --- /dev/null +++ b/src/shared/url-match.js @@ -0,0 +1,18 @@ +// Path matching for the security page-URL list, with ABP separator semantics. +// Shared by the service worker and the unit tests. +// +// An entry is a path prefix, optionally ending in "^". Without "^" it is a plain prefix +// (`/spt/` matches `/spt/anything`). With "^" the path must end there or continue with a +// separator, so `/6Y3zq^` matches `/6Y3zq` and `/6Y3zq?x` but NOT `/6Y3zqABC`, which on a +// link shortener is someone else's link. + +// ABP: a separator is anything but a letter, digit, or one of _ - . % +const WORD = /[A-Za-z0-9_\-.%]/; + +export function pathMatches(path, entry) { + if (!entry.endsWith('^')) return path.startsWith(entry); + const base = entry.slice(0, -1); + if (!path.startsWith(base)) return false; + const next = path.charAt(base.length); + return next === '' || !WORD.test(next); +} diff --git a/src/warning/warning.css b/src/warning/warning.css new file mode 100644 index 0000000..66b6270 --- /dev/null +++ b/src/warning/warning.css @@ -0,0 +1,18 @@ +:root { + --danger-ink: #8e1f33; + --danger-soft: #fbe9ec; +} +@media (prefers-color-scheme: dark) { + :root { --danger-ink: #f39aaa; --danger-soft: #3a1a21; } +} +body { min-height: 100vh; display: grid; place-items: center; padding: 32px 16px; font-size: 15px; } +.warn { max-width: 560px; display: flex; flex-direction: column; align-items: flex-start; gap: 14px; } +.mark { margin-bottom: 4px; } +h1 { margin: 0; font-size: 26px; line-height: 1.2; text-wrap: balance; } +.host { margin: 0; font-size: 17px; font-weight: 700; color: var(--danger-ink); background: var(--danger-soft); padding: 6px 10px; border-radius: 8px; word-break: break-all; } +.why { margin: 0; color: var(--muted); line-height: 1.55; max-width: 60ch; } +.url { margin: 0; font: 12px/1.4 ui-monospace, Consolas, monospace; color: var(--muted); word-break: break-all; } +.actions { display: flex; flex-wrap: wrap; align-items: center; gap: 16px; margin-top: 6px; } +.link { border: 0; background: none; padding: 4px 0; color: var(--muted); text-decoration: underline; cursor: pointer; font-size: 14px; } +.link:hover { color: var(--text); } +.fine { margin: 0; font-size: 12px; color: var(--muted); } diff --git a/src/warning/warning.html b/src/warning/warning.html new file mode 100644 index 0000000..42dd67f --- /dev/null +++ b/src/warning/warning.html @@ -0,0 +1,25 @@ + + + + + + Dangerous site blocked + + + + +
      + +

      SilentBlock stopped this page

      +

       

      +

      This site is on a list of known malware, phishing or scam sites. Pages like this try to steal passwords and card details, or install software you didn't ask for.

      +

      +
      + + +
      +

      If you continue, SilentBlock allows this site until you close the browser.

      +
      + + + diff --git a/src/warning/warning.js b/src/warning/warning.js new file mode 100644 index 0000000..85496f3 --- /dev/null +++ b/src/warning/warning.js @@ -0,0 +1,31 @@ +// Warning page for known malware, phishing and scam sites. The blocked URL arrives in the +// query string; the service worker re-validates it before allowing anything. +const params = new URLSearchParams(location.search); +const target = params.get('u') || ''; +const listedHost = params.get('h') || ''; +const back = params.get('b') || ''; + +let host = listedHost; +try { host = new URL(target).hostname; } catch { /* keep the listed host */ } +document.getElementById('host').textContent = host || 'Unknown site'; +document.getElementById('url').textContent = target; +document.title = `Blocked: ${host}`; + +const valid = /^https?:\/\//i.test(target); +if (!valid) { + document.getElementById('proceed').hidden = true; + document.getElementById('fine').hidden = true; +} + +document.getElementById('back').addEventListener('click', async () => { + // Straight to the page you were on. history.back() would land on the blocked + // navigation's error entry instead. + if (/^https?:\/\//i.test(back)) { location.replace(back); return; } + const tab = await chrome.tabs.getCurrent(); + if (tab) chrome.tabs.update(tab.id, { url: 'chrome://newtab/' }); +}); + +document.getElementById('proceed').addEventListener('click', async () => { + const res = await chrome.runtime.sendMessage({ type: 'security:bypass', url: target }); + if (res && !res.error) location.replace(target); +}); diff --git a/test/e2e/extension.spec.mjs b/test/e2e/extension.spec.mjs new file mode 100644 index 0000000..87c02b9 --- /dev/null +++ b/test/e2e/extension.spec.mjs @@ -0,0 +1,468 @@ +// End-to-end tests against the real built extension (dist/chrome). Each one pins a +// behaviour the 1.x review found broken, or a promise 2.0 makes. +import { test, expect, openPopup, tabIdFor, display, reinstallExtension } from './fixtures.mjs'; + +test.describe('install', () => { + test('enables every ruleset and registers content scripts', async ({ sw }) => { + const r = await sw.evaluate(async () => ({ + rulesets: (await chrome.declarativeNetRequest.getEnabledRulesets()).sort(), + scripts: (await chrome.scripting.getRegisteredContentScripts()).map((s) => s.id), + state: await chrome.storage.local.get(null), + })); + expect(r.rulesets).toEqual(['ads', 'annoyances', 'core', 'privacy', 'security']); + expect(r.scripts).toContain('sb-tokens'); + expect(r.scripts).toContain('sb-generic-ads'); + expect(r.scripts.some((id) => id.startsWith('sb-sl-core-'))).toBe(true); + expect(r.state).toMatchObject({ schema: 2, enabled: true, allowlist: [] }); + }); +}); + +test.describe('network', () => { + test('blocks third-party ad hosts and lets other hosts load', async ({ context, sw, url }) => { + const page = await context.newPage(); + await page.goto(url('site.test', 'basic.html')); + await expect.poll(() => page.evaluate(() => window.__net)).toEqual({ ad: 'error', ok: 'load' }); + }); + + test('third-party rules leave the vendor\'s own site alone', async ({ context, sw, url }) => { + const page = await context.newPage(); + await page.goto(url('sb-ads.test', 'basic.html')); + await expect.poll(() => page.evaluate(() => window.__net.ad)).toBe('load'); + }); + + test('first-party Google tag is swapped for a stub that still fires callbacks', async ({ context, sw, url, server }) => { + const page = await context.newPage(); + await page.goto(url('site.test', 'gtag.html')); + await expect.poll(() => page.evaluate(() => window.__callback)).toBe(true); + expect(await page.evaluate(() => window.__ended)).toBe(true); + expect(await page.evaluate(() => window.__real || [])).not.toContain('G-TEST'); + expect(server.hits.some((h) => h.includes('/gtag/js'))).toBe(false); + }); +}); + +test.describe('cosmetic', () => { + test('hides generic token, generic complex and site-specific targets, applies :style()', async ({ context, sw, url }) => { + const page = await context.newPage(); + await page.goto(url('sb-selftest.test', 'basic.html')); + await expect.poll(() => display(page, '#tokenProbe')).toBe('none'); + await expect.poll(() => display(page, '#complexProbe')).toBe('none'); + await expect.poll(() => display(page, '#specificProbe')).toBe('none'); + await expect.poll(() => page.$eval('#styleProbe', (el) => getComputedStyle(el).color)).toBe('rgb(1, 2, 3)'); + }); + + test('hiding CSS is invisible to the page (user origin, no + +
      We've detected an ad blocker. Please whitelist this site.
      `); + await expect.poll(() => page.$eval('#wall', (el) => getComputedStyle(el).display)).toBe('none'); + expect(await page.$eval('#menu', (el) => getComputedStyle(el).display)).toBe('block'); + expect(await page.evaluate(() => getComputedStyle(document.body).overflowY)).toBe('auto'); +}); diff --git a/test/e2e/server.mjs b/test/e2e/server.mjs new file mode 100644 index 0000000..71d008c --- /dev/null +++ b/test/e2e/server.mjs @@ -0,0 +1,36 @@ +// Fixture server. The browser maps every hostname to 127.0.0.1, so one server answers +// for site.test, sb-ads.test, and so on; the Host header tells them apart. +import http from 'node:http'; +import { readFile } from 'node:fs/promises'; +import path from 'node:path'; + +const FIXTURES = path.resolve(import.meta.dirname, '..', 'fixtures'); + +export async function startServer() { + const hits = []; + const server = http.createServer(async (req, res) => { + const url = new URL(req.url, `http://${req.headers.host}`); + hits.push(`${url.hostname}${url.pathname}${url.search}`); + if (url.pathname.startsWith('/page/')) { + try { + const html = await readFile(path.join(FIXTURES, path.basename(url.pathname)), 'utf8'); + res.writeHead(200, { 'content-type': 'text/html; charset=utf-8' }); + res.end(html); + } catch { + res.writeHead(404).end('not found'); + } + return; + } + if (url.pathname.endsWith('.js') || url.pathname.startsWith('/gtag/') || url.pathname.startsWith('/script')) { + // A script served for real records itself, so tests can tell "loaded" from "stubbed". + const id = url.searchParams.get('id') || url.pathname; + res.writeHead(200, { 'content-type': 'text/javascript' }); + res.end(`(window.__real = window.__real || []).push(${JSON.stringify(id)});`); + return; + } + res.writeHead(200, { 'content-type': 'text/plain' }); + res.end('ok'); + }); + await new Promise((r) => server.listen(0, '127.0.0.1', r)); + return { port: server.address().port, hits, close: () => new Promise((r) => server.close(r)) }; +} diff --git a/test/fixtures/basic.html b/test/fixtures/basic.html new file mode 100644 index 0000000..5c4f58c --- /dev/null +++ b/test/fixtures/basic.html @@ -0,0 +1,32 @@ + + +basic + +
      token probe
      +
      complex probe
      +
      specific probe
      +
      style probe
      + + + diff --git a/test/fixtures/gtag.html b/test/fixtures/gtag.html new file mode 100644 index 0000000..7e2a831 --- /dev/null +++ b/test/fixtures/gtag.html @@ -0,0 +1,20 @@ + + + + gtag + + + + +gtag fixture + diff --git a/test/fixtures/hygiene.html b/test/fixtures/hygiene.html new file mode 100644 index 0000000..895b27e --- /dev/null +++ b/test/fixtures/hygiene.html @@ -0,0 +1,32 @@ + + + + hygiene + + + + + +
      glass panel
      + + + + diff --git a/test/fixtures/landing.html b/test/fixtures/landing.html new file mode 100644 index 0000000..bcaf361 --- /dev/null +++ b/test/fixtures/landing.html @@ -0,0 +1,2 @@ + +landinglanding page diff --git a/test/fixtures/malware-embed.html b/test/fixtures/malware-embed.html new file mode 100644 index 0000000..4e3ec8a --- /dev/null +++ b/test/fixtures/malware-embed.html @@ -0,0 +1,14 @@ + + +malware embed + + + + diff --git a/test/fixtures/popup.html b/test/fixtures/popup.html new file mode 100644 index 0000000..e97435a --- /dev/null +++ b/test/fixtures/popup.html @@ -0,0 +1,25 @@ + + +popup + + + + + + + + diff --git a/test/fixtures/wall-frame.html b/test/fixtures/wall-frame.html new file mode 100644 index 0000000..757c783 --- /dev/null +++ b/test/fixtures/wall-frame.html @@ -0,0 +1,9 @@ + + +wall in a frame + +

      Host page

      + + + + diff --git a/test/fixtures/wall.html b/test/fixtures/wall.html new file mode 100644 index 0000000..af836f4 --- /dev/null +++ b/test/fixtures/wall.html @@ -0,0 +1,17 @@ + + + + wall + + + +

      Article text

      +
      +

      Ad blocker detected

      Please disable your ad blocker to keep reading.

      + + diff --git a/test/unit/compiler.test.mjs b/test/unit/compiler.test.mjs new file mode 100644 index 0000000..cca018e --- /dev/null +++ b/test/unit/compiler.test.mjs @@ -0,0 +1,252 @@ +// Unit tests for the filter-list compiler (scripts/lib) and shared helpers. +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { evaluate, preprocess } from '../../scripts/lib/preprocess.mjs'; +import { parseLine, parseDomainList, splitScriptletArgs, badfilterKey } from '../../scripts/lib/parse.mjs'; +import { networkToRule, mergeRules, assignIds, PRIORITY, ALLOW_ID_BASE } from '../../scripts/lib/network.mjs'; +import { processSelector, CosmeticCompiler, TOKEN_RE, cssHide } from '../../scripts/lib/cosmetic.mjs'; +import { ScriptletCompiler, CANONICAL } from '../../scripts/lib/scriptlets.mjs'; +import { RESOURCES } from '../../scripts/lib/resources.mjs'; +import { hostnameAndParents, normaliseHostname, hostnameToMatchPatterns, isValidHostname } from '../../src/shared/hostnames.js'; + +const rule = (line) => networkToRule(parseLine(line), RESOURCES); + +// ---- preprocess ---------------------------------------------------------------- + +test('preprocessor evaluates uBO environment expressions', () => { + assert.equal(evaluate('env_chromium'), true); + assert.equal(evaluate('env_firefox'), false); + assert.equal(evaluate('!cap_html_filtering && (env_mv3 || false)'), true); + assert.equal(evaluate('unknown_token'), false); +}); + +test('preprocessor keeps the right branch of nested !#if/!#else', () => { + const { lines } = preprocess([ + 'a', '!#if env_firefox', 'ff', '!#if env_mv3', 'ff-mv3', '!#endif', '!#else', 'not-ff', '!#endif', '!#include x.txt', 'z', + ].join('\n')); + assert.deepEqual(lines, ['a', 'not-ff', 'z']); +}); + +// ---- parse --------------------------------------------------------------------------- + +test('parser classifies network, cosmetic, scriptlet, comments and skips', () => { + assert.equal(parseLine('! comment'), null); + assert.equal(parseLine('[Adblock Plus 2.0]'), null); + assert.equal(parseLine('||ads.com^$third-party').type, 'network'); + assert.equal(parseLine('||site.com/#!/ads$script').type, 'network'); + assert.equal(parseLine('##.ad').type, 'cosmetic'); + assert.equal(parseLine('example.com##+js(set, a, 1)').type, 'scriptlet'); + assert.equal(parseLine('example.com##^script:has-text(x)').reason, 'html-filter'); + assert.equal(parseLine('example.com#$#abort-on-property-read x').reason, 'abp-snippet'); +}); + +test('entity-only cosmetic domains are dropped, never widened to generic', () => { + assert.equal(parseLine('example.*##.ad').type, 'skip'); + const f = parseLine('example.*,real.com##.ad'); + assert.deepEqual(f.include, ['real.com']); +}); + +test('domain lists handle negation, case and IDN', () => { + const d = parseDomainList('A.com|~b.a.com|bücher.de|x.*', '|'); + assert.deepEqual(d.include, ['a.com', 'xn--bcher-kva.de']); + assert.deepEqual(d.exclude, ['b.a.com']); + assert.equal(d.dropped, 1); +}); + +test('scriptlet args split on unescaped commas and unquote', () => { + assert.deepEqual(splitScriptletArgs('set, a.b, "x, y", c\\,d'), ['set', 'a.b', 'x, y', 'c,d']); +}); + +test('badfilter key ignores option order', () => { + assert.equal(badfilterKey(parseLine('||a.com^$script,3p,badfilter')), badfilterKey(parseLine('||a.com^$3p,script'))); +}); + +// ---- network ----------------------------------------------------------------------- + +test('||host^ becomes requestDomains; ||host without ^ stays a urlFilter', () => { + assert.deepEqual(rule('||ads.com^').rule.condition, { requestDomains: ['ads.com'] }); + assert.deepEqual(rule('||ads.com').rule.condition, { urlFilter: '||ads.com' }); +}); + +test('party, types, domains and methods map to DNR conditions', () => { + const r = rule('||t.com/px$image,ping,third-party,domain=a.com|~b.a.com,method=post').rule; + assert.deepEqual(r.condition, { + urlFilter: '||t.com/px', resourceTypes: ['image', 'ping'], domainType: 'thirdParty', + initiatorDomains: ['a.com'], excludedInitiatorDomains: ['b.a.com'], requestMethods: ['post'], + }); + assert.equal(r.priority, PRIORITY.block); + assert.deepEqual(rule('||x.com^$~script').rule.condition.excludedResourceTypes, ['script']); + assert.equal(rule('||x.com^$1p').rule.condition.domainType, 'firstParty'); +}); + +test('priority ladder: block < redirect < allow < important', () => { + assert.equal(rule('||a.com^').rule.priority, 10); + const redir = rule('||a.com/gpt.js$script,redirect=googletagservices_gpt.js').rule; + assert.equal(redir.priority, 11); + assert.deepEqual(redir.action, { type: 'redirect', redirect: { extensionPath: '/resources/googletagservices_gpt.js' } }); + assert.equal(rule('@@||a.com^').rule.priority, 20); + assert.equal(rule('||a.com^$important').rule.priority, 30); + assert.ok(PRIORITY.important < 1000, 'user allowlist (1000) must beat everything'); +}); + +test('unknown redirect resource falls back to a block; redirect needs a type', () => { + assert.equal(rule('||a.com/x.js$script,redirect=not-a-resource').rule.action.type, 'block'); + assert.equal(rule('||a.com/x.js$redirect=noop.js').skip, 'redirect-without-type'); +}); + +test('unsupported options drop the filter instead of approximating it', () => { + for (const opt of ['csp=script-src none', 'removeparam=utm', 'popup', 'redirect-rule=noop.js', 'header=x:y', 'frobnicate']) { + assert.ok(rule(`||a.com^$${opt}`).skip, opt); + } + assert.equal(rule('$script').skip, 'match-everything'); +}); + +test('$document exceptions allow the frame tree and disable cosmetics', () => { + const r = rule('@@||site.com^$document'); + assert.equal(r.rule.action.type, 'allowAllRequests'); + assert.deepEqual(r.rule.condition.resourceTypes, ['main_frame', 'sub_frame']); + assert.deepEqual(r.flags, { hosts: ['site.com'], ehide: true }); +}); + +test('$ghide is a cosmetic flag, not a network rule', () => { + const r = rule('@@||site.com^$ghide'); + assert.equal(r.rule, undefined); + assert.deepEqual(r.flags, { hosts: ['site.com'], ghide: true }); + assert.equal(rule('||site.com^$ghide').skip, 'cosmetic-flag-on-block'); +}); + +test('regex filters: literals become urlFilter, lookarounds are refused', () => { + assert.deepEqual(rule('/\\/banner\\/ads\\//').rule.condition, { urlFilter: '/banner/ads/' }); + assert.equal(rule('/^https?:\\/\\/[a-z]{8}\\.xyz\\//$script').rule.condition.regexFilter, '^https?:\\/\\/[a-z]{8}\\.xyz\\/'); + assert.equal(rule('/ads(?=\\.js)/').skip, 'regex-unsupported'); +}); + +test('mergeRules folds requestDomains, drops covered subdomains and duplicates', () => { + const merged = mergeRules(['||a.com^', '||x.a.com^', '||b.com^', '||c.com^$3p', '||a.com^', '||d.com/path'].map((l) => rule(l).rule)); + assert.equal(merged.length, 3); + assert.deepEqual(merged.find((r) => !r.condition.domainType && r.condition.requestDomains).condition.requestDomains, ['a.com', 'b.com']); +}); + +test('assignIds puts allow rules above ALLOW_ID_BASE', () => { + const ids = assignIds([rule('||a.com^').rule, rule('@@||b.com^').rule, rule('||c.com/x').rule]).map((r) => r.id); + assert.deepEqual(ids, [1, ALLOW_ID_BASE, 2]); +}); + +// ---- cosmetic ------------------------------------------------------------------------ + +test('selectors: :style is sanitised, procedural and unsafe ones are skipped', () => { + assert.deepEqual(processSelector('body:style(overflow: auto)'), { kind: 'style', selector: 'body', decl: 'overflow: auto !important' }); + assert.equal(processSelector('div:style(background: url(http://x))').skip, 'style-unsafe'); + assert.equal(processSelector('div:has-text(Sponsored)').skip, 'procedural'); + assert.equal(processSelector('a{} body{display:none}').skip, 'selector-unsafe'); + assert.equal(processSelector('div /* comment').skip, 'selector-unsafe'); + assert.deepEqual(processSelector('div:-abp-has(> .ad)'), { kind: 'hide', selector: 'div:has(> .ad)' }); + assert.deepEqual(processSelector('.x:remove()'), { kind: 'hide', selector: '.x' }); +}); + +test('token selectors are only plain classes and ids', () => { + assert.ok(TOKEN_RE.test('.ad-banner') && TOKEN_RE.test('#ad_top')); + assert.ok(!TOKEN_RE.test('div.ad') && !TOKEN_RE.test('.a .b') && !TOKEN_RE.test('[class^="ad"]')); +}); + +test('cosmetic compiler routes generic, specific and exceptions', () => { + const c = new CosmeticCompiler(['ads']); + for (const l of ['##.ad', '##div[id^="ad-"]', 'a.com##.site-ad', 'a.com#@#.ad', '~b.com##.gone', '#@#.gone', 'c.com##.x:style(color: red)']) { + c.add('ads', parseLine(l)); + } + const { files } = c.emit(); + assert.deepEqual(files['cosmetic/tokens-ads.json'], ['.ad']); + assert.deepEqual(files['cosmetic/complex-ads.json'], ['div[id^="ad-"]']); + assert.deepEqual(files['cosmetic/exceptions.json'], { 'a.com': ['.ad'], 'b.com': ['.gone'] }); + const shards = Object.entries(files).filter(([k]) => k.startsWith('cosmetic/specific-ads-')).map(([, v]) => v); + const merged = Object.assign({}, ...shards); + assert.deepEqual(merged, { 'a.com': { h: ['.site-ad'] }, 'c.com': { s: [['.x', 'color: red !important']] } }); +}); + +test('cssHide groups selectors into rules', () => { + assert.equal(cssHide(['.a', '.b', '.c'], 2), '.a,\n.b\n{display:none!important}\n.c\n{display:none!important}'); +}); + +// ---- scriptlets ------------------------------------------------------------------------ + +test('scriptlet aliases resolve to canonical names', () => { + assert.equal(CANONICAL.get('aopr'), 'abort-on-property-read'); + assert.equal(CANONICAL.get('nostif'), 'prevent-setTimeout'); + assert.equal(CANONICAL.get('trusted-set'), undefined); +}); + +test('scriptlet compiler: generic skipped, exceptions honoured, buckets registered per host', () => { + const c = new ScriptletCompiler(['ads']); + for (const l of [ + 'a.com,b.com##+js(set, x, true)', '##+js(set, y, true)', 'b.com#@#+js(set, x, true)', + 'c.com##+js(trusted-set, z, 1)', 'd.com##+js(aopr, ad)', 'd.com#@#+js()', + ]) c.add('ads', parseLine(l)); + assert.equal(c.stats['generic-skipped'], 1); + assert.equal(c.stats['trusted-skipped'], 1); + const { files, registrations } = c.emit('const SCRIPTLETS = {};'); + const src = Object.values(files).join('\n'); + assert.match(src, /"a\.com":\[\["set-constant","x","true"\]\]/); + assert.match(src, /"d\.com":\["\*"\]/); + const matches = registrations.ads.flatMap((b) => b.matches); + assert.ok(matches.includes('*://a.com/*') && matches.includes('*://*.a.com/*')); +}); + +// ---- hostnames ----------------------------------------------------------------------------- + +test('hostname helpers', () => { + assert.deepEqual(hostnameAndParents('a.b.c'), ['a.b.c', 'b.c', 'c']); + assert.equal(normaliseHostname(' https://WWW.Example.com/path?q '), 'www.example.com'); + assert.equal(normaliseHostname('*.example.com.'), 'example.com'); + assert.equal(normaliseHostname('not a host'), null); + assert.equal(normaliseHostname('example.com:8080'), null); + assert.deepEqual(hostnameToMatchPatterns('x.com'), ['*://x.com/*', '*://*.x.com/*']); + assert.ok(!isValidHostname('-bad.com') && isValidHostname('ok-1.co.uk')); +}); + +// ---- popups ---------------------------------------------------------------------------- + +import { PopupCompiler, patternToRegexSource, isPopupFilter, withoutPopup } from '../../scripts/lib/popups.mjs'; + +test('popup patterns compile to URL regexes with ABP anchors', () => { + const re = new RegExp(patternToRegexSource('||ads.com^'), 'i'); + assert.ok(re.test('https://ads.com/x') && re.test('https://sub.ads.com/') && !re.test('https://notads.com/')); + const path = new RegExp(patternToRegexSource('/popunder/*.php'), 'i'); + assert.ok(path.test('https://x.com/popunder/a.php') && !path.test('https://x.com/other.php')); +}); + +test('popup compiler splits hosts, third-party hosts, rules and exceptions', () => { + const c = new PopupCompiler(); + for (const l of ['||pop.com^$popup', '||pop3.com^$popup,third-party', '||x.com/go$popup,domain=site.com', '@@*$popup,domain=mail.google.com', '||e.*^$popup,domain=e.*']) { + c.add(parseLine(l)); + } + const out = c.emit(); + assert.deepEqual(out.hosts, ['pop.com']); + assert.deepEqual(out.hosts3p, ['pop3.com']); + assert.equal(out.rules.length, 1); + assert.deepEqual(out.rules[0].slice(1), [['site.com'], [], 0]); + assert.deepEqual(out.allow[0].slice(1), [['mail.google.com'], [], 0]); +}); + +test('$script,popup filters keep their network half', () => { + const f = parseLine('||ads.com^$script,popup'); + assert.ok(isPopupFilter(f)); + const rest = withoutPopup(f); + assert.deepEqual(rest.options.map((o) => o.name), ['script']); + assert.equal(withoutPopup(parseLine('||ads.com^$popup')), null); +}); + +// ---- security page-URL matching ------------------------------------------------------------ + +import { pathMatches } from '../../src/shared/url-match.js'; + +test('page-URL entries use ABP separator semantics', () => { + // A shortener code must not swallow a longer, different code. + assert.equal(pathMatches('/6Y3zq', '/6Y3zq^'), true); + assert.equal(pathMatches('/6Y3zq?utm=x', '/6Y3zq^'), true); + assert.equal(pathMatches('/6Y3zq/', '/6Y3zq^'), true); + assert.equal(pathMatches('/6Y3zqABC', '/6Y3zq^'), false); + assert.equal(pathMatches('/6Y3zq-x', '/6Y3zq^'), false); + // Without ^ it is a plain prefix. + assert.equal(pathMatches('/spt/login.php', '/spt/'), true); + assert.equal(pathMatches('/sp', '/spt/'), false); +}); diff --git a/test/unit/state.test.mjs b/test/unit/state.test.mjs new file mode 100644 index 0000000..264f30f --- /dev/null +++ b/test/unit/state.test.mjs @@ -0,0 +1,51 @@ +// Settings normalisation and migration, against a fake chrome.storage. +import { test, beforeEach } from 'node:test'; +import assert from 'node:assert/strict'; + +let store = {}; +globalThis.chrome = { + storage: { + local: { + get: async () => structuredClone(store), + set: async (o) => { Object.assign(store, structuredClone(o)); }, + clear: async () => { store = {}; }, + }, + onChanged: { addListener: () => {} }, + }, +}; + +const { normalise, migrate, defaults, allowlistEntryFor } = await import('../../src/background/state.js'); + +beforeEach(() => { store = {}; }); + +test('normalise fills defaults and rejects junk', () => { + assert.deepEqual(normalise(undefined), defaults()); + const n = normalise({ enabled: 'yes', allowlist: ['B.com', 'b.com', 'bad host', 5, 'https://a.com/x'], categories: { ads: false, evil: true }, badge: 1 }); + assert.deepEqual(n, { ...defaults(), allowlist: ['a.com', 'b.com'], categories: { ads: false, privacy: true, annoyances: true, security: true } }); +}); + +test('first install writes defaults', async () => { + await migrate(); + assert.deepEqual(store, defaults()); +}); + +test('an update never resets existing v2 settings', async () => { + store = { ...defaults(), enabled: false, allowlist: ['keep.com'], categories: { ads: true, privacy: false, annoyances: true } }; + await migrate(); + assert.equal(store.enabled, false); + assert.deepEqual(store.allowlist, ['keep.com']); + assert.equal(store.categories.privacy, false); +}); + +test('v1 settings migrate and v1 leftovers are dropped', async () => { + store = { enabled: false, disabledSites: ['Old.com', 'x.org'], updateAvailable: '1.6.1', updateUrl: 'https://github.com/...' }; + await migrate(); + assert.deepEqual(store, { ...defaults(), enabled: false, allowlist: ['old.com', 'x.org'] }); +}); + +test('allowlist entries cover subdomains', () => { + const s = { ...defaults(), allowlist: ['example.com'] }; + assert.equal(allowlistEntryFor('www.example.com', s), 'example.com'); + assert.equal(allowlistEntryFor('example.com', s), 'example.com'); + assert.equal(allowlistEntryFor('notexample.com', s), null); +}); diff --git a/updates.json b/updates.json deleted file mode 100644 index 8e90d15..0000000 --- a/updates.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "addons": { - "silentblock@local": { - "updates": [ - { - "version": "1.6.0", - "update_link": "https://github.com/ccmrik/SilentBlock/releases/latest/download/SilentBlock.xpi" - } - ] - } - } -} diff --git a/updates.xml b/updates.xml deleted file mode 100644 index d5cd490..0000000 --- a/updates.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - diff --git a/version-bump.ps1 b/version-bump.ps1 deleted file mode 100644 index 18e582a..0000000 --- a/version-bump.ps1 +++ /dev/null @@ -1,76 +0,0 @@ -<# -.SYNOPSIS - Bumps the version in manifest.json, updates.xml, updates.json, commits, and tags. - -.PARAMETER Part - Which part to bump: major, minor, or patch (default: patch) - -.EXAMPLE - .\version-bump.ps1 - .\version-bump.ps1 -Part minor - .\version-bump.ps1 -Part major -#> -param( - [ValidateSet('major', 'minor', 'patch')] - [string]$Part = 'patch' -) - -$ErrorActionPreference = 'Stop' -$root = $PSScriptRoot -$manifestPath = Join-Path $root 'manifest.json' -$updatesXmlPath = Join-Path $root 'updates.xml' -$updatesJsonPath = Join-Path $root 'updates.json' - -# Read and parse -$json = Get-Content $manifestPath -Raw | ConvertFrom-Json -$oldVersion = $json.version -$parts = $oldVersion -split '\.' - -if ($parts.Count -ne 3) { - Write-Error "Unexpected version format: $oldVersion (expected X.Y.Z)" - exit 1 -} - -$major = [int]$parts[0] -$minor = [int]$parts[1] -$patch = [int]$parts[2] - -switch ($Part) { - 'major' { $major++; $minor = 0; $patch = 0 } - 'minor' { $minor++; $patch = 0 } - 'patch' { $patch++ } -} - -$newVersion = "$major.$minor.$patch" - -# Update manifest.json -$raw = Get-Content $manifestPath -Raw -$raw = $raw -replace """version"":\s*""$([regex]::Escape($oldVersion))""", """version"": ""$newVersion""" -Set-Content $manifestPath -Value $raw -NoNewline -Write-Host "manifest.json: $oldVersion -> $newVersion" -ForegroundColor Green - -# Update updates.xml (Chromium auto-update) -if (Test-Path $updatesXmlPath) { - $xml = Get-Content $updatesXmlPath -Raw - $xml = $xml -replace "version='$([regex]::Escape($oldVersion))'", "version='$newVersion'" - Set-Content $updatesXmlPath -Value $xml -NoNewline - Write-Host "updates.xml: $oldVersion -> $newVersion" -ForegroundColor Green -} - -# Update updates.json (Firefox auto-update) -if (Test-Path $updatesJsonPath) { - $jsonFile = Get-Content $updatesJsonPath -Raw - $jsonFile = $jsonFile -replace """version"":\s*""$([regex]::Escape($oldVersion))""", """version"": ""$newVersion""" - Set-Content $updatesJsonPath -Value $jsonFile -NoNewline - Write-Host "updates.json: $oldVersion -> $newVersion" -ForegroundColor Green -} - -Write-Host "Version bumped: $oldVersion -> $newVersion" -ForegroundColor Green - -# Git operations -git add -A -git commit -m "Bump version to $newVersion" -git tag "v$newVersion" - -Write-Host "Committed and tagged v$newVersion" -ForegroundColor Cyan -Write-Host "Run 'git push && git push --tags' to deploy." -ForegroundColor Yellow