diff --git a/Src/Api/Template/Util/get_domain.py b/Src/Api/Template/Util/get_domain.py
new file mode 100644
index 0000000..f2e75a0
--- /dev/null
+++ b/Src/Api/Template/Util/get_domain.py
@@ -0,0 +1,192 @@
+# 18.06.24
+
+import os
+import sys
+import time
+import logging
+import threading
+from concurrent.futures import ThreadPoolExecutor, as_completed
+
+
+# External libraries
+import httpx
+import psutil
+from tqdm import tqdm
+
+
+# Internal utilities
+from Src.Util.color import Colors
+from Src.Util.headers import get_headers
+from Src.Util.console import console
+from Src.Util._jsonConfig import config_manager
+
+
+
+def check_url_for_content(url: str, content: str, timeout: int = 1) -> bool:
+ """
+ Check if a URL contains specific content.
+
+ Args:
+ - url (str): The URL to check.
+ - content (str): The content to search for in the response.
+ - timeout (int): Timeout for the request in seconds.
+
+ Returns:
+ bool: True if the content is found, False otherwise.
+ """
+ try:
+
+ response = httpx.get(url, timeout=timeout, headers={'user-agent': get_headers()})
+ logging.info(f"Testing site to extract domain: {url}, response: {response.status_code}")
+
+ # Raise an error if the status is not successful
+ response.raise_for_status()
+
+ # Check if the target content is in the response text
+ if content in response.text:
+ return True
+
+ except httpx.RequestError as e:
+ logging.warning(f"Request error for {url}: {e}")
+
+ except httpx.HTTPStatusError as e:
+ logging.warning(f"HTTP status error for {url}: {e}")
+
+ except Exception as e:
+ logging.warning(f"Error for {url}: {e}")
+
+ return False
+
+def get_top_level_domain(base_url: str, target_content: str, max_workers: int = os.cpu_count(), timeout: int = 2, retries: int = 1) -> str:
+ """
+ Get the top-level domain (TLD) from a list of URLs.
+
+ Args:
+ - base_url (str): The base URL to construct complete URLs.
+ - target_content (str): The content to search for in the response.
+ - max_workers (int): Maximum number of threads.
+ - timeout (int): Timeout for the request in seconds.
+ - retries (int): Number of retries for failed requests.
+
+ Returns:
+ str: The found TLD, if any.
+ """
+
+ results = []
+ failed_urls = []
+ path_file = os.path.join("Test", "data", "TLD", "tld_list_complete.txt")
+ logging.info(f"Loading file: {path_file}")
+
+ if not os.path.exists(path_file):
+ raise FileNotFoundError("The file 'tld_list_complete.txt' does not exist.")
+
+ # Read TLDs from file and create URLs to test
+ with open(path_file, "r") as file:
+ urls = [f"{base_url}.{x.strip().lower()}" for x in file]
+ urls = list(set(urls)) # Remove duplicates
+
+ start_time = time.time()
+
+ bar_format=f"{Colors.YELLOW}Testing URLS{Colors.WHITE}: {Colors.RED}{{percentage:.2f}}% {Colors.MAGENTA}{{bar}} {Colors.WHITE}[ {Colors.YELLOW}{{n_fmt}}{Colors.WHITE} / {Colors.RED}{{total_fmt}} {Colors.WHITE}] {Colors.YELLOW}{{elapsed}} {Colors.WHITE}< {Colors.CYAN}{{remaining}}{Colors.GREEN}{{postfix}} {Colors.WHITE}]"
+ progress_bar = tqdm(
+ total=len(urls),
+ unit='url',
+ ascii='░▒█',
+ bar_format=bar_format
+ )
+
+ # Event to signal when to stop checking URLs
+ stop_event = threading.Event()
+
+ def url_checker(url: str):
+ for attempt in range(retries):
+ if stop_event.is_set():
+ return None
+
+ if check_url_for_content(url, target_content, timeout):
+ stop_event.set()
+ progress_bar.update(1)
+ return url.split(".")[-1]
+
+ logging.info(f"Retrying {url} ({attempt+1}/{retries})")
+
+ failed_urls.append(url)
+ progress_bar.update(1)
+ return None
+
+ with ThreadPoolExecutor(max_workers=max_workers) as executor:
+ futures = {executor.submit(url_checker, url): url for url in urls}
+
+ for future in as_completed(futures):
+ tld = future.result()
+
+ if tld:
+ results.append(tld)
+ if stop_event.is_set():
+ break
+
+ # Update the progress bar with CPU usage info
+ progress_bar.set_postfix(cpu_usage=f"{psutil.cpu_percent()}%")
+
+ progress_bar.close()
+
+ end_time = time.time()
+ total_time = end_time - start_time
+ avg_time_per_url = total_time / len(urls) if urls else 0
+
+ logging.info(f"Tested {len(urls)} URLs: {len(results)} passed, {len(failed_urls)} failed.")
+ logging.info(f"Total time: {total_time:.2f} seconds, Average time per URL: {avg_time_per_url:.2f} seconds.")
+
+ if results:
+ return results[-1]
+ else:
+ return None
+
+
+def search_domain(site_name: str, target_content: str, base_url: str):
+ """
+ Search for a valid domain for the given site name and base URL.
+
+ Args:
+ - site_name (str): The name of the site to search the domain for.
+ - target_content (str): The content to search for in the response.
+ - base_url (str): The base URL to construct complete URLs.
+
+ Returns:
+ tuple: The found domain and the complete URL.
+ """
+
+ # Extract config domain
+ domain = config_manager.get("SITE", site_name)
+ console.print(f"[cyan]Test site[white]: [red]{base_url}.{domain}")
+
+ try:
+ # Test the current domain
+ response = httpx.get(f"{base_url}.{domain}", headers={'user-agent': get_headers()}, timeout=2)
+ console.print(f"[cyan]Test response site[white]: [red]{response.status_code}")
+ response.raise_for_status()
+
+ # Return config domain
+ console.print(f"[cyan]Use domain: [red]{domain}")
+ return domain, f"{base_url}.{domain}"
+
+ except:
+
+ # If the current domain fails, find a new one
+ print()
+ console.print("[red]Extract new DOMAIN from TLD list.")
+ new_domain = get_top_level_domain(base_url=base_url, target_content=target_content)
+
+ if new_domain is not None:
+
+ # Update domain in config.json
+ config_manager.set_key('SITE', site_name, new_domain)
+ config_manager.write_config()
+
+ # Return new config domain
+ console.print(f"[cyan]Use domain: [red]{new_domain}")
+ return new_domain, f"{base_url}.{new_domain}"
+
+ else:
+ logging.error(f"Failed to find a new domain for: {base_url}")
+ sys.exit(0)
diff --git a/Src/Api/Template/__init__.py b/Src/Api/Template/__init__.py
new file mode 100644
index 0000000..f15ac79
--- /dev/null
+++ b/Src/Api/Template/__init__.py
@@ -0,0 +1 @@
+from .Util.get_domain import search_domain
\ No newline at end of file
diff --git a/Src/Api/altadefinizione/site.py b/Src/Api/altadefinizione/site.py
index 1ce41b6..aca6105 100644
--- a/Src/Api/altadefinizione/site.py
+++ b/Src/Api/altadefinizione/site.py
@@ -11,9 +11,10 @@ from unidecode import unidecode
# Internal utilities
-from Src.Util.table import TVShowManager
-from Src.Util.console import console
from Src.Util.headers import get_headers
+from Src.Util.console import console
+from Src.Util.table import TVShowManager
+from ..Template import search_domain
# Logic class
@@ -37,9 +38,12 @@ def title_search(title_search: str) -> int:
Returns:
int: The number of titles found.
"""
+
+ # Find new domain if prev dont work
+ domain_to_use, _ = search_domain(SITE_NAME, '', f"https://{SITE_NAME}")
# Send request to search for titles
- response = httpx.get(f"https://{SITE_NAME}.{DOMAIN_NOW}/page/1/?story={unidecode(title_search.replace(' ', '+'))}&do=search&subaction=search&titleonly=3", headers={'user-agent': get_headers()})
+ response = httpx.get(f"https://{SITE_NAME}.{domain_to_use}/page/1/?story={unidecode(title_search.replace(' ', '+'))}&do=search&subaction=search&titleonly=3", headers={'user-agent': get_headers()})
response.raise_for_status()
# Create soup and find table
diff --git a/Src/Api/animeunity/site.py b/Src/Api/animeunity/site.py
index a837ae9..ea83d79 100644
--- a/Src/Api/animeunity/site.py
+++ b/Src/Api/animeunity/site.py
@@ -11,9 +11,10 @@ from unidecode import unidecode
# Internal utilities
-from Src.Util.table import TVShowManager
from Src.Util.console import console
from Src.Util._jsonConfig import config_manager
+from Src.Util.table import TVShowManager
+from ..Template import search_domain
# Logic class
@@ -65,28 +66,6 @@ def get_token(site_name: str, domain: str) -> dict:
}
-def update_domain():
- """
- Update the domain for the anime streaming site.
-
- This function tests the accessibility of the current anime streaming site.
- If the current domain is inaccessible, it attempts to obtain and set a new domain.
- It uses the 'light' method to extract a new domain from Anime Unity.
- """
-
- # Test current site's accessibility
- try:
-
- console.log(f"[cyan]Test site: [red]https://{SITE_NAME}.{DOMAIN_NOW}")
- response = httpx.get(f"https://www.{SITE_NAME}.{DOMAIN_NOW}")
- response.raise_for_status()
-
- except Exception as e:
-
- console.log("[red]Upload domain")
- sys.exit(0)
-
-
def get_real_title(record):
"""
Get the real title from a record.
@@ -122,12 +101,9 @@ def title_search(title: str) -> int:
- int: A number containing the length of media search manager.
"""
- # Update domain
- update_domain()
-
# Get token and session value from configuration
- url_domain = config_manager.get('SITE', SITE_NAME)
- data = get_token(SITE_NAME, url_domain)
+ domain_to_use, _ = search_domain(SITE_NAME, '', f"https://www.{SITE_NAME}")
+ data = get_token(SITE_NAME, domain_to_use)
# Prepare cookies to be used in the request
cookies = {
@@ -148,7 +124,7 @@ def title_search(title: str) -> int:
}
# Send a POST request to the API endpoint for live search
- response = httpx.post(f'https://www.{SITE_NAME}.{url_domain}/livesearch', cookies=cookies, headers=headers, json=json_data)
+ response = httpx.post(f'https://www.{SITE_NAME}.{domain_to_use}/livesearch', cookies=cookies, headers=headers, json=json_data)
response.raise_for_status()
# Process each record returned in the response
diff --git a/Src/Api/streamingcommunity/site.py b/Src/Api/streamingcommunity/site.py
index e4f557f..698f5c6 100644
--- a/Src/Api/streamingcommunity/site.py
+++ b/Src/Api/streamingcommunity/site.py
@@ -15,9 +15,10 @@ from unidecode import unidecode
# Internal utilities
from Src.Util.headers import get_headers
-from Src.Util._jsonConfig import config_manager
from Src.Util.console import console
from Src.Util.table import TVShowManager
+from ..Template import search_domain
+
# Logic class
@@ -75,45 +76,15 @@ def get_version(text: str) -> tuple[str, list]:
raise
-def get_version_and_domain(new_domain = None) -> Tuple[str, str]:
- """
- Retrieves the version and domain of the streaming website.
+def get_version_and_domain() -> Tuple[str, str]:
- This function retrieves the version and domain of the streaming website.
- It first checks the accessibility of the current site.
- If the site is accessible, it extracts the version from the response.
- If configured to do so, it also scrapes and prints the titles of the moments.
- If the site is inaccessible, it attempts to obtain a new domain using the 'insta' method.
+ # Find new domain if prev dont work
+ domain_to_use, base_url = search_domain(SITE_NAME, '', f"https://{SITE_NAME}")
- Returns:
- Tuple[str, str]: A tuple containing the version and domain.
- """
-
- # Get the current domain from the configuration
- if new_domain is None:
- config_domain = config_manager.get('SITE', SITE_NAME)
- else:
- config_domain = new_domain
+ # Extract version from the response
+ version, list_title_top_10 = get_version(httpx.get(base_url, headers={'user-agent': get_headers()}).text)
- # Test the accessibility of the current site
- try:
-
- # Make requests to site to get text
- console.print(f"[cyan]Test site[white]: [red]https://{SITE_NAME}.{config_domain}")
- response = httpx.get(f"https://{SITE_NAME}.{config_domain}")
- response.raise_for_status()
-
- console.print(f"[cyan]Test respost site[white]: [red]{response.status_code} \n")
-
- # Extract version from the response
- version, list_title_top_10 = get_version(response.text)
-
- return version, config_domain
-
- except:
-
- console.log("[red]Upload domain.")
- sys.exit(0)
+ return version, domain_to_use
def title_search(title_search: str, domain: str) -> int:
diff --git a/Test/data/TLD/creation.py b/Test/data/TLD/creation.py
index 02283ae..29c2c2c 100644
--- a/Test/data/TLD/creation.py
+++ b/Test/data/TLD/creation.py
@@ -1,12 +1,11 @@
# 29.04.24
import httpx
-import json
from bs4 import BeautifulSoup
# URL of the webpage containing the table
-url = 'https://icannwiki.org/New_gTLD_Generic_Applications'
+url = 'https://icannwiki.org/All_New_gTLD_Applications'
# List to store scraped data
@@ -78,8 +77,9 @@ def main():
print(len(data))
# Write the scraped data to a JSON file
- with open('data.json', 'w') as json_file:
- json.dump(data, json_file)
+ with open('data.txt', 'w') as json_file:
+ for find_tld in data:
+ json_file.write(find_tld['application_id'] + "\n")
if __name__ == '__main__':
diff --git a/Test/data/TLD/tld_list_complete.txt b/Test/data/TLD/tld_list_complete.txt
new file mode 100644
index 0000000..d1cfad1
--- /dev/null
+++ b/Test/data/TLD/tld_list_complete.txt
@@ -0,0 +1,1490 @@
+to
+vodka
+ads
+africa
+analytics
+apartments
+app
+arab
+are
+art
+auction
+audio
+author
+auto
+autoinsurance
+autos
+band
+banque
+bargains
+baseball
+bcn
+beauty
+best
+bet
+bid
+bike
+bingo
+black
+blackfriday
+blog
+boats
+boo
+book
+booking
+bot
+boutique
+box
+broadway
+broker
+builders
+business
+buy
+buzz
+cab
+cafe
+call
+camera
+camp
+cancerresearch
+car
+cards
+care
+careers
+carinsurance
+cars
+casa
+cash
+cashbackbonus
+catering
+center
+channel
+chat
+cheap
+christmas
+church
+circle
+claims
+cleaning
+click
+clothing
+cloud
+club
+codes
+coffee
+college
+community
+company
+compare
+computer
+condos
+connectors
+construction
+consulting
+contact
+contractors
+cool
+corp
+country
+coupon
+coupons
+cpa
+cricket
+cruises
+dad
+dance
+data
+dating
+day
+dds
+deal
+deals
+delivery
+democrat
+desi
+design
+dev
+diamonds
+diet
+digital
+directory
+docs
+dog
+domains
+dot
+download
+earth
+eat
+email
+energy
+enterprises
+epost
+esq
+est
+estate
+events
+exchange
+expert
+exposed
+faith
+family
+fan
+fans
+farm
+fashion
+feedback
+film
+final
+fish
+fishing
+fit
+fitness
+flights
+florist
+flowers
+fly
+foo
+food
+football
+forsale
+forum
+foundation
+free
+fun
+fund
+furniture
+futbol
+fyi
+gallery
+game
+games
+garden
+gay
+gift
+gifts
+gives
+giving
+glass
+global
+golf
+got
+graphics
+group
+guide
+guitars
+guru
+hair
+haus
+help
+here
+hiphop
+hockey
+holdings
+holiday
+home
+homes
+hosting
+hot
+house
+how
+imamat
+immo
+inc
+industries
+ing
+institute
+international
+irish
+jewelry
+jot
+joy
+ketchup
+kim
+kitchen
+kosher
+krd
+land
+lat
+latino
+law
+lease
+legal
+lgbt
+life
+lifeinsurance
+lighting
+like
+limited
+limo
+link
+live
+living
+llc
+llp
+loans
+lol
+lotto
+love
+ltd
+ltda
+luxury
+mail
+maison
+management
+map
+market
+marketing
+mba
+media
+meet
+meme
+memorial
+menu
+mobile
+moi
+mom
+money
+mormon
+moto
+mov
+movie
+movistar
+network
+new
+news
+ninja
+now
+nowruz
+one
+onl
+online
+ott
+page
+partners
+parts
+party
+pay
+pet
+pets
+phd
+phone
+photo
+photography
+photos
+pics
+pictures
+pid
+pin
+pink
+pizza
+place
+play
+plumbing
+poker
+productions
+prof
+promo
+properties
+property
+pub
+qpon
+racing
+radio
+read
+realestate
+realty
+recipes
+red
+rehab
+rent
+rentals
+repair
+report
+republican
+rest
+restaurant
+review
+reviews
+rich
+rocks
+room
+rsvp
+ruhr
+run
+safe
+salon
+save
+scholarships
+school
+science
+search
+secure
+services
+shoes
+shop
+shopping
+show
+singles
+site
+ski
+smile
+soccer
+social
+software
+solar
+solutions
+spa
+spot
+srl
+storage
+store
+stream
+studio
+style
+supplies
+supply
+support
+surgery
+systems
+talk
+tattoo
+taxi
+team
+tech
+technology
+tennis
+theater
+tickets
+tienda
+tips
+tires
+today
+tools
+top
+tour
+toys
+trading
+training
+translations
+trust
+tube
+uno
+vacations
+ventures
+vet
+video
+villas
+vin
+vip
+vision
+vivo
+voyage
+wanggou
+watch
+watches
+web
+webcam
+webs
+wed
+whoswho
+win
+wine
+winners
+works
+world
+wow
+xin
+xyz
+yoga
+you
+yun
+zero
+zip
+to
+play
+dnp
+lat
+energy
+mormon
+ruhr
+gle
+schwarzgroup
+camera
+koeln
+fishing
+buy
+transformers
+menu
+redumbrella
+viva
+agakhan
+active
+church
+wtc
+tech
+stc
+mobily
+helsinki
+joy
+furniture
+imamat
+fiat
+otsuka
+lasalle
+digikey
+prod
+temasek
+docs
+coupon
+cyou
+showtime
+wilmar
+mcd
+select
+aig
+salon
+cimb
+wiki
+clothing
+lighting
+singles
+help
+tattoo
+wme
+uno
+gop
+ventures
+radio
+desi
+tokyo
+associates
+ceo
+aaa
+chase
+app
+trading
+nra
+voyage
+swiss
+help
+auction
+emerck
+site
+epson
+poker
+pictures
+schaeffler
+hermes
+xin
+flowers
+qvc
+email
+bid
+bridgestone
+dot
+talk
+diet
+cab
+guru
+got
+statebank
+tkmaxx
+school
+app
+mcdonalds
+tickets
+site
+democrat
+holdings
+cisco
+room
+alipay
+gdn
+legal
+place
+fire
+mattel
+news
+mtn
+bike
+estate
+auto
+naspers
+app
+deal
+cars
+virgin
+dell
+salon
+art
+duns
+travelguard
+hosting
+africa
+art
+property
+codes
+itau
+axa
+mobile
+contractors
+fashion
+esurance
+docomo
+talk
+film
+webcam
+business
+property
+cal
+cpa
+love
+silk
+onl
+monash
+guide
+plumbing
+wolterskluwer
+center
+bbc
+surgery
+yoga
+jll
+vanguard
+construction
+analytics
+how
+winners
+yamaxun
+bnl
+iselect
+news
+land
+theater
+americanexpress
+praxi
+bauhaus
+cba
+management
+yandex
+hughes
+mnet
+chrome
+data
+meo
+ads
+systems
+home
+delivery
+tickets
+media
+ski
+lease
+salon
+monster
+immo
+oldnavy
+pin
+save
+inc
+pets
+movistar
+rocher
+graphics
+technology
+pioneer
+lancia
+extraspace
+grainger
+mov
+solutions
+pizza
+smile
+tjmaxx
+pramerica
+memorial
+icbc
+media
+akdn
+spot
+ltd
+llc
+loft
+tickets
+love
+homegoods
+aws
+poker
+ltd
+realestate
+realty
+kim
+chesapeake
+gifts
+tjx
+caravan
+tickets
+band
+autos
+deal
+restaurant
+review
+fashion
+shop
+gallery
+toray
+youtube
+kindle
+now
+careers
+bradesco
+homedepot
+mrporter
+sbi
+observer
+dance
+forsale
+game
+market
+tour
+iwc
+pink
+fox
+kinder
+viking
+nike
+arab
+dev
+diamonds
+link
+tech
+law
+tickets
+webs
+photography
+channel
+nexus
+zippo
+plus
+enterprises
+goog
+apartments
+supplies
+fan
+company
+wow
+spot
+travelers
+love
+nagoya
+exchange
+dealer
+directory
+today
+money
+kitchen
+read
+jot
+icu
+doha
+chat
+theguardian
+bnpparibas
+natura
+camp
+wow
+movie
+mtpc
+supply
+amex
+wed
+ott
+tvs
+latino
+boo
+tips
+jpmorgan
+kyknet
+dad
+vivo
+emerson
+lancaster
+lotto
+homes
+movie
+tennis
+alfaromeo
+web
+london
+home
+video
+apartments
+bingo
+allstate
+online
+software
+lanxess
+mango
+ferrari
+infiniti
+drive
+law
+epost
+swiftcover
+svr
+broadway
+marshalls
+samsung
+firmdale
+design
+booking
+guardianmedia
+komatsu
+lacaixa
+abudhabi
+alibaba
+like
+lgbt
+team
+boats
+sony
+you
+citic
+trade
+voting
+realestate
+rest
+pfizer
+gift
+hangout
+blockbuster
+lixil
+cbre
+blog
+new
+lilly
+fund
+prudential
+tab
+suzuki
+group
+gay
+art
+social
+shoes
+qpon
+sohu
+fedex
+storage
+caseih
+ketchup
+casa
+blog
+online
+cricket
+app
+buzz
+show
+promo
+cbn
+dhl
+legal
+football
+open
+app
+furniture
+telefonica
+calvinklein
+toys
+eat
+book
+axis
+ren
+call
+show
+tech
+solar
+toyota
+canalplus
+lexus
+immo
+moto
+hyundai
+marketing
+everbank
+marketing
+llc
+mom
+free
+tube
+auto
+shopyourway
+golf
+doosan
+yoga
+chk
+pru
+one
+limo
+marketing
+storage
+secure
+domains
+computer
+racing
+zara
+target
+nba
+goodhands
+ing
+sling
+meme
+giving
+jewelry
+deals
+golf
+here
+luxury
+cern
+ninja
+zip
+tires
+recipes
+film
+teva
+auto
+istanbul
+web
+bostik
+total
+diet
+support
+beats
+nowruz
+vons
+moscow
+inc
+car
+forsale
+hsbc
+energy
+man
+team
+blog
+family
+aetna
+home
+group
+baidu
+bananarepublic
+top
+republican
+mail
+fyi
+photos
+wine
+foo
+film
+science
+play
+corp
+ibm
+htc
+gdn
+secure
+fit
+ultrabook
+gold
+soccer
+movie
+map
+coffee
+apple
+compare
+fitness
+discover
+cbs
+drive
+inc
+williamhill
+racing
+movie
+memorial
+voto
+vet
+mail
+scor
+toshiba
+konami
+day
+games
+garden
+book
+hosting
+ollo
+montblanc
+realestate
+cashbackbonus
+plus
+vistaprint
+uol
+amica
+yahoo
+philips
+corp
+beauty
+schmidt
+alsace
+home
+auction
+chat
+travelersinsurance
+law
+love
+jio
+online
+golf
+flowers
+hot
+sharp
+guitars
+store
+video
+mozaic
+club
+builders
+free
+whoswho
+vote
+limited
+international
+hdfc
+ifm
+group
+ceb
+gifts
+box
+hbo
+boston
+dev
+radio
+taobao
+training
+dtv
+mail
+sncf
+rent
+marriott
+jpmorganchase
+audio
+guide
+statefarm
+gucci
+dnb
+radio
+mtr
+gay
+auto
+ltd
+play
+cafe
+redstone
+institute
+airtel
+bestbuy
+shouji
+alstom
+multichoice
+gmail
+holiday
+deutschepost
+chrysler
+terra
+inc
+farm
+florist
+bet
+cafe
+mih
+iveco
+dodge
+fyi
+global
+bharti
+design
+zappos
+commbank
+house
+cars
+blog
+wine
+group
+free
+living
+maserati
+amsterdam
+design
+tci
+fans
+tushu
+fly
+wow
+glass
+fashion
+search
+school
+trust
+red
+boats
+shop
+repair
+fun
+dstv
+gbiz
+claims
+mit
+soccer
+cpa
+forum
+mba
+metlife
+mom
+frogans
+rip
+homesense
+realty
+web
+fun
+ril
+datsun
+netbank
+jmp
+ferrero
+pet
+hockey
+contact
+country
+avianca
+cheap
+bet
+uconnect
+media
+pics
+network
+garden
+expert
+trv
+review
+forum
+pizza
+dabur
+pay
+bingo
+home
+agency
+xfinity
+nokia
+tube
+school
+win
+faith
+pizza
+boehringer
+rehab
+global
+pwc
+fun
+brother
+intel
+place
+photo
+christmas
+wine
+dupont
+run
+boutique
+store
+design
+style
+globo
+sew
+prime
+shopping
+llc
+catalonia
+law
+restaurant
+dubai
+cuisinella
+fast
+bot
+gotv
+tennis
+safe
+money
+sapo
+ltd
+download
+wanggou
+sas
+rsvp
+party
+bargains
+digital
+abbott
+heinz
+chloe
+bet
+gmo
+volkswagen
+comcast
+ipiranga
+translations
+web
+rocks
+audio
+justforu
+bentley
+bcn
+home
+restaurant
+spa
+watch
+online
+jnj
+africamagic
+ltd
+works
+imdb
+ntt
+ups
+cartier
+direct
+aigo
+ltda
+cool
+run
+hot
+ricoh
+hiphop
+llp
+kpmg
+game
+style
+blackfriday
+tennis
+baseball
+erni
+android
+llc
+rich
+ink
+nec
+mzansimagic
+moto
+map
+gap
+zero
+guardian
+football
+lplfinancial
+loans
+schwarz
+box
+cloud
+expert
+stream
+shopping
+gmx
+tmall
+live
+xyz
+tools
+hair
+ggee
+book
+golf
+free
+exposed
+llc
+broker
+coupons
+store
+flights
+inc
+app
+alcon
+tours
+abarth
+locker
+star
+events
+page
+irish
+rent
+family
+services
+studio
+honda
+buy
+click
+inc
+group
+mopar
+seek
+mitsubishi
+meet
+nfl
+baseball
+eurovision
+fish
+brussels
+team
+partners
+jeep
+scholarships
+final
+northwesternmutual
+pet
+hdfcbank
+boots
+rentals
+diet
+hyatt
+phone
+family
+kred
+google
+book
+coupons
+store
+pub
+you
+barclays
+cricket
+piaget
+community
+piperlime
+circle
+app
+vip
+cancerresearch
+lidl
+nissan
+yun
+style
+moi
+cleaning
+taxi
+mlb
+stream
+catering
+dating
+dot
+reliance
+black
+jlc
+construction
+vision
+shop
+cards
+tech
+dog
+jprs
+online
+kfh
+condos
+blog
+sfr
+villas
+soccer
+delivery
+sina
+pamperedchef
+case
+college
+casa
+newholland
+life
+world
+barclaycard
+report
+abbvie
+srl
+poker
+shop
+qtel
+author
+help
+sap
+consulting
+ally
+stcgroup
+gives
+srt
+thd
+vacations
+pid
+news
+industries
+love
+poker
+taxi
+athleta
+phd
+etisalat
+mom
+earth
+safeway
+actor
+foundation
+dclk
+home
+northlandinsurance
+studio
+gift
+cologne
+aquarelle
+kia
+buy
+panerai
+chat
+band
+spa
+flickr
+playstation
+cash
+honeywell
+cruises
+vig
+netaporter
+aramco
+ping
+olayan
+lol
+parts
+netflix
+science
+inc
+rio
+shaw
+mail
+mutual
+best
+men
+citadel
+care
+racing
+feedback
+design
+save
+nhk
+productions
+forum
+spot
+web
+dish
+vista
+art
+maison
+properties
+book
+haus
+hockey
+hisamitsu
+intuit
+kosher
+orientexpress
+gecompany
+lamer
+chartis
+team
+panasonic
+buick
+mail
+tech
+chevrolet
+play
+weatherchannel
+app
+cloud
+origins
+free
+banamex
+dog
+rogers
+prof
+farmers
+itv
+goo
+ford
+hkt
+inc
+phd
+lifeinsurance
+esq
+fido
+memorial
+pccw
+citi
+live
+game
+news
+shop
+anthem
+aquitaine
+llc
+frontier
+flir
+watches
+banque
+love
+connectors
+dds
+dunlop
+fujitsu
+telecity
+movie
+olympus
+mutuelle
+stockholm
+search
+kddi
+monster
+news
+lincoln
+book
+shriram
+tube
+mint
+buy
+cadillac
+chevy
+goodyear
+seven
+fage
+richardli
+mitek
+llp
+ftr
+beknown
+gallup
+saxo
+progressive
+firestone
+corp
+movie
+sapphire
+gmc
+srl
+seat
+mba
+and
+ansons
+caremore
+chatr
+cialis
+hilton
+skolkovo
+are
+est