From 070bb45978fb05162be43a316df050dec35eca25 Mon Sep 17 00:00:00 2001 From: Miodec Date: Wed, 22 Feb 2023 14:09:56 +0100 Subject: [PATCH 01/50] pw --- frontend/src/ts/controllers/ad-controller.ts | 108 +++++--------- .../src/ts/controllers/eg-ad-controller.ts | 65 +++++++++ .../src/ts/controllers/pw-ad-controller.ts | 132 ++++++++++++++++++ frontend/src/ts/ready.ts | 12 +- frontend/webpack/config.base.js | 1 + 5 files changed, 240 insertions(+), 78 deletions(-) create mode 100644 frontend/src/ts/controllers/eg-ad-controller.ts create mode 100644 frontend/src/ts/controllers/pw-ad-controller.ts diff --git a/frontend/src/ts/controllers/ad-controller.ts b/frontend/src/ts/controllers/ad-controller.ts index a866a53b7..8b3026d5d 100644 --- a/frontend/src/ts/controllers/ad-controller.ts +++ b/frontend/src/ts/controllers/ad-controller.ts @@ -4,6 +4,8 @@ import * as ConfigEvent from "../observables/config-event"; import * as BannerEvent from "../observables/banner-event"; import Config from "../config"; import * as TestActive from "../states/test-active"; +import * as EG from "./eg-ad-controller"; +import * as PW from "./pw-ad-controller"; const breakpoint = 900; let widerThanBreakpoint = true; @@ -13,24 +15,25 @@ let initialised = false; export let adBlock: boolean; export let cookieBlocker: boolean; +// const choice: "eg" | "pw" = Math.random() < 0.5 ? "eg" : "pw"; +const choice: "eg" | "pw" = "eg"; + export function init(): void { - $("head").append(``); - $("body") - .prepend(``); + if (choice === "eg") { + EG.init(); + } else { + PW.init(); + } setInterval(() => { if (TestActive.get()) { return; } - refreshVisible(); + if (choice === "eg") { + EG.refreshVisible(); + } else { + PW.refreshVisible(); + } }, 60000); initialised = true; @@ -88,29 +91,20 @@ function updateBreakpoint(noReinstate = false): void { } if (noReinstate) return; if (beforeUpdate !== widerThanBreakpoint) { - reinstate(); + if (choice === "eg") { + EG.reinstate(); + } else { + PW.reinstate(); + } } } export async function refreshVisible(): Promise { - //@ts-ignore - const adDivs = Object.keys(window.egAdPack.gptAdSlots); - const visibleAdDivs = []; - - for (let i = 0; i < adDivs.length; i++) { - const el = document.querySelectorAll( - "[data-adunit-name='" + adDivs[i] + "']" - )[0]; - if (!el) continue; - const elParent = el.parentElement as HTMLElement; - if ( - window.getComputedStyle(elParent).getPropertyValue("display") != "none" - ) { - visibleAdDivs.push(adDivs[i]); - } + if (choice === "eg") { + await EG.refreshVisible(); + } else { + await PW.refreshVisible(); } - //@ts-ignore - window.egAps.refreshAds(visibleAdDivs); } export async function checkAdblock(): Promise { @@ -164,13 +158,10 @@ export async function reinstate(): Promise { await checkCookieblocker(); if (adBlock || cookieBlocker) return false; - try { - //@ts-ignore - window.egAps.reinstate(); - return true; - } catch (e) { - console.error(e); - return false; + if (choice === "eg") { + return EG.reinstate(); + } else { + return PW.reinstate(); } } @@ -210,40 +201,10 @@ export async function renderResult(): Promise { return; } - if (widerThanBreakpoint) { - // $("#ad-result-wrapper").html(` - //
- //
- // `); - // if ($("#ad-result-wrapper").is(":empty")) { - //@ts-ignore - // window.egAps.render(["ad-result"]); - // } else { - //@ts-ignore - window.egAps.refreshAds([ - "ad-result", - "ad-vertical-left", - "ad-vertical-right", - "ad-footer", - ]); - // } + if (choice === "eg") { + EG.renderResult(widerThanBreakpoint); } else { - // $("#ad-result-small-wrapper").html(` - //
- //
- // `); - // if ($("#ad-result-small-wrapper").is(":empty")) { - //@ts-ignore - // window.egAps.render(["ad-result-small"]); - // } else { - //@ts-ignore - window.egAps.refreshAds([ - "ad-result-small", - "ad-vertical-left", - "ad-vertical-right", - "ad-footer-small", - ]); - // } + PW.renderResult(); } } @@ -296,7 +257,10 @@ $(document).ready(() => { }); window.onerror = function (error): void { - if (typeof error === "string" && error.substring(0, 6) === "EG APS") { - $("#ad-result-wrapper .iconAndText").addClass("withLeft"); + //@ts-ignore + if (choice === "eg") { + if (typeof error === "string" && error.substring(0, 6) === "EG APS") { + $("#ad-result-wrapper .iconAndText").addClass("withLeft"); + } } }; diff --git a/frontend/src/ts/controllers/eg-ad-controller.ts b/frontend/src/ts/controllers/eg-ad-controller.ts new file mode 100644 index 000000000..1daf053d0 --- /dev/null +++ b/frontend/src/ts/controllers/eg-ad-controller.ts @@ -0,0 +1,65 @@ +export function init(): void { + $("head").append(``); + $("body") + .prepend(``); +} + +export function renderResult(widerThanBreakpoint: boolean): void { + if (widerThanBreakpoint) { + //@ts-ignore + window.egAps.refreshAds([ + "ad-result", + "ad-vertical-left", + "ad-vertical-right", + "ad-footer", + ]); + } else { + //@ts-ignore + window.egAps.refreshAds([ + "ad-result-small", + "ad-vertical-left", + "ad-vertical-right", + "ad-footer-small", + ]); + } +} + +export function reinstate(): boolean { + try { + //@ts-ignore + window.egAps.reinstate(); + return true; + } catch (e) { + console.error(e); + return false; + } +} + +export async function refreshVisible(): Promise { + //@ts-ignore + const adDivs = Object.keys(window.egAdPack.gptAdSlots); + const visibleAdDivs = []; + + for (let i = 0; i < adDivs.length; i++) { + const el = document.querySelectorAll( + "[data-adunit-name='" + adDivs[i] + "']" + )[0]; + if (!el) continue; + const elParent = el.parentElement as HTMLElement; + if ( + window.getComputedStyle(elParent).getPropertyValue("display") != "none" + ) { + visibleAdDivs.push(adDivs[i]); + } + } + //@ts-ignore + window.egAps.refreshAds(visibleAdDivs); +} diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts new file mode 100644 index 000000000..e339cdd89 --- /dev/null +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -0,0 +1,132 @@ +//@ts-nocheck + +import Config from "../config"; + +// Step 1: Create the Ramp Object, NOTE: selector id needed for tagged units only +const resultUnits = [ + { + type: "leaderboard_atf", + selectorId: "ad-result-wrapper", // fill in appropriate selectorId as needed. + }, +]; +const onUnits = [ + { + type: "leaderboard_atf", + selectorId: "ad-result-wrapper", // fill in appropriate selectorId as needed. + }, + { + type: "skyscraper_atf", + selectorId: "ad-vertical-right-wrapper", // fill in appropriate selectorId as needed. + }, + { + type: "skyscraper_btf", + selectorId: "ad-vertical-left-wrapper", // fill in appropriate selectorId as needed. + }, +]; +const selloutUnits = [ + { + type: "leaderboard_atf", + selectorId: "ad-result-wrapper", // fill in appropriate selectorId as needed. + }, + { + type: "leaderboard_btf", + selectorId: "ad-vertical-right-wrapper", // fill in appropriate selectorId as needed. + }, + { + type: "leaderboard_btf", + selectorId: "ad-vertical-left-wrapper", // fill in appropriate selectorId as needed. + }, + { + type: "skyscraper_atf", //160x600 + selectorId: "ad-vertical-right-wrapper", // fill in appropriate selectorId as needed. + }, + { + type: "skyscraper_btf", //160x600 + selectorId: "ad-vertical-left-wrapper", // fill in appropriate selectorId as needed. + }, + { + type: "bottom_rail", //OOP or out-of-page unit do not need a selectorId. 728x90. + }, +]; + +export function init(): void { + // Set Values with your PubID and Website ID + const pubId = "1024888"; + const websiteId = "74058"; + + window.ramp = { + que: [], + passiveMode: true, + // onReady: (): void => { + // const units = getUnits(); + + // if (units) { + // ramp.addUnits(units).then(() => { + // ramp.displayUnits(); + // }); + // } + // }, + }; + + const headOfDocument = document.getElementsByTagName("head")[0]; + + // Step 2: Creates the Ramp Scripts + const rampScript = document.createElement("script"); + rampScript.setAttribute("async", true); + rampScript.src = `//cdn.intergient.com/${pubId}/${websiteId}/ramp.js`; + headOfDocument.appendChild(rampScript); + + window._pwGA4PageviewId = "".concat(Date.now()); + window.dataLayer = window.dataLayer || []; + window.gtag = + window.gtag || + function (): void { + // eslint-disable-next-line prefer-rest-params + dataLayer.push(arguments); + }; + gtag("js", new Date()); + gtag("config", "G-KETCPNHRJF", { send_page_view: false }); + gtag("event", "ramp_js", { + send_to: "G-KETCPNHRJF", + pageview_id: window._pwGA4PageviewId, + }); +} + +function getUnits(): unknown { + let units = undefined; + + if (Config.ads === "result") { + units = resultUnits; + } else if (Config.ads === "on") { + units = onUnits; + } else if (Config.ads === "sellout") { + units = selloutUnits; + } + + return units; +} + +//add logic so script selects the correct ad units array, 'default', 'on', 'sellout' +//Since ad units do not populate until results page is shown, trigger the API methods when results are +//shown for user so the containers do not populate with hidden ads before the ad containers are shown. Current example below will populate the container with an ad on page load. +//use onClick's or other user events to trigger applicable API methods. For example, if user clicks to a new area of the site, ramp.destroyUnits('all')... +//then run ramp.addUnits(defaultUnits).then( +// () => { +// ramp.displayUnits() +// } +// ) + +export function reinstate(): boolean { + //@ts-ignore + ramp.destroyUnits("all"); + //@ts-ignore + return ramp.addUnits(getUnits()); +} + +export async function refreshVisible(): Promise { + ramp.triggerRefresh(); +} + +export function renderResult(): void { + ramp.addUnits(resultUnits); +} diff --git a/frontend/src/ts/ready.ts b/frontend/src/ts/ready.ts index dabb60e90..e82fcbed9 100644 --- a/frontend/src/ts/ready.ts +++ b/frontend/src/ts/ready.ts @@ -104,12 +104,12 @@ if ("serviceWorker" in navigator) { (event.isUpdate || event2.isUpdate) && updateBannerId === undefined ) { - updateBannerId = Notifications.addBanner( - "Update ready - please refresh", - 1, - "gift", - true - ); + // updateBannerId = Notifications.addBanner( + // "Update ready - please refresh", + // 1, + // "gift", + // true + // ); } }); diff --git a/frontend/webpack/config.base.js b/frontend/webpack/config.base.js index 50500c46d..94b11a89a 100644 --- a/frontend/webpack/config.base.js +++ b/frontend/webpack/config.base.js @@ -11,6 +11,7 @@ const htmlWebpackPlugins = [ "security-policy", "privacy-policy", "email-handler", + "adtest", ].map((name) => { return new HtmlWebpackPlugin({ filename: `${name}.html`, From 5ffa0578c7c7c4fcd559669dcd66132197c82e76 Mon Sep 17 00:00:00 2001 From: Miodec Date: Wed, 22 Feb 2023 16:53:52 +0100 Subject: [PATCH 02/50] updated english 10k list --- frontend/static/languages/english_10k.json | 16214 +++++++++---------- 1 file changed, 8107 insertions(+), 8107 deletions(-) diff --git a/frontend/static/languages/english_10k.json b/frontend/static/languages/english_10k.json index e040074bb..d8b8194b5 100644 --- a/frontend/static/languages/english_10k.json +++ b/frontend/static/languages/english_10k.json @@ -3,8120 +3,8116 @@ "leftToRight": true, "noLazyMode": true, "words": [ - "a", - "abandoned", - "abilities", - "ability", - "able", - "abortion", - "about", - "above", - "abroad", - "absence", - "absent", - "absolute", - "absolutely", - "absorption", - "abstract", - "abuse", - "academic", - "academy", - "accent", - "accept", - "acceptable", - "acceptance", - "accepted", - "accepting", - "access", - "accessed", - "accessibility", - "accessible", - "accessing", - "accessories", - "accessory", - "accident", - "accidents", - "accommodate", - "accommodation", - "accommodations", - "accompanied", - "accompanying", - "accomplish", - "accomplished", - "accordance", - "according", - "accordingly", - "account", - "accountability", - "accounting", - "accounts", - "accreditation", - "accredited", - "accuracy", - "accurate", - "accurately", - "accused", - "achieve", - "achieved", - "achievement", - "achievements", - "achieving", - "acid", - "acids", - "acknowledge", - "acknowledged", - "acne", - "acoustic", - "acquire", - "acquired", - "acquisition", - "acquisitions", - "acre", - "acres", - "acrobat", - "across", - "acrylic", - "act", - "acting", - "action", - "actions", - "activated", - "activation", - "active", - "actively", - "activists", - "activities", - "activity", - "actor", - "actors", - "actress", - "acts", - "actual", - "actually", - "acute", - "ad", - "adaptation", - "adapted", - "adapter", - "adapters", - "adaptive", - "adaptor", - "add", - "added", - "addiction", - "adding", - "addition", - "additional", - "additionally", - "additions", - "address", - "addressed", - "addresses", - "addressing", - "adds", - "adequate", - "adjacent", - "adjust", - "adjustable", - "adjusted", - "adjustment", - "adjustments", - "admin", - "administered", - "administration", - "administrative", - "administrator", - "administrators", - "admission", - "admissions", - "admit", - "admitted", - "adolescent", - "adopt", - "adopted", - "adoption", - "ads", - "adult", - "adults", - "advance", - "advanced", - "advancement", - "advances", - "advantage", - "advantages", - "adventure", - "adventures", - "adverse", - "advert", - "advertise", - "advertisement", - "advertisements", - "advertiser", - "advertisers", - "advertising", - "advice", - "advise", - "advised", - "advisor", - "advisors", - "advisory", - "advocacy", - "advocate", - "adware", - "aerial", - "aerospace", - "affair", - "affairs", - "affect", - "affected", - "affecting", - "affects", - "affiliate", - "affiliated", - "affiliates", - "affiliation", - "afford", - "affordable", - "Afghanistan", - "afraid", - "Africa", - "African", - "after", - "afternoon", - "afterwards", - "again", - "against", - "age", - "aged", - "agencies", - "agency", - "agenda", - "agent", - "agents", - "ages", - "aggregate", - "aggressive", - "aging", - "ago", - "agree", - "agreed", - "agreement", - "agreements", - "agrees", - "agricultural", - "agriculture", - "ahead", - "aid", - "aids", - "aim", - "aimed", - "aims", - "air", - "aircraft", - "airfare", - "airline", - "airlines", - "airplane", - "airport", - "airports", - "Alabama", - "alarm", - "Alaska", - "Albania", - "Albany", - "album", - "albums", - "alcohol", - "alert", - "alerts", - "algebra", - "Algeria", - "algorithm", - "algorithms", - "alias", - "alien", - "align", - "alignment", - "alike", - "alive", - "all", - "alleged", - "allergy", - "alliance", - "allied", - "allocated", - "allocation", - "allow", - "allowance", - "allowed", - "allowing", - "allows", - "alloy", - "almost", - "alone", - "along", - "alpha", - "alphabetical", - "alpine", - "already", - "also", - "alter", - "altered", - "alternate", - "alternative", - "alternatively", - "alternatives", - "although", - "alumni", - "always", - "am", - "amateur", - "amazing", - "ambassador", - "amber", - "ambient", - "amend", - "amended", - "amendment", - "amendments", - "amenities", - "America", - "American", - "Americans", - "amino", - "among", - "amongst", - "amount", - "amounts", - "amp", - "amplifier", - "Amsterdam", - "an", - "analog", - "analyses", - "analysis", - "analyst", - "analysts", - "analytical", - "analyze", - "analyzed", - "anatomy", - "anchor", - "ancient", - "and", - "Andorra", - "angel", - "angels", - "anger", - "angle", - "Angola", - "angry", - "animal", - "animals", - "animated", - "animation", - "anime", - "annex", - "anniversary", - "annotated", - "annotation", - "announce", - "announced", - "announcement", - "announcements", - "announces", - "annoying", - "annual", - "annually", - "anonymous", - "another", - "answer", - "answered", - "answering", - "answers", - "ant", - "Antarctica", - "antenna", - "anthropology", - "antibodies", - "antibody", - "anticipated", - "Antigua", - "antique", - "antiques", - "antivirus", - "anxiety", - "any", - "anybody", - "anymore", - "anyone", - "anything", - "anytime", - "anyway", - "anywhere", - "apart", - "apartment", - "apartments", - "app", - "apparatus", - "apparel", - "apparent", - "apparently", - "appeal", - "appeals", - "appear", - "appearance", - "appeared", - "appearing", - "appears", - "appendix", - "apple", - "appliance", - "appliances", - "applicable", - "applicant", - "applicants", - "application", - "applications", - "applied", - "applies", - "apply", - "applying", - "appointed", - "appointment", - "appointments", - "appraisal", - "appreciate", - "appreciated", - "appreciation", - "approach", - "approaches", - "appropriate", - "appropriations", - "approval", - "approve", - "approved", - "approximate", - "approximately", - "apps", - "April", - "apt", - "aqua", - "aquarium", - "aquatic", - "Arab", - "Arabia", - "Arabic", - "arbitrary", - "arbitration", - "arc", - "arcade", - "arch", - "architect", - "architects", - "architectural", - "architecture", - "archive", - "archived", - "archives", - "arctic", - "are", - "area", - "areas", - "arena", - "Argentina", - "argue", - "argued", - "argument", - "arguments", - "arise", - "arising", - "Arizona", - "Arkansas", - "Arlington", - "arm", - "armed", - "Armenia", - "armor", - "arms", - "army", - "around", - "arrange", - "arranged", - "arrangement", - "arrangements", - "array", - "arrest", - "arrested", - "arrival", - "arrivals", - "arrive", - "arrived", - "arrives", - "arrow", - "art", - "arthritis", - "article", - "articles", - "artificial", - "artist", - "artistic", - "artists", - "arts", - "artwork", - "Aruba", - "as", - "ash", - "Asia", - "Asian", - "aside", - "ask", - "asked", - "asking", - "asks", - "asp", - "aspect", - "aspects", - "assault", - "assembled", - "assembly", - "assess", - "assessed", - "assessing", - "assessment", - "assessments", - "asset", - "assets", - "assign", - "assigned", - "assignment", - "assignments", - "assist", - "assistance", - "assistant", - "assisted", - "assists", - "associate", - "associated", - "associates", - "association", - "associations", - "assume", - "assumed", - "assumes", - "assuming", - "assumption", - "assumptions", - "assurance", - "assure", - "assured", - "asthma", - "astrology", - "astronomy", - "at", - "ate", - "Athens", - "athletes", - "athletic", - "athletics", - "Atlanta", - "Atlantic", - "atlas", - "atmosphere", - "atmospheric", - "atom", - "atomic", - "attach", - "attached", - "attachment", - "attachments", - "attack", - "attacked", - "attacks", - "attempt", - "attempted", - "attempting", - "attempts", - "attend", - "attendance", - "attended", - "attending", - "attention", - "attitude", - "attitudes", - "attorney", - "attorneys", - "attract", - "attraction", - "attractions", - "attractive", - "attribute", - "attributes", - "Auburn", - "Auckland", - "auction", - "auctions", - "audience", - "audio", - "audit", - "auditor", - "August", - "aurora", - "Australia", - "Australian", - "Austria", - "authentic", - "authentication", - "author", - "authorities", - "authority", - "authorization", - "authorized", - "authors", - "auto", - "automated", - "automatic", - "automatically", - "automation", - "automobile", - "automobiles", - "automotive", - "autos", - "autumn", - "availability", - "available", - "avatar", - "avenue", - "average", - "aviation", - "avoid", - "avoiding", - "Avon", - "award", - "awarded", - "awards", - "aware", - "awareness", - "away", - "awesome", - "awful", - "axis", - "aye", - "Azerbaijan", - "babe", - "babes", - "babies", - "baby", - "bachelor", - "back", - "backed", - "background", - "backgrounds", - "backing", - "backup", - "bacon", - "bacteria", - "bacterial", - "bad", - "badge", - "badly", - "bag", - "bags", - "Bahamas", - "Bahrain", - "baker", - "baking", - "balance", - "balanced", - "bald", - "ball", - "ballet", - "balloon", - "ballot", - "balls", - "Baltimore", - "ban", - "banana", - "band", - "bands", - "bandwidth", - "bang", - "Bangkok", - "Bangladesh", - "bank", - "banking", - "bankruptcy", - "banks", - "banned", - "banner", - "banners", - "baptist", - "bar", - "Barbados", - "Barcelona", - "bare", - "barely", - "bargain", - "bargains", - "barn", - "barrel", - "barrier", - "barriers", - "bars", - "base", - "baseball", - "based", - "baseline", - "basement", - "bases", - "basic", - "basically", - "basics", - "basin", - "basis", - "basket", - "basketball", - "baskets", - "bass", - "bat", - "batch", - "bath", - "bathroom", - "bathrooms", - "baths", - "batman", - "batteries", - "battery", - "battle", - "battlefield", - "bay", - "be", - "beach", - "beaches", - "beads", - "beam", - "bean", - "beans", - "bear", - "bearing", - "bears", - "beast", - "beat", - "beats", - "beautiful", - "beautifully", - "beauty", - "beaver", - "became", - "because", - "become", - "becomes", - "becoming", - "bed", - "bedding", - "bedroom", - "bedrooms", - "beds", - "bee", - "beef", - "been", - "beer", - "before", - "began", - "begin", - "beginner", - "beginners", - "beginning", - "begins", - "begun", - "behalf", - "behavior", - "behavioral", - "behind", - "Beijing", - "being", - "beings", - "Belarus", - "Belfast", - "Belgium", - "belief", - "beliefs", - "believe", - "believed", - "believes", - "Belize", - "bell", - "belle", - "belly", - "belong", - "belongs", - "below", - "belt", - "belts", - "bench", - "benchmark", - "bend", - "beneath", - "beneficial", - "benefit", - "benefits", - "Berlin", - "Bermuda", - "berry", - "beside", - "besides", - "best", - "bestseller", - "bet", - "beta", - "better", - "betting", - "between", - "beverage", - "beverages", - "beyond", - "Bhutan", - "bias", - "bible", - "biblical", - "bibliographic", - "bibliography", - "bicycle", - "bid", - "bidder", - "bidding", - "bids", - "big", - "bigger", - "biggest", - "bike", - "bikes", - "bikini", - "bill", - "billing", - "billion", - "bills", - "bin", - "binary", - "bind", - "binding", - "bingo", - "biodiversity", - "biographies", - "biography", - "biological", - "biology", - "biotechnology", - "bird", - "birds", - "Birmingham", - "birth", - "birthday", - "bishop", - "bit", - "bite", - "bits", - "biz", - "bizarre", - "black", - "blackberry", - "blackjack", - "blade", - "blades", - "blah", - "blame", - "blank", - "blanket", - "blast", - "bleeding", - "blend", - "bless", - "blessed", - "blind", - "blink", - "block", - "blocked", - "blocking", - "blocks", - "blog", - "blogger", - "bloggers", - "blogging", - "blogs", - "blond", - "blonde", - "blood", - "bloody", - "bloom", - "blow", - "blowing", - "blue", - "blues", - "bluetooth", - "board", - "boards", - "boat", - "boating", - "boats", - "bodies", - "body", - "bold", - "Bolivia", - "bolt", - "bomb", - "bond", - "bondage", - "bonds", - "bone", - "bones", - "bonus", - "book", - "booking", - "bookings", - "bookmark", - "bookmarks", - "books", - "bookstore", - "boolean", - "boom", - "boost", - "boot", - "booth", - "boots", - "booty", - "border", - "borders", - "bored", - "boring", - "born", - "borough", - "Bosnia", - "boss", - "Boston", - "both", - "bother", - "Botswana", - "bottle", - "bottles", - "bottom", - "bought", - "boulder", - "boulevard", - "bound", - "boundaries", - "boundary", - "bouquet", - "boutique", - "bow", - "bowl", - "bowling", - "box", - "boxed", - "boxes", - "boxing", - "boy", - "boys", - "bracelet", - "bracelets", - "bracket", - "brain", - "brake", - "brakes", - "branch", - "branches", - "brand", - "brands", - "brass", - "brave", - "Brazil", - "Brazilian", - "breach", - "bread", - "break", - "breakdown", - "breakfast", - "breaking", - "breaks", - "breath", - "breathing", - "breed", - "breeding", - "breeds", - "brick", - "bridal", - "bride", - "bridge", - "bridges", - "brief", - "briefing", - "briefly", - "briefs", - "bright", - "brilliant", - "bring", - "bringing", - "brings", - "Brisbane", - "Britain", - "British", - "broad", - "broadband", - "broadcast", - "broadcasting", - "broader", - "Broadway", - "brochure", - "brochures", - "broke", - "broken", - "broker", - "brokers", - "bronze", - "brook", - "brooks", - "brother", - "brothers", - "brought", - "brown", - "browse", - "browser", - "browsers", - "browsing", - "Brunei", - "brunette", - "brush", - "Brussels", - "brutal", - "bubble", - "buck", - "bucks", - "Budapest", - "buddy", - "budget", - "budgets", - "buffalo", - "buffer", - "bug", - "bugs", - "build", - "builder", - "builders", - "building", - "buildings", - "builds", - "built", - "Bulgaria", - "Bulgarian", - "bulk", - "bull", - "bullet", - "bulletin", - "bumper", - "bunch", - "bundle", - "bunny", - "burden", - "bureau", - "buried", - "burn", - "burner", - "burning", - "burns", - "burst", - "bus", - "buses", - "bush", - "business", - "businesses", - "busy", - "but", - "butler", - "butter", - "butterfly", - "button", - "buttons", - "buy", - "buyer", - "buyers", - "buying", - "buys", - "buzz", - "by", - "bye", - "byte", - "bytes", - "cab", - "cabin", - "cabinet", - "cabinets", - "cable", - "cables", - "cache", - "cached", - "cad", - "cafe", - "cage", - "cake", - "cakes", - "calcium", - "calculate", - "calculated", - "calculation", - "calculations", - "calculator", - "calculators", - "calendar", - "calendars", - "calibration", - "California", - "call", - "called", - "calling", - "calls", - "calm", - "Cambodia", - "Cambridge", - "camcorder", - "camcorders", - "came", - "camel", - "camera", - "cameras", - "Cameroon", - "camp", - "campaign", - "campaigns", - "camping", - "camps", - "campus", - "can", - "Canada", - "Canadian", - "canal", - "Canberra", - "cancel", - "cancellation", - "cancelled", - "cancer", - "candidate", - "candidates", - "candle", - "candles", - "candy", - "cannon", - "cant", - "canvas", - "canyon", - "cap", - "capabilities", - "capability", - "capable", - "capacity", - "cape", - "capital", - "capitol", - "caps", - "captain", - "capture", - "captured", - "car", - "carbon", - "card", - "cardiac", - "Cardiff", - "cardiovascular", - "cards", - "care", - "career", - "careers", - "careful", - "carefully", - "cargo", - "Caribbean", - "caring", - "carnival", - "carpet", - "carried", - "carrier", - "carriers", - "carries", - "carry", - "carrying", - "cars", - "cart", - "Carter", - "cartoon", - "cartoons", - "cartridge", - "cartridges", - "case", - "cases", - "cash", - "cashiers", - "casino", - "casinos", - "cassette", - "cast", - "casting", - "castle", - "casual", - "cat", - "catalog", - "catalogs", - "catalogue", - "catalyst", - "catch", - "categories", - "category", - "catering", - "cathedral", - "catholic", - "cats", - "cattle", - "caught", - "cause", - "caused", - "causes", - "causing", - "caution", - "cave", - "Cayman", - "cedar", - "ceiling", - "celebrate", - "celebration", - "celebrities", - "celebrity", - "cell", - "cells", - "cellular", - "Celtic", - "cement", - "cemetery", - "census", - "cent", - "center", - "centered", - "centers", - "central", - "cents", - "centuries", - "century", - "ceramic", - "ceremony", - "certain", - "certainly", - "certificate", - "certificates", - "certification", - "certified", - "Chad", - "chain", - "chains", - "chair", - "chairman", - "chairs", - "challenge", - "challenged", - "challenges", - "challenging", - "chamber", - "chambers", - "champagne", - "champion", - "champions", - "championship", - "championships", - "chance", - "chancellor", - "chances", - "change", - "changed", - "changelog", - "changes", - "changing", - "channel", - "channels", - "chaos", - "chapel", - "chapter", - "chapters", - "character", - "characteristic", - "characteristics", - "characterization", - "characterized", - "characters", - "charge", - "charged", - "charger", - "chargers", - "charges", - "charging", - "charitable", - "charity", - "charm", - "charming", - "charms", - "chart", - "charter", - "charts", - "chase", - "chassis", - "chat", - "cheap", - "cheaper", - "cheapest", - "cheat", - "cheats", - "check", - "checked", - "checking", - "checklist", - "checkout", - "checks", - "cheers", - "cheese", - "chef", - "chemical", - "chemicals", - "chemistry", - "cherry", - "chess", - "chest", - "Chicago", - "chick", - "chicken", - "chicks", - "chief", - "child", - "childhood", - "children", - "childrens", - "Chile", - "China", - "Chinese", - "chip", - "chips", - "chocolate", - "choice", - "choices", - "choir", - "cholesterol", - "choose", - "choosing", - "chorus", - "chose", - "chosen", - "Christ", - "christian", - "Christianity", - "christians", - "Christmas", - "chrome", - "chronic", - "chronicle", - "chronicles", - "chubby", - "chuck", - "church", - "churches", - "cigarette", - "cigarettes", - "Cincinnati", - "cinema", - "circle", - "circles", - "circuit", - "circuits", - "circular", - "circulation", - "circumstances", - "circus", - "citation", - "citations", - "cite", - "cited", - "cities", - "citizen", - "citizens", - "citizenship", - "city", - "civic", - "civil", - "civilian", - "civilization", - "claim", - "claimed", - "claims", - "clan", - "clarity", - "class", - "classes", - "classic", - "classical", - "classics", - "classification", - "classified", - "classroom", - "clause", - "clay", - "clean", - "cleaner", - "cleaners", - "cleaning", - "cleanup", - "clear", - "clearance", - "cleared", - "clearing", - "clearly", - "clerk", - "Cleveland", - "click", - "clicking", - "clicks", - "client", - "clients", - "cliff", - "climate", - "climb", - "climbing", - "clinic", - "clinical", - "clinics", - "clip", - "clips", - "clock", - "clocks", - "clone", - "close", - "closed", - "closely", - "closer", - "closes", - "closest", - "closing", - "closure", - "cloth", - "clothes", - "clothing", - "cloud", - "clouds", - "cloudy", - "club", - "clubs", - "cluster", - "clusters", - "coach", - "coaches", - "coaching", - "coal", - "coalition", - "coast", - "coastal", - "coat", - "coated", - "coating", - "cod", - "code", - "codes", - "coding", - "coffee", - "cognitive", - "coin", - "coins", - "col", - "cold", - "collaboration", - "collaborative", - "collapse", - "collar", - "colleague", - "colleagues", - "collect", - "collectables", - "collected", - "collectible", - "collectibles", - "collecting", - "collection", - "collections", - "collective", - "collector", - "collectors", - "college", - "colleges", - "Colombia", - "colon", - "colonial", - "colony", - "color", - "Colorado", - "colors", - "Columbia", - "column", - "columnists", - "columns", - "combat", - "combination", - "combinations", - "combine", - "combined", - "combines", - "combining", - "combo", - "come", - "comedy", - "comes", - "comfort", - "comfortable", - "comic", - "comics", - "coming", - "command", - "commander", - "commands", - "comment", - "commentary", - "commented", - "comments", - "commerce", - "commercial", - "commission", - "commissioner", - "commissioners", - "commissions", - "commit", - "commitment", - "commitments", - "committed", - "committee", - "committees", - "commodities", - "commodity", - "common", - "commonly", - "commons", - "commonwealth", - "communicate", - "communication", - "communications", - "communist", - "communities", - "community", - "comp", - "compact", - "companies", - "companion", - "company", - "comparable", - "comparative", - "compare", - "compared", - "comparing", - "comparison", - "comparisons", - "compatibility", - "compatible", - "compensation", - "compete", - "competent", - "competing", - "competition", - "competitions", - "competitive", - "competitors", - "compilation", - "compile", - "compiled", - "compiler", - "complaint", - "complaints", - "complement", - "complete", - "completed", - "completely", - "completing", - "completion", - "complex", - "complexity", - "compliance", - "compliant", - "complicated", - "complications", - "complimentary", - "comply", - "component", - "components", - "composed", - "composer", - "composite", - "composition", - "compound", - "compounds", - "comprehensive", - "compressed", - "compression", - "compromise", - "computation", - "computational", - "compute", - "computed", - "computer", - "computers", - "computing", - "con", - "concentrate", - "concentration", - "concentrations", - "concept", - "concepts", - "conceptual", - "concern", - "concerned", - "concerning", - "concerns", - "concert", - "concerts", - "conclude", - "concluded", - "conclusion", - "conclusions", - "concord", - "concrete", - "condition", - "conditional", - "conditioning", - "conditions", - "conduct", - "conducted", - "conducting", - "conference", - "conferences", - "conferencing", - "confidence", - "confident", - "confidential", - "confidentiality", - "configuration", - "configure", - "configured", - "configuring", - "confirm", - "confirmation", - "confirmed", - "conflict", - "conflicts", - "confused", - "confusion", - "Congo", - "congratulations", - "Congress", - "congressional", - "conjunction", - "connect", - "connected", - "Connecticut", - "connecting", - "connection", - "connections", - "connectivity", - "connector", - "connectors", - "cons", - "conscious", - "consciousness", - "consecutive", - "consensus", - "consent", - "consequence", - "consequences", - "consequently", - "conservation", - "conservative", - "consider", - "considerable", - "consideration", - "considerations", - "considered", - "considering", - "considers", - "consist", - "consistency", - "consistent", - "consistently", - "consisting", - "consists", - "console", - "consoles", - "consolidated", - "consolidation", - "consortium", - "conspiracy", - "constant", - "constantly", - "constitute", - "constitutes", - "constitution", - "constitutional", - "constraint", - "constraints", - "construct", - "constructed", - "construction", - "consult", - "consultancy", - "consultant", - "consultants", - "consultation", - "consulting", - "consumer", - "consumers", - "consumption", - "contact", - "contacted", - "contacting", - "contacts", - "contain", - "contained", - "container", - "containers", - "containing", - "contains", - "contamination", - "contemporary", - "content", - "contents", - "contest", - "contests", - "context", - "continent", - "continental", - "continually", - "continue", - "continued", - "continues", - "continuing", - "continuity", - "continuous", - "continuously", - "contract", - "contracting", - "contractor", - "contractors", - "contracts", - "contrary", - "contrast", - "contribute", - "contributed", - "contributing", - "contribution", - "contributions", - "contributor", - "contributors", - "control", - "controlled", - "controller", - "controllers", - "controlling", - "controls", - "controversial", - "controversy", - "convenience", - "convenient", - "convention", - "conventional", - "conventions", - "convergence", - "conversation", - "conversations", - "conversion", - "convert", - "converted", - "converter", - "convertible", - "convicted", - "conviction", - "convinced", - "cook", - "cookbook", - "cooked", - "cookie", - "cookies", - "cooking", - "cool", - "cooler", - "cooling", - "cooper", - "cooperation", - "cooperative", - "coordinate", - "coordinated", - "coordinates", - "coordination", - "coordinator", - "cop", - "cope", - "copied", - "copies", - "copper", - "copy", - "copying", - "copyright", - "copyrighted", - "copyrights", - "coral", - "cord", - "cordless", - "core", - "cork", - "corn", - "corner", - "corners", - "Cornwall", - "corporate", - "corporation", - "corporations", - "corps", - "corpus", - "correct", - "corrected", - "correction", - "corrections", - "correctly", - "correlation", - "correspondence", - "corresponding", - "corruption", - "cosmetic", - "cosmetics", - "cost", - "costs", - "costume", - "costumes", - "cottage", - "cottages", - "cotton", - "could", - "council", - "councils", - "counsel", - "counseling", - "count", - "counted", - "counter", - "counters", - "counties", - "counting", - "countries", - "country", - "counts", - "county", - "couple", - "coupled", - "couples", - "coupon", - "coupons", - "courage", - "courier", - "course", - "courses", - "court", - "courtesy", - "courts", - "cove", - "cover", - "coverage", - "covered", - "covering", - "covers", - "cow", - "cowboy", - "crack", - "cradle", - "craft", - "crafts", - "crap", - "crash", - "crazy", - "cream", - "create", - "created", - "creates", - "creating", - "creation", - "creations", - "creative", - "creativity", - "creator", - "creature", - "creatures", - "credit", - "credits", - "creek", - "crest", - "crew", - "cricket", - "crime", - "crimes", - "criminal", - "crisis", - "criteria", - "criterion", - "critical", - "criticism", - "critics", - "Croatia", - "crop", - "crops", - "cross", - "crossing", - "crossword", - "crowd", - "crown", - "crucial", - "crude", - "cruise", - "cruises", - "cry", - "crystal", - "Cuba", - "cube", - "cubic", - "cuisine", - "cult", - "cultural", - "culture", - "cultures", - "cumulative", - "cup", - "cups", - "cure", - "curious", - "currencies", - "currency", - "current", - "currently", - "curriculum", - "cursor", - "curve", - "curves", - "custody", - "custom", - "customer", - "customers", - "customize", - "customized", - "customs", - "cut", - "cute", - "cuts", - "cutting", - "cycle", - "cycles", - "cycling", - "cylinder", - "Cyprus", - "Czech", - "dad", - "daily", - "dairy", - "daisy", - "dale", - "Dallas", - "dam", - "damage", - "damaged", - "damages", - "dame", - "damn", - "dance", - "dancing", - "danger", - "dangerous", - "Danish", - "dare", - "dark", - "darkness", - "dash", - "data", - "database", - "databases", - "date", - "dated", - "dates", - "dating", - "daughter", - "daughters", - "dawn", - "day", - "days", - "dead", - "deadline", - "deadly", - "deaf", - "deal", - "dealer", - "dealers", - "dealing", - "deals", - "dealt", - "dean", - "dear", - "death", - "deaths", - "debate", - "debt", - "debug", - "debut", - "decade", - "decades", - "December", - "decent", - "decide", - "decided", - "decimal", - "decision", - "decisions", - "deck", - "declaration", - "declare", - "declared", - "decline", - "declined", - "decor", - "decorating", - "decorative", - "decrease", - "decreased", - "dedicated", - "deemed", - "deep", - "deeper", - "deeply", - "deer", - "def", - "default", - "defeat", - "defects", - "defend", - "defendant", - "defense", - "defensive", - "deferred", - "deficit", - "define", - "defined", - "defines", - "defining", - "definitely", - "definition", - "definitions", - "degree", - "degrees", - "Delaware", - "delay", - "delayed", - "delays", - "delegation", - "delete", - "deleted", - "Delhi", - "delicious", - "delight", - "deliver", - "delivered", - "delivering", - "delivers", - "delivery", - "dell", - "delta", - "deluxe", - "demand", - "demanding", - "demands", - "demo", - "democracy", - "democrat", - "democratic", - "democrats", - "demographic", - "demonstrate", - "demonstrated", - "demonstrates", - "demonstration", - "den", - "denial", - "denied", - "Denmark", - "dense", - "density", - "dental", - "dentists", - "Denver", - "deny", - "department", - "departmental", - "departments", - "departure", - "depend", - "dependence", - "dependent", - "depending", - "depends", - "deployment", - "deposit", - "deposits", - "depot", - "depression", - "depth", - "deputy", - "derby", - "derived", - "descending", - "describe", - "described", - "describes", - "describing", - "description", - "descriptions", - "desert", - "deserve", - "design", - "designated", - "designation", - "designed", - "designer", - "designers", - "designing", - "designs", - "desirable", - "desire", - "desired", - "desk", - "desktop", - "desktops", - "desperate", - "despite", - "destination", - "destinations", - "destiny", - "destroy", - "destroyed", - "destruction", - "detail", - "detailed", - "details", - "detect", - "detected", - "detection", - "detective", - "detector", - "determination", - "determine", - "determined", - "determines", - "determining", - "Detroit", - "develop", - "developed", - "developer", - "developers", - "developing", - "development", - "developmental", - "developments", - "develops", - "deviant", - "deviation", - "device", - "devices", - "devil", - "devoted", - "diabetes", - "diagnosis", - "diagnostic", - "diagram", - "dial", - "dialog", - "dialogue", - "diameter", - "diamond", - "diamonds", - "diary", - "dice", - "dictionaries", - "dictionary", - "did", - "die", - "died", - "diesel", - "diet", - "dietary", - "differ", - "difference", - "differences", - "different", - "differential", - "differently", - "difficult", - "difficulties", - "difficulty", - "dig", - "digest", - "digit", - "digital", - "dim", - "dimension", - "dimensional", - "dimensions", - "dining", - "dinner", - "dip", - "diploma", - "direct", - "directed", - "direction", - "directions", - "directive", - "directly", - "director", - "directories", - "directors", - "directory", - "dirt", - "dirty", - "disabilities", - "disability", - "disable", - "disabled", - "disagree", - "disappointed", - "disaster", - "disc", - "discharge", - "disciplinary", - "discipline", - "disciplines", - "disclaimer", - "disclaimers", - "disclose", - "disclosure", - "disco", - "discount", - "discounted", - "discounts", - "discover", - "discovered", - "discovery", - "discrete", - "discretion", - "discrimination", - "discs", - "discuss", - "discussed", - "discusses", - "discussing", - "discussion", - "discussions", - "disease", - "diseases", - "dish", - "dishes", - "disk", - "disks", - "disorder", - "disorders", - "dispatch", - "dispatched", - "display", - "displayed", - "displaying", - "displays", - "disposal", - "disposition", - "dispute", - "disputes", - "distance", - "distances", - "distant", - "distinct", - "distinction", - "distinguished", - "distribute", - "distributed", - "distribution", - "distributions", - "distributor", - "distributors", - "district", - "districts", - "disturbed", - "dive", - "diverse", - "diversity", - "divide", - "divided", - "dividend", - "divine", - "diving", - "division", - "divisions", - "divorce", - "do", - "dock", - "doctor", - "doctors", - "doctrine", - "document", - "documentary", - "documentation", - "documented", - "documents", - "dodge", - "doe", - "does", - "dog", - "dogs", - "doing", - "doll", - "dollar", - "dollars", - "dolls", - "domain", - "domains", - "dome", - "domestic", - "dominant", - "Dominican", - "donate", - "donated", - "donation", - "donations", - "done", - "donor", - "donors", - "doom", - "door", - "doors", - "dosage", - "dose", - "dot", - "double", - "doubt", - "down", - "download", - "downloadable", - "downloaded", - "downloading", - "downloads", - "downtown", - "dozen", - "dozens", - "draft", - "drag", - "dragon", - "drain", - "drainage", - "drama", - "dramatic", - "dramatically", - "draw", - "drawing", - "drawings", - "drawn", - "draws", - "dream", - "dreams", - "dress", - "dressed", - "dresses", - "dressing", - "drew", - "dried", - "drill", - "drilling", - "drink", - "drinking", - "drinks", - "drive", - "driven", - "driver", - "drivers", - "drives", - "driving", - "drop", - "dropped", - "drops", - "drove", - "drug", - "drugs", - "drum", - "drums", - "drunk", - "dry", - "dryer", - "dual", - "Dubai", - "Dublin", - "duck", - "dude", - "due", - "duke", - "dumb", - "dump", - "duo", - "duplicate", - "durable", - "duration", - "Durham", - "during", - "dust", - "Dutch", - "duties", - "duty", - "dying", - "dynamic", - "dynamics", - "each", - "eagle", - "eagles", - "ear", - "earlier", - "earliest", - "early", - "earn", - "earned", - "earning", - "earnings", - "earrings", - "ears", - "earth", - "earthquake", - "ease", - "easier", - "easily", - "east", - "easter", - "eastern", - "easy", - "eat", - "eating", - "ebony", - "ebook", - "ebooks", - "echo", - "eclipse", - "ecological", - "ecology", - "ecommerce", - "economic", - "economics", - "economies", - "economy", - "Ecuador", - "edge", - "edges", - "Edinburgh", - "edit", - "edited", - "editing", - "edition", - "editions", - "editor", - "editorial", - "editorials", - "editors", - "educated", - "education", - "educational", - "educators", - "effect", - "effective", - "effectively", - "effectiveness", - "effects", - "efficiency", - "efficient", - "efficiently", - "effort", - "efforts", - "egg", - "eggs", - "Egypt", - "Egyptian", - "eh", - "eight", - "either", - "elder", - "elderly", - "elect", - "elected", - "election", - "elections", - "electoral", - "electric", - "electrical", - "electricity", - "electro", - "electron", - "electronic", - "electronics", - "elegant", - "element", - "elementary", - "elements", - "elephant", - "elevation", - "eleven", - "eligibility", - "eligible", - "eliminate", - "elimination", - "elite", - "else", - "elsewhere", - "email", - "emails", - "embassy", - "embedded", - "emerald", - "emergency", - "emerging", - "emission", - "emissions", - "emotional", - "emotions", - "emperor", - "emphasis", - "empire", - "empirical", - "employ", - "employed", - "employee", - "employees", - "employer", - "employers", - "employment", - "empty", - "enable", - "enabled", - "enables", - "enabling", - "enclosed", - "enclosure", - "encoding", - "encounter", - "encountered", - "encourage", - "encouraged", - "encourages", - "encouraging", - "encryption", - "encyclopedia", - "end", - "endangered", - "ended", - "ending", - "endless", - "endorsed", - "endorsement", - "ends", - "enemies", - "enemy", - "energy", - "enforcement", - "engage", - "engaged", - "engagement", - "engaging", - "engine", - "engineer", - "engineering", - "engineers", - "engines", - "England", - "English", - "enhance", - "enhanced", - "enhancement", - "enhancements", - "enhancing", - "enjoy", - "enjoyed", - "enjoying", - "enlarge", - "enlargement", - "enormous", - "enough", - "enquiries", - "enquiry", - "enrolled", - "enrollment", - "ensemble", - "ensure", - "ensures", - "ensuring", - "enter", - "entered", - "entering", - "enterprise", - "enterprises", - "enters", - "entertaining", - "entertainment", - "entire", - "entirely", - "entities", - "entitled", - "entity", - "entrance", - "entrepreneur", - "entrepreneurs", - "entries", - "entry", - "envelope", - "environment", - "environmental", - "environments", - "enzyme", - "epic", - "episode", - "episodes", - "equal", - "equality", - "equally", - "equation", - "equations", - "equilibrium", - "equipment", - "equipped", - "equity", - "equivalent", - "era", - "erotic", - "erotica", - "error", - "errors", - "escape", - "escort", - "escorts", - "especially", - "essay", - "essays", - "essence", - "essential", - "essentially", - "essentials", - "Essex", - "establish", - "established", - "establishing", - "establishment", - "estate", - "estates", - "estimate", - "estimated", - "estimates", - "estimation", - "Estonia", - "eternal", - "ethernet", - "ethical", - "ethics", - "Ethiopia", - "ethnic", - "euro", - "Europe", - "European", - "euros", - "evaluate", - "evaluated", - "evaluating", - "evaluation", - "evaluations", - "evanescence", - "even", - "evening", - "event", - "events", - "eventually", - "ever", - "every", - "everybody", - "everyday", - "everyone", - "everything", - "everywhere", - "evidence", - "evident", - "evil", - "evolution", - "exact", - "exactly", - "exam", - "examination", - "examinations", - "examine", - "examined", - "examines", - "examining", - "example", - "examples", - "exams", - "exceed", - "excel", - "excellence", - "excellent", - "except", - "exception", - "exceptional", - "exceptions", - "excerpt", - "excess", - "excessive", - "exchange", - "exchanges", - "excited", - "excitement", - "exciting", - "exclude", - "excluded", - "excluding", - "exclusion", - "exclusive", - "exclusively", - "excuse", - "execute", - "executed", - "execution", - "executive", - "executives", - "exempt", - "exemption", - "exercise", - "exercises", - "exhaust", - "exhibit", - "exhibition", - "exhibitions", - "exhibits", - "exist", - "existed", - "existence", - "existing", - "exists", - "exit", - "exotic", - "expand", - "expanded", - "expanding", - "expansion", - "expect", - "expectations", - "expected", - "expects", - "expenditure", - "expenditures", - "expense", - "expenses", - "expensive", - "experience", - "experienced", - "experiences", - "experiencing", - "experiment", - "experimental", - "experiments", - "expert", - "expertise", - "experts", - "expiration", - "expired", - "expires", - "explain", - "explained", - "explaining", - "explains", - "explanation", - "explicit", - "explicitly", - "exploration", - "explore", - "explorer", - "exploring", - "explosion", - "export", - "exports", - "exposed", - "exposure", - "express", - "expressed", - "expression", - "expressions", - "extend", - "extended", - "extending", - "extends", - "extension", - "extensions", - "extensive", - "extent", - "exterior", - "external", - "extra", - "extract", - "extraction", - "extraordinary", - "extras", - "extreme", - "extremely", - "eye", - "eyed", - "eyes", - "fabric", - "fabrics", - "fabulous", - "face", - "faced", - "faces", - "facial", - "facilitate", - "facilities", - "facility", - "facing", - "fact", - "factor", - "factors", - "factory", - "facts", - "faculty", - "fail", - "failed", - "failing", - "fails", - "failure", - "failures", - "fair", - "fairly", - "fairy", - "faith", - "fake", - "fall", - "fallen", - "falling", - "falls", - "false", - "fame", - "familiar", - "families", - "family", - "famous", - "fan", - "fancy", - "fans", - "fantastic", - "fantasy", - "far", - "fare", - "fares", - "farm", - "farmer", - "farmers", - "farming", - "farms", - "fascinating", - "fashion", - "fast", - "faster", - "fastest", - "fat", - "fatal", - "fate", - "father", - "fathers", - "fatty", - "fault", - "favor", - "favorite", - "favorites", - "favors", - "fax", - "fear", - "fears", - "feat", - "feature", - "featured", - "features", - "featuring", - "February", - "federal", - "federation", - "fee", - "feed", - "feedback", - "feeding", - "feeds", - "feel", - "feeling", - "feelings", - "feels", - "fees", - "feet", - "fell", - "fellow", - "fellowship", - "felt", - "female", - "females", - "fence", - "ferry", - "festival", - "festivals", - "fetish", - "fever", - "few", - "fewer", - "fiber", - "fiction", - "field", - "fields", - "fifteen", - "fifth", - "fifty", - "fig", - "fight", - "fighter", - "fighters", - "fighting", - "figure", - "figured", - "figures", - "Fiji", - "file", - "filed", - "filename", - "files", - "filing", - "fill", - "filled", - "filling", - "film", - "films", - "filter", - "filtering", - "filters", - "fin", - "final", - "finally", - "finals", - "finance", - "finances", - "financial", - "financing", - "find", - "finder", - "finding", - "findings", - "finds", - "fine", - "finest", - "finger", - "fingers", - "finish", - "finished", - "finishing", - "finite", - "Finland", - "Finnish", - "fire", - "fired", - "fireplace", - "fires", - "firewall", - "firm", - "firms", - "firmware", - "first", - "fiscal", - "fish", - "fisher", - "fisheries", - "fishing", - "fist", - "fit", - "fitness", - "fits", - "fitted", - "fitting", - "five", - "fix", - "fixed", - "fixes", - "fixtures", - "flag", - "flags", - "flame", - "flash", - "flashing", - "flat", - "flavor", - "fleece", - "fleet", - "flesh", - "flex", - "flexibility", - "flexible", - "flight", - "flights", - "flip", - "float", - "floating", - "flood", - "floor", - "flooring", - "floors", - "floppy", - "floral", - "Florida", - "florist", - "florists", - "flour", - "flow", - "flower", - "flowers", - "flows", - "flu", - "fluid", - "flush", - "flux", - "fly", - "flyer", - "flying", - "foam", - "focal", - "focus", - "focused", - "focuses", - "focusing", - "fog", - "fold", - "folder", - "folders", - "folding", - "folk", - "folks", - "follow", - "followed", - "following", - "follows", - "font", - "fonts", - "food", - "foods", - "fool", - "foot", - "footage", - "football", - "footwear", - "for", - "forbidden", - "force", - "forced", - "forces", - "ford", - "forecast", - "forecasts", - "foreign", - "forest", - "forestry", - "forests", - "forever", - "forge", - "forget", - "forgot", - "forgotten", - "fork", - "form", - "formal", - "format", - "formation", - "formats", - "formatting", - "formed", - "former", - "formerly", - "forming", - "forms", - "formula", - "fort", - "forth", - "fortune", - "forty", - "forum", - "forums", - "forward", - "forwarding", - "fossil", - "foster", - "foto", - "fotos", - "fought", - "foul", - "found", - "foundation", - "foundations", - "founded", - "founder", - "fountain", - "four", - "fourth", - "fox", - "fraction", - "fragrance", - "fragrances", - "frame", - "framed", - "frames", - "framework", - "framing", - "France", - "franchise", - "fraud", - "free", - "freedom", - "freelance", - "freely", - "freeware", - "freeze", - "freight", - "French", - "frequencies", - "frequency", - "frequent", - "frequently", - "fresh", - "Friday", - "fridge", - "friend", - "friendly", - "friends", - "friendship", - "frog", - "from", - "front", - "frontier", - "frontpage", - "frost", - "frozen", - "fruit", - "fruits", - "fuel", - "full", - "fully", - "fun", - "function", - "functional", - "functionality", - "functioning", - "functions", - "fund", - "fundamental", - "fundamentals", - "funded", - "funding", - "fundraising", - "funds", - "funeral", - "funk", - "funky", - "funny", - "fur", - "furnished", - "furnishings", - "furniture", - "further", - "furthermore", - "fusion", - "future", - "futures", - "fuzzy", - "gadgets", - "gain", - "gained", - "gains", - "galaxy", - "gale", - "galleries", - "gallery", - "gambling", - "game", - "games", - "gaming", - "gamma", - "gang", - "gap", - "gaps", - "garage", - "garbage", - "garden", - "gardening", - "gardens", - "garlic", - "gas", - "gasoline", - "gate", - "gates", - "gateway", - "gather", - "gathered", - "gathering", - "gauge", - "gave", - "gay", - "gays", - "gazette", - "gear", - "geek", - "gel", - "gem", - "gen", - "gender", - "gene", - "genealogy", - "general", - "generally", - "generate", - "generated", - "generates", - "generating", - "generation", - "generations", - "generator", - "generators", - "generic", - "generous", - "genes", - "genesis", - "genetic", - "genetics", - "genius", - "genome", - "genre", - "genres", - "gentle", - "gentleman", - "gently", - "genuine", - "geographic", - "geographical", - "geography", - "geological", - "geology", - "geometry", - "German", - "Germany", - "get", - "gets", - "getting", - "Ghana", - "ghost", - "giant", - "giants", - "Gibraltar", - "gift", - "gifts", - "gig", - "girl", - "girlfriend", - "girls", - "give", - "given", - "gives", - "giving", - "glad", - "glance", - "Glasgow", - "glass", - "glasses", - "glen", - "global", - "globe", - "glory", - "glossary", - "gloves", - "glow", - "glucose", - "gnome", - "gnu", - "go", - "goal", - "goals", - "goat", - "god", - "gods", - "goes", - "going", - "gold", - "golden", - "golf", - "gone", - "good", - "goods", - "gore", - "gorgeous", - "gospel", - "gossip", - "got", - "gothic", - "gotten", - "gourmet", - "governance", - "governing", - "government", - "governmental", - "governments", - "governor", - "grab", - "grace", - "grade", - "grades", - "gradually", - "graduate", - "graduated", - "graduates", - "graduation", - "grain", - "grammar", - "grams", - "grand", - "grant", - "granted", - "grants", - "graph", - "graphic", - "graphical", - "graphics", - "graphs", - "grass", - "grateful", - "grave", - "gravity", - "gray", - "great", - "greater", - "greatest", - "greatly", - "Greece", - "Greek", - "green", - "greenhouse", - "greeting", - "greetings", - "Grenada", - "grew", - "grey", - "grid", - "grill", - "grip", - "grocery", - "groove", - "gross", - "ground", - "grounds", - "groundwater", - "group", - "groups", - "grove", - "grow", - "growing", - "grown", - "grows", - "growth", - "guarantee", - "guaranteed", - "guarantees", - "guard", - "guardian", - "guards", - "Guatemala", - "guess", - "guest", - "guestbook", - "guests", - "guidance", - "guide", - "guided", - "guidelines", - "guides", - "guild", - "guilty", - "guitar", - "guitars", - "gulf", - "gun", - "guns", - "guru", - "guy", - "Guyana", - "guys", - "gym", - "habitat", - "habits", - "hack", - "hacker", - "had", - "hair", - "hairy", - "Haiti", - "half", - "hall", - "halloween", - "halo", - "ham", - "hammer", - "Hampshire", - "hand", - "handbags", - "handbook", - "handed", - "handheld", - "handle", - "handled", - "handles", - "handling", - "handmade", - "hands", - "handy", - "hang", - "hanging", - "happen", - "happened", - "happening", - "happens", - "happiness", - "happy", - "harassment", - "harbor", - "hard", - "hardcore", - "hardcover", - "harder", - "hardly", - "hardware", - "hardwood", - "harm", - "harmful", - "harmony", - "hart", - "harvest", - "has", - "hash", - "hat", - "hate", - "hats", - "have", - "haven", - "having", - "Hawaii", - "Hawaiian", - "hawk", - "hay", - "hazard", - "hazardous", - "hazards", - "he", - "head", - "headed", - "header", - "headers", - "heading", - "headline", - "headlines", - "headphones", - "headquarters", - "heads", - "headset", - "healing", - "health", - "healthcare", - "healthy", - "hear", - "heard", - "hearing", - "hearings", - "heart", - "hearts", - "heat", - "heated", - "heater", - "heath", - "heather", - "heating", - "heaven", - "heavily", - "heavy", - "Hebrew", - "heel", - "height", - "heights", - "held", - "helicopter", - "hell", - "hello", - "helmet", - "help", - "helped", - "helpful", - "helping", - "helps", - "hence", - "hepatitis", - "her", - "herb", - "herbal", - "herbs", - "here", - "hereby", - "herein", - "heritage", - "hero", - "heroes", - "herself", - "hey", - "hi", - "hidden", - "hide", - "hierarchy", - "high", - "higher", - "highest", - "highland", - "highlight", - "highlighted", - "highlights", - "highly", - "highway", - "highways", - "hiking", - "hill", - "hills", - "him", - "himself", - "hint", - "hints", - "hip", - "hire", - "hired", - "hiring", - "his", - "Hispanic", - "historic", - "historical", - "history", - "hit", - "hits", - "hitting", - "ho", - "hobbies", - "hobby", - "hockey", - "hold", - "holder", - "holders", - "holding", - "holdings", - "holds", - "hole", - "holes", - "holiday", - "holidays", - "Holland", - "hollow", - "holy", - "home", - "homeland", - "homeless", - "homepage", - "homes", - "hometown", - "homework", - "honest", - "honey", - "Honolulu", - "honor", - "honors", - "hood", - "hook", - "hop", - "hope", - "hoped", - "hopefully", - "hopes", - "hoping", - "horizon", - "horizontal", - "hormone", - "horn", - "horrible", - "horror", - "horse", - "horses", - "hose", - "hospital", - "hospitality", - "hospitals", - "host", - "hosted", - "hostel", - "hostels", - "hosting", - "hosts", - "hot", - "hotel", - "hotels", - "hottest", - "hour", - "hourly", - "hours", - "house", - "household", - "households", - "houses", - "housewares", - "housewives", - "housing", - "Houston", - "how", - "however", - "hub", - "huge", - "hull", - "human", - "humanitarian", - "humanities", - "humanity", - "humans", - "humidity", - "humor", - "hundred", - "hundreds", - "hung", - "hunger", - "hungry", - "hunt", - "hunter", - "hunting", - "hurricane", - "hurt", - "husband", - "hybrid", - "hydraulic", - "hydrogen", - "hygiene", - "hypothesis", - "hypothetical", - "I", - "ice", - "Iceland", - "icon", - "icons", - "Idaho", - "idea", - "ideal", - "ideas", - "identical", - "identification", - "identified", - "identifier", - "identifies", - "identify", - "identifying", - "identity", - "idle", - "idol", - "if", - "ignore", - "ignored", - "ill", - "illegal", - "Illinois", - "illness", - "illustrated", - "illustration", - "illustrations", - "image", - "images", - "imagination", - "imagine", - "imaging", - "immediate", - "immediately", - "immigrants", - "immigration", - "immune", - "immunology", - "impact", - "impacts", - "impaired", - "imperial", - "implement", - "implementation", - "implemented", - "implementing", - "implications", - "implied", - "implies", - "import", - "importance", - "important", - "importantly", - "imported", - "imports", - "impose", - "imposed", - "impossible", - "impressed", - "impression", - "impressive", - "improve", - "improved", - "improvement", - "improvements", - "improving", - "in", - "inappropriate", - "inbox", - "incentive", - "incentives", - "inch", - "inches", - "incidence", - "incident", - "incidents", - "include", - "included", - "includes", - "including", - "inclusion", - "inclusive", - "income", - "incoming", - "incomplete", - "incorporate", - "incorporated", - "incorrect", - "increase", - "increased", - "increases", - "increasing", - "increasingly", - "incredible", - "indeed", - "independence", - "independent", - "independently", - "index", - "indexed", - "indexes", - "India", - "Indian", - "Indiana", - "Indianapolis", - "Indians", - "indicate", - "indicated", - "indicates", - "indicating", - "indication", - "indicator", - "indicators", - "indices", - "indigenous", - "indirect", - "individual", - "individually", - "individuals", - "Indonesia", - "Indonesian", - "indoor", - "induced", - "induction", - "industrial", - "industries", - "industry", - "inexpensive", - "infant", - "infants", - "infected", - "infection", - "infections", - "infectious", - "infinite", - "inflation", - "influence", - "influenced", - "influences", - "info", - "inform", - "informal", - "information", - "informational", - "informative", - "informed", - "infrared", - "infrastructure", - "ingredients", - "inherited", - "initial", - "initially", - "initiated", - "initiative", - "initiatives", - "injection", - "injured", - "injuries", - "injury", - "ink", - "inline", - "inn", - "inner", - "innocent", - "innovation", - "innovations", - "innovative", - "inns", - "input", - "inputs", - "inquire", - "inquiries", - "inquiry", - "insects", - "insert", - "inserted", - "insertion", - "inside", - "insider", - "insight", - "insights", - "inspection", - "inspections", - "inspector", - "inspiration", - "inspired", - "install", - "installation", - "installations", - "installed", - "installing", - "instance", - "instances", - "instant", - "instantly", - "instead", - "institute", - "institutes", - "institution", - "institutional", - "institutions", - "instruction", - "instructional", - "instructions", - "instructor", - "instructors", - "instrument", - "instrumental", - "instrumentation", - "instruments", - "insulin", - "insurance", - "insured", - "intake", - "integer", - "integral", - "integrate", - "integrated", - "integrating", - "integration", - "integrity", - "intel", - "intellectual", - "intelligence", - "intelligent", - "intend", - "intended", - "intense", - "intensity", - "intensive", - "intent", - "intention", - "inter", - "interact", - "interaction", - "interactions", - "interactive", - "interest", - "interested", - "interesting", - "interests", - "interface", - "interfaces", - "interference", - "interim", - "interior", - "intermediate", - "internal", - "international", - "internationally", - "internet", - "internship", - "interpretation", - "interpreted", - "interracial", - "intersection", - "interstate", - "interval", - "intervals", - "intervention", - "interventions", - "interview", - "interviews", - "intimate", - "into", - "intranet", - "introduce", - "introduced", - "introduces", - "introducing", - "introduction", - "introductory", - "invalid", - "invasion", - "invention", - "inventory", - "invest", - "investigate", - "investigated", - "investigation", - "investigations", - "investigator", - "investigators", - "investing", - "investment", - "investments", - "investor", - "investors", - "invisible", - "invitation", - "invitations", - "invite", - "invited", - "invoice", - "involve", - "involved", - "involvement", - "involves", - "involving", - "Iran", - "Iraq", - "Iraqi", - "Ireland", - "Irish", - "iron", - "irrigation", - "is", - "Islam", - "Islamic", - "island", - "islands", - "isle", - "isolated", - "isolation", - "Israel", - "Israeli", - "issue", - "issued", - "issues", - "Istanbul", - "it", - "Italian", - "italic", - "Italy", - "item", - "items", - "its", - "itself", - "ivory", - "jacket", - "jackets", - "jade", - "jaguar", - "jail", - "jam", - "Jamaica", - "January", - "Japan", - "Japanese", - "jar", - "jazz", - "jean", - "jeans", - "jeep", - "jersey", - "Jerusalem", - "Jesus", - "jet", - "jets", - "jewel", - "jewelry", - "jewish", - "jews", - "job", - "jobs", - "join", - "joined", - "joining", - "joins", - "joint", - "joke", - "jokes", - "journal", - "journalism", - "journalist", - "journalists", - "journals", - "journey", - "joy", - "judge", - "judges", - "judgment", - "judicial", - "judy", - "juice", - "July", - "jump", - "jumping", - "junction", - "June", - "jungle", - "junior", - "junk", - "jurisdiction", - "jury", - "just", - "justice", - "justify", - "justin", - "juvenile", - "Kansas", - "karaoke", - "karma", - "Kazakhstan", - "keen", - "keep", - "keeping", - "keeps", - "Kent", - "Kentucky", - "Kenya", - "kept", - "kernel", - "key", - "keyboard", - "keyboards", - "keys", - "keyword", - "keywords", - "kick", - "kid", - "kidney", - "kids", - "kill", - "killed", - "killer", - "killing", - "kills", - "kilometers", - "kind", - "kinds", - "king", - "kingdom", - "kings", - "kiss", - "kissing", - "kit", - "kitchen", - "kits", - "kitty", - "knee", - "knew", - "knife", - "knight", - "knights", - "knit", - "knitting", - "knives", - "knock", - "know", - "knowing", - "knowledge", - "knowledgestorm", - "known", - "knows", - "Korea", - "Korean", - "Kuwait", - "label", - "labeled", - "labels", - "labor", - "laboratories", - "laboratory", - "lace", - "lack", - "ladder", - "laden", - "ladies", - "lady", - "laid", - "lake", - "lakes", - "lamb", - "lambda", - "lamp", - "lamps", - "lance", - "land", - "landing", - "lands", - "landscape", - "landscapes", - "lane", - "lanes", - "language", - "languages", - "lap", - "laptop", - "laptops", - "large", - "largely", - "larger", - "largest", - "laser", - "last", - "lasting", - "late", - "lately", - "later", - "latest", - "Latin", - "Latina", - "Latinas", - "Latino", - "latitude", - "latter", - "Latvia", - "laugh", - "laughing", - "launch", - "launched", - "launches", - "laundry", - "law", - "lawn", - "laws", - "lawsuit", - "lawyer", - "lawyers", - "lay", - "layer", - "layers", - "layout", - "lazy", - "lead", - "leader", - "leaders", - "leadership", - "leading", - "leads", - "leaf", - "league", - "lean", - "learn", - "learned", - "learners", - "learning", - "lease", - "leasing", - "least", - "leather", - "leave", - "leaves", - "leaving", - "Lebanon", - "lecture", - "lectures", - "led", - "lee", - "left", - "leg", - "legacy", - "legal", - "legally", - "legend", - "legendary", - "legends", - "legislation", - "legislative", - "legislature", - "legitimate", - "legs", - "leisure", - "lemon", - "lender", - "lenders", - "lending", - "length", - "lens", - "lenses", - "less", - "lesser", - "lesson", - "lessons", - "let", - "lets", - "letter", - "letters", - "letting", - "level", - "levels", - "liabilities", - "liability", - "liable", - "liberal", - "Liberia", - "liberty", - "librarian", - "libraries", - "library", - "license", - "licensed", - "licenses", - "licensing", - "licking", - "lid", - "lie", - "Liechtenstein", - "lies", - "life", - "lifestyle", - "lifetime", - "lift", - "light", - "lighter", - "lighting", - "lightning", - "lights", - "lightweight", - "like", - "liked", - "likelihood", - "likely", - "likes", - "likewise", - "lime", - "limit", - "limitation", - "limitations", - "limited", - "limiting", - "limits", - "limousines", - "line", - "linear", - "lined", - "lines", - "link", - "linked", - "linking", - "links", - "lion", - "lions", - "lip", - "lips", - "liquid", - "list", - "listed", - "listen", - "listening", - "listing", - "listings", - "lists", - "lit", - "lite", - "literacy", - "literally", - "literary", - "literature", - "Lithuania", - "litigation", - "little", - "live", - "lived", - "liver", - "Liverpool", - "lives", - "livestock", - "living", - "load", - "loaded", - "loading", - "loads", - "loan", - "loans", - "lobby", - "local", - "locale", - "locally", - "locate", - "located", - "location", - "locations", - "locator", - "lock", - "locked", - "locking", - "locks", - "lodge", - "lodging", - "log", - "logged", - "logging", - "logic", - "logical", - "login", - "logistics", - "Logitech", - "logo", - "logos", - "logs", - "London", - "lone", - "lonely", - "long", - "longer", - "longest", - "longitude", - "look", - "looked", - "looking", - "looks", - "lookup", - "loop", - "loops", - "loose", - "lord", - "lose", - "losing", - "loss", - "losses", - "lost", - "lot", - "lots", - "lottery", - "lotus", - "loud", - "Louisiana", - "lounge", - "love", - "loved", - "lovely", - "lover", - "lovers", - "loves", - "loving", - "low", - "lower", - "lowest", - "luck", - "lucky", - "luggage", - "lunch", - "lung", - "luther", - "Luxembourg", - "luxury", - "lying", - "lyric", - "lyrics", - "Macedonia", - "machine", - "machinery", - "machines", - "macro", - "mad", - "Madagascar", - "made", - "madness", - "Madrid", - "magazine", - "magazines", - "magic", - "magical", - "magnet", - "magnetic", - "magnificent", - "magnitude", - "maiden", - "mail", - "mailed", - "mailing", - "mailman", - "mails", - "main", - "Maine", - "mainland", - "mainly", - "mainstream", - "maintain", - "maintained", - "maintaining", - "maintains", - "maintenance", - "major", - "majority", - "make", - "maker", - "makers", - "makes", - "makeup", - "making", - "Malawi", - "Malaysia", - "Maldives", - "male", - "males", - "Mali", - "mall", - "malpractice", - "Malta", - "man", - "manage", - "managed", - "management", - "manager", - "managers", - "managing", - "Manchester", - "mandate", - "mandatory", - "Manhattan", - "Manitoba", - "manner", - "manor", - "manual", - "manually", - "manuals", - "manufacture", - "manufactured", - "manufacturer", - "manufacturers", - "manufacturing", - "many", - "map", - "maple", - "mapping", - "maps", - "mar", - "marathon", - "marble", - "march", - "margin", - "marine", - "maritime", - "mark", - "marked", - "marker", - "markers", - "market", - "marketing", - "marketplace", - "markets", - "marking", - "marks", - "marriage", - "married", - "Mars", - "marshall", - "mart", - "martial", - "marvel", - "mask", - "mass", - "Massachusetts", - "massage", - "massive", - "master", - "masters", - "mat", - "match", - "matched", - "matches", - "matching", - "mate", - "material", - "materials", - "maternity", - "math", - "mathematical", - "mathematics", - "mating", - "matrix", - "mats", - "matt", - "matter", - "matters", - "mattress", - "mature", - "Mauritius", - "maximize", - "maximum", - "may", - "maybe", - "mayor", - "me", - "meal", - "meals", - "mean", - "meaning", - "meaningful", - "means", - "meant", - "meanwhile", - "measure", - "measured", - "measurement", - "measurements", - "measures", - "measuring", - "meat", - "mechanical", - "mechanics", - "mechanism", - "mechanisms", - "medal", - "media", - "median", - "medicaid", - "medical", - "medicare", - "medication", - "medications", - "medicine", - "medicines", - "medieval", - "meditation", - "Mediterranean", - "medium", - "meet", - "meeting", - "meetings", - "meets", - "mega", - "Melbourne", - "member", - "members", - "membership", - "membrane", - "memo", - "memorabilia", - "memorial", - "memories", - "memory", - "Memphis", - "men", - "mental", - "mention", - "mentioned", - "mentor", - "menu", - "menus", - "merchandise", - "merchant", - "merchants", - "mercury", - "mercy", - "mere", - "merely", - "merge", - "merger", - "merit", - "merry", - "mesa", - "mesh", - "mess", - "message", - "messages", - "messaging", - "messenger", - "met", - "meta", - "metabolism", - "metadata", - "metal", - "metallic", - "metals", - "meter", - "meters", - "method", - "methodology", - "methods", - "metric", - "metro", - "metropolitan", - "Mexican", - "Mexico", - "Miami", - "mice", - "Michigan", - "micro", - "microphone", - "microsoft", - "microwave", - "middle", - "midi", - "Midlands", - "midnight", - "Midwest", - "might", - "mighty", - "migration", - "mild", - "mile", - "mileage", - "miles", - "military", - "milk", - "mill", - "millennium", - "miller", - "million", - "millions", - "mills", - "mime", - "mind", - "minds", - "mine", - "mineral", - "minerals", - "mines", - "miniature", - "minimal", - "minimize", - "minimum", - "mining", - "minister", - "ministers", - "ministries", - "ministry", - "Minnesota", - "minor", - "minority", - "mint", - "minus", - "minute", - "minutes", - "miracle", - "mirror", - "mirrors", - "miscellaneous", - "miss", - "missed", - "missile", - "missing", - "mission", - "missions", - "Mississippi", - "Missouri", - "mistake", - "mistakes", - "mistress", - "mix", - "mixed", - "mixer", - "mixing", - "mixture", - "mobile", - "mobiles", - "mobility", - "mod", - "mode", - "model", - "modeling", - "models", - "modem", - "modems", - "moderate", - "moderator", - "moderators", - "modern", - "modes", - "modification", - "modifications", - "modified", - "modify", - "mods", - "modular", - "module", - "modules", - "moisture", - "Moldova", - "molecular", - "molecules", - "moment", - "moments", - "momentum", - "Monaco", - "Monday", - "monetary", - "money", - "Mongolia", - "monitor", - "monitored", - "monitoring", - "monitors", - "monkey", - "monster", - "Montana", - "month", - "monthly", - "months", - "Montreal", - "mood", - "moon", - "moral", - "more", - "moreover", - "morning", - "Morocco", - "morris", - "mortality", - "mortgage", - "mortgages", - "Moscow", - "Moses", - "moss", - "most", - "mostly", - "motel", - "motels", - "mother", - "motherboard", - "mothers", - "motion", - "motivated", - "motivation", - "motor", - "motorcycle", - "motorcycles", - "motors", - "mount", - "mountain", - "mountains", - "mounted", - "mounting", - "mounts", - "mouse", - "mouth", - "move", - "moved", - "movement", - "movements", - "movers", - "moves", - "movie", - "movies", - "moving", - "Mozambique", - "much", - "mud", - "mug", - "multi", - "multimedia", - "multiple", - "Mumbai", - "Munich", - "municipal", - "municipality", - "murder", - "muscle", - "muscles", - "museum", - "museums", - "music", - "musical", - "musician", - "musicians", - "Muslim", - "Muslims", - "must", - "mutual", - "Myanmar", - "myrtle", - "myself", - "mysterious", - "mystery", - "myth", - "nail", - "nails", - "name", - "named", - "namely", - "names", - "Namibia", - "narrative", - "narrow", - "Nashville", - "nasty", - "nation", - "national", - "nationally", - "nations", - "nationwide", - "native", - "natural", - "naturally", - "naturals", - "nature", - "naughty", - "naval", - "navigate", - "navigation", - "navigator", - "navy", - "near", - "nearby", - "nearest", - "nearly", - "Nebraska", - "necessarily", - "necessary", - "necessity", - "neck", - "necklace", - "need", - "needed", - "needle", - "needs", - "negative", - "negotiation", - "negotiations", - "neighbor", - "neighborhood", - "neighbors", - "neither", - "neon", - "Nepal", - "nerve", - "nervous", - "nest", - "nested", - "net", - "Netherlands", - "network", - "networking", - "networks", - "neural", - "neutral", - "Nevada", - "never", - "nevertheless", - "new", - "newbie", - "newer", - "newest", - "newly", - "news", - "newsletter", - "newsletters", - "newspaper", - "newspapers", - "newton", - "next", - "Niagara", - "Nicaragua", - "nice", - "nick", - "nickel", - "nickname", - "night", - "nightlife", - "nightmare", - "nights", - "nil", - "nine", - "nirvana", - "nitrogen", - "no", - "noble", - "nobody", - "node", - "nodes", - "noise", - "nominated", - "nomination", - "nominations", - "none", - "nonprofit", - "noon", - "nor", - "Norfolk", - "norm", - "normal", - "normally", - "north", - "northeast", - "northern", - "northwest", - "Norway", - "Norwegian", - "nose", - "not", - "note", - "notebook", - "notebooks", - "noted", - "notes", - "nothing", - "notice", - "noticed", - "notices", - "notification", - "notifications", - "notified", - "notify", - "notion", - "nova", - "novel", - "novels", - "novelty", - "November", - "now", - "nowhere", - "nuclear", - "nuke", - "null", - "number", - "numbers", - "numeric", - "numerical", - "numerous", - "nurse", - "nursery", - "nurses", - "nursing", - "nut", - "nutrition", - "nutritional", - "nuts", - "nylon", - "oak", - "oaks", - "oasis", - "obesity", - "obituaries", - "object", - "objective", - "objectives", - "objects", - "obligation", - "obligations", - "observation", - "observations", - "observe", - "observed", - "observer", - "obtain", - "obtained", - "obtaining", - "obvious", - "obviously", - "occasion", - "occasional", - "occasionally", - "occasions", - "occupation", - "occupational", - "occupations", - "occupied", - "occur", - "occurred", - "occurrence", - "occurring", - "occurs", - "ocean", - "October", - "odd", - "odds", - "of", - "off", - "offense", - "offensive", - "offer", - "offered", - "offering", - "offerings", - "offers", - "office", - "officer", - "officers", - "offices", - "official", - "officially", - "officials", - "offline", - "offset", - "offshore", - "often", - "Ohio", - "oil", - "oils", - "okay", - "Oklahoma", - "old", - "older", - "oldest", - "olive", - "olympic", - "olympics", - "olympus", - "Oman", - "omega", - "omissions", - "on", - "once", - "one", - "ones", - "ongoing", - "onion", - "online", - "only", - "Ontario", - "onto", - "oops", - "open", - "opened", - "opening", - "openings", - "opens", - "opera", - "operate", - "operated", - "operates", - "operating", - "operation", - "operational", - "operations", - "operator", - "operators", - "opinion", - "opinions", - "opponent", - "opponents", - "opportunities", - "opportunity", - "opposed", - "opposite", - "opposition", - "opt", - "optical", - "optics", - "optimal", - "optimization", - "optimize", - "optimum", - "option", - "optional", - "options", - "or", - "oracle", - "oral", - "orange", - "orbit", - "orchestra", - "order", - "ordered", - "ordering", - "orders", - "ordinance", - "ordinary", - "Oregon", - "organ", - "organic", - "organisms", - "organization", - "organizational", - "organizations", - "organize", - "organized", - "organizer", - "organizing", - "Oriental", - "orientation", - "oriented", - "origin", - "original", - "originally", - "origins", - "Orlando", - "other", - "others", - "otherwise", - "Ottawa", - "ought", - "our", - "ours", - "ourselves", - "out", - "outcome", - "outcomes", - "outdoor", - "outdoors", - "outer", - "outlet", - "outline", - "outlined", - "outlook", - "output", - "outputs", - "outreach", - "outside", - "outsourcing", - "outstanding", - "oval", - "oven", - "over", - "overall", - "overcome", - "overhead", - "overnight", - "overseas", - "overview", - "own", - "owned", - "owner", - "owners", - "ownership", - "owns", - "Oxford", - "oxide", - "oxygen", - "ozone", - "pace", - "Pacific", - "pack", - "package", - "packages", - "packaging", - "packed", - "packet", - "packets", - "packing", - "packs", - "pad", - "pads", - "page", - "pages", - "paid", - "pain", - "painful", - "paint", - "paintball", - "painted", - "painting", - "paintings", - "pair", - "pairs", - "Pakistan", - "pal", - "palace", - "pale", - "Palestine", - "Palestinian", - "palm", - "pan", - "Panama", - "panel", - "panels", - "panic", - "pants", - "pantyhose", - "paper", - "paperback", - "paperbacks", - "papers", - "parade", - "paradise", - "paragraph", - "paragraphs", - "Paraguay", - "parallel", - "parameter", - "parameters", - "parcel", - "parent", - "parental", - "parenting", - "parents", - "Paris", - "park", - "parking", - "parks", - "parliament", - "parliamentary", - "part", - "partial", - "partially", - "participant", - "participants", - "participate", - "participated", - "participating", - "participation", - "particle", - "particles", - "particular", - "particularly", - "parties", - "partition", - "partly", - "partner", - "partners", - "partnership", - "partnerships", - "parts", - "party", - "pass", - "passage", - "passed", - "passenger", - "passengers", - "passes", - "passing", - "passion", - "passive", - "passport", - "password", - "passwords", - "past", - "pasta", - "paste", - "pastor", - "pat", - "patch", - "patches", - "patent", - "patents", - "path", - "pathology", - "paths", - "patient", - "patients", - "patio", - "patrol", - "pattern", - "patterns", - "pavilion", - "pay", - "payable", - "payday", - "paying", - "payment", - "payments", - "payroll", - "pays", - "peace", - "peaceful", - "peak", - "pearl", - "peas", - "pediatric", - "peer", - "peers", - "pen", - "penalties", - "penalty", - "pencil", - "pendant", - "pending", - "penguin", - "peninsula", - "Pennsylvania", - "penny", - "pens", - "pension", - "pensions", - "people", - "peoples", - "pepper", - "per", - "perceived", - "percent", - "percentage", - "perception", - "perfect", - "perfectly", - "perform", - "performance", - "performances", - "performed", - "performer", - "performing", - "performs", - "perfume", - "perhaps", - "period", - "periodic", - "periodically", - "periods", - "peripheral", - "peripherals", - "perl", - "permanent", - "permission", - "permissions", - "permit", - "permits", - "permitted", - "Persian", - "persistent", - "person", - "personal", - "personality", - "personalized", - "personally", - "personnel", - "persons", - "perspective", - "perspectives", - "Peru", - "pest", - "pet", - "petition", - "petroleum", - "pets", - "phantom", - "pharmaceutical", - "pharmaceuticals", - "pharmacies", - "pharmacology", - "pharmacy", - "phase", - "phases", - "phenomenon", - "Philadelphia", - "Philippines", - "philosophy", - "phoenix", - "phone", - "phones", - "photo", - "photograph", - "photographer", - "photographers", - "photographic", - "photographs", - "photography", - "photos", - "photoshop", - "phrase", - "phrases", - "physical", - "physically", - "physician", - "physicians", - "physics", - "physiology", - "piano", - "pick", - "picked", - "picking", - "picks", - "pickup", - "picnic", - "pics", - "picture", - "pictures", - "pie", - "piece", - "pieces", - "pierce", - "pig", - "pike", - "pill", - "pillow", - "pills", - "pilot", - "pin", - "pine", - "ping", - "pink", - "pins", - "pioneer", - "pipe", - "pipeline", - "pipes", - "pirates", - "pit", - "pitch", - "Pittsburgh", - "pixel", - "pixels", - "pizza", - "place", - "placed", - "placement", - "places", - "placing", - "plain", - "plains", - "plaintiff", - "plan", - "plane", - "planes", - "planet", - "planets", - "planned", - "planner", - "planners", - "planning", - "plans", - "plant", - "plants", - "plasma", - "plastic", - "plastics", - "plate", - "plates", - "platform", - "platforms", - "platinum", - "play", - "playback", - "played", - "player", - "players", - "playing", - "playlist", - "plays", - "PlayStation", - "plaza", - "pleasant", - "please", - "pleased", - "pleasure", - "pledge", - "plenty", - "plot", - "plots", - "plug", - "plugin", - "plugins", - "plumbing", - "plus", - "pocket", - "pockets", - "pod", - "podcast", - "podcasts", - "poem", - "poems", - "poet", - "poetry", - "point", - "pointed", - "pointer", - "pointing", - "points", - "Pokemon", - "poker", - "Poland", - "polar", - "pole", - "police", - "policies", - "policy", - "Polish", - "polished", - "political", - "politicians", - "politics", - "poll", - "polls", - "pollution", - "polo", - "polyester", - "polymer", - "polyphonic", - "pond", - "pool", - "pools", - "poor", - "pop", - "Pope", - "popular", - "popularity", - "population", - "populations", - "porcelain", - "pork", - "port", - "portable", - "portal", - "portfolio", - "portion", - "portions", - "Portland", - "portrait", - "portraits", - "ports", - "Portugal", - "Portuguese", - "pose", - "posing", - "position", - "positioning", - "positions", - "positive", - "possess", - "possession", - "possibilities", - "possibility", - "possible", - "possibly", - "post", - "postage", - "postal", - "postcard", - "postcards", - "posted", - "poster", - "posters", - "posting", - "postings", - "posts", - "pot", - "potato", - "potatoes", - "potential", - "potentially", - "potter", - "pottery", - "poultry", - "pound", - "pounds", - "pour", - "poverty", - "powder", - "power", - "powered", - "powerful", - "powers", - "practical", - "practice", - "practices", - "practitioner", - "practitioners", - "Prague", - "prairie", - "praise", - "pray", - "prayer", - "prayers", - "preceding", - "precious", - "precipitation", - "precise", - "precisely", - "precision", - "predict", - "predicted", - "prediction", - "predictions", - "prefer", - "preference", - "preferences", - "preferred", - "prefers", - "prefix", - "pregnancy", - "pregnant", - "preliminary", - "premier", - "premiere", - "premises", - "premium", - "prepaid", - "preparation", - "prepare", - "prepared", - "preparing", - "prerequisite", - "prescribed", - "prescription", - "presence", - "present", - "presentation", - "presentations", - "presented", - "presenting", - "presently", - "presents", - "preservation", - "preserve", - "president", - "presidential", - "press", - "pressed", - "pressing", - "pressure", - "pretty", - "prevent", - "preventing", - "prevention", - "preview", - "previews", - "previous", - "previously", - "price", - "priced", - "prices", - "pricing", - "pride", - "priest", - "primarily", - "primary", - "prime", - "prince", - "princess", - "principal", - "principle", - "principles", - "print", - "printable", - "printed", - "printer", - "printers", - "printing", - "prints", - "prior", - "priorities", - "priority", - "prison", - "prisoner", - "prisoners", - "privacy", - "private", - "privilege", - "privileges", - "prize", - "prizes", - "pro", - "probability", - "probably", - "probe", - "problem", - "problems", - "procedure", - "procedures", - "proceed", - "proceeding", - "proceedings", - "proceeds", - "process", - "processed", - "processes", - "processing", - "processor", - "processors", - "procurement", - "produce", - "produced", - "producer", - "producers", - "produces", - "producing", - "product", - "production", - "productions", - "productive", - "productivity", - "products", - "profession", - "professional", - "professionals", - "professor", - "profile", - "profiles", - "profit", - "profits", - "program", - "programmer", - "programmers", - "programming", - "programs", - "progress", - "progressive", - "prohibited", - "project", - "projected", - "projection", - "projector", - "projectors", - "projects", - "prominent", - "promise", - "promised", - "promises", - "promising", - "promo", - "promote", - "promoted", - "promotes", - "promoting", - "promotion", - "promotional", - "promotions", - "prompt", - "promptly", - "proof", - "proper", - "properly", - "properties", - "property", - "prophet", - "proportion", - "proposal", - "proposals", - "propose", - "proposed", - "proposition", - "proprietary", - "pros", - "prospect", - "prospective", - "prospects", - "protect", - "protected", - "protecting", - "protection", - "protective", - "protein", - "proteins", - "protest", - "protocol", - "protocols", - "prototype", - "proud", - "proudly", - "prove", - "proved", - "proven", - "provide", - "provided", - "providence", - "provider", - "providers", - "provides", - "providing", - "province", - "provinces", - "provincial", - "provision", - "provisions", - "proxy", - "psychiatry", - "psychological", - "psychology", - "pub", - "public", - "publication", - "publications", - "publicity", - "publicly", - "publish", - "published", - "publisher", - "publishers", - "publishing", - "pubs", - "pull", - "pulled", - "pulling", - "pulse", - "pump", - "pumps", - "punch", - "punishment", - "punk", - "pupils", - "puppy", - "purchase", - "purchased", - "purchases", - "purchasing", - "pure", - "purple", - "purpose", - "purposes", - "purse", - "pursuant", - "pursue", - "pursuit", - "push", - "pushed", - "pushing", - "put", - "puts", - "putting", - "puzzle", - "puzzles", - "python", - "Qatar", - "qualification", - "qualifications", - "qualified", - "qualify", - "qualifying", - "qualities", - "quality", - "quantitative", - "quantities", - "quantity", - "quantum", - "quarter", - "quarterly", - "quarters", - "Quebec", - "queen", - "queens", - "Queensland", - "queries", - "query", - "quest", - "question", - "questionnaire", - "questions", - "queue", - "quick", - "quickly", - "quiet", - "quilt", - "quit", - "quite", - "quiz", - "quizzes", - "quotations", - "quote", - "quoted", - "quotes", - "rabbit", - "race", - "races", - "racing", - "rack", - "racks", - "radar", - "radiation", - "radical", - "radio", - "radios", - "radius", - "rage", - "raid", - "rail", - "railroad", - "railway", - "rain", - "rainbow", - "raise", - "raised", - "raises", - "raising", - "Raleigh", - "rally", - "ran", - "ranch", - "random", - "range", - "rangers", - "ranges", - "ranging", - "rank", - "ranked", - "ranking", - "rankings", - "ranks", - "rap", - "rapid", - "rapidly", - "rapids", - "rare", - "rarely", - "rat", - "rate", - "rated", - "rates", - "rather", - "rating", - "ratings", - "ratio", - "rational", - "ratios", - "rats", - "raw", - "ray", - "rays", - "reach", - "reached", - "reaches", - "reaching", - "reaction", - "reactions", - "read", - "reader", - "readers", - "readily", - "reading", - "readings", - "reads", - "ready", - "real", - "realistic", - "reality", - "realize", - "realized", - "really", - "realm", - "realtor", - "realtors", - "realty", - "rear", - "reason", - "reasonable", - "reasonably", - "reasoning", - "reasons", - "rebate", - "rebates", - "rebound", - "recall", - "receipt", - "receive", - "received", - "receiver", - "receivers", - "receives", - "receiving", - "recent", - "recently", - "reception", - "receptor", - "receptors", - "recipe", - "recipes", - "recipient", - "recipients", - "recognition", - "recognize", - "recognized", - "recommend", - "recommendation", - "recommendations", - "recommended", - "recommends", - "reconstruction", - "record", - "recorded", - "recorder", - "recorders", - "recording", - "recordings", - "records", - "recover", - "recovered", - "recovery", - "recreation", - "recreational", - "recruiting", - "recruitment", - "recycling", - "red", - "redeem", - "redhead", - "reduce", - "reduced", - "reduces", - "reducing", - "reduction", - "reductions", - "reed", - "reef", - "reel", - "refer", - "reference", - "referenced", - "references", - "referral", - "referrals", - "referred", - "referring", - "refers", - "refinance", - "refine", - "refined", - "reflect", - "reflected", - "reflection", - "reflections", - "reflects", - "reform", - "reforms", - "refresh", - "refrigerator", - "refugees", - "refund", - "refurbished", - "refuse", - "refused", - "regard", - "regarded", - "regarding", - "regardless", - "regards", - "reggae", - "region", - "regional", - "regions", - "register", - "registered", - "registrar", - "registration", - "registry", - "regression", - "regular", - "regularly", - "regulated", - "regulation", - "regulations", - "regulatory", - "rehab", - "rehabilitation", - "reject", - "rejected", - "relate", - "related", - "relates", - "relating", - "relation", - "relations", - "relationship", - "relationships", - "relative", - "relatively", - "relatives", - "relax", - "relaxation", - "relay", - "release", - "released", - "releases", - "relevance", - "relevant", - "reliability", - "reliable", - "reliance", - "relief", - "religion", - "religions", - "religious", - "reload", - "relocation", - "rely", - "relying", - "remain", - "remainder", - "remained", - "remaining", - "remains", - "remark", - "remarkable", - "remarks", - "remedies", - "remedy", - "remember", - "remembered", - "remind", - "reminder", - "remix", - "remote", - "removable", - "removal", - "remove", - "removed", - "removing", - "Renaissance", - "render", - "rendered", - "rendering", - "renew", - "renewable", - "renewal", - "rent", - "rental", - "rentals", - "repair", - "repairs", - "repeat", - "repeated", - "replace", - "replaced", - "replacement", - "replacing", - "replica", - "replication", - "replied", - "replies", - "reply", - "report", - "reported", - "reporter", - "reporters", - "reporting", - "reports", - "repository", - "represent", - "representation", - "representations", - "representative", - "representatives", - "represented", - "representing", - "represents", - "reprint", - "reprints", - "reproduce", - "reproduced", - "reproduction", - "reproductive", - "republic", - "Republican", - "Republicans", - "reputation", - "request", - "requested", - "requesting", - "requests", - "require", - "required", - "requirement", - "requirements", - "requires", - "requiring", - "rescue", - "research", - "researcher", - "researchers", - "reseller", - "reservation", - "reservations", - "reserve", - "reserved", - "reserves", - "reservoir", - "reset", - "residence", - "resident", - "residential", - "residents", - "resist", - "resistance", - "resistant", - "resolution", - "resolutions", - "resolve", - "resolved", - "resort", - "resorts", - "resource", - "resources", - "respect", - "respected", - "respective", - "respectively", - "respiratory", - "respond", - "responded", - "respondent", - "respondents", - "responding", - "response", - "responses", - "responsibilities", - "responsibility", - "responsible", - "rest", - "restaurant", - "restaurants", - "restoration", - "restore", - "restored", - "restrict", - "restricted", - "restriction", - "restrictions", - "restructuring", - "result", - "resulted", - "resulting", - "results", - "resume", - "resumes", - "retail", - "retailer", - "retailers", - "retain", - "retained", - "retention", - "retired", - "retirement", - "retreat", - "retrieval", - "retrieve", - "retrieved", - "retro", - "return", - "returned", - "returning", - "returns", - "reunion", - "reveal", - "revealed", - "reveals", - "revelation", - "revenge", - "revenue", - "revenues", - "reverse", - "review", - "reviewed", - "reviewer", - "reviewing", - "reviews", - "revised", - "revision", - "revisions", - "revolution", - "revolutionary", - "reward", - "rewards", - "rhythm", - "ribbon", - "rice", - "rich", - "rid", - "ride", - "rider", - "riders", - "rides", - "ridge", - "riding", - "right", - "rights", - "ring", - "rings", - "ringtone", - "ringtones", - "ripe", - "rise", - "rising", - "risk", - "risks", - "river", - "rivers", - "riverside", - "road", - "roads", - "rob", - "robot", - "robots", - "robust", - "rock", - "rocket", - "rocks", - "rocky", - "rod", - "role", - "roles", - "roll", - "rolled", - "roller", - "rolling", - "rolls", - "Roman", - "romance", - "Romania", - "romantic", - "Rome", - "roof", - "room", - "roommate", - "roommates", - "rooms", - "root", - "roots", - "rope", - "rose", - "roses", - "roster", - "rotary", - "rotation", - "rouge", - "rough", - "roughly", - "round", - "rounds", - "route", - "router", - "routers", - "routes", - "routine", - "routines", - "routing", - "rover", - "row", - "rows", - "royal", - "royalty", - "rubber", - "ruby", - "rug", - "rugby", - "rugs", - "rule", - "ruled", - "rules", - "ruling", - "run", - "runner", - "running", - "runs", - "runtime", - "rural", - "rush", - "Russia", - "Russian", - "ruth", - "Rwanda", - "sacred", - "sacrifice", - "sad", - "safari", - "safe", - "safely", - "safer", - "safety", - "sage", - "said", - "sail", - "sailing", - "saint", - "saints", - "sake", - "salad", - "salaries", - "salary", - "sale", - "sales", - "sally", - "salmon", - "salon", - "salt", - "salvation", - "samba", - "same", - "Samoa", - "sample", - "samples", - "sampling", - "sand", - "sandwich", - "santa", - "sap", - "sapphire", - "Saskatchewan", - "sat", - "satellite", - "satin", - "satisfaction", - "satisfactory", - "satisfied", - "satisfy", - "saturday", - "saturn", - "sauce", - "savage", - "savannah", - "save", - "saved", - "saver", - "saves", - "saving", - "savings", - "saw", - "say", - "saying", - "says", - "scale", - "scales", - "scan", - "scanned", - "scanner", - "scanners", - "scanning", - "scary", - "scenario", - "scenarios", - "scene", - "scenes", - "scenic", - "schedule", - "scheduled", - "schedules", - "scheduling", - "schema", - "scheme", - "schemes", - "scholar", - "scholars", - "scholarship", - "scholarships", - "school", - "schools", - "science", - "sciences", - "scientific", - "scientist", - "scientists", - "scoop", - "scope", - "score", - "scored", - "scores", - "scoring", - "Scotland", - "Scottish", - "scout", - "scratch", - "screen", - "screening", - "screens", - "screensaver", - "screensavers", - "screenshot", - "screenshots", - "screw", - "script", - "scripting", - "scripts", - "scroll", - "sculpture", - "sea", - "seafood", - "seal", - "sealed", - "search", - "searched", - "searching", - "seas", - "season", - "seasonal", - "seasons", - "seat", - "seating", - "seats", - "Seattle", - "second", - "secondary", - "seconds", - "secret", - "secretariat", - "secretary", - "secrets", - "section", - "sections", - "sector", - "sectors", - "secure", - "secured", - "securely", - "securities", - "security", - "see", - "seed", - "seeds", - "seeing", - "seek", - "seeker", - "seekers", - "seeking", - "seeks", - "seem", - "seemed", - "seems", - "seen", - "sees", - "segment", - "segments", - "select", - "selected", - "selecting", - "selection", - "selections", - "selective", - "self", - "sell", - "seller", - "sellers", - "selling", - "sells", - "semester", - "semi", - "semiconductor", - "seminar", - "seminars", - "senate", - "senator", - "senators", - "send", - "sender", - "sending", - "sends", - "Senegal", - "senior", - "seniors", - "sense", - "sensitive", - "sensitivity", - "sensor", - "sensors", - "sent", - "sentence", - "sentences", - "separate", - "separated", - "separately", - "separation", - "September", - "sequence", - "sequences", - "Serbia", - "serial", - "series", - "serious", - "seriously", - "serum", - "serve", - "served", - "server", - "servers", - "serves", - "service", - "services", - "serving", - "session", - "sessions", - "set", - "sets", - "setting", - "settings", - "settle", - "settled", - "settlement", - "setup", - "seven", - "seventh", - "several", - "severe", - "sewing", - "shade", - "shades", - "shadow", - "shadows", - "shaft", - "shake", - "shall", - "shame", - "Shanghai", - "Shannon", - "shape", - "shaped", - "shapes", - "share", - "shared", - "shareholders", - "shares", - "shareware", - "sharing", - "shark", - "sharp", - "shaved", - "shaw", - "she", - "shed", - "sheep", - "sheer", - "sheet", - "sheets", - "shelf", - "shell", - "shelter", - "shepherd", - "sheriff", - "shield", - "shift", - "shine", - "ship", - "shipment", - "shipments", - "shipped", - "shipping", - "ships", - "shirt", - "shirts", - "shock", - "shoe", - "shoes", - "shoot", - "shooting", - "shop", - "shopper", - "shoppers", - "shopping", - "shops", - "shore", - "short", - "shortcuts", - "shorter", - "shortly", - "shorts", - "shot", - "shots", - "should", - "shoulder", - "show", - "showcase", - "showed", - "shower", - "showers", - "showing", - "shown", - "shows", - "showtimes", - "shut", - "shuttle", - "sick", - "side", - "sides", - "sierra", - "sight", - "sigma", - "sign", - "signal", - "signals", - "signature", - "signatures", - "signed", - "significance", - "significant", - "significantly", - "signing", - "signs", - "signup", - "silence", - "silent", - "silicon", - "silk", - "silly", - "silver", - "sim", - "similar", - "similarly", - "simple", - "simplified", - "simply", - "simulation", - "simulations", - "simultaneously", - "sin", - "since", - "sing", - "Singapore", - "singer", - "singing", - "single", - "singles", - "sink", - "sip", - "sir", - "sister", - "sisters", - "sit", - "site", - "sites", - "sitting", - "situated", - "situation", - "situations", - "six", - "sixth", - "size", - "sized", - "sizes", - "skating", - "ski", - "skiing", - "skill", - "skilled", - "skills", - "skin", - "skins", - "skip", - "skirt", - "skirts", - "sky", - "sleep", - "sleeping", - "sleeps", - "sleeve", - "slide", - "slides", - "slight", - "slightly", - "slim", - "slip", - "slope", - "slot", - "slots", - "Slovak", - "Slovakia", - "Slovenia", - "slow", - "slowly", - "small", - "smaller", - "smart", - "smell", - "smile", - "smilies", - "smith", - "smoke", - "smoking", - "smooth", - "snake", - "snap", - "snapshot", - "snow", - "snowboard", - "so", - "soap", - "soccer", - "social", - "societies", - "society", - "sociology", - "socket", - "socks", - "sodium", - "sofa", - "soft", - "softball", - "software", - "soil", - "solar", - "sold", - "soldier", - "soldiers", - "sole", - "solely", - "solid", - "solo", - "solution", - "solutions", - "solve", - "solved", - "solving", - "Somalia", - "some", - "somebody", - "somehow", - "someone", - "Somerset", - "something", - "sometimes", - "somewhat", - "somewhere", - "son", - "song", - "songs", - "sonic", - "sons", - "soon", - "sophisticated", - "sorry", - "sort", - "sorted", - "sorts", - "sought", - "soul", - "souls", - "sound", - "sounds", - "soundtrack", - "soup", - "source", - "sources", - "south", - "southeast", - "southern", - "southwest", - "space", - "spaces", - "Spain", - "spam", - "span", - "Spanish", - "spare", - "spatial", - "speak", - "speaker", - "speakers", - "speaking", - "speaks", - "spears", - "special", - "specialist", - "specialists", - "specialized", - "specializing", - "specially", - "specials", - "specialties", - "specialty", - "species", - "specific", - "specifically", - "specification", - "specifications", - "specifics", - "specified", - "specifies", - "specify", - "spectacular", - "spectrum", - "speech", - "speeches", - "speed", - "speeds", - "spell", - "spelling", - "spend", - "spending", - "spent", - "sphere", - "spice", - "spider", - "spies", - "spin", - "spine", - "spirit", - "spirits", - "spiritual", - "spirituality", - "split", - "spoke", - "spoken", - "spokesman", - "sponsor", - "sponsored", - "sponsors", - "sponsorship", - "sport", - "sporting", - "sports", - "spot", - "spotlight", - "spots", - "spouse", - "spray", - "spread", - "spreading", - "spring", - "sprint", - "spy", - "spyware", - "squad", - "square", - "stability", - "stable", - "stack", - "stadium", - "staff", - "staffing", - "stage", - "stages", - "stainless", - "stakeholders", - "stamp", - "stamps", - "stan", - "stand", - "standard", - "standards", - "standing", - "stands", - "star", - "starring", - "stars", - "start", - "started", - "starter", - "starting", - "starts", - "startup", - "state", - "stated", - "statement", - "statements", - "states", - "statewide", - "static", - "stating", - "station", - "stationery", - "stations", - "statistical", - "statistics", - "stats", - "status", - "statute", - "statutes", - "statutory", - "stay", - "stayed", - "staying", - "stays", - "steady", - "steal", - "steam", - "steel", - "steering", - "stem", - "step", - "steps", - "stereo", - "stick", - "sticker", - "stickers", - "sticks", - "sticky", - "still", - "stock", - "Stockholm", - "stockings", - "stocks", - "stolen", - "stomach", - "stone", - "stones", - "stood", - "stop", - "stopped", - "stopping", - "stops", - "storage", - "store", - "stored", - "stores", - "stories", - "storm", - "story", - "straight", - "strain", - "strand", - "strange", - "stranger", - "strategic", - "strategies", - "strategy", - "stream", - "streaming", - "streams", - "street", - "streets", - "strength", - "strengthen", - "strengthening", - "strengths", - "stress", - "stretch", - "strict", - "strictly", - "strike", - "strikes", - "striking", - "string", - "strings", - "strip", - "stripes", - "strips", - "stroke", - "strong", - "stronger", - "strongly", - "struck", - "structural", - "structure", - "structured", - "structures", - "struggle", - "stuck", - "student", - "students", - "studied", - "studies", - "studio", - "studios", - "study", - "studying", - "stuff", - "stuffed", - "stunning", - "stupid", - "style", - "styles", - "stylish", - "subcommittee", - "subdivision", - "subject", - "subjects", - "sublime", - "submission", - "submissions", - "submit", - "submitted", - "submitting", - "subscribe", - "subscriber", - "subscribers", - "subscription", - "subscriptions", - "subsection", - "subsequent", - "subsequently", - "subsidiaries", - "subsidiary", - "substance", - "substances", - "substantial", - "substantially", - "substitute", - "subtle", - "suburban", - "succeed", - "success", - "successful", - "successfully", - "such", - "Sudan", - "sudden", - "suddenly", - "sue", - "suffer", - "suffered", - "suffering", - "sufficient", - "sufficiently", - "sugar", - "suggest", - "suggested", - "suggesting", - "suggestion", - "suggestions", - "suggests", - "suit", - "suitable", - "suite", - "suited", - "suites", - "suits", - "sum", - "summaries", - "summary", - "summer", - "summit", - "sun", - "Sunday", - "sunglasses", - "sunny", - "sunrise", - "sunset", - "sunshine", - "super", - "superb", - "superintendent", - "superior", - "supervision", - "supervisor", - "supervisors", - "supplement", - "supplemental", - "supplements", - "supplied", - "supplier", - "suppliers", - "supplies", - "supply", - "support", - "supported", - "supporters", - "supporting", - "supports", - "suppose", - "supposed", - "supreme", - "sure", - "surely", - "surf", - "surface", - "surfaces", - "surfing", - "surge", - "surgeon", - "surgeons", - "surgery", - "surgical", - "surname", - "surplus", - "surprise", - "surprised", - "surprising", - "surrey", - "surround", - "surrounded", - "surrounding", - "surveillance", - "survey", - "surveys", - "survival", - "survive", - "survivor", - "survivors", - "suspect", - "suspected", - "suspended", - "suspension", - "Sussex", - "sustainability", - "sustainable", - "sustained", - "swap", - "Sweden", - "Swedish", - "sweet", - "swift", - "swim", - "swimming", - "swing", - "swingers", - "Swiss", - "switch", - "switched", - "switches", - "switching", - "Switzerland", - "sword", - "Sydney", - "symbol", - "symbols", - "sympathy", - "symphony", - "symposium", - "symptoms", - "syndicate", - "syndication", - "syndrome", - "synopsis", - "syntax", - "synthesis", - "synthetic", - "Syria", - "system", - "systematic", - "systems", - "tab", - "table", - "tables", - "tablet", - "tablets", - "tabs", - "tackle", - "tactics", - "tag", - "tagged", - "tags", - "tail", - "Taiwan", - "take", - "taken", - "takes", - "taking", - "tale", - "talent", - "talented", - "tales", - "talk", - "talked", - "talking", - "talks", - "tall", - "Tamil", - "tan", - "tank", - "tanks", - "Tanzania", - "tap", - "tape", - "tapes", - "tar", - "target", - "targeted", - "targets", - "tariff", - "task", - "tasks", - "taste", - "tattoo", - "taught", - "tax", - "taxation", - "taxes", - "taxi", - "tea", - "teach", - "teacher", - "teachers", - "teaches", - "teaching", - "team", - "teams", - "tear", - "tears", - "tech", - "technical", - "technician", - "technique", - "techniques", - "techno", - "technological", - "technologies", - "technology", - "techrepublic", - "tee", - "teen", - "teenage", - "teens", - "teeth", - "telecommunications", - "telephone", - "telephony", - "telescope", - "television", - "televisions", - "tell", - "telling", - "tells", - "temperature", - "temperatures", - "template", - "templates", - "temple", - "temporal", - "temporarily", - "temporary", - "ten", - "tenant", - "tend", - "tender", - "Tennessee", - "tennis", - "tension", - "tent", - "term", - "terminal", - "terminals", - "termination", - "terminology", - "terms", - "terrace", - "terrain", - "terrible", - "territories", - "territory", - "terror", - "terrorism", - "terrorist", - "terrorists", - "test", - "testament", - "tested", - "testimonials", - "testimony", - "testing", - "tests", - "tex", - "Texas", - "text", - "textbook", - "textbooks", - "textile", - "textiles", - "texts", - "texture", - "Thai", - "Thailand", - "than", - "thank", - "thanks", - "Thanksgiving", - "that", "the", - "theater", - "theft", - "their", - "them", - "theme", - "themes", - "themselves", - "then", - "theology", - "theorem", - "theoretical", - "theories", - "theory", - "therapeutic", - "therapist", - "therapy", - "there", - "thereafter", - "thereby", - "therefore", - "thereof", - "thermal", - "thesaurus", - "these", - "thesis", - "they", - "thick", - "thickness", - "thin", - "thing", - "things", - "think", - "thinking", - "thinks", - "third", - "thirty", + "of", + "and", + "a", + "in", + "for", + "is", + "on", + "that", + "by", "this", - "thong", - "thongs", - "thorough", - "thoroughly", - "those", - "though", - "thought", - "thoughts", - "thousand", - "thousands", - "thread", - "threaded", - "threads", - "three", - "threshold", - "thriller", - "throat", - "through", - "throughout", - "throw", - "throwing", - "thrown", - "throws", - "thumb", - "thumbnail", - "thumbnails", - "thumbs", - "thunder", - "Thursday", - "thus", - "ticket", - "tickets", - "tide", - "tie", - "tied", - "tier", - "ties", - "tiger", - "tigers", - "tight", - "tile", - "tiles", - "timber", - "time", - "timeline", - "timely", - "timer", - "times", - "timing", - "tin", - "tiny", - "tion", - "tips", - "tire", - "tired", - "tires", - "tissue", - "titanium", - "titans", - "title", - "titled", - "titles", - "tobacco", - "today", - "toddler", - "toe", - "together", - "toilet", - "token", - "Tokyo", - "told", - "tolerance", - "toll", - "tomato", - "tomatoes", - "tomorrow", - "ton", - "tone", - "toner", - "tones", - "tongue", - "tonight", - "tons", - "too", - "took", - "tool", - "toolbar", - "toolbox", - "toolkit", - "tools", - "tooth", - "top", - "topic", - "topics", - "tops", - "Toronto", - "total", - "totally", - "touch", - "touched", - "tough", - "tour", - "touring", - "tourism", - "tourist", - "tournament", - "tournaments", - "tours", - "toward", - "towards", - "tower", - "towers", - "town", - "towns", - "township", - "toxic", - "toy", - "toys", - "trace", - "track", - "trackback", - "trackbacks", - "tracked", - "tracker", - "tracking", - "tracks", - "tract", - "tractor", - "trade", - "trademark", - "trademarks", - "trader", - "trades", - "trading", - "tradition", - "traditional", - "traditions", - "traffic", - "tragedy", - "trail", - "trailer", - "trailers", - "trails", - "train", - "trained", - "trainer", - "trainers", - "training", - "trains", - "tramadol", - "trance", - "transaction", - "transactions", - "transcript", - "transcription", - "transcripts", - "transfer", - "transferred", - "transfers", - "transform", - "transformation", - "transit", - "transition", - "translate", - "translated", - "translation", - "translations", - "translator", - "transmission", - "transmit", - "transmitted", - "transparency", - "transparent", - "transport", - "transportation", - "trap", - "trash", - "travel", - "traveler", - "travelers", - "traveling", - "travels", - "tray", - "treasure", - "treasurer", - "treasures", - "treasury", - "treat", - "treated", - "treating", - "treatment", - "treatments", - "treaty", - "tree", - "trees", - "trek", - "tremendous", - "trend", - "trends", - "trial", - "trials", - "triangle", - "tribal", - "tribe", - "tribes", - "tribunal", - "tribune", - "tribute", - "trick", - "tricks", - "tried", - "tries", - "trigger", - "trim", - "trio", - "trip", - "triple", - "trips", - "triumph", - "trivia", - "troops", - "tropical", - "trouble", - "troubleshooting", - "trout", - "truck", - "trucks", - "true", - "truly", - "trunk", - "trust", - "trusted", - "trustee", - "trustees", - "trusts", - "truth", - "try", - "trying", - "tsunami", - "tub", - "tube", - "tubes", - "Tuesday", - "tuition", - "tune", - "tuner", - "tunes", - "tuning", - "Tunisia", - "tunnel", - "turbo", - "Turkey", - "Turkish", - "turn", - "turned", - "turner", - "turning", - "turns", - "turtle", - "tutorial", - "tutorials", - "twelve", - "twenty", - "twice", - "twin", - "twins", - "twist", - "twisted", - "two", - "type", - "types", - "typical", - "typically", - "typing", - "Uganda", - "ugly", - "Ukraine", - "ultimate", - "ultimately", - "ultra", - "unable", - "unauthorized", - "unavailable", - "uncertainty", - "uncle", - "undefined", - "under", - "undergraduate", - "underground", - "underlying", - "understand", - "understanding", - "understood", - "undertake", - "undertaken", - "underwear", - "undo", - "unemployment", - "unexpected", - "unfortunately", - "unified", - "uniform", - "union", - "unions", - "unique", - "unit", - "united", - "units", - "unity", - "universal", - "universe", - "universities", - "university", - "unknown", - "unless", - "unlike", - "unlikely", - "unlimited", - "unlock", - "unnecessary", - "unsigned", - "unsubscribe", - "until", - "untitled", - "unusual", - "unwrap", - "up", - "upcoming", - "update", - "updated", - "updates", - "updating", - "upgrade", - "upgrades", - "upgrading", - "upload", - "uploaded", - "upon", - "upper", - "upset", - "urban", - "urge", - "urgent", - "Uruguay", - "usage", - "use", - "used", - "useful", - "user", - "username", - "users", - "uses", - "using", - "usual", - "usually", - "utilities", - "utility", - "utilization", - "utilize", - "Uzbekistan", - "vacancies", - "vacation", - "vacations", - "vaccine", - "vacuum", - "valentine", - "valid", - "validation", - "validity", - "valley", - "valuable", - "valuation", - "value", - "valued", - "values", - "valve", - "valves", - "vampire", - "van", - "Vancouver", - "vanilla", - "variable", - "variables", - "variance", - "variation", - "variations", - "varied", - "varies", - "variety", - "various", - "vary", - "varying", - "vast", - "vat", - "Vatican", - "vault", - "vector", - "vegetable", - "vegetables", - "vegetarian", - "vegetation", - "vehicle", - "vehicles", - "velocity", - "velvet", - "vendor", - "vendors", - "Venezuela", - "Venice", - "venture", - "ventures", - "venue", - "venues", - "verbal", - "verification", - "verified", - "verify", - "Vermont", - "verse", - "version", - "versions", - "versus", - "vertex", - "vertical", - "very", - "vessel", - "vessels", - "veteran", - "veterans", - "veterinary", - "via", - "vice", - "victim", - "victims", - "victor", - "Victoria", - "Victorian", - "victory", - "video", - "videos", - "Vienna", - "Vietnam", - "Vietnamese", - "view", - "viewed", - "viewer", - "viewers", - "viewing", - "views", - "viking", - "villa", - "village", - "villages", - "villas", - "vintage", - "vinyl", - "violation", - "violations", - "violence", - "violent", - "violin", - "viral", - "virgin", - "Virginia", - "virtual", - "virtually", - "virtue", - "virus", - "viruses", - "visa", - "visibility", - "visible", - "vision", - "visit", - "visited", - "visiting", - "visitor", - "visitors", - "visits", - "vista", - "visual", - "vital", - "vitamin", - "vitamins", - "vocabulary", - "vocal", - "vocals", - "vocational", - "voice", - "voices", - "void", - "volleyball", - "volt", - "voltage", - "volume", - "volumes", - "voluntary", - "volunteer", - "volunteers", - "vote", - "voted", - "voters", - "votes", - "voting", - "vulnerability", - "vulnerable", - "wage", - "wages", - "wagon", - "wait", - "waiting", - "waiver", - "wake", - "Wales", - "walk", - "walked", - "walker", - "walking", - "walks", - "wall", - "wallet", - "wallpaper", - "wallpapers", - "walls", - "walnut", - "wan", - "want", - "wanted", - "wanting", - "wants", - "ward", - "ware", - "warehouse", - "warm", - "warming", - "warned", - "warning", - "warnings", - "warrant", - "warranties", - "warranty", - "warren", - "warrior", - "warriors", - "wars", - "was", - "wash", - "washer", - "washing", - "Washington", - "waste", - "watch", - "watched", - "watches", - "watching", - "water", - "waterproof", - "waters", - "watershed", - "watt", - "watts", - "wave", - "waves", - "wax", - "way", - "ways", - "we", - "weak", - "wealth", - "wear", - "wearing", - "weather", - "web", - "webcam", - "webcams", - "webcast", - "weblog", - "weblogs", - "webmaster", - "webmasters", - "webpage", - "website", - "websites", - "wed", - "wedding", - "weddings", - "Wednesday", - "week", - "weekend", - "weekends", - "weekly", - "weeks", - "weight", - "weighted", - "weights", - "weird", - "welcome", - "welding", - "welfare", - "well", - "Wellington", - "wellness", - "wells", - "Welsh", - "went", - "were", - "west", - "western", - "wet", - "whale", - "what", - "whatever", - "wheat", - "wheel", - "wheels", - "when", - "whenever", - "where", - "whereas", - "wherever", - "whether", - "which", - "while", - "whilst", - "white", - "who", - "whole", - "wholesale", - "whom", - "whose", - "why", - "wicked", - "wide", - "widely", - "wider", - "widescreen", - "widespread", - "width", - "wife", - "wifi", - "wild", - "wilderness", - "wildlife", - "will", - "willing", - "willow", - "win", - "wind", - "window", - "windows", - "Windsor", - "wine", - "wines", - "wing", - "wings", - "winner", - "winners", - "winning", - "wins", - "winter", - "wire", - "wired", - "wireless", - "wires", - "wiring", - "Wisconsin", - "wisdom", - "wise", - "wish", - "wishes", - "wit", - "witch", "with", - "withdrawal", - "within", - "without", - "witness", - "witnesses", - "wives", - "wizard", - "wolf", - "woman", - "women", - "won", - "wonder", - "wonderful", - "wondering", - "wood", - "wooden", - "woods", - "wool", - "word", - "words", - "work", - "worked", - "worker", - "workers", - "workflow", - "workforce", - "working", - "workout", - "workplace", - "works", - "workshop", - "workshops", - "workstation", - "world", - "worlds", - "worldwide", - "worm", - "worn", - "worried", - "worry", - "worse", - "worship", - "worst", - "worth", - "worthy", - "would", - "wound", - "wow", - "wrap", - "wrapped", - "wrapping", - "wrestling", - "wright", - "wrist", - "write", - "writer", - "writers", - "writes", - "writing", - "writings", - "written", - "wrong", - "wrote", - "yacht", - "yang", - "yard", - "yards", - "yarn", - "year", - "yearly", - "years", - "yeast", - "yellow", - "Yemen", - "yen", - "yes", - "yesterday", - "yet", - "yield", - "yields", - "yoga", + "I", "you", - "young", - "younger", + "it", + "not", + "or", + "be", + "are", + "from", + "at", + "as", "your", - "yours", - "yourself", - "youth", - "Yugoslavia", - "Yukon", - "Zambia", - "zen", - "zero", - "Zimbabwe", - "zinc", + "all", + "have", + "new", + "more", + "an", + "was", + "we", + "will", + "home", + "can", + "about", + "if", + "page", + "has", + "search", + "free", + "but", + "our", + "one", + "other", + "do", + "no", + "information", + "time", + "they", + "site", + "he", + "up", + "may", + "what", + "which", + "their", + "news", + "out", + "use", + "any", + "there", + "see", + "only", + "so", + "his", + "when", + "contact", + "here", + "business", + "who", + "web", + "also", + "now", + "help", + "get", + "view", + "online", + "first", + "am", + "been", + "would", + "how", + "were", + "me", + "services", + "some", + "these", + "click", + "its", + "like", + "service", + "than", + "find", + "price", + "date", + "back", + "top", + "people", + "had", + "list", + "name", + "just", + "over", + "state", + "year", + "day", + "into", + "email", + "two", + "health", + "world", + "next", + "used", + "go", + "work", + "last", + "most", + "products", + "music", + "buy", + "data", + "make", + "them", + "should", + "product", + "system", + "post", + "her", + "city", + "add", + "policy", + "number", + "such", + "please", + "available", + "copyright", + "support", + "message", + "after", + "best", + "software", + "then", + "good", + "video", + "well", + "where", + "info", + "rights", + "public", + "books", + "high", + "school", + "through", + "each", + "links", + "she", + "review", + "years", + "order", + "very", + "privacy", + "book", + "items", + "company", + "read", + "group", + "need", + "many", + "user", + "said", + "does", + "set", + "under", + "general", + "research", + "university", + "January", + "mail", + "full", + "map", + "reviews", + "program", + "life", + "know", + "games", + "way", + "days", + "management", + "part", + "could", + "great", + "united", + "hotel", + "real", + "item", + "international", + "center", + "must", + "store", + "travel", + "comments", + "made", + "development", + "report", + "off", + "member", + "details", + "line", + "terms", + "before", + "hotels", + "did", + "send", + "right", + "type", + "because", + "local", + "those", + "using", + "results", + "office", + "education", + "national", + "car", + "design", + "take", + "posted", + "internet", + "address", + "community", + "within", + "states", + "area", + "want", + "phone", + "shipping", + "reserved", + "subject", + "between", + "forum", + "family", + "long", + "based", + "code", + "show", + "even", + "black", + "check", + "special", + "prices", + "website", + "index", + "being", + "women", + "much", + "sign", + "file", + "link", + "open", + "today", + "technology", + "south", + "case", + "project", + "same", + "pages", + "version", + "section", + "own", + "found", + "sports", + "house", + "related", + "security", + "both", + "county", + "American", + "photo", + "game", + "members", + "power", + "while", + "care", + "network", + "down", + "computer", + "systems", + "three", + "total", + "place", + "end", + "following", + "download", + "him", + "without", + "per", + "access", + "think", + "north", + "resources", + "current", + "posts", + "big", + "media", + "law", + "control", + "water", + "history", + "pictures", + "size", + "art", + "personal", + "since", + "including", + "guide", + "shop", + "directory", + "board", + "location", + "change", + "white", + "text", + "small", + "rating", + "rate", + "government", + "children", + "during", + "return", + "students", + "shopping", + "account", + "times", + "sites", + "level", + "digital", + "profile", + "previous", + "form", + "events", + "love", + "old", + "main", + "call", + "hours", + "image", + "department", + "title", + "description", + "insurance", + "another", + "why", + "shall", + "property", + "class", + "still", + "money", + "quality", + "every", + "listing", + "content", + "country", + "private", + "little", + "visit", + "save", + "tools", + "low", + "reply", + "customer", + "December", + "compare", + "movies", + "include", + "college", + "value", + "article", + "man", + "card", + "jobs", + "provide", + "food", + "source", + "author", + "different", + "press", + "learn", + "sale", + "around", + "print", + "course", + "job", + "Canada", + "process", + "teen", + "room", + "stock", + "training", + "too", + "credit", + "point", + "join", + "science", + "men", + "categories", + "advanced", + "west", + "sales", + "look", + "English", + "left", + "team", + "estate", + "box", + "conditions", + "select", + "windows", + "photos", + "gay", + "thread", + "week", + "category", + "note", + "live", + "large", + "gallery", + "table", + "register", + "however", + "June", + "October", + "November", + "market", + "library", + "really", + "action", + "start", + "series", + "model", + "features", + "air", + "industry", + "plan", + "human", + "provided", + "yes", + "required", + "second", + "hot", + "accessories", + "cost", + "movie", + "forums", + "march", + "September", + "better", + "say", + "questions", + "July", + "going", + "medical", + "test", + "friend", + "come", + "server", + "study", + "application", + "cart", + "staff", + "articles", + "feedback", + "again", + "play", + "looking", + "issues", + "April", + "never", + "users", + "complete", + "street", + "topic", + "comment", + "financial", + "things", + "working", + "against", + "standard", + "tax", + "person", + "below", + "mobile", + "less", + "got", + "blog", + "party", + "payment", + "equipment", + "login", + "student", + "let", + "programs", + "offers", + "legal", + "above", + "recent", + "park", + "stores", + "side", + "act", + "problem", + "red", + "give", + "memory", + "performance", + "social", + "August", + "quote", + "language", + "story", + "sell", + "options", + "experience", + "rates", + "create", + "key", + "body", + "young", + "America", + "important", + "field", + "few", + "east", + "paper", + "single", + "age", + "activities", + "club", + "example", + "girls", + "additional", + "password", + "latest", + "something", + "road", + "gift", + "question", + "changes", + "night", + "hard", + "Texas", + "pay", + "four", + "poker", + "status", + "browse", + "issue", + "range", + "building", + "seller", + "court", + "February", + "always", + "result", + "audio", + "light", + "write", + "offer", + "blue", + "groups", + "easy", + "given", + "files", + "event", + "release", + "analysis", + "request", + "fax", + "China", + "making", + "picture", + "needs", + "possible", + "might", + "professional", + "yet", + "month", + "major", + "star", + "areas", + "future", + "space", + "committee", + "hand", + "sun", + "cards", + "problems", + "London", + "Washington", + "meeting", + "become", + "interest", + "child", + "keep", + "enter", + "California", + "share", + "similar", + "garden", + "schools", + "million", + "added", + "reference", + "companies", + "listed", + "baby", + "learning", + "energy", + "run", + "delivery", + "net", + "popular", + "term", + "film", + "stories", + "put", + "computers", + "journal", + "reports", + "try", + "welcome", + "central", + "images", + "president", + "notice", + "god", + "original", + "head", + "radio", + "until", + "cell", + "color", + "self", + "council", + "away", + "includes", + "track", + "Australia", + "discussion", + "archive", + "once", + "others", + "entertainment", + "agreement", + "format", + "least", + "society", + "months", + "log", + "safety", + "friends", + "sure", + "trade", + "edition", + "cars", + "messages", + "marketing", + "tell", + "further", + "updated", + "association", + "able", + "having", + "provides", + "fun", + "already", + "green", + "studies", + "close", + "common", + "drive", + "specific", + "several", + "gold", + "living", + "collection", + "called", + "short", + "arts", + "lot", + "ask", + "display", + "limited", + "powered", + "solutions", + "means", + "director", + "daily", + "beach", + "past", + "natural", + "whether", + "due", + "electronics", + "five", + "upon", + "period", + "planning", + "database", + "says", + "official", + "weather", + "mar", + "land", + "average", + "done", + "technical", + "window", + "France", + "pro", + "region", + "island", + "record", + "direct", + "microsoft", + "conference", + "environment", + "records", + "district", + "calendar", + "costs", + "style", + "front", + "statement", + "update", + "parts", + "ever", + "downloads", + "early", + "miles", + "sound", + "resource", + "present", + "applications", + "either", + "ago", + "document", + "word", + "works", + "material", + "bill", + "written", + "talk", + "federal", + "hosting", + "rules", + "final", + "adult", + "tickets", + "thing", + "requirements", + "via", + "cheap", + "kids", + "finance", + "true", + "minutes", + "else", + "mark", + "third", + "rock", + "gifts", + "Europe", + "reading", + "topics", + "bad", + "individual", + "tips", + "plus", + "auto", + "cover", + "usually", + "edit", + "together", + "videos", + "percent", + "fast", + "function", + "fact", + "unit", + "getting", + "global", + "tech", + "meet", + "far", + "economic", + "player", + "projects", + "lyrics", + "often", + "subscribe", + "submit", + "Germany", + "amount", + "watch", + "included", + "feel", + "though", + "bank", + "risk", + "thanks", + "everything", + "deals", + "various", + "words", + "production", + "commercial", + "weight", + "town", + "heart", + "advertising", + "received", + "choose", + "treatment", + "newsletter", + "archives", + "points", + "knowledge", + "magazine", + "error", + "camera", + "girl", + "currently", + "construction", + "toys", + "registered", + "clear", + "golf", + "receive", + "domain", + "methods", + "chapter", + "makes", + "protection", + "policies", + "loan", + "wide", + "beauty", + "manager", + "India", + "position", + "taken", + "sort", + "listings", + "models", + "known", + "half", + "cases", + "step", + "engineering", + "Florida", + "simple", + "quick", + "none", + "wireless", + "license", + "Friday", + "lake", + "whole", + "annual", + "published", + "later", + "basic", + "shows", + "corporate", + "church", + "method", + "purchase", + "customers", + "active", + "response", + "practice", + "hardware", + "figure", + "materials", + "fire", + "holiday", + "chat", + "enough", + "designed", + "along", + "among", + "death", + "writing", + "speed", + "countries", + "loss", + "face", + "brand", + "discount", + "higher", + "effects", + "created", + "remember", + "standards", + "oil", + "bit", + "yellow", + "political", + "increase", + "advertise", + "kingdom", + "base", + "near", + "environmental", + "thought", + "stuff", + "French", + "storage", + "Japan", + "doing", + "loans", + "shoes", + "entry", + "stay", + "nature", + "orders", + "availability", + "Africa", + "summary", + "turn", + "mean", + "growth", + "notes", + "agency", + "king", + "Monday", + "European", + "activity", + "copy", + "although", + "drug", + "pics", + "western", + "income", + "force", + "cash", + "employment", + "overall", + "bay", + "river", + "commission", + "ad", + "package", + "contents", + "seen", + "players", + "engine", + "port", + "album", + "regional", + "stop", + "supplies", + "started", + "administration", + "bar", + "institute", + "views", + "plans", + "double", + "dog", + "build", + "screen", + "exchange", + "types", + "soon", + "sponsored", + "lines", + "electronic", + "continue", + "across", + "benefits", + "needed", + "season", + "apply", + "someone", + "held", + "anything", + "printer", + "condition", + "effective", + "believe", + "organization", + "effect", + "asked", + "mind", + "Sunday", + "selection", + "casino", + "lost", + "tour", + "menu", + "volume", + "cross", + "anyone", + "mortgage", + "hope", + "silver", + "corporation", + "wish", + "inside", + "solution", + "mature", + "role", + "rather", + "weeks", + "addition", + "came", + "supply", + "nothing", + "certain", + "executive", + "running", + "lower", + "necessary", + "union", + "jewelry", + "according", + "clothing", + "particular", + "fine", + "names", + "homepage", + "hour", + "gas", + "skills", + "six", + "bush", + "islands", + "advice", + "career", + "military", + "rental", + "decision", + "leave", + "British", + "teens", + "huge", + "sat", + "woman", + "facilities", "zip", + "bid", + "kind", + "sellers", + "middle", + "move", + "cable", + "opportunities", + "taking", + "values", + "division", + "coming", + "Tuesday", + "object", + "appropriate", + "machine", + "logo", + "length", + "actually", + "nice", + "score", + "statistics", + "client", + "returns", + "capital", + "follow", + "sample", + "investment", + "sent", + "shown", + "saturday", + "Christmas", + "England", + "culture", + "band", + "flash", + "lead", + "choice", + "went", + "starting", + "registration", + "Thursday", + "courses", + "consumer", + "hi", + "airport", + "foreign", + "artist", + "outside", + "furniture", + "levels", + "channel", + "letter", + "mode", + "phones", + "ideas", + "Wednesday", + "structure", + "fund", + "summer", + "allow", + "degree", + "contract", + "button", + "releases", + "wed", + "homes", + "super", + "male", + "matter", + "custom", + "Virginia", + "almost", + "took", + "located", + "multiple", + "Asian", + "distribution", + "editor", + "inn", + "industrial", + "cause", + "potential", + "song", + "focus", + "late", + "fall", + "featured", + "idea", + "rooms", + "female", + "responsible", + "communications", + "win", + "associated", + "primary", + "cancer", + "numbers", + "reason", + "tool", + "browser", + "spring", + "foundation", + "answer", + "voice", + "friendly", + "schedule", + "documents", + "communication", + "purpose", + "feature", + "bed", + "comes", + "police", + "everyone", + "independent", + "approach", + "cameras", + "brown", + "physical", + "operating", + "hill", + "maps", + "medicine", + "deal", + "hold", + "ratings", + "Chicago", + "forms", + "glass", + "happy", + "smith", + "wanted", + "developed", + "thank", + "safe", + "unique", + "survey", + "prior", + "telephone", + "sport", + "ready", + "feed", + "animal", + "sources", + "Mexico", + "population", + "regular", + "secure", + "navigation", + "operations", + "therefore", + "simply", + "evidence", + "station", + "christian", + "round", + "favorite", + "understand", + "option", + "master", + "valley", + "recently", + "probably", + "rentals", + "sea", + "built", + "publications", + "blood", + "cut", + "worldwide", + "improve", + "connection", + "publisher", + "hall", + "larger", + "networks", + "earth", + "parents", + "impact", + "transfer", + "introduction", + "kitchen", + "strong", + "wedding", + "properties", + "hospital", + "ground", + "overview", + "ship", + "accommodation", + "owners", + "disease", + "excellent", + "paid", + "Italy", + "perfect", + "hair", + "opportunity", + "kit", + "classic", + "basis", + "command", + "cities", + "express", + "award", + "distance", + "tree", + "assessment", + "ensure", + "thus", + "wall", + "involved", + "extra", + "especially", + "interface", + "partners", + "budget", + "rated", + "guides", + "success", + "maximum", + "operation", + "existing", + "quite", + "selected", + "boy", + "patients", + "restaurants", + "beautiful", + "warning", + "wine", + "locations", + "horse", + "vote", + "forward", + "flowers", + "stars", + "significant", + "lists", + "technologies", + "owner", + "retail", + "animals", + "useful", + "directly", + "manufacturer", + "ways", + "son", + "providing", + "rule", + "housing", + "takes", + "bring", + "catalog", + "trying", + "mother", + "authority", + "considered", + "told", + "traffic", + "joined", + "input", + "strategy", + "feet", + "agent", + "valid", + "bin", + "modern", + "senior", + "Ireland", + "teaching", + "door", + "grand", + "testing", + "trial", + "charge", + "units", + "instead", + "Canadian", + "cool", + "normal", + "wrote", + "enterprise", + "ships", + "entire", + "educational", + "leading", + "metal", + "positive", + "fitness", + "Chinese", + "opinion", + "Asia", + "football", + "abstract", + "uses", + "output", + "funds", + "greater", + "likely", + "develop", + "employees", + "artists", + "alternative", + "processing", + "responsibility", + "resolution", + "guest", + "seems", + "publication", + "pass", + "relations", + "trust", + "van", + "contains", + "session", + "multi", + "photography", + "republic", + "fees", + "components", + "vacation", + "century", + "academic", + "assistance", + "completed", + "skin", + "graphics", + "Indian", + "ads", + "expected", + "ring", + "grade", + "dating", + "Pacific", + "mountain", + "organizations", + "pop", + "filter", + "mailing", + "vehicle", + "longer", + "consider", + "northern", + "behind", + "panel", + "floor", + "German", + "buying", + "match", + "proposed", + "default", + "require", + "Iraq", + "boys", + "outdoor", + "deep", + "morning", + "otherwise", + "allows", + "rest", + "protein", + "plant", + "reported", + "hit", + "transportation", + "pool", + "politics", + "partner", + "disclaimer", + "authors", + "boards", + "faculty", + "parties", + "fish", + "membership", + "mission", + "eye", + "string", + "sense", + "modified", + "pack", + "released", + "stage", + "internal", + "goods", + "recommended", + "born", + "unless", + "detailed", + "Japanese", + "race", + "approved", + "background", + "target", + "except", + "character", + "maintenance", + "ability", + "maybe", + "functions", + "moving", + "brands", + "places", + "pretty", + "trademarks", + "Spain", + "southern", + "yourself", + "winter", + "battery", + "youth", + "pressure", + "submitted", + "Boston", + "debt", + "keywords", + "medium", + "television", + "interested", + "core", + "break", + "purposes", + "throughout", + "sets", + "dance", + "wood", + "itself", + "defined", + "papers", + "playing", + "awards", + "fee", + "studio", + "reader", + "virtual", + "device", + "established", + "answers", + "rent", + "remote", + "dark", + "programming", + "external", + "apple", + "regarding", + "instructions", + "offered", + "theory", + "enjoy", + "remove", + "aid", + "surface", + "minimum", + "visual", + "host", + "variety", + "teachers", + "manual", + "block", + "subjects", + "agents", + "increased", + "repair", + "fair", + "civil", + "steel", + "understanding", + "songs", + "fixed", + "wrong", + "beginning", + "hands", + "associates", + "finally", + "updates", + "desktop", + "classes", + "Paris", + "Ohio", + "gets", + "sector", + "capacity", + "requires", + "jersey", + "fat", + "fully", + "father", + "electric", + "saw", + "instruments", + "quotes", + "officer", + "driver", + "businesses", + "dead", + "respect", + "unknown", + "specified", + "restaurant", + "trip", + "worth", + "procedures", + "poor", + "teacher", + "eyes", + "relationship", + "workers", + "farm", + "peace", + "traditional", + "campus", + "showing", + "creative", + "coast", + "benefit", + "progress", + "funding", + "devices", + "lord", + "grant", + "agree", + "fiction", + "hear", + "sometimes", + "watches", + "careers", + "beyond", + "goes", + "families", + "led", + "museum", + "themselves", + "fan", + "transport", + "interesting", + "blogs", + "wife", + "evaluation", + "accepted", + "former", + "implementation", + "ten", + "hits", "zone", - "zones", - "zoning", - "zoo", + "complex", + "cat", + "galleries", + "references", + "die", + "presented", + "flat", + "flow", + "agencies", + "literature", + "respective", + "parent", + "Spanish", + "Michigan", + "Columbia", + "setting", + "scale", + "stand", + "economy", + "highest", + "helpful", + "monthly", + "critical", + "frame", + "musical", + "definition", + "secretary", + "networking", + "path", + "Australian", + "employee", + "chief", + "gives", + "bottom", + "magazines", + "packages", + "detail", + "laws", + "changed", + "pet", + "heard", + "begin", + "individuals", + "Colorado", + "royal", + "clean", + "switch", + "Russian", + "largest", + "African", + "guy", + "titles", + "relevant", + "guidelines", + "justice", + "connect", + "bible", + "cup", + "basket", + "applied", + "weekly", + "installation", + "described", + "demand", + "suite", + "square", + "attention", + "advance", + "skip", + "diet", + "army", + "auction", + "gear", + "lee", + "difference", + "allowed", + "correct", + "nation", + "selling", + "lots", + "piece", + "sheet", + "firm", + "seven", + "older", + "Illinois", + "regulations", + "elements", + "species", + "jump", + "cells", + "module", + "resort", + "facility", + "random", + "pricing", + "certificate", + "minister", + "motion", + "looks", + "fashion", + "directions", + "visitors", + "documentation", + "monitor", + "trading", + "forest", + "calls", + "whose", + "coverage", + "couple", + "giving", + "chance", + "vision", + "ball", + "ending", + "clients", + "actions", + "listen", + "discuss", + "accept", + "automotive", + "goal", + "successful", + "sold", + "wind", + "communities", + "clinical", + "situation", + "sciences", + "markets", + "lowest", + "highly", + "publishing", + "appear", + "emergency", + "developing", + "lives", + "currency", + "leather", + "determine", + "temperature", + "palm", + "announcements", + "patient", + "actual", + "historical", + "stone", + "commerce", + "ringtones", + "perhaps", + "persons", + "difficult", + "scientific", + "satellite", + "fit", + "tests", + "village", + "accounts", + "amateur", + "met", + "pain", + "particularly", + "factors", + "coffee", + "settings", + "buyer", + "cultural", + "easily", + "oral", + "ford", + "poster", + "edge", + "functional", + "root", + "closed", + "holidays", + "ice", + "pink", + "balance", + "monitoring", + "graduate", + "replies", + "shot", + "architecture", + "initial", + "label", + "thinking", + "recommend", + "hardcore", + "league", + "waste", + "minute", + "bus", + "provider", + "optional", + "dictionary", + "cold", + "accounting", + "manufacturing", + "sections", + "chair", + "fishing", + "effort", + "phase", + "fields", + "bag", + "fantasy", + "letters", + "motor", + "professor", + "context", + "install", + "shirt", + "apparel", + "generally", + "continued", + "foot", + "mass", + "crime", + "count", + "techniques", + "quickly", + "dollars", + "websites", + "religion", + "claim", + "driving", + "permission", + "surgery", + "patch", + "heat", + "wild", + "measures", + "generation", + "Kansas", + "miss", + "chemical", + "doctor", + "task", + "reduce", + "brought", + "himself", + "nor", + "component", + "enable", + "exercise", + "bug", + "santa", + "guarantee", + "leader", + "diamond", + "Israel", + "processes", + "soft", + "servers", + "alone", + "meetings", + "seconds", + "Arizona", + "keyword", + "interests", + "flight", + "Congress", + "fuel", + "username", + "walk", + "produced", + "Italian", + "paperback", + "wait", + "supported", + "pocket", + "saint", + "rose", + "freedom", + "argument", + "competition", + "creating", + "drugs", + "joint", + "premium", + "providers", + "fresh", + "characters", + "attorney", + "upgrade", + "factor", + "growing", + "thousands", + "stream", + "apartments", + "pick", + "hearing", + "eastern", + "auctions", + "therapy", + "entries", + "dates", + "generated", + "signed", + "upper", + "administrative", + "serious", + "prime", + "limit", + "began", + "steps", + "errors", + "shops", + "bondage", + "efforts", + "informed", + "thoughts", + "creek", + "worked", + "quantity", + "urban", + "practices", + "sorted", + "reporting", + "essential", + "myself", + "tours", + "platform", + "load", + "affiliate", + "labor", + "immediately", + "admin", + "nursing", + "defense", + "machines", + "designated", + "tags", + "heavy", + "covered", + "recovery", + "guys", + "integrated", + "configuration", + "merchant", + "comprehensive", + "expert", + "universal", + "protect", + "drop", + "solid", + "presentation", + "languages", + "became", + "orange", + "compliance", + "vehicles", + "prevent", + "theme", + "rich", + "campaign", + "marine", + "improvement", + "guitar", + "finding", + "Pennsylvania", + "examples", + "saying", + "spirit", + "claims", + "challenge", + "acceptance", + "strategies", + "seem", + "affairs", + "touch", + "intended", + "towards", + "goals", + "hire", + "election", + "suggest", + "branch", + "charges", + "serve", + "affiliates", + "reasons", + "magic", + "mount", + "smart", + "talking", + "gave", + "ones", + "Latin", + "multimedia", + "avoid", + "certified", + "manage", + "corner", + "rank", + "computing", + "Oregon", + "element", + "birth", + "virus", + "abuse", + "interactive", + "requests", + "separate", + "quarter", + "procedure", + "leadership", + "tables", + "define", + "racing", + "religious", + "facts", + "breakfast", + "column", + "plants", + "faith", + "chain", + "developer", + "identify", + "avenue", + "missing", + "died", + "approximately", + "domestic", + "recommendations", + "moved", + "Houston", + "reach", + "comparison", + "mental", + "viewed", + "moment", + "extended", + "sequence", + "inch", + "attack", + "sorry", + "centers", + "opening", + "damage", + "reserve", + "recipes", + "gamma", + "plastic", + "produce", + "snow", + "placed", + "truth", + "counter", + "failure", + "follows", + "weekend", + "dollar", + "camp", + "Ontario", + "automatically", + "Minnesota", + "films", + "bridge", + "native", + "fill", + "movement", + "printing", + "baseball", + "owned", + "approval", + "draft", + "chart", + "played", + "contacts", + "Jesus", + "readers", + "clubs", + "equal", + "adventure", + "matching", + "offering", + "shirts", + "profit", + "leaders", + "posters", + "institutions", + "assistant", + "variable", + "advertisement", + "expect", + "parking", + "headlines", + "yesterday", + "compared", + "determined", + "wholesale", + "workshop", + "Russia", + "gone", + "codes", + "kinds", + "extension", + "Seattle", + "statements", + "golden", + "completely", + "teams", + "fort", + "lighting", + "senate", + "forces", + "funny", + "brother", + "gene", + "turned", + "portable", + "tried", + "electrical", + "applicable", + "disc", + "returned", + "pattern", + "boat", + "named", + "laser", + "earlier", + "manufacturers", + "sponsor", + "classical", + "icon", + "warranty", + "dedicated", + "Indiana", + "direction", + "basketball", + "objects", + "ends", + "delete", + "evening", + "assembly", + "nuclear", + "taxes", + "mouse", + "signal", + "criminal", + "issued", + "brain", + "Wisconsin", + "powerful", + "dream", + "obtained", + "false", + "cast", + "flower", + "felt", + "personnel", + "passed", + "supplied", + "identified", + "falls", + "soul", + "aids", + "opinions", + "promote", + "stated", + "stats", + "Hawaii", + "professionals", + "appears", + "carry", + "flag", + "decided", + "covers", + "advantage", + "hello", + "designs", + "maintain", + "tourism", + "priority", + "newsletters", + "adults", + "clips", + "savings", + "graphic", + "atom", + "payments", + "estimated", + "binding", + "brief", + "ended", + "winning", + "eight", + "anonymous", + "iron", + "straight", + "script", + "served", + "wants", + "miscellaneous", + "prepared", + "void", + "dining", + "alert", + "integration", + "Atlanta", + "tag", + "interview", + "mix", + "framework", + "disk", + "installed", + "queen", + "credits", + "clearly", + "fix", + "handle", + "sweet", + "desk", + "criteria", + "Massachusetts", + "vice", + "associate", + "truck", + "behavior", + "enlarge", + "ray", + "frequently", + "revenue", + "measure", + "changing", + "votes", + "duty", + "looked", + "discussions", + "bear", + "gain", + "festival", + "laboratory", + "ocean", + "flights", + "experts", + "signs", + "lack", + "depth", + "whatever", + "logged", + "laptop", + "vintage", + "train", + "exactly", + "dry", + "explore", + "concept", + "nearly", + "eligible", + "checkout", + "reality", + "forgot", + "handling", + "origin", + "knew", + "gaming", + "feeds", + "billion", + "destination", + "Scotland", + "faster", + "intelligence", + "Dallas", + "bought", + "con", + "nations", + "route", + "followed", + "specifications", + "broken", + "Alaska", "zoom", - "frogs", - "mango", - "mangos", - "chickens", + "blow", + "battle", + "residential", + "anime", + "speak", + "decisions", + "industries", + "protocol", + "query", + "clip", + "partnership", + "editorial", + "expression", + "equity", + "provisions", + "speech", + "wire", + "principles", + "suggestions", + "rural", + "shared", + "sounds", + "replacement", + "tape", + "strategic", + "judge", + "spam", + "economics", + "acid", + "bytes", + "cent", + "forced", + "compatible", + "fight", + "apartment", + "height", + "null", + "zero", + "speaker", + "filed", + "Netherlands", + "obtain", + "consulting", + "recreation", + "offices", + "designer", + "remain", + "managed", + "failed", + "marriage", + "roll", + "Korea", + "banks", + "participants", + "secret", + "bath", + "leads", + "negative", + "favorites", + "Toronto", + "theater", + "Missouri", + "perform", + "healthy", + "translation", + "estimates", + "font", + "assets", + "injury", + "ministry", + "drivers", + "lawyer", + "figures", + "married", + "protected", + "proposal", + "sharing", + "Philadelphia", + "portal", + "waiting", + "birthday", + "beta", + "fail", + "banking", + "officials", + "toward", + "won", + "slightly", + "assist", + "conduct", + "contained", + "legislation", + "calling", + "parameters", + "jazz", + "serving", + "bags", + "profiles", + "Miami", + "comics", + "matters", + "houses", + "postal", + "relationships", + "Tennessee", + "wear", + "controls", + "breaking", + "combined", + "ultimate", + "Wales", + "representative", + "frequency", + "introduced", + "minor", + "finish", + "departments", + "residents", + "noted", + "displayed", + "reduced", + "physics", + "rare", + "spent", + "performed", + "extreme", + "samples", + "bars", + "reviewed", + "row", + "forecast", + "removed", + "helps", + "singles", + "administrator", + "cycle", + "amounts", + "contain", + "accuracy", + "dual", + "rise", + "sleep", + "bird", + "pharmacy", + "Brazil", + "creation", + "static", + "scene", + "hunter", + "addresses", + "lady", + "crystal", + "famous", + "writer", + "chairman", + "violence", + "fans", + "Oklahoma", + "speakers", + "drink", + "academy", + "dynamic", + "gender", + "eat", + "permanent", + "agriculture", + "dell", + "cleaning", + "constitutes", + "portfolio", + "practical", + "delivered", + "collectibles", + "infrastructure", + "exclusive", + "seat", + "concerns", + "vendor", + "originally", + "intel", + "utilities", + "philosophy", + "regulation", + "officers", + "reduction", + "aim", + "bids", + "referred", + "supports", + "nutrition", + "recording", + "regions", + "junior", + "toll", + "cape", + "rings", + "meaning", + "secondary", + "wonderful", + "mine", + "ladies", + "ticket", + "announced", + "guess", + "agreed", + "prevention", + "whom", + "ski", + "soccer", + "math", + "import", + "posting", + "presence", + "instant", + "mentioned", + "automatic", + "healthcare", + "viewing", + "maintained", + "increasing", + "majority", + "connected", + "Christ", + "dogs", + "directors", + "aspects", + "Austria", + "ahead", + "moon", + "participation", + "scheme", + "utility", + "preview", + "fly", + "manner", + "matrix", + "containing", + "combination", + "amendment", + "despite", + "strength", + "guaranteed", + "Turkey", + "libraries", + "proper", + "distributed", + "degrees", + "Singapore", + "enterprises", + "delta", + "fear", + "seeking", + "inches", + "phoenix", + "convention", + "shares", + "principal", + "daughter", + "standing", + "comfort", + "colors", + "wars", + "ordering", + "kept", + "alpha", + "appeal", + "cruise", + "bonus", + "certification", + "previously", + "hey", + "bookmark", + "buildings", + "specials", + "beat", + "household", + "batteries", + "smoking", + "becomes", + "drives", + "arms", + "Alabama", + "tea", + "improved", + "trees", + "achieve", + "positions", + "dress", + "subscription", + "dealer", + "contemporary", + "sky", + "nearby", + "carried", + "happen", + "exposure", + "hide", + "signature", + "gambling", + "refer", + "miller", + "provision", + "outdoors", + "clothes", + "caused", + "luxury", + "babes", + "frames", + "certainly", + "indeed", + "newspaper", + "toy", + "circuit", + "layer", + "printed", + "slow", + "removal", + "easier", + "liability", + "trademark", + "hip", + "printers", + "nine", + "adding", + "Kentucky", + "mostly", + "spot", + "trackback", + "prints", + "spend", + "factory", + "interior", + "revised", + "grow", + "Americans", + "optical", + "promotion", + "relative", + "amazing", + "clock", + "dot", + "identity", + "suites", + "conversion", + "feeling", + "hidden", + "reasonable", + "Victoria", + "serial", + "relief", + "revision", + "broadband", + "influence", + "ratio", + "importance", + "rain", + "onto", + "planet", + "webmaster", + "copies", + "recipe", + "permit", + "seeing", + "proof", + "tennis", + "bass", + "prescription", + "bedroom", + "empty", + "instance", + "hole", + "pets", + "ride", + "licensed", + "Orlando", + "specifically", + "bureau", + "Maine", + "represent", + "conservation", + "pair", + "ideal", + "recorded", + "pieces", + "finished", + "parks", + "dinner", + "lawyers", + "Sydney", + "stress", + "cream", + "runs", + "trends", + "discover", + "patterns", + "boxes", + "Louisiana", + "hills", + "fourth", + "advisor", + "marketplace", + "evil", + "aware", + "shape", + "evolution", + "Irish", + "certificates", + "objectives", + "stations", + "suggested", + "remains", + "greatest", + "firms", + "concerned", + "euro", + "operator", + "structures", + "generic", + "encyclopedia", + "usage", + "cap", + "ink", + "charts", + "continuing", + "mixed", + "census", + "interracial", + "peak", + "competitive", + "exist", + "wheel", + "transit", + "suppliers", + "salt", + "compact", + "poetry", + "lights", + "tracking", + "angel", + "bell", + "keeping", + "preparation", + "attempt", + "receiving", + "matches", + "accordance", + "width", + "noise", + "engines", + "forget", + "array", + "discussed", + "accurate", + "climate", + "reservations", + "pin", + "PlayStation", + "alcohol", + "Greek", + "instruction", + "managing", + "annotation", + "sister", + "raw", + "differences", + "walking", + "explain", + "smaller", + "newest", + "establish", + "gnu", + "happened", + "expressed", + "extent", + "sharp", + "lane", + "paragraph", + "kill", + "mathematics", + "compensation", + "export", + "managers", + "aircraft", + "modules", + "Sweden", + "conflict", + "conducted", + "versions", + "employer", + "occur", + "percentage", + "knows", + "Mississippi", + "describe", + "concern", + "backup", + "requested", + "citizens", + "Connecticut", + "heritage", + "immediate", + "holding", + "trouble", + "spread", + "coach", + "agricultural", + "expand", + "supporting", + "audience", + "assigned", + "collections", + "ages", + "participate", + "plug", + "specialist", + "cook", + "affect", + "virgin", + "experienced", + "investigation", + "raised", + "hat", + "institution", + "directed", + "dealers", + "searching", + "sporting", + "helping", + "perl", + "affected", + "bike", + "totally", + "plate", + "expenses", + "indicate", + "blonde", + "proceedings", + "transmission", + "characteristics", + "lose", + "organic", + "seek", + "experiences", + "albums", + "cheats", + "extremely", + "contracts", + "guests", + "hosted", + "diseases", + "concerning", + "developers", + "equivalent", + "chemistry", + "neighborhood", + "Nevada", + "kits", + "Thailand", + "variables", + "agenda", + "anyway", + "continues", + "tracks", + "advisory", + "curriculum", + "logic", + "template", + "prince", + "circle", + "soil", + "grants", + "anywhere", + "psychology", + "responses", + "Atlantic", + "wet", + "circumstances", + "investor", + "identification", + "leaving", + "wildlife", + "appliances", + "matt", + "elementary", + "cooking", + "speaking", + "sponsors", + "fox", + "unlimited", + "respond", + "sizes", + "plain", + "exit", + "entered", + "Iran", + "arm", + "keys", + "launch", + "wave", + "checking", + "Belgium", + "printable", + "holy", + "acts", + "guidance", + "mesh", + "trail", + "enforcement", + "symbol", + "crafts", + "highway", + "buddy", + "hardcover", + "observed", + "dean", + "setup", + "poll", + "booking", + "glossary", + "fiscal", + "celebrity", + "styles", + "Denver", + "filled", + "bond", + "channels", + "appendix", + "notify", + "blues", + "chocolate", + "pub", + "portion", + "scope", + "Hampshire", + "supplier", + "cables", + "cotton", + "bluetooth", + "controlled", + "requirement", + "authorities", + "biology", + "dental", + "killed", + "border", + "ancient", + "debate", + "representatives", + "starts", + "pregnancy", + "causes", + "Arkansas", + "biography", + "leisure", + "attractions", + "learned", + "transactions", + "notebook", + "explorer", + "historic", + "attached", + "opened", + "husband", + "disabled", + "authorized", + "crazy", + "upcoming", + "Britain", + "concert", + "retirement", + "scores", + "financing", + "efficiency", + "comedy", + "adopted", + "efficient", + "weblog", + "linear", + "commitment", + "specialty", + "bears", + "jean", + "hop", + "carrier", + "edited", + "constant", + "visa", + "mouth", + "jewish", + "meter", + "linked", + "Portland", + "interviews", + "concepts", + "gun", + "reflect", + "pure", + "deliver", + "wonder", + "hell", + "lessons", + "fruit", + "begins", + "qualified", + "reform", + "lens", + "alerts", + "treated", + "discovery", + "draw", + "classified", + "relating", + "assume", + "confidence", + "alliance", + "confirm", + "warm", + "neither", + "offline", + "leaves", + "engineer", + "lifestyle", + "consistent", + "replace", + "clearance", + "connections", + "inventory", + "converter", + "babe", + "checks", + "reached", + "becoming", + "safari", + "objective", + "indicated", + "sugar", + "crew", + "legs", + "stick", + "securities", + "relation", + "enabled", + "genre", + "slide", + "Montana", + "volunteer", + "tested", + "rear", + "democratic", + "enhance", + "Switzerland", + "exact", + "bound", + "parameter", + "adapter", + "processor", + "node", + "formal", + "dimensions", + "contribute", + "lock", + "hockey", + "storm", + "micro", + "colleges", + "laptops", + "mile", + "showed", + "challenges", + "editors", + "threads", + "bowl", + "supreme", + "brothers", + "recognition", + "presents", + "tank", + "submission", + "dolls", + "estimate", + "encourage", + "navy", + "kid", + "regulatory", + "inspection", + "consumers", + "cancel", + "limits", + "territory", + "transaction", + "Manchester", + "paint", + "delay", + "pilot", + "outlet", + "contributions", + "continuous", + "Czech", + "resulting", + "Cambridge", + "initiative", + "novel", + "pan", + "execution", + "disability", + "increases", + "ultra", + "winner", + "Idaho", + "contractor", + "episode", + "examination", + "potter", + "dish", + "plays", + "bulletin", + "indicates", + "modify", + "Oxford", + "truly", + "painting", + "committed", + "extensive", + "affordable", + "universe", + "candidate", + "databases", + "patent", + "slot", + "outstanding", + "eating", + "perspective", + "planned", + "watching", + "lodge", + "messenger", + "mirror", + "tournament", + "consideration", + "discounts", + "sessions", + "kernel", + "stocks", + "buyers", + "journals", + "gray", + "catalogue", + "charged", + "broad", + "Taiwan", + "chosen", + "demo", + "Greece", + "Swiss", + "hate", + "terminal", + "publishers", + "nights", + "behalf", + "Caribbean", + "liquid", + "rice", + "Nebraska", + "loop", + "salary", + "reservation", + "foods", + "gourmet", + "guard", + "properly", + "saving", + "remaining", + "empire", + "resume", + "twenty", + "newly", + "raise", + "prepare", + "avatar", + "depending", + "illegal", + "expansion", + "vary", + "hundreds", + "Rome", + "Arab", + "helped", + "premier", + "tomorrow", + "purchased", + "milk", + "decide", + "consent", + "drama", + "visiting", + "performing", + "downtown", + "keyboard", + "contest", + "collected", + "bands", + "boot", + "suitable", + "absolutely", + "millions", + "lunch", + "audit", + "push", + "chamber", + "findings", + "muscle", + "featuring", + "implement", + "clicking", + "scheduled", + "polls", + "typical", + "tower", + "yours", + "sum", + "calculator", + "significantly", + "chicken", + "temporary", + "attend", + "shower", + "sending", + "tonight", + "dear", + "sufficient", + "shell", + "province", + "catholic", + "oak", + "vat", + "awareness", + "Vancouver", + "governor", + "beer", + "seemed", + "contribution", + "measurement", + "swimming", + "spyware", + "formula", + "constitution", + "packaging", + "solar", + "catch", + "Pakistan", + "reliable", + "consultation", + "northwest", + "sir", + "doubt", + "earn", + "finder", + "unable", + "periods", + "classroom", + "tasks", + "democracy", + "attacks", + "wallpaper", + "merchandise", + "resistance", + "doors", + "symptoms", + "resorts", + "biggest", + "memorial", + "visitor", + "twin", + "forth", + "insert", + "Baltimore", + "gateway", + "alumni", + "drawing", + "candidates", + "ordered", + "biological", + "fighting", + "transition", + "happens", + "preferences", + "spy", + "romance", + "instrument", + "split", + "themes", + "powers", + "heaven", + "bits", + "pregnant", + "twice", + "classification", + "focused", + "Egypt", + "physician", + "bargain", + "cellular", + "Norway", + "Vermont", + "asking", + "blocks", + "normally", + "spiritual", + "hunting", + "diabetes", + "suit", + "shift", + "chip", + "sit", + "bodies", + "photographs", + "cutting", + "wow", + "writers", + "marks", + "flexible", + "loved", + "mapping", + "numerous", + "relatively", + "birds", + "satisfaction", + "represents", + "indexed", + "Pittsburgh", + "superior", + "preferred", + "saved", + "paying", + "cartoon", + "shots", + "intellectual", + "granted", + "choices", + "carbon", + "spending", + "comfortable", + "magnetic", + "interaction", + "listening", + "effectively", + "registry", + "crisis", + "outlook", + "massive", + "Denmark", + "employed", + "bright", + "treat", + "header", + "poverty", + "formed", + "piano", + "echo", + "grid", + "sheets", + "experimental", + "revolution", + "consolidation", + "displays", + "plasma", + "allowing", + "earnings", + "mystery", + "landscape", + "dependent", + "mechanical", + "journey", + "Delaware", + "bidding", + "consultants", + "risks", + "banner", + "applicant", + "charter", + "fig", + "cooperation", + "counties", + "acquisition", + "ports", + "implemented", + "directories", + "recognized", + "dreams", + "blogger", + "notification", + "licensing", + "stands", + "teach", + "occurred", + "textbooks", + "rapid", + "pull", + "hairy", + "diversity", + "Cleveland", + "reverse", + "deposit", + "seminar", + "investments", + "Latina", + "wheels", + "specify", + "accessibility", + "Dutch", + "sensitive", + "templates", + "formats", + "tab", + "depends", + "boots", + "holds", + "router", + "concrete", + "editing", + "Poland", + "folder", + "completion", + "upload", + "pulse", + "universities", + "technique", + "contractors", + "voting", + "courts", + "notices", + "subscriptions", + "calculate", + "Detroit", + "broadcast", + "converted", + "metro", + "anniversary", + "improvements", + "strip", + "specification", + "pearl", + "accident", + "nick", + "accessible", + "accessory", + "resident", + "plot", + "possibly", + "airline", + "typically", + "representation", + "regard", + "pump", + "exists", + "arrangements", + "smooth", + "conferences", + "strike", + "consumption", + "Birmingham", + "flashing", + "narrow", + "afternoon", + "surveys", + "sitting", + "putting", + "consultant", + "controller", + "ownership", + "committees", + "legislative", + "researchers", + "Vietnam", + "trailer", + "castle", + "gardens", + "missed", + "Malaysia", + "unsubscribe", + "antique", + "labels", + "willing", + "molecular", + "acting", + "heads", + "stored", + "exam", + "logos", + "residence", + "attorneys", + "antiques", + "density", + "hundred", + "operators", + "strange", + "sustainable", + "Philippines", + "statistical", + "beds", + "mention", + "innovation", + "employers", + "grey", + "parallel", + "amended", + "operate", + "bills", + "bold", + "bathroom", + "stable", + "opera", + "definitions", + "doctors", + "lesson", + "cinema", + "asset", + "scan", + "elections", + "drinking", + "reaction", + "blank", + "enhanced", + "entitled", + "severe", + "generate", + "stainless", + "newspapers", + "hospitals", + "deluxe", + "humor", + "aged", + "monitors", + "exception", + "lived", + "duration", + "bulk", + "successfully", + "Indonesia", + "pursuant", + "fabric", + "visits", + "primarily", + "tight", + "domains", + "capabilities", + "contrast", + "recommendation", + "flying", + "recruitment", + "sin", + "Berlin", + "cute", + "organized", + "adoption", + "improving", + "expensive", + "meant", + "capture", + "pounds", + "buffalo", + "plane", + "explained", + "seed", + "desire", + "expertise", + "mechanism", + "camping", + "meets", + "welfare", + "peer", + "caught", + "eventually", + "marked", + "driven", + "measured", + "bottle", + "agreements", + "considering", + "innovative", + "marshall", + "massage", + "rubber", + "conclusion", + "closing", + "thousand", + "meat", + "legend", + "grace", + "python", + "monster", + "bang", + "villa", + "bone", + "columns", + "disorders", + "bugs", + "collaboration", + "detection", + "cookies", + "inner", + "formation", + "tutorial", + "engineers", + "entity", + "cruises", + "gate", + "holder", + "proposals", + "moderator", + "tutorials", + "settlement", + "Portugal", + "Roman", + "duties", + "valuable", + "erotic", + "tone", + "collectables", + "ethics", + "forever", + "dragon", + "busy", + "captain", + "fantastic", + "imagine", + "brings", + "heating", + "leg", + "neck", + "wing", + "governments", + "purchasing", + "scripts", + "stereo", + "appointed", + "taste", + "dealing", + "commit", + "tiny", + "operational", + "rail", + "airlines", + "liberal", + "trips", + "gap", + "sides", + "tube", + "turns", + "corresponding", + "descriptions", + "cache", + "belt", + "jacket", + "determination", + "animation", + "oracle", + "lease", + "productions", + "aviation", + "hobbies", + "proud", + "excess", + "disaster", + "console", + "commands", + "telecommunications", + "instructor", + "giant", + "achieved", + "injuries", + "shipped", + "seats", + "approaches", + "biz", + "alarm", + "voltage", + "usual", + "loading", + "stamps", + "appeared", + "angle", + "rob", + "vinyl", + "highlights", + "mining", + "designers", + "Melbourne", + "ongoing", + "worst", + "imaging", + "betting", + "scientists", + "liberty", + "blackjack", + "Argentina", + "era", + "convert", + "possibility", + "analyst", + "commissioner", + "dangerous", + "garage", + "exciting", + "reliability", + "thongs", + "unfortunately", + "respectively", + "volunteers", + "attachment", + "ringtone", + "Finland", + "derived", + "pleasure", + "honor", + "asp", + "oriented", + "eagle", + "desktops", + "pants", + "nurse", + "prayer", + "appointment", + "workshops", + "hurricane", + "quiet", + "luck", + "postage", + "producer", + "represented", + "mortgages", + "dial", + "responsibilities", + "cheese", + "comic", + "carefully", + "jet", + "productivity", + "investors", + "crown", + "underground", + "diagnosis", + "maker", + "crack", + "principle", + "picks", + "vacations", + "gang", + "semester", + "calculated", + "fetish", + "applies", + "casinos", + "appearance", + "smoke", + "filters", + "incorporated", + "craft", + "cake", + "notebooks", + "apart", + "fellow", + "blind", + "lounge", + "mad", + "algorithm", + "semi", + "coins", + "gross", + "strongly", + "cafe", + "valentine", + "proteins", + "horror", + "familiar", + "capable", + "involving", + "pen", + "investing", + "admission", + "shoe", + "elected", + "carrying", + "victory", + "sand", + "terrorism", + "joy", + "editions", + "mainly", + "ethnic", + "ran", + "parliament", + "actor", + "finds", + "seal", + "situations", + "fifth", + "allocated", + "citizen", + "vertical", + "corrections", + "structural", + "municipal", + "describes", + "prize", + "occurs", + "absolute", + "disabilities", + "consists", + "anytime", + "substance", + "prohibited", + "addressed", + "lies", + "pipe", + "soldiers", + "guardian", + "lecture", + "simulation", + "layout", + "initiatives", + "ill", + "concentration", + "classics", + "lay", + "interpretation", + "horses", + "dirty", + "deck", + "donate", + "taught", + "bankruptcy", + "worker", + "optimization", + "alive", + "temple", + "substances", + "prove", + "discovered", + "wings", + "breaks", + "genetic", + "restrictions", + "participating", + "waters", + "promise", + "thin", + "exhibition", + "prefer", + "ridge", + "cabinet", + "modem", + "bringing", + "sick", + "dose", + "evaluate", + "tropical", + "collect", + "bet", + "composition", + "streets", + "nationwide", + "vector", + "definitely", + "shaved", + "turning", + "buffer", + "purple", + "existence", + "commentary", + "limousines", + "developments", + "def", + "immigration", + "destinations", + "lets", + "mutual", + "pipeline", + "necessarily", + "syntax", + "attribute", + "prison", + "skill", + "chairs", + "everyday", + "apparently", + "surrounding", + "mountains", + "moves", + "popularity", + "inquiry", + "ethernet", + "checked", + "exhibit", + "throw", + "trend", + "sierra", + "visible", + "cats", + "desert", + "oldest", + "coordinator", + "obviously", + "mercury", + "handbook", + "navigate", + "worse", + "summit", + "victims", + "spaces", + "fundamental", + "burning", + "escape", + "coupons", + "somewhat", + "receiver", + "substantial", + "progressive", + "boats", + "glance", + "Scottish", + "championship", + "arcade", + "impossible", + "tells", + "obvious", + "fiber", + "depression", + "graph", + "covering", + "platinum", + "judgment", + "bedrooms", + "talks", + "filing", + "foster", + "modeling", + "passing", + "awarded", + "testimonials", + "trials", + "tissue", + "memorabilia", + "masters", + "bonds", + "cartridge", + "explanation", + "folk", + "commons", + "Cincinnati", + "subsection", + "fraud", + "electricity", + "permitted", + "spectrum", + "arrival", + "okay", + "pottery", + "emphasis", + "aspect", + "workplace", + "awesome", + "Mexican", + "confirmed", + "counts", + "priced", + "wallpapers", + "crash", + "lift", + "desired", + "inter", + "closer", + "assumes", + "heights", + "shadow", + "riding", + "infection", + "expense", + "grove", + "eligibility", + "venture", + "clinic", + "Korean", + "healing", + "princess", + "mall", + "entering", + "packet", + "spray", + "studios", + "involvement", + "dad", + "buttons", + "placement", + "observations", + "funded", + "winners", + "extend", + "roads", + "subsequent", + "pat", + "Dublin", + "rolling", + "fell", + "motorcycle", + "yard", + "disclosure", + "establishment", + "memories", + "arrived", + "creates", + "faces", + "tourist", + "mayor", + "murder", + "adequate", + "senator", + "yield", + "presentations", + "grades", + "cartoons", + "pour", + "digest", + "lodging", + "tion", + "dust", + "hence", + "entirely", + "replaced", + "radar", + "rescue", + "undergraduate", + "losses", + "combat", + "reducing", + "stopped", + "occupation", + "lakes", + "donations", + "associations", + "closely", + "radiation", + "diary", + "seriously", + "kings", + "shooting", + "Kent", + "adds", + "ear", + "flags", + "baker", + "launched", + "elsewhere", + "pollution", + "conservative", + "guestbook", + "shock", + "effectiveness", + "walls", + "abroad", + "ebony", + "tie", + "ward", + "drawn", + "visited", + "roof", + "walker", + "demonstrate", + "atmosphere", + "suggests", + "kiss", + "beast", + "operated", + "experiment", + "targets", + "overseas", + "purchases", + "dodge", + "counsel", + "federation", + "pizza", + "invited", + "yards", + "assignment", + "chemicals", + "mod", + "farmers", + "queries", + "rush", + "Ukraine", + "absence", + "nearest", + "cluster", + "vendors", + "whereas", + "yoga", + "serves", + "woods", + "surprise", + "lamp", + "partial", + "shoppers", + "everybody", + "couples", + "Nashville", + "ranking", + "jokes", + "sublime", + "counseling", + "palace", + "acceptable", + "satisfied", + "glad", + "wins", + "measurements", + "verify", + "globe", + "trusted", + "copper", + "rack", + "medication", + "warehouse", + "shareware", + "receipt", + "supposed", + "ordinary", + "nobody", + "ghost", + "violation", + "configure", + "stability", + "applying", + "southwest", + "boss", + "pride", + "institutional", + "expectations", + "independence", + "knowing", + "reporter", + "metabolism", + "champion", + "cloudy", + "personally", + "Chile", + "plenty", + "solo", + "sentence", + "throat", + "ignore", + "uniform", + "excellence", + "wealth", + "tall", + "somewhere", + "vacuum", + "dancing", + "attributes", + "recognize", + "brass", + "writes", + "plaza", + "outcomes", + "survival", + "quest", + "publish", + "screening", + "toe", + "thumbnail", + "whenever", + "nova", + "lifetime", + "pioneer", + "booty", + "forgotten", + "acrobat", + "plates", + "acres", + "venue", + "athletic", + "thermal", + "essays", + "vital", + "telling", + "fairly", + "coastal", + "charity", + "intelligent", + "Edinburgh", + "excel", + "modes", + "obligation", + "wake", + "stupid", + "harbor", + "traveler", + "segment", + "realize", + "regardless", + "enemy", + "puzzle", + "rising", + "wells", + "opens", + "insight", + "restricted", + "Republican", + "secrets", + "lucky", + "latter", + "merchants", + "thick", + "trailers", + "repeat", + "syndrome", + "attendance", + "penalty", + "drum", + "glasses", + "enables", + "Iraqi", + "builder", + "vista", + "chips", + "flood", + "foto", + "ease", + "arguments", + "Amsterdam", + "arena", + "adventures", + "pupils", + "announcement", + "tabs", + "outcome", + "appreciate", + "expanded", + "casual", + "grown", + "Polish", + "lovely", + "extras", + "clause", + "smile", + "lands", + "troops", + "indoor", + "Bulgaria", + "armed", + "broker", + "charger", + "regularly", + "believed", + "pine", + "cooling", + "tend", + "gulf", + "trucks", + "mechanisms", + "divorce", + "shopper", + "Tokyo", + "partly", + "customize", + "tradition", + "candy", + "pills", + "tiger", + "folks", + "sensor", + "exposed", + "hunt", + "angels", + "deputy", + "indicators", + "sealed", + "Thai", + "emissions", + "physicians", + "loaded", + "complaint", + "scenes", + "experiments", + "balls", + "Afghanistan", + "boost", + "scholarship", + "governance", + "mill", + "founded", + "supplements", + "chronic", + "icons", + "moral", + "den", + "catering", + "finger", + "keeps", + "pound", + "locate", + "camcorder", + "trained", + "burn", + "implementing", + "roses", + "ourselves", + "bread", + "tobacco", + "wooden", + "motors", + "tough", + "incident", + "dynamics", + "lie", + "conversation", + "decrease", + "chest", + "pension", + "revenues", + "emerging", + "worship", + "capability", + "herself", + "producing", + "churches", + "precision", + "damages", + "reserves", + "contributed", + "solve", + "shorts", + "reproduction", + "minority", + "diverse", + "amp", + "ingredients", + "sole", + "franchise", + "recorder", + "complaints", + "facing", + "promotions", + "tones", + "passion", + "rehabilitation", + "maintaining", + "sight", + "laid", + "clay", + "patches", + "weak", + "refund", + "towns", + "environments", + "divided", + "reception", + "wise", + "emails", + "Cyprus", + "odds", + "correctly", + "insider", + "seminars", + "consequences", + "makers", + "hearts", + "geography", + "appearing", + "integrity", + "worry", + "discrimination", + "Carter", + "legacy", + "pleased", + "danger", + "vitamin", + "widely", + "processed", + "phrase", + "genuine", + "raising", + "implications", + "functionality", + "paradise", + "hybrid", + "reads", + "roles", + "intermediate", + "emotional", + "sons", + "leaf", + "pad", + "glory", + "platforms", + "bigger", + "billing", + "diesel", + "versus", + "combine", + "overnight", + "geographic", + "exceed", + "rod", + "fault", + "Cuba", + "preliminary", + "districts", + "introduce", + "silk", + "promotional", + "babies", + "compiled", + "romantic", + "revealed", + "specialists", + "generator", + "examine", + "suspension", + "sad", + "correction", + "wolf", + "slowly", + "authentication", + "communicate", + "rugby", + "supplement", + "showtimes", + "portions", + "infant", + "promoting", + "sectors", + "fluid", + "grounds", + "fits", + "kick", + "regards", + "meal", + "hurt", + "machinery", + "bandwidth", + "unlike", + "equation", + "baskets", + "probability", + "pot", + "dimension", + "wright", + "proven", + "schedules", + "admissions", + "cached", + "warren", + "slip", + "studied", + "reviewer", + "involves", + "quarterly", + "profits", + "devil", + "grass", + "comply", + "florist", + "illustrated", + "cherry", + "continental", + "alternate", + "achievement", + "limitations", + "Kenya", + "webcam", + "cuts", + "funeral", + "earrings", + "enjoyed", + "automated", + "chapters", + "Quebec", + "passenger", + "convenient", + "Mars", + "sized", + "noticed", + "socket", + "silent", + "literary", + "egg", + "signals", + "caps", + "orientation", + "pill", + "theft", + "childhood", + "swing", + "symbols", + "meta", + "humans", + "analog", + "facial", + "choosing", + "talent", + "dated", + "flexibility", + "seeker", + "wisdom", + "shoot", + "boundary", + "mint", + "offset", + "payday", + "elite", + "spin", + "holders", + "believes", + "Swedish", + "poems", + "deadline", + "jurisdiction", + "robot", + "displaying", + "witness", + "equipped", + "stages", + "encouraged", + "powder", + "Broadway", + "acquired", + "assess", + "wash", + "cartridges", + "stones", + "entrance", + "gnome", + "roots", + "declaration", + "losing", + "attempts", + "gadgets", + "noble", + "Glasgow", + "automation", + "impacts", + "gospel", + "advantages", + "shore", + "loves", + "induced", + "knight", + "preparing", + "loose", + "aims", + "recipient", + "linking", + "extensions", + "appeals", + "earned", + "illness", + "Islamic", + "athletics", + "southeast", + "ho", + "alternatives", + "pending", + "determining", + "Lebanon", + "personalized", + "conditioning", + "teenage", + "soap", + "triple", + "cooper", + "jam", + "secured", + "unusual", + "answered", + "partnerships", + "destruction", + "slots", + "increasingly", + "migration", + "disorder", + "routine", + "toolbar", + "basically", + "rocks", + "conventional", + "titans", + "applicants", + "wearing", + "axis", + "sought", + "genes", + "mounted", + "habitat", + "firewall", + "median", + "guns", + "scanner", + "herein", + "occupational", + "animated", + "judicial", + "adjustment", + "hero", + "integer", + "treatments", + "bachelor", + "attitude", + "camcorders", + "engaged", + "falling", + "basics", + "Montreal", + "carpet", + "lenses", + "binary", + "genetics", + "attended", + "difficulty", + "punk", + "collective", + "coalition", + "dropped", + "enrollment", + "duke", + "pace", + "besides", + "wage", + "producers", + "collector", + "arc", + "hosts", + "interfaces", + "advertisers", + "moments", + "atlas", + "strings", + "dawn", + "representing", + "observation", + "feels", + "deleted", + "coat", + "restoration", + "convenience", + "returning", + "opposition", + "container", + "defendant", + "confirmation", + "app", + "embedded", + "supervisor", + "wizard", + "corps", + "actors", + "liver", + "peripherals", + "liable", + "brochure", + "morris", + "petition", + "recall", + "antenna", + "picked", + "assumed", + "departure", + "belief", + "killing", + "bikini", + "Memphis", + "shoulder", + "decor", + "lookup", + "texts", + "brokers", + "diameter", + "Ottawa", + "doll", + "podcast", + "seasons", + "Peru", + "interactions", + "refine", + "bidder", + "singer", + "literacy", + "fails", + "aging", + "intervention", + "plugin", + "attraction", + "diving", + "invite", + "modification", + "Latinas", + "suppose", + "customized", + "reed", + "involve", + "moderate", + "terror", + "younger", + "thirty", + "mice", + "opposite", + "understood", + "rapidly", + "ban", + "assurance", + "clerk", + "happening", + "vast", + "mills", + "outline", + "amendments", + "tramadol", + "Holland", + "receives", + "jeans", + "metropolitan", + "compilation", + "verification", + "fonts", + "odd", + "wrap", + "refers", + "mood", + "favor", + "veterans", + "quiz", + "sigma", + "attractive", + "occasion", + "recordings", + "victim", + "demands", + "sleeping", + "careful", + "beam", + "gardening", + "obligations", + "arrive", + "orchestra", + "sunset", + "tracked", + "moreover", + "minimal", + "polyphonic", + "lottery", + "tops", + "framed", + "aside", + "outsourcing", + "adjustable", + "allocation", + "essay", + "discipline", + "demonstrated", + "dialogue", + "identifying", + "alphabetical", + "camps", + "declared", + "dispatched", + "handheld", + "trace", + "disposal", + "shut", + "florists", + "packs", + "installing", + "switches", + "Romania", + "voluntary", + "consult", + "greatly", + "blogging", + "mask", + "cycling", + "midnight", + "commonly", + "photographer", + "inform", + "Turkish", + "coal", + "cry", + "messaging", + "quantum", + "intent", + "zoo", + "largely", + "pleasant", + "announce", + "constructed", + "additions", + "requiring", + "spoke", + "arrow", + "engagement", + "sampling", + "rough", + "weird", + "tee", + "refinance", + "lion", + "inspired", + "holes", + "weddings", + "blade", + "suddenly", + "oxygen", + "cookie", + "meals", + "canyon", + "meters", + "merely", + "calendars", + "arrangement", + "conclusions", + "passes", + "bibliography", + "pointer", + "compatibility", + "stretch", + "Durham", + "furthermore", + "permits", + "cooperative", + "Muslim", + "sleeve", + "cleaner", + "cricket", + "beef", + "feeding", + "stroke", + "township", + "rankings", + "measuring", + "cad", + "hats", + "headquarters", + "crowd", + "transfers", + "surf", + "olympic", + "transformation", + "remained", + "attachments", + "entities", + "customs", + "administrators", + "personality", + "rainbow", + "hook", + "decline", + "gloves", + "Israeli", + "medicare", + "cord", + "skiing", + "cloud", + "facilitate", + "subscriber", + "valve", + "explains", + "proceed", + "feelings", + "knife", + "Jamaica", + "priorities", + "shelf", + "bookstore", + "timing", + "liked", + "parenting", + "adopt", + "denied", + "fotos", + "incredible", + "freeware", + "donation", + "outer", + "crop", + "deaths", + "rivers", + "commonwealth", + "pharmaceutical", + "Manhattan", + "tales", + "workforce", + "Islam", + "nodes", + "thumbs", + "seeds", + "cited", + "lite", + "hub", + "targeted", + "organizational", + "realized", + "twelve", + "founder", + "decade", + "dispute", + "Portuguese", + "tired", + "adverse", + "everywhere", + "excerpt", + "steam", + "discharge", + "drinks", + "voices", + "acute", + "halloween", + "climbing", + "stood", + "sing", + "tons", + "perfume", + "honest", + "Albany", + "hazardous", + "restore", + "stack", + "methodology", + "somebody", + "sue", + "housewares", + "reputation", + "resistant", + "democrats", + "recycling", + "hang", + "curve", + "creator", + "amber", + "qualifications", + "museums", + "coding", + "tracker", + "variation", + "passage", + "transferred", + "trunk", + "hiking", + "damn", + "headset", + "photograph", + "Colombia", + "waves", + "camel", + "distributor", + "lamps", + "underlying", + "hood", + "wrestling", + "archived", + "photoshop", + "Arabia", + "gathering", + "projection", + "juice", + "chase", + "mathematical", + "logical", + "sauce", + "fame", + "extract", + "specialized", + "diagnostic", + "Panama", + "Indianapolis", + "payable", + "corporations", + "courtesy", + "criticism", + "automobile", + "confidential", + "statutory", + "accommodations", + "Athens", + "northeast", + "downloaded", + "judges", + "retired", + "remarks", + "detected", + "decades", + "paintings", + "walked", + "arising", + "bracelet", + "eggs", + "juvenile", + "injection", + "populations", + "protective", + "afraid", + "acoustic", + "railway", + "cassette", + "initially", + "indicator", + "pointed", + "causing", + "mistake", + "locked", + "eliminate", + "fusion", + "mineral", + "sunglasses", + "ruby", + "steering", + "beads", + "fortune", + "preference", + "canvas", + "threshold", + "claimed", + "screens", + "cemetery", + "planner", + "Croatia", + "flows", + "stadium", + "Venezuela", + "exploration", + "fewer", + "sequences", + "coupon", + "nurses", + "stem", + "proxy", + "astronomy", + "opt", + "drew", + "contests", + "flu", + "translate", + "announces", + "costume", + "tagged", + "voted", + "killer", + "bikes", + "gates", + "adjusted", + "rap", + "tune", + "bishop", + "pulled", + "corn", + "shaped", + "compression", + "seasonal", + "establishing", + "farmer", + "counters", + "puts", + "constitutional", + "grew", + "perfectly", + "tin", + "instantly", + "cultures", + "Norfolk", + "coaching", + "examined", + "trek", + "encoding", + "litigation", + "submissions", + "heroes", + "painted", + "broadcasting", + "horizontal", + "artwork", + "cosmetic", + "resulted", + "portrait", + "terrorist", + "informational", + "ethical", + "carriers", + "ecommerce", + "mobility", + "floral", + "builders", + "ties", + "struggle", + "schemes", + "suffering", + "neutral", + "fisher", + "rat", + "spears", + "prospective", + "bedding", + "ultimately", + "joining", + "heading", + "equally", + "artificial", + "bearing", + "spectacular", + "coordination", + "connector", + "combo", + "seniors", + "worlds", + "guilty", + "affiliated", + "activation", + "naturally", + "haven", + "tablet", + "jury", + "tail", + "subscribers", + "charm", + "lawn", + "violent", + "underwear", + "basin", + "soup", + "potentially", + "ranch", + "constraints", + "crossing", + "inclusive", + "dimensional", + "cottage", + "drunk", + "considerable", + "crimes", + "resolved", + "byte", + "toner", + "nose", + "branches", + "anymore", + "Delhi", + "holdings", + "alien", + "locator", + "selecting", + "processors", + "pantyhose", + "broke", + "Nepal", + "Zimbabwe", + "difficulties", + "complexity", + "constantly", + "browsing", + "resolve", + "Barcelona", + "presidential", + "documentary", + "cod", + "territories", + "Moscow", + "thesis", + "jews", + "nylon", + "Palestinian", + "discs", + "rocky", + "bargains", + "frequent", + "trim", + "ceiling", + "pixels", + "ensuring", + "Hispanic", + "legislature", + "hospitality", + "gen", + "anybody", + "procurement", + "diamonds", + "fleet", + "untitled", + "bunch", + "singing", + "theoretical", + "afford", + "exercises", + "starring", + "referral", + "surveillance", + "optimal", + "quit", + "distinct", + "protocols", + "lung", + "highlight", + "substitute", + "inclusion", + "hopefully", + "brilliant", + "turner", + "cents", + "gel", + "spoken", + "omega", + "evaluated", + "stayed", + "civic", + "assignments", + "manuals", + "sees", + "termination", + "watched", + "saver", + "thereof", + "grill", + "households", + "redeem", + "grain", + "authentic", + "wishes", + "bull", + "architectural", + "depend", + "differ", + "movements", + "ranging", + "repairs", + "breath", + "amenities", + "virtually", + "mart", + "candle", + "hanging", + "colored", + "authorization", + "tale", + "verified", + "formerly", + "projector", + "situated", + "comparative", + "seeks", + "herbal", + "loving", + "strictly", + "routing", + "psychological", + "surprised", + "retailer", + "vitamins", + "elegant", + "gains", + "renewal", + "genealogy", + "opposed", + "deemed", + "scoring", + "expenditure", + "Liverpool", + "sisters", + "critics", + "connectivity", + "spots", + "algorithms", + "hacker", + "Madrid", + "similarly", + "margin", + "coin", + "solely", + "fake", + "salon", + "collaborative", + "excluding", + "turbo", + "headed", + "voters", + "cure", + "commander", + "arch", + "thinks", + "suggestion", + "soldier", + "aimed", + "justin", + "bomb", + "harm", + "interval", + "mirrors", + "spotlight", + "tricks", + "reset", + "brush", + "investigate", + "panels", + "repeated", + "assault", + "connecting", + "spare", + "logistics", + "deer", + "tongue", + "bowling", + "Danish", + "pal", + "monkey", + "proportion", + "filename", + "skirt", + "invest", + "honey", + "analyses", + "drawings", + "significance", + "scenario", + "lovers", + "atomic", + "symposium", + "Arabic", + "gauge", + "essentials", + "junction", + "protecting", + "faced", + "mat", + "solving", + "transmitted", + "weekends", + "screenshots", + "produces", + "oven", + "intensive", + "chains", + "sixth", + "engage", + "deviant", + "noon", + "switching", + "quoted", + "adapters", + "correspondence", + "farms", + "imports", + "supervision", + "cheat", + "bronze", + "expenditures", + "separation", + "testimony", + "suspect", + "celebrities", + "macro", + "sender", + "mandatory", + "boundaries", + "crucial", + "syndication", + "gym", + "celebration", + "adjacent", + "filtering", + "tuition", + "spouse", + "exotic", + "viewer", + "signup", + "Luxembourg", + "puzzles", + "reaching", + "damaged", + "receptor", + "laugh", + "surgical", + "destroy", + "citation", + "pitch", + "autos", + "premises", + "proved", + "offensive", + "imperial", + "dozen", + "deployment", + "teeth", + "cloth", + "studying", + "colleagues", + "stamp", + "lotus", + "salmon", + "olympus", + "separated", + "cargo", + "tan", + "directive", + "mate", + "starter", + "upgrades", + "likes", + "butter", + "pepper", + "luggage", + "burden", + "chef", + "tapes", + "zones", + "races", + "isle", + "stylish", + "slim", + "maple", + "grocery", + "offshore", + "governing", + "retailers", + "depot", + "comp", + "pie", + "blend", + "occasionally", + "attending", + "emission", + "finest", + "realty", + "bow", + "recruiting", + "apparent", + "instructional", + "autumn", + "traveling", + "probe", + "midi", + "permissions", + "biotechnology", + "toilet", + "ranked", + "jackets", + "routes", + "packed", + "excited", + "outreach", + "mounting", + "recover", + "tied", + "balanced", + "prescribed", + "timely", + "talked", + "debug", + "delayed", + "chuck", + "reproduced", + "dale", + "explicit", + "calculation", + "villas", + "ebook", + "consolidated", + "exclude", + "occasions", + "brooks", + "equations", + "newton", + "oils", + "exceptional", + "anxiety", + "bingo", + "whilst", + "spatial", + "respondents", + "ceramic", + "prompt", + "precious", + "minds", + "annually", + "considerations", + "scanners", + "pays", + "fingers", + "sunny", + "ebooks", + "delivers", + "Queensland", + "necklace", + "musicians", + "composite", + "unavailable", + "cedar", + "arranged", + "advocacy", + "Raleigh", + "fold", + "essentially", + "designing", + "threaded", + "qualify", + "hopes", + "assessments", + "diagram", + "burns", + "pumps", + "footwear", + "Beijing", + "peoples", + "victor", + "attach", + "licenses", + "removing", + "advised", + "spider", + "ranges", + "pairs", + "sensitivity", + "trails", + "preservation", + "isolated", + "interim", + "assisted", + "divine", + "streaming", + "approve", + "chose", + "compound", + "intensity", + "technological", + "syndicate", + "abortion", + "dialog", + "venues", + "blast", + "wellness", + "calcium", + "antivirus", + "addressing", + "pole", + "discounted", + "Indians", + "shield", + "harvest", + "membrane", + "Prague", + "previews", + "Bangladesh", + "constitute", + "locally", + "concluded", + "pickup", + "desperate", + "mothers", + "Iceland", + "demonstration", + "governmental", + "manufactured", + "candles", + "graduation", + "mega", + "bend", + "sailing", + "variations", + "sacred", + "addiction", + "Morocco", + "chrome", + "refused", + "brake", + "exterior", + "greeting", + "ecology", + "Congo", + "glen", + "Botswana", + "delays", + "synthesis", + "olive", + "undefined", + "unemployment", + "scored", + "enhancement", + "clone", + "velocity", + "lambda", + "relay", + "composed", + "tears", + "performances", + "oasis", + "baseline", + "cab", + "angry", + "societies", + "silicon", + "Brazilian", + "identical", + "petroleum", + "compete", + "Norwegian", + "lover", + "belong", + "Honolulu", + "lips", + "escort", + "retention", + "exchanges", + "pond", + "rolls", + "soundtrack", + "wondering", + "Malta", + "ferry", + "rabbit", + "profession", + "seating", + "dam", + "separately", + "physiology", + "collecting", + "exports", + "tire", + "participant", + "scholarships", + "recreational", + "Dominican", + "Chad", + "electron", + "loads", + "friendship", + "heather", + "passport", + "motel", + "unions", + "treasury", + "warrant", + "frozen", + "occupied", + "royalty", + "scales", + "rally", + "observer", + "sunshine", + "strain", + "drag", + "ceremony", + "somehow", + "arrested", + "expanding", + "provincial", + "investigations", + "ripe", + "rely", + "medications", + "Hebrew", + "gained", + "dying", + "laundry", + "stuck", + "placing", + "stops", + "homework", + "adjust", + "assessed", + "advertiser", + "enabling", + "encryption", + "filling", + "downloadable", + "sophisticated", + "imposed", + "silence", + "focuses", + "possession", + "laboratories", + "treaty", + "vocal", + "trainer", + "organ", + "stronger", + "volumes", + "advances", + "vegetables", + "lemon", + "toxic", + "thumbnails", + "darkness", + "nuts", + "nail", + "Vienna", + "implied", + "span", + "stockings", + "joke", + "respondent", + "packing", + "statute", + "rejected", + "satisfy", + "destroyed", + "shelter", + "chapel", + "manufacture", + "layers", + "guided", + "vulnerability", + "accountability", + "celebrate", + "accredited", + "appliance", + "compressed", + "Bahamas", + "mixture", + "bench", + "tub", + "rider", + "scheduling", + "radius", + "perspectives", + "mortality", + "logging", + "christians", + "borders", + "therapeutic", + "pads", + "inns", + "impressive", + "sheep", + "accordingly", + "architect", + "railroad", + "lectures", + "challenging", + "wines", + "nursery", + "harder", + "cups", + "ash", + "microwave", + "cheapest", + "accidents", + "relocation", + "contributors", + "salad", + "tender", + "violations", + "foam", + "temperatures", + "paste", + "clouds", + "competitions", + "discretion", + "Tanzania", + "preserve", + "poem", + "unsigned", + "staying", + "cosmetics", + "easter", + "theories", + "repository", + "praise", + "Venice", + "concentrations", + "Estonia", + "Christianity", + "veteran", + "streams", + "landing", + "signing", + "executed", + "negotiations", + "realistic", + "showcase", + "integral", + "asks", + "relax", + "Namibia", + "generating", + "congressional", + "synopsis", + "hardly", + "prairie", + "reunion", + "composer", + "bean", + "sword", + "absent", + "photographic", + "sells", + "Ecuador", + "hoping", + "accessed", + "spirits", + "modifications", + "coral", + "pixel", + "float", + "bias", + "imported", + "paths", + "bubble", + "acquire", + "contrary", + "millennium", + "tribune", + "vessel", + "acids", + "focusing", + "viruses", + "cheaper", + "admitted", + "dairy", + "admit", + "fancy", + "equality", + "Samoa", + "achieving", + "tap", + "stickers", + "fisheries", + "exceptions", + "reactions", + "leasing", + "beliefs", + "companion", + "squad", + "analyze", + "scroll", + "relate", + "divisions", + "swim", + "wages", + "additionally", + "suffer", + "forests", + "fellowship", + "invalid", + "concerts", + "martial", + "males", + "Victorian", + "retain", + "execute", + "tunnel", + "genres", + "Cambodia", + "patents", + "copyrights", + "chaos", + "Lithuania", + "wheat", + "chronicles", + "obtaining", + "beaver", + "updating", + "distribute", + "readings", + "decorative", + "confused", + "compiler", + "enlargement", + "eagles", + "bases", + "accused", + "bee", + "campaigns", + "unity", + "loud", + "conjunction", + "bride", + "rats", + "defines", + "airports", + "instances", + "indigenous", + "begun", + "brunette", + "packets", + "anchor", + "socks", + "validation", + "parade", + "corruption", + "trigger", + "incentives", + "cholesterol", + "gathered", + "Essex", + "Slovenia", + "notified", + "differential", + "beaches", + "folders", + "dramatic", + "surfaces", + "terrible", + "routers", + "pendant", + "dresses", + "baptist", + "scientist", + "hiring", + "clocks", + "arthritis", + "females", + "nevertheless", + "reflects", + "taxation", + "fever", + "cuisine", + "surely", + "practitioners", + "transcript", + "theorem", + "inflation", + "ruth", + "pray", + "compounds", + "Pope", + "drums", + "contracting", + "structured", + "reasonably", + "jeep", + "chicks", + "bare", + "hung", + "cattle", + "radical", + "graduates", + "rover", + "recommends", + "controlling", + "treasure", + "reload", + "distributors", + "flame", + "tanks", + "assuming", + "monetary", + "elderly", + "pit", + "Arlington", + "particles", + "floating", + "extraordinary", + "tile", + "indicating", + "Bolivia", + "spell", + "hottest", + "coordinate", + "Kuwait", + "exclusively", + "alleged", + "limitation", + "widescreen", + "compile", + "struck", + "illustration", + "warnings", + "construct", + "apps", + "inquiries", + "bridal", + "annex", + "inspiration", + "tribal", + "curious", + "affecting", + "freight", + "rebate", + "eclipse", + "Sudan", + "downloading", + "shuttle", + "aggregate", + "stunning", + "cycles", + "affects", + "forecasts", + "detect", + "actively", + "knee", + "complicated", + "fastest", + "butler", + "injured", + "decorating", + "payroll", + "cookbook", + "expressions", + "ton", + "courier", + "uploaded", + "hints", + "collapse", + "connectors", + "unlikely", + "pros", + "conflicts", + "techno", + "beverage", + "tribute", + "wired", + "immune", + "Latvia", + "travelers", + "forestry", + "barriers", + "cant", + "rarely", + "infected", + "offerings", + "genesis", + "barrier", + "argue", + "incorrect", + "trains", + "metals", + "bicycle", + "furnishings", + "letting", + "arise", + "Guatemala", + "Celtic", + "thereby", + "particle", + "perception", + "minerals", + "advise", + "humidity", + "bottles", + "boxing", + "Bangkok", + "Renaissance", + "pathology", + "ordinance", + "photographers", + "infections", + "chess", + "operates", + "Brisbane", + "configured", + "survive", + "festivals", + "menus", + "possibilities", + "duck", + "reveal", + "canal", + "amino", + "contributing", + "herbs", + "clinics", + "cow", + "Manitoba", + "analytical", + "missions", + "lying", + "costumes", + "strict", + "dive", + "circulation", + "drill", + "offense", + "protest", + "assumption", + "Jerusalem", + "hobby", + "tries", + "invention", + "nickname", + "Fiji", + "technician", + "inline", + "executives", + "enquiries", + "washing", + "staffing", + "cognitive", + "exploring", + "trick", + "enquiry", + "closure", + "raid", + "timber", + "volt", + "intense", + "playlist", + "registrar", + "showers", + "supporters", + "ruling", + "steady", + "dirt", + "statutes", + "withdrawal", + "drops", + "predicted", + "wider", + "Saskatchewan", + "cancellation", + "plugins", + "enrolled", + "sensors", + "screw", + "ministers", + "publicly", + "hourly", + "blame", + "veterinary", + "reseller", + "handed", + "suffered", + "intake", + "informal", + "relevance", + "incentive", + "butterfly", + "mechanics", + "heavily", + "swingers", + "fifty", + "headers", + "mistakes", + "numerical", + "geek", + "uncle", + "defining", + "counting", + "reflection", + "sink", + "accompanied", + "assure", + "invitation", + "devoted", + "sodium", + "spirituality", + "hormone", + "meanwhile", + "proprietary", + "childrens", + "brick", + "grip", + "naval", + "medieval", + "porcelain", + "bridges", + "captured", + "watt", + "decent", + "casting", + "translated", + "shortly", + "columnists", + "pins", + "warrior", + "diploma", + "cabin", + "innocent", + "scanning", + "consensus", + "polo", + "copying", + "delivering", + "cordless", + "horn", + "Uganda", + "fired", + "journalism", + "trivia", + "frog", + "grammar", + "intention", + "Syria", + "disagree", + "tires", + "logs", + "undertaken", + "hazard", + "retro", + "statewide", + "semiconductor", + "episodes", + "boolean", + "circular", + "anger", + "mainland", + "illustrations", + "suits", + "chances", + "interact", + "snap", + "happiness", + "substantially", + "bizarre", + "Auckland", + "olympics", + "fruits", + "identifier", + "ribbon", + "calculations", + "doe", + "conducting", + "startup", + "kissing", + "handy", + "swap", + "exempt", + "crops", + "reduces", + "accomplished", + "calculators", + "geometry", + "impression", + "Slovakia", + "flip", + "guild", + "correlation", + "gorgeous", + "capitol", + "sim", + "dishes", + "Barbados", + "nervous", + "refuse", + "extends", + "fragrance", + "replica", + "plumbing", + "Brussels", + "tribe", + "neighbors", + "trades", + "superb", + "buzz", + "transparent", + "nuke", + "rid", + "handled", + "legends", + "boom", + "calm", + "champions", + "floors", + "selections", + "projectors", + "inappropriate", + "exhaust", + "comparing", + "Shanghai", + "speaks", + "vocational", + "copied", + "farming", + "pharmacies", + "fork", + "roller", + "introducing", + "batch", + "organize", + "appreciated", + "alter", + "Latino", + "Ghana", + "edges", + "mixing", + "handles", + "skilled", + "fitted", + "harmony", + "distinguished", + "asthma", + "projected", + "assumptions", + "shareholders", + "twins", + "developmental", + "regulated", + "triangle", + "amend", + "anticipated", + "Oriental", + "reward", + "Windsor", + "Zambia", + "completing", + "hydrogen", + "sprint", + "comparable", + "chick", + "advocate", + "confusion", + "copyrighted", + "tray", + "inputs", + "warranties", + "genome", + "escorts", + "documented", + "thong", + "medal", + "paperbacks", + "coaches", + "vessels", + "walks", + "keyboards", + "sage", + "knives", + "vulnerable", + "arrange", + "artistic", + "bat", + "honors", + "booth", + "reflected", + "unified", + "bones", + "breed", + "detector", + "ignored", + "polar", + "fallen", + "precise", + "Sussex", + "respiratory", + "notifications", + "mainstream", + "invoice", + "evaluating", + "lip", + "subcommittee", + "sap", + "gather", + "maternity", + "backed", + "colonial", + "motels", + "forming", + "embassy", + "cave", + "journalists", + "slight", + "proceeds", + "indirect", + "amongst", + "wool", + "foundations", + "arrest", + "volleyball", + "horizon", + "deeply", + "toolbox", + "liabilities", + "prizes", + "Bosnia", + "browsers", + "decreased", + "patio", + "tolerance", + "surfing", + "creativity", + "describing", + "optics", + "pursue", + "lightning", + "overcome", + "eyed", + "quotations", + "grab", + "inspector", + "attract", + "beans", + "bookmarks", + "disable", + "snake", + "succeed", + "lending", + "oops", + "reminder", + "searched", + "behavioral", + "riverside", + "bathrooms", + "plains", + "insights", + "abilities", + "initiated", + "Midwest", + "karaoke", + "trap", + "lonely", + "fool", + "nonprofit", + "suspended", + "hereby", + "observe", + "containers", + "attitudes", + "berry", + "collar", + "simultaneously", + "integrate", + "Bermuda", + "sociology", + "mobiles", + "screenshot", + "exhibitions", + "confident", + "retrieved", + "exhibits", + "officially", + "consortium", + "terrace", + "bacteria", + "replied", + "seafood", + "novels", + "recipients", + "ought", + "delicious", + "traditions", + "jail", + "safely", + "finite", + "kidney", + "periodically", + "fixes", + "sends", + "durable", + "allied", + "throws", + "moisture", + "roster", + "referring", + "Uruguay", + "transform", + "timer", + "tablets", + "tuning", + "gotten", + "educators", + "futures", + "vegetable", + "verse", + "humanities", + "independently", + "wanting", + "custody", + "scratch", + "launches", + "alignment", + "competitors", + "rocket", + "aye", + "bullet", + "towers", + "racks", + "lace", + "nasty", + "visibility", + "latitude", + "consciousness", + "ugly", + "deposits", + "mistress", + "encounter", + "trustees", + "watts", + "reprints", + "hart", + "resolutions", + "accessing", + "forty", + "tubes", + "attempted", + "col", + "Midlands", + "priest", + "analysts", + "queue", + "trance", + "locale", + "bundle", + "hammer", + "invasion", + "witnesses", + "runner", + "rows", + "administered", + "notion", + "skins", + "mailed", + "spelling", + "arctic", + "exams", + "rewards", + "beneath", + "strengthen", + "defend", + "medicaid", + "infrared", + "seventh", + "gods", + "Welsh", + "belly", + "aggressive", + "tex", + "advertisements", + "quarters", + "stolen", + "Haiti", + "disturbed", + "determines", + "sculpture", + "ears", + "fist", + "naturals", + "motivation", + "lenders", + "pharmacology", + "fitting", + "fixtures", + "bloggers", + "mere", + "agrees", + "passengers", + "quantities", + "consistently", + "cons", + "surplus", + "elder", + "sonic", + "obituaries", + "cheers", + "dig", + "taxi", + "punishment", + "appreciation", + "subsequently", + "Belarus", + "zoning", + "gravity", + "providence", + "thumb", + "restriction", + "incorporate", + "backgrounds", + "treasurer", + "guitars", + "essence", + "flooring", + "lightweight", + "Ethiopia", + "mighty", + "athletes", + "humanity", + "transcription", + "complications", + "scholars", + "scripting", + "remembered", + "galaxy", + "snapshot", + "caring", + "worn", + "synthetic", + "shaw", + "segments", + "testament", + "dominant", + "twist", + "specifics", + "stomach", + "partially", + "buried", + "newbie", + "minimize", + "ranks", + "wilderness", + "debut", + "generations", + "tournaments", + "deny", + "anatomy", + "judy", + "sponsorship", + "headphones", + "fraction", + "trio", + "proceeding", + "cube", + "defects", + "uncertainty", + "breakdown", + "marker", + "reconstruction", + "subsidiary", + "strengths", + "clarity", + "rugs", + "encouraging", + "furnished", + "Monaco", + "settled", + "folding", + "terrorists", + "airfare", + "comparisons", + "beneficial", + "distributions", + "vaccine", + "Belize", + "crap", + "fate", + "promised", + "penny", + "robust", + "bookings", + "Republicans", + "discusses", + "jungle", + "responded", + "zen", + "ivory", + "alpine", + "prediction", + "pharmaceuticals", + "fabulous", + "remix", + "alias", + "thesaurus", + "individually", + "battlefield", + "literally", + "newer", + "ecological", + "spice", + "oval", + "implies", + "cooler", + "appraisal", + "consisting", + "maritime", + "periodic", + "submitting", + "overhead", + "prospect", + "shipment", + "breeding", + "citations", + "geographical", + "donor", + "Mozambique", + "tension", + "trash", + "shapes", + "wifi", + "tier", + "manor", + "envelope", + "homeland", + "disclaimers", + "championships", + "excluded", + "breeds", + "rapids", + "disco", + "finishing", + "emotions", + "Wellington", + "incoming", + "prospects", + "cleaners", + "Bulgarian", + "eternal", + "cashiers", + "cite", + "remarkable", + "rotation", + "preventing", + "productive", + "boulevard", + "pig", + "metric", + "compliant", + "minus", + "penalties", + "imagination", + "refurbished", + "Armenia", + "varied", + "closest", + "activated", + "actress", + "mess", + "conferencing", + "assign", + "politicians", + "trackbacks", + "lit", + "accommodate", + "tigers", + "aurora", + "slides", + "premiere", + "lender", + "villages", + "shade", + "chorus", + "rhythm", + "digit", + "argued", + "dietary", + "symphony", + "sudden", + "accepting", + "precipitation", + "lions", + "pools", + "lyric", + "isolation", + "speeds", + "sustained", + "matched", + "approximate", + "rope", + "rational", + "programmer", + "fighters", + "chambers", + "dump", + "greetings", + "inherited", + "warming", + "incomplete", + "vocals", + "chronicle", + "fountain", + "chubby", + "grave", + "legitimate", + "biographies", + "burner", + "investigator", + "plaintiff", + "Finnish", + "gentle", + "prisoners", + "deeper", + "Muslims", + "hose", + "Mediterranean", + "nightlife", + "footage", + "worthy", + "reveals", + "architects", + "saints", + "entrepreneur", + "carries", + "freelance", + "duo", + "excessive", + "screensaver", + "saves", + "regarded", + "valuation", + "unexpected", + "cigarette", + "fog", + "characteristic", + "lobby", + "Egyptian", + "Tunisia", + "outlined", + "consequently", + "headline", + "treating", + "punch", + "appointments", + "cowboy", + "narrative", + "Bahrain", + "enormous", + "karma", + "consist", + "queens", + "pubs", + "quantitative", + "screensavers", + "subdivision", + "tribes", + "defeat", + "clicks", + "distinction", + "naughty", + "hazards", + "insured", + "livestock", + "exemption", + "tenant", + "sustainability", + "cabinets", + "tattoo", + "shake", + "algebra", + "shadows", + "formatting", + "silly", + "nutritional", + "mercy", + "freely", + "sunrise", + "wrapping", + "mild", + "fur", + "Nicaragua", + "weblogs", + "timeline", + "tar", + "belongs", + "readily", + "affiliation", + "fence", + "infinite", + "ensures", + "relatives", + "clan", + "legally", + "shame", + "satisfactory", + "revolutionary", + "bracelets", + "civilian", + "telephony", + "mesa", + "fatal", + "remedy", + "realtors", + "breathing", + "briefly", + "thickness", + "adjustments", + "graphical", + "genius", + "discussing", + "aerospace", + "fighter", + "meaningful", + "flesh", + "retreat", + "adapted", + "barely", + "wherever", + "estates", + "rug", + "democrat", + "borough", + "maintains", + "failing", + "shortcuts", + "retained", + "marble", + "extending", + "specifies", + "hull", + "Logitech", + "surrey", + "briefing", + "accreditation", + "blackberry", + "highland", + "meditation", + "modular", + "microphone", + "Macedonia", + "combining", + "instrumental", + "giants", + "organizing", + "shed", + "balloon", + "moderators", + "memo", + "ham", + "solved", + "tide", + "Kazakhstan", + "Hawaiian", + "partition", + "invisible", + "consoles", + "funk", + "Qatar", + "magnet", + "translations", + "Cayman", + "jaguar", + "reel", + "sheer", + "commodity", + "posing", + "kilometers", + "bind", + "Thanksgiving", + "urgent", + "guarantees", + "infants", + "gothic", + "cylinder", + "witch", + "buck", + "indication", + "eh", + "congratulations", + "puppy", + "acre", + "graphs", + "surround", + "cigarettes", + "revenge", + "expires", + "enemies", + "controllers", + "aqua", + "consultancy", + "finances", + "enjoying", + "conventions", + "patrol", + "smell", + "pest", + "coordinates", + "carnival", + "roughly", + "sticker", + "promises", + "responding", + "reef", + "physically", + "divide", + "stakeholders", + "consecutive", + "satin", + "deserve", + "attempting", + "promo", + "representations", + "worried", + "tunes", + "garbage", + "competing", + "combines", + "phrases", + "peninsula", + "boring", + "accurately", + "speeches", + "reaches", + "schema", + "considers", + "sofa", + "catalogs", + "ministries", + "vacancies", + "quizzes", + "parliamentary", + "prefix", + "savannah", + "barrel", + "typing", + "nerve", + "planets", + "deficit", + "boulder", + "pointing", + "renew", + "coupled", + "Myanmar", + "metadata", + "circuits", + "floppy", + "texture", + "handbags", + "jar", + "Somerset", + "acknowledge", + "thoroughly", + "Antigua", + "thunder", + "tent", + "caution", + "identifies", + "questionnaire", + "qualification", + "locks", + "namely", + "miniature", + "hack", + "dare", + "euros", + "interstate", + "pirates", + "aerial", + "hawk", + "consequence", + "systematic", + "perceived", + "origins", + "hired", + "makeup", + "textile", + "lamb", + "Madagascar", + "presenting", + "troubleshooting", + "Uzbekistan", + "indexes", + "centuries", + "magnitude", + "fragrances", + "vocabulary", + "licking", + "earthquake", + "fundraising", + "markers", + "weights", + "Albania", + "geological", + "assessing", + "lasting", + "wicked", + "introduces", + "kills", + "roommate", + "webcams", + "pushed", + "webmasters", + "computational", + "participated", + "junk", + "wax", + "answering", + "impressed", + "slope", + "reggae", + "failures", + "poet", + "conspiracy", + "surname", + "theology", + "nails", + "evident", + "rides", + "rehab", + "epic", + "saturn", + "organizer", + "nut", + "allergy", + "sake", + "twisted", + "combinations", + "preceding", + "merit", + "enzyme", + "cumulative", + "planes", + "tackle", + "disks", + "Pokemon", + "amplifier", + "arbitrary", + "prominent", + "retrieve", + "titanium", + "fairy", + "builds", + "contacted", + "shaft", + "lean", + "bye", + "recorders", + "occasional", + "postings", + "innovations", + "kitty", + "postcards", + "dude", + "drain", + "fires", + "Algeria", + "blessed", + "reviewing", + "Cardiff", + "Cornwall", + "favors", + "potato", + "panic", + "explicitly", + "sticks", + "citizenship", + "excuse", + "reforms", + "basement", + "onion", + "strand", + "sandwich", + "lawsuit", + "informative", + "girlfriend", + "hierarchy", + "influenced", + "banners", + "reject", + "abandoned", + "circles", + "italic", + "beats", + "merry", + "gore", + "complement", + "cult", + "dash", + "passive", + "Mauritius", + "valued", + "cage", + "checklist", + "requesting", + "courage", + "scenarios", + "gazette", + "extraction", + "batman", + "elevation", + "hearings", + "lap", + "utilization", + "beverages", + "calibration", + "efficiently", + "ping", + "textbook", + "dried", + "entertaining", + "prerequisite", + "luther", + "frontier", + "settle", + "stopping", + "refugees", + "knights", + "hypothesis", + "medicines", + "flux", + "derby", + "peaceful", + "altered", + "regression", + "doctrine", + "scenic", + "trainers", + "enhancements", + "renewable", + "intersection", + "passwords", + "sewing", + "consistency", + "collectors", + "conclude", + "Munich", + "Oman", + "propose", + "Azerbaijan", + "lighter", + "rage", + "astrology", + "advisors", + "pavilion", + "tactics", + "trusts", + "occurring", + "supplemental", + "talented", + "pillow", + "induction", + "precisely", + "shorter", + "spreading", + "provinces", + "relying", + "finals", + "Paraguay", + "steal", + "parcel", + "refined", + "fifteen", + "widespread", + "incidence", + "fears", + "predict", + "boutique", + "acrylic", + "rolled", + "tuner", + "Avon", + "incidents", + "rays", + "Shannon", + "toddler", + "enhancing", + "flavor", + "alike", + "homeless", + "horrible", + "hungry", + "metallic", + "acne", + "blocked", + "interference", + "warriors", + "Palestine", + "undo", + "atmospheric", + "Malawi", + "knowledgestorm", + "halo", + "parental", + "referenced", + "strikes", + "lesser", + "publicity", + "marathon", + "ant", + "proposition", + "gays", + "pressing", + "gasoline", + "apt", + "dressed", + "scout", + "Belfast", + "dealt", + "Niagara", + "charms", + "catalyst", + "trader", + "bucks", + "allowance", + "denial", + "designation", + "thrown", + "prepaid", + "raises", + "gem", + "duplicate", + "electro", + "criterion", + "badge", + "wrist", + "civilization", + "analyzed", + "Vietnamese", + "heath", + "tremendous", + "ballot", + "varying", + "remedies", + "validity", + "trustee", + "weighted", + "Angola", + "performs", + "plastics", + "realm", + "corrected", + "helmet", + "salaries", + "postcard", + "elephant", + "Yemen", + "encountered", + "tsunami", + "scholar", + "nickel", + "internationally", + "surrounded", + "buses", + "geology", + "creatures", + "coating", + "commented", + "wallet", + "cleared", + "smilies", + "accomplish", + "boating", + "drainage", + "corners", + "broader", + "vegetarian", + "rouge", + "yeast", + "clearing", + "investigated", + "ambassador", + "coated", + "intend", + "contacting", + "vegetation", + "doom", + "specially", + "routines", + "hitting", + "Yukon", + "beings", + "bite", + "aquatic", + "reliance", + "habits", + "striking", + "myth", + "infectious", + "podcasts", + "gig", + "continuity", + "brook", + "outputs", + "phenomenon", + "ensemble", + "insulin", + "assured", + "biblical", + "conscious", + "accent", + "eleven", + "wives", + "ambient", + "utilize", + "mileage", + "adaptor", + "Auburn", + "unlock", + "pledge", + "vampire", + "relates", + "nitrogen", + "dice", + "merger", + "softball", + "referrals", + "dock", + "differently", + "mods", + "framing", + "musician", + "blocking", + "Rwanda", + "sorts", + "integrating", + "limiting", + "dispatch", + "revisions", + "restored", + "hint", + "armor", + "riders", + "chargers", + "remark", + "dozens", + "varies", + "reasoning", + "rendered", + "picking", + "charitable", + "guards", + "annotated", + "convinced", + "openings", + "buys", + "replacing", + "researcher", + "watershed", + "councils", + "occupations", + "acknowledged", + "pockets", + "pork", + "equilibrium", + "viral", + "inquire", + "pipes", + "characterized", + "laden", + "Aruba", + "cottages", + "realtor", + "merge", + "privilege", + "develops", + "qualifying", + "chassis", + "Dubai", + "estimation", + "barn", + "pushing", + "fleece", + "pediatric", + "fare", + "pierce", + "dressing", + "techrepublic", + "bald", + "frost", + "institutes", + "dame", + "sally", + "yacht", + "prefers", + "drilling", + "brochures", + "herb", + "ate", + "breach", + "whale", + "appropriations", + "suspected", + "tomatoes", + "benchmark", + "beginners", + "instructors", + "highlighted", + "stationery", + "idle", + "unauthorized", + "clusters", + "antibody", + "competent", + "momentum", + "fin", + "wiring", + "pastor", + "mud", + "shark", + "contributor", + "demonstrates", + "phases", + "grateful", + "emerald", + "gradually", + "laughing", + "grows", + "cliff", + "desirable", + "tract", + "ballet", + "journalist", + "bumper", + "afterwards", + "webpage", + "religions", + "garlic", + "hostels", + "shine", + "Senegal", + "explosion", + "banned", + "briefs", + "signatures", + "cove", + "Mumbai", + "ozone", + "disciplines", + "daughters", + "conversations", + "radios", + "tariff", + "opponent", + "pasta", + "simplified", + "muscles", + "serum", + "wrapped", + "swift", + "motherboard", + "runtime", + "inbox", + "focal", + "bibliographic", + "distant", + "champagne", + "decimal", + "deviation", + "superintendent", + "dip", + "samba", + "hostel", + "housewives", + "employ", + "Mongolia", + "penguin", + "magical", + "influences", + "inspections", + "irrigation", + "miracle", + "manually", + "reprint", + "hydraulic", + "centered", + "flex", + "yearly", + "wound", + "belle", + "conviction", + "hash", + "omissions", + "writings", + "lazy", + "retrieval", + "qualities", + "fathers", + "charging", + "marvel", + "lined", + "prototype", + "importantly", + "apparatus", + "terrain", + "pens", + "explaining", + "yen", + "strips", + "gossip", + "rangers", + "nomination", + "empirical", + "rotary", + "worm", + "dependence", + "discrete", + "beginner", + "boxed", + "lid", + "polyester", + "cubic", + "deaf", + "commitments", + "suggesting", + "sapphire", + "skirts", + "mats", + "remainder", + "labeled", + "privileges", + "televisions", + "specializing", + "marking", + "commodities", + "Serbia", + "sheriff", + "declined", + "Guyana", + "spies", + "blah", + "mime", + "neighbor", + "motorcycles", + "elect", + "highways", + "concentrate", + "intimate", + "reproductive", + "deadly", + "bunny", + "molecules", + "rounds", + "longest", + "refrigerator", + "intervals", + "sentences", + "dentists", + "exclusion", + "workstation", + "keen", + "flyer", + "peas", + "dosage", + "receivers", + "disposition", + "variance", + "navigator", + "investigators", + "Cameroon", + "baking", + "adaptive", + "computed", + "needle", + "baths", + "cathedral", + "brakes", + "nirvana", + "owns", + "sticky", + "destiny", + "generous", + "madness", + "climb", + "blowing", + "fascinating", + "landscapes", + "heated", + "computation", + "hay", + "cardiovascular", + "cardiac", + "salvation", + "predictions", + "accompanying", + "Vatican", + "brutal", + "learners", + "selective", + "arbitration", + "configuring", + "token", + "editorials", + "zinc", + "sacrifice", + "seekers", + "guru", + "removable", + "convergence", + "yields", + "Gibraltar", + "suited", + "numeric", + "anthropology", + "skating", + "emperor", + "malpractice", + "belts", + "educated", + "rebates", + "reporters", + "proudly", + "necessity", + "rendering", + "inserted", + "pulling", + "obesity", + "curves", + "suburban", + "touring", + "vertex", + "hepatitis", + "nationally", + "tomato", + "Andorra", + "waterproof", + "expired", + "travels", + "flush", + "waiver", + "pale", + "specialties", + "humanitarian", + "invitations", + "functioning", + "delight", + "survivor", + "economies", + "bacterial", + "Moses", + "counted", + "undertake", + "declare", + "continuously", + "valves", + "gaps", + "impaired", + "achievements", + "donors", + "tear", + "jewel", + "convertible", + "teaches", + "ventures", + "nil", + "stranger", + "tragedy", + "nest", + "dryer", + "painful", + "velvet", + "tribunal", + "ruled", + "pensions", + "prayers", + "funky", + "secretariat", + "nowhere", + "cop", + "paragraphs", + "gale", + "joins", + "adolescent", + "nominations", + "dim", + "lately", + "cancelled", + "scary", + "mattress", + "Brunei", + "likewise", + "banana", + "introductory", + "Slovak", + "cakes", + "stan", + "reservoir", + "occurrence", + "idol", + "bloody", + "mixer", + "remind", + "demographic", + "charming", + "tooth", + "disciplinary", + "annoying", + "respected", + "stays", + "disclose", + "affair", + "drove", + "washer", + "upset", + "restrict", + "beside", + "mines", + "portraits", + "rebound", + "mentor", + "interpreted", + "evaluations", + "fought", + "elimination", + "hypothetical", + "immigrants", + "complimentary", + "helicopter", + "pencil", + "freeze", + "performer", + "titled", + "commissions", + "sphere", + "moss", + "ratios", + "concord", + "graduated", + "endorsed", + "surprising", + "walnut", + "lance", + "ladder", + "unnecessary", + "dramatically", + "Liberia", + "cork", + "maximize", + "senators", + "workout", + "Mali", + "Yugoslavia", + "bleeding", + "characterization", + "colon", + "likelihood", + "lanes", + "purse", + "fundamentals", + "contamination", + "endangered", + "compromise", + "optimize", + "stating", + "dome", + "expiration", + "align", + "peripheral", + "bless", + "engaging", + "negotiation", + "crest", + "opponents", + "triumph", + "nominated", + "confidentiality", + "electoral", + "changelog", + "welding", + "deferred", + "alternatively", + "heel", + "alloy", + "plots", + "polished", + "yang", + "gently", + "locking", + "controversial", + "draws", + "fridge", + "blanket", + "bloom", + "recovered", + "justify", + "upgrading", + "blades", + "loops", + "surge", + "frontpage", + "advert", + "possess", + "demanding", + "defensive", + "sip", + "forbidden", + "vanilla", + "programmers", + "monitored", + "installations", + "picnic", + "souls", + "arrivals", + "practitioner", + "motivated", + "dumb", + "hollow", + "vault", + "securely", + "examining", + "groove", + "revelation", + "pursuit", + "delegation", + "wires", + "dictionaries", + "mails", + "backing", + "greenhouse", + "sleeps", + "transparency", + "endless", + "figured", + "orbit", + "currencies", + "bacon", + "survivors", + "positioning", + "heater", + "colony", + "cannon", + "circus", + "promoted", + "Moldova", + "descending", + "spine", + "trout", + "enclosed", + "feat", + "temporarily", + "cooked", + "thriller", + "transmit", + "fatty", + "pressed", + "frequencies", + "scanned", + "reflections", + "hunger", + "municipality", + "detective", + "surgeon", + "cement", + "experiencing", + "fireplace", + "endorsement", + "planners", + "disputes", + "textiles", + "missile", + "intranet", + "closes", + "psychiatry", + "persistent", + "assists", + "summaries", + "glow", + "auditor", + "aquarium", + "violin", + "prophet", + "bracket", + "oxide", + "oaks", + "magnificent", + "colleague", + "promptly", + "modems", + "adaptation", + "harmful", + "paintball", + "enclosure", + "dividend", + "glucose", + "phantom", + "norm", + "playback", + "supervisors", + "turtle", + "distances", + "absorption", + "treasures", + "warned", + "neural", + "ware", + "fossil", + "hometown", + "badly", + "transcripts", + "wan", + "disappointed", + "Persian", + "continually", + "communist", + "collectible", + "handmade", + "entrepreneurs", + "robots", + "Grenada", + "creations", + "jade", + "scoop", + "acquisitions", + "foul", + "earning", + "mailman", + "nested", + "biodiversity", + "excitement", + "Somalia", + "movers", + "verbal", + "blink", + "presently", + "seas", + "workflow", + "mysterious", + "novelty", + "tiles", + "librarian", + "subsidiaries", + "switched", + "Stockholm", + "Tamil", + "pose", + "fuzzy", + "Indonesian", + "grams", + "therapist", + "budgets", + "toolkit", + "promising", + "relaxation", + "goat", + "render", + "thereafter", + "hardwood", + "erotica", + "temporal", + "sail", + "forge", + "commissioners", + "dense", + "brave", + "forwarding", + "awful", + "nightmare", + "airplane", + "reductions", + "Istanbul", + "impose", + "organisms", + "telescope", + "viewers", + "enters", + "pod", + "savage", + "advancement", + "harassment", + "willow", + "resumes", + "bolt", + "throwing", + "existed", + "generators", + "wagon", + "knock", + "urge", + "generates", + "potatoes", + "thorough", + "replication", + "inexpensive", + "receptors", + "peers", + "optimum", + "neon", + "interventions", + "quilt", + "creature", + "ours", + "mounts", + "internship", + "lone", + "refresh", + "snowboard", + "webcast", + "evanescence", + "subtle", + "coordinated", + "shipments", + "Maldives", + "stripes", + "firmware", + "Antarctica", + "cope", + "shepherd", + "Canberra", + "cradle", + "chancellor", + "lime", + "flour", + "controversy", + "legendary", + "sympathy", + "choir", + "avoiding", + "beautifully", + "blond", + "expects", + "jumping", + "fabrics", + "antibodies", + "polymer", + "hygiene", + "wit", + "poultry", + "virtue", + "burst", + "examinations", + "surgeons", + "bouquet", + "immunology", + "promotes", + "mandate", + "departmental", + "corpus", + "terminology", + "gentleman", + "reproduce", + "convicted", + "shades", + "jets", + "indices", + "roommates", + "adware", + "spokesman", + "activists", + "prisoner", + "daisy", + "encourages", + "cursor", + "assembled", + "earliest", + "donated", + "stuffed", + "restructuring", + "insects", + "terminals", + "crude", + "maiden", + "simulations", + "sufficiently", + "examines", + "viking", + "myrtle", + "bored", + "cleanup", + "yarn", + "knit", + "conditional", + "mug", + "crossword", + "bother", + "Budapest", + "conceptual", + "knitting", + "attacked", + "Bhutan", + "Liechtenstein", + "mating", + "compute", + "redhead", + "arrives", + "translator", + "automobiles", + "tractor", + "continent", + "unwrap", + "fares", + "longitude", + "resist", + "challenged", + "hoped", + "pike", + "safer", + "insertion", + "instrumentation", + "constraint", + "groundwater", + "touched", + "strengthening", "poison", "ethnicity", "dominated", @@ -9952,6 +9948,10 @@ "localities", "dinosaur", "apprentice", - "colored" + "frogs", + "chickens", + "mango", + "bestseller", + "mangos" ] } From ebdb9c9252e2477ecf938f296173f6d8c999ec36 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 23 Feb 2023 12:59:46 +0100 Subject: [PATCH 03/50] added way to force choice removed adblock and coockie block check for now --- frontend/src/ts/controllers/ad-controller.ts | 64 ++++++++++++-------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/frontend/src/ts/controllers/ad-controller.ts b/frontend/src/ts/controllers/ad-controller.ts index 8b3026d5d..c877569bd 100644 --- a/frontend/src/ts/controllers/ad-controller.ts +++ b/frontend/src/ts/controllers/ad-controller.ts @@ -16,7 +16,14 @@ export let adBlock: boolean; export let cookieBlocker: boolean; // const choice: "eg" | "pw" = Math.random() < 0.5 ? "eg" : "pw"; -const choice: "eg" | "pw" = "eg"; +let choice: "eg" | "pw" = "eg"; + +const adChoiceForce = window.localStorage.getItem("adChoiceForce"); +if (adChoiceForce === "eg") { + choice = "eg"; +} else if (adChoiceForce === "pw") { + choice = "pw"; +} export function init(): void { if (choice === "eg") { @@ -109,12 +116,19 @@ export async function refreshVisible(): Promise { export async function checkAdblock(): Promise { return new Promise((resolve) => { - if (adBlock === undefined) { + if (choice === "eg") { + if (adBlock === undefined) { + //@ts-ignore + if (window.egAdPack === undefined) { + adBlock = true; + } else { + adBlock = false; + } + } + } else if (choice === "pw") { //@ts-ignore - if (window.egAdPack === undefined) { + if (window.ramp === undefined) { adBlock = true; - } else { - adBlock = false; } } resolve(); @@ -123,28 +137,30 @@ export async function checkAdblock(): Promise { export async function checkCookieblocker(): Promise { return new Promise((resolve) => { - if (cookieBlocker === undefined) { - //@ts-ignore - if (window.__tcfapi === undefined) { - cookieBlocker = true; - resolve(); - } - //@ts-ignore - window.__tcfapi("getTCData", 2, (tcData, success) => { - if (success) { - if (tcData.eventStatus === "cmpuishown") { - cookieBlocker = true; - } else { - cookieBlocker = false; - } - } else { + if (choice === "eg") { + if (cookieBlocker === undefined) { + //@ts-ignore + if (window.__tcfapi === undefined) { cookieBlocker = true; + resolve(); } - resolve(); - }); - } else { - resolve(); + //@ts-ignore + window.__tcfapi("getTCData", 2, (tcData, success) => { + if (success) { + if (tcData.eventStatus === "cmpuishown") { + cookieBlocker = true; + } else { + cookieBlocker = false; + } + } else { + cookieBlocker = true; + } + }); + } + } else if (choice === "pw") { + //todo } + resolve(); }); } From 051b18176563540622e66c2827a99f1a28b253ce Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 23 Feb 2023 13:00:00 +0100 Subject: [PATCH 04/50] testing continued --- .../src/ts/controllers/pw-ad-controller.ts | 81 ++++++++++++++----- 1 file changed, 59 insertions(+), 22 deletions(-) diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index e339cdd89..ce8330470 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -29,26 +29,53 @@ const selloutUnits = [ selectorId: "ad-result-wrapper", // fill in appropriate selectorId as needed. }, { - type: "leaderboard_btf", + type: "sky_atf", //160x600 selectorId: "ad-vertical-right-wrapper", // fill in appropriate selectorId as needed. }, + { + type: "sky_atf", //160x600 + selectorId: "ad-vertical-left-wrapper", // fill in appropriate selectorId as needed. + }, { type: "leaderboard_btf", - selectorId: "ad-vertical-left-wrapper", // fill in appropriate selectorId as needed. + selectorId: "ad-footer-wrapper", }, { - type: "skyscraper_atf", //160x600 - selectorId: "ad-vertical-right-wrapper", // fill in appropriate selectorId as needed. + type: "leaderboard_btf", + selectorId: "ad-about-1-wrapper", }, { - type: "skyscraper_btf", //160x600 - selectorId: "ad-vertical-left-wrapper", // fill in appropriate selectorId as needed. + type: "leaderboard_btf", + selectorId: "ad-about-2-wrapper", }, { - type: "bottom_rail", //OOP or out-of-page unit do not need a selectorId. 728x90. + type: "leaderboard_btf", + selectorId: "ad-settings-1-wrapper", + }, + { + type: "leaderboard_btf", + selectorId: "ad-settings-1-small-wrapper", + }, + { + type: "leaderboard_btf", + selectorId: "ad-settings-2-wrapper", + }, + { + type: "leaderboard_btf", + selectorId: "ad-settings-3-wrapper", + }, + { + type: "leaderboard_btf", + selectorId: "ad-account-1-wrapper", + }, + { + type: "leaderboard_btf", + selectorId: "ad-account-2-wrapper", }, ]; +let rampReady = false; + export function init(): void { // Set Values with your PubID and Website ID const pubId = "1024888"; @@ -57,15 +84,11 @@ export function init(): void { window.ramp = { que: [], passiveMode: true, - // onReady: (): void => { - // const units = getUnits(); + onReady: (): void => { + rampReady = true; - // if (units) { - // ramp.addUnits(units).then(() => { - // ramp.displayUnits(); - // }); - // } - // }, + reinstate(); + }, }; const headOfDocument = document.getElementsByTagName("head")[0]; @@ -103,7 +126,14 @@ function getUnits(): unknown { units = selloutUnits; } - return units; + const toReturn = []; + for (const unit of units) { + if (document.querySelector(`#${unit.selectorId}`)) { + toReturn.push(unit); + } + } + + return toReturn; } //add logic so script selects the correct ad units array, 'default', 'on', 'sellout' @@ -116,17 +146,24 @@ function getUnits(): unknown { // } // ) -export function reinstate(): boolean { - //@ts-ignore - ramp.destroyUnits("all"); - //@ts-ignore - return ramp.addUnits(getUnits()); +export async function reinstate(): boolean { + if (!rampReady) return; + await ramp.destroyUnits("all"); + await ramp.addUnits(getUnits()); + await ramp.displayUnits(); } export async function refreshVisible(): Promise { + if (!rampReady) return; ramp.triggerRefresh(); } export function renderResult(): void { - ramp.addUnits(resultUnits); + if (!rampReady) return; + ramp.triggerRefresh(); +} + +export function setMobile(tf: boolean): void { + if (!rampReady) return; + ramp.setMobile(tf); } From d2faf78e55b651aa30f7b414bc810f92515221c9 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 23 Feb 2023 19:29:50 +0100 Subject: [PATCH 05/50] fixed 'on' units --- frontend/src/ts/controllers/pw-ad-controller.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index ce8330470..d52b98231 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -15,11 +15,11 @@ const onUnits = [ selectorId: "ad-result-wrapper", // fill in appropriate selectorId as needed. }, { - type: "skyscraper_atf", + type: "sky_atf", //160x600 selectorId: "ad-vertical-right-wrapper", // fill in appropriate selectorId as needed. }, { - type: "skyscraper_btf", + type: "sky_atf", //160x600 selectorId: "ad-vertical-left-wrapper", // fill in appropriate selectorId as needed. }, ]; From 6da48e8d7bc38f287dcbdd1fdedc35ba9a22658e Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 23 Feb 2023 19:37:59 +0100 Subject: [PATCH 06/50] changed test page logic --- frontend/src/ts/controllers/pw-ad-controller.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index d52b98231..f53b40d50 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -1,6 +1,8 @@ //@ts-nocheck import Config from "../config"; +import * as ActivePage from "../states/active-page"; +import * as TestUI from "../test/test-ui"; // Step 1: Create the Ramp Object, NOTE: selector id needed for tagged units only const resultUnits = [ @@ -148,6 +150,7 @@ function getUnits(): unknown { export async function reinstate(): boolean { if (!rampReady) return; + if (ActivePage.get() === "test" && !TestUI.resultVisible) return; await ramp.destroyUnits("all"); await ramp.addUnits(getUnits()); await ramp.displayUnits(); @@ -155,7 +158,12 @@ export async function reinstate(): boolean { export async function refreshVisible(): Promise { if (!rampReady) return; - ramp.triggerRefresh(); + + if (ramp.getUnits().includes("leaderboard_atf")) { + ramp.triggerRefresh(); + } else { + reinstate(); + } } export function renderResult(): void { From 0e164d3492c1d59fd83b66a930e00fc1424e0d88 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 23 Feb 2023 19:41:29 +0100 Subject: [PATCH 07/50] testing mobile sizes --- frontend/src/ts/controllers/pw-ad-controller.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index f53b40d50..fc248d475 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -55,7 +55,7 @@ const selloutUnits = [ selectorId: "ad-settings-1-wrapper", }, { - type: "leaderboard_btf", + type: "med_rect_btf", selectorId: "ad-settings-1-small-wrapper", }, { @@ -86,6 +86,7 @@ export function init(): void { window.ramp = { que: [], passiveMode: true, + forcePath: "320x50-test", onReady: (): void => { rampReady = true; From f990d8432c80b834f9b5ab3e2195e0f754e74dfd Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 23 Feb 2023 19:55:07 +0100 Subject: [PATCH 08/50] sky logic --- frontend/src/ts/controllers/ad-controller.ts | 13 +++++++++++++ frontend/src/ts/controllers/pw-ad-controller.ts | 17 ++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/frontend/src/ts/controllers/ad-controller.ts b/frontend/src/ts/controllers/ad-controller.ts index c877569bd..3101c4578 100644 --- a/frontend/src/ts/controllers/ad-controller.ts +++ b/frontend/src/ts/controllers/ad-controller.ts @@ -106,6 +106,16 @@ function updateBreakpoint(noReinstate = false): void { } } +function updateBreakpoint2(): void { + if (choice !== "pw") return; + + if (window.innerWidth > 1330) { + PW.updateSky(true); + } else { + PW.updateSky(false); + } +} + export async function refreshVisible(): Promise { if (choice === "eg") { await EG.refreshVisible(); @@ -245,10 +255,12 @@ export function destroyResult(): void { const debouncedMarginUpdate = debounce(100, updateVerticalMargin); const debouncedBreakpointUpdate = debounce(100, updateBreakpoint); +const debouncedBreakpoint2Update = debounce(100, updateBreakpoint2); $(window).on("resize", () => { debouncedMarginUpdate(); debouncedBreakpointUpdate(); + debouncedBreakpoint2Update(); }); ConfigEvent.subscribe((event, value) => { @@ -270,6 +282,7 @@ BannerEvent.subscribe(() => { $(document).ready(() => { updateBreakpoint(true); + updateBreakpoint2(); }); window.onerror = function (error): void { diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index fc248d475..33ef2d1d9 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -131,7 +131,11 @@ function getUnits(): unknown { const toReturn = []; for (const unit of units) { - if (document.querySelector(`#${unit.selectorId}`)) { + const isSky = unit.type === "sky_atf"; + if ( + document.querySelector(`#${unit.selectorId}`) && + (!isSky || (isSky && showSky)) + ) { toReturn.push(unit); } } @@ -176,3 +180,14 @@ export function setMobile(tf: boolean): void { if (!rampReady) return; ramp.setMobile(tf); } + +let showSky = false; + +export function updateSky(visible: boolean): void { + showSky = visible; + if (showSky && !ramp.getUnits().includes("sky_atf")) { + ramp.addUnits(getUnits()).then(() => { + ramp.displayUnits(); + }); + } +} From 90a0d3abca7c10961fa87b34fbc4a8c9ee8872c7 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 23 Feb 2023 20:53:34 +0100 Subject: [PATCH 09/50] fixed logic --- frontend/src/ts/controllers/pw-ad-controller.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index 33ef2d1d9..74223594c 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -164,6 +164,11 @@ export async function reinstate(): boolean { export async function refreshVisible(): Promise { if (!rampReady) return; + ramp.triggerRefresh(); +} + +export function renderResult(): void { + if (!rampReady) return; if (ramp.getUnits().includes("leaderboard_atf")) { ramp.triggerRefresh(); } else { @@ -171,11 +176,6 @@ export async function refreshVisible(): Promise { } } -export function renderResult(): void { - if (!rampReady) return; - ramp.triggerRefresh(); -} - export function setMobile(tf: boolean): void { if (!rampReady) return; ramp.setMobile(tf); @@ -185,7 +185,7 @@ let showSky = false; export function updateSky(visible: boolean): void { showSky = visible; - if (showSky && !ramp.getUnits().includes("sky_atf")) { + if (showSky && ramp && !ramp.getUnits().includes("sky_atf")) { ramp.addUnits(getUnits()).then(() => { ramp.displayUnits(); }); From 7998b37b41c973da4533406db717ed2480c2cc7e Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 23 Feb 2023 21:04:15 +0100 Subject: [PATCH 10/50] destroying on test page --- frontend/src/ts/controllers/pw-ad-controller.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index 74223594c..e5675f6b8 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -155,7 +155,10 @@ function getUnits(): unknown { export async function reinstate(): boolean { if (!rampReady) return; - if (ActivePage.get() === "test" && !TestUI.resultVisible) return; + if (ActivePage.get() === "test" && !TestUI.resultVisible) { + ramp.destroyUnits("all"); + return; + } await ramp.destroyUnits("all"); await ramp.addUnits(getUnits()); await ramp.displayUnits(); From a3a72ae58f8efce3f627756210dc700e68ddccf2 Mon Sep 17 00:00:00 2001 From: Miodec Date: Sun, 26 Feb 2023 14:49:28 +0100 Subject: [PATCH 11/50] destroying sky units on breakpoint only showing units which are visible --- .../src/ts/controllers/pw-ad-controller.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index e5675f6b8..1d80ca55d 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -132,8 +132,12 @@ function getUnits(): unknown { const toReturn = []; for (const unit of units) { const isSky = unit.type === "sky_atf"; + + const element = document.querySelector(`#${unit.selectorId}`); + if ( - document.querySelector(`#${unit.selectorId}`) && + element && + window.getComputedStyle(element).display !== "none" && (!isSky || (isSky && showSky)) ) { toReturn.push(unit); @@ -188,9 +192,19 @@ let showSky = false; export function updateSky(visible: boolean): void { showSky = visible; - if (showSky && ramp && !ramp.getUnits().includes("sky_atf")) { + if ( + showSky && + ramp && + !ramp.getUnits().some((u) => u.includes("pw-160x600")) + ) { ramp.addUnits(getUnits()).then(() => { ramp.displayUnits(); }); + } else if (ramp && !showSky) { + const toDestroy = []; + ramp.getUnits().map((u) => { + if (u.includes("pw-160x600")) toDestroy.push(u); + }); + ramp.destroyUnits(toDestroy); } } From 62757918dfc78923bcdf6334ad190ff6e075115f Mon Sep 17 00:00:00 2001 From: Miodec Date: Sun, 26 Feb 2023 14:49:37 +0100 Subject: [PATCH 12/50] increased debounce time --- frontend/src/ts/controllers/ad-controller.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/ts/controllers/ad-controller.ts b/frontend/src/ts/controllers/ad-controller.ts index 3101c4578..4cc3cff81 100644 --- a/frontend/src/ts/controllers/ad-controller.ts +++ b/frontend/src/ts/controllers/ad-controller.ts @@ -253,9 +253,9 @@ export function destroyResult(): void { // $("#ad-result-small-wrapper").empty(); } -const debouncedMarginUpdate = debounce(100, updateVerticalMargin); -const debouncedBreakpointUpdate = debounce(100, updateBreakpoint); -const debouncedBreakpoint2Update = debounce(100, updateBreakpoint2); +const debouncedMarginUpdate = debounce(500, updateVerticalMargin); +const debouncedBreakpointUpdate = debounce(500, updateBreakpoint); +const debouncedBreakpoint2Update = debounce(500, updateBreakpoint2); $(window).on("resize", () => { debouncedMarginUpdate(); From d7162874790fc895605bbc418e153ba8bc25048c Mon Sep 17 00:00:00 2001 From: Miodec Date: Sun, 26 Feb 2023 20:47:41 +0100 Subject: [PATCH 13/50] added mythical badge --- frontend/src/ts/controllers/badge-controller.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/src/ts/controllers/badge-controller.ts b/frontend/src/ts/controllers/badge-controller.ts index 73feebe68..866daaad2 100644 --- a/frontend/src/ts/controllers/badge-controller.ts +++ b/frontend/src/ts/controllers/badge-controller.ts @@ -95,6 +95,14 @@ const badges: Record = { color: "var(--text-color)", background: "var(--sub-color)", }, + 13: { + id: 13, + name: "Mythical", + description: "Yes, I'm actually this fast", + icon: "fa-rocket", + color: "white", + customStyle: "animation: rgb-bg 10s linear infinite;", + }, }; export function getHTMLById( From 2dba4914995296ac5fe692fa032fab3989c7c13a Mon Sep 17 00:00:00 2001 From: Miodec Date: Sun, 26 Feb 2023 20:53:42 +0100 Subject: [PATCH 14/50] updated badge --- frontend/src/ts/controllers/badge-controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/ts/controllers/badge-controller.ts b/frontend/src/ts/controllers/badge-controller.ts index 866daaad2..d471b9cbe 100644 --- a/frontend/src/ts/controllers/badge-controller.ts +++ b/frontend/src/ts/controllers/badge-controller.ts @@ -3,7 +3,7 @@ const badges: Record = { id: 1, name: "Developer", description: "I made this", - icon: "fa-rocket", + icon: "fa-laptop-code", color: "white", customStyle: "animation: rgb-bg 10s linear infinite;", }, From af1535d7236d7cf850ad5a22ffc2ed6a343e9026 Mon Sep 17 00:00:00 2001 From: Miodec Date: Sun, 26 Feb 2023 20:54:55 +0100 Subject: [PATCH 15/50] updated icon --- frontend/src/ts/controllers/badge-controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/ts/controllers/badge-controller.ts b/frontend/src/ts/controllers/badge-controller.ts index d471b9cbe..f96398e20 100644 --- a/frontend/src/ts/controllers/badge-controller.ts +++ b/frontend/src/ts/controllers/badge-controller.ts @@ -3,7 +3,7 @@ const badges: Record = { id: 1, name: "Developer", description: "I made this", - icon: "fa-laptop-code", + icon: "fa-laptop", color: "white", customStyle: "animation: rgb-bg 10s linear infinite;", }, From bb8b95c4f286cd74cb541cf0ab56c14caae153f5 Mon Sep 17 00:00:00 2001 From: Miodec Date: Tue, 28 Feb 2023 13:15:04 +0100 Subject: [PATCH 16/50] added 2nd breakpoint removed sky check not refreshing if nothing is visible --- frontend/src/ts/controllers/ad-controller.ts | 16 +++++-- .../src/ts/controllers/pw-ad-controller.ts | 46 ++++++++++--------- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/frontend/src/ts/controllers/ad-controller.ts b/frontend/src/ts/controllers/ad-controller.ts index 4cc3cff81..5f5e8dcd6 100644 --- a/frontend/src/ts/controllers/ad-controller.ts +++ b/frontend/src/ts/controllers/ad-controller.ts @@ -10,6 +10,9 @@ import * as PW from "./pw-ad-controller"; const breakpoint = 900; let widerThanBreakpoint = true; +const breakpoint2 = 1330; +let widerThanBreakpoint2 = true; + let initialised = false; export let adBlock: boolean; @@ -106,13 +109,18 @@ function updateBreakpoint(noReinstate = false): void { } } -function updateBreakpoint2(): void { +function updateBreakpoint2(noReinstate = false): void { if (choice !== "pw") return; + const beforeUpdate = widerThanBreakpoint2; - if (window.innerWidth > 1330) { - PW.updateSky(true); + if (window.innerWidth > breakpoint2) { + widerThanBreakpoint2 = true; } else { - PW.updateSky(false); + widerThanBreakpoint2 = false; + } + if (noReinstate) return; + if (beforeUpdate !== widerThanBreakpoint2) { + PW.reinstate(); } } diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index 1d80ca55d..6b120aeac 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -131,14 +131,14 @@ function getUnits(): unknown { const toReturn = []; for (const unit of units) { - const isSky = unit.type === "sky_atf"; + // const isSky = unit.type === "sky_atf"; const element = document.querySelector(`#${unit.selectorId}`); if ( element && - window.getComputedStyle(element).display !== "none" && - (!isSky || (isSky && showSky)) + window.getComputedStyle(element).display !== "none" + // && (!isSky || (isSky && showSky)) ) { toReturn.push(unit); } @@ -171,6 +171,8 @@ export async function reinstate(): boolean { export async function refreshVisible(): Promise { if (!rampReady) return; + if (getUnits().length === 0) return; + ramp.triggerRefresh(); } @@ -188,23 +190,23 @@ export function setMobile(tf: boolean): void { ramp.setMobile(tf); } -let showSky = false; +// let showSky = false; -export function updateSky(visible: boolean): void { - showSky = visible; - if ( - showSky && - ramp && - !ramp.getUnits().some((u) => u.includes("pw-160x600")) - ) { - ramp.addUnits(getUnits()).then(() => { - ramp.displayUnits(); - }); - } else if (ramp && !showSky) { - const toDestroy = []; - ramp.getUnits().map((u) => { - if (u.includes("pw-160x600")) toDestroy.push(u); - }); - ramp.destroyUnits(toDestroy); - } -} +// export function updateSky(visible: boolean): void { +// showSky = visible; +// if ( +// showSky && +// ramp && +// !ramp.getUnits().some((u) => u.includes("pw-160x600")) +// ) { +// ramp.addUnits(getUnits()).then(() => { +// ramp.displayUnits(); +// }); +// } else if (ramp && !showSky) { +// const toDestroy = []; +// ramp.getUnits().map((u) => { +// if (u.includes("pw-160x600")) toDestroy.push(u); +// }); +// ramp.destroyUnits(toDestroy); +// } +// } From a98d658fe9f6caf32d522be6d7515540d1b6f1e8 Mon Sep 17 00:00:00 2001 From: Miodec Date: Tue, 28 Feb 2023 23:48:27 +0100 Subject: [PATCH 17/50] checking if element is visible --- frontend/src/ts/controllers/pw-ad-controller.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index 6b120aeac..87baf3e39 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -137,7 +137,8 @@ function getUnits(): unknown { if ( element && - window.getComputedStyle(element).display !== "none" + window.getComputedStyle(element).display !== "none" && + element.offsetParent !== null // && (!isSky || (isSky && showSky)) ) { toReturn.push(unit); From 1501b28f2c645748b16b025db6bb70324b78cc2a Mon Sep 17 00:00:00 2001 From: Miodec Date: Wed, 1 Mar 2023 00:07:52 +0100 Subject: [PATCH 18/50] better visible check --- frontend/src/ts/utils/misc.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/ts/utils/misc.ts b/frontend/src/ts/utils/misc.ts index ad8569417..de528c598 100644 --- a/frontend/src/ts/utils/misc.ts +++ b/frontend/src/ts/utils/misc.ts @@ -1195,12 +1195,12 @@ export function createErrorMessage(error: unknown, message: string): string { } export function isElementVisible(query: string): boolean { - const popup = document.querySelector(query); - if (!popup) { + const el = document.querySelector(query); + if (!el) { return false; } - const style = window.getComputedStyle(popup); - return style.display !== "none"; + // const style = window.getComputedStyle(el); + return !!el.getClientRects().length; } export function isPopupVisible(popupId: string): boolean { From 1ad2d1e3c29d1c79dbba0fb5a66c89ea5d9b02af Mon Sep 17 00:00:00 2001 From: Miodec Date: Wed, 1 Mar 2023 12:03:03 +0100 Subject: [PATCH 19/50] removed timed refresh --- frontend/src/ts/controllers/pw-ad-controller.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index 87baf3e39..c29fa90b3 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -170,11 +170,9 @@ export async function reinstate(): boolean { } export async function refreshVisible(): Promise { - if (!rampReady) return; - - if (getUnits().length === 0) return; - - ramp.triggerRefresh(); + // if (!rampReady) return; + // if (getUnits().length === 0) return; + // ramp.triggerRefresh(); } export function renderResult(): void { From b66504be72a1079ded5c407c140c39a8e9464ef0 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 2 Mar 2023 12:35:32 +0100 Subject: [PATCH 20/50] not saving last result if the user signed out manually this session --- frontend/src/ts/controllers/account-controller.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/ts/controllers/account-controller.ts b/frontend/src/ts/controllers/account-controller.ts index b4fb6612d..20e7b13dc 100644 --- a/frontend/src/ts/controllers/account-controller.ts +++ b/frontend/src/ts/controllers/account-controller.ts @@ -47,6 +47,8 @@ import { navigate } from "../observables/navigate-event"; import { update as updateTagsCommands } from "../commandline/lists/tags"; import * as ConnectionState from "../states/connection"; +let signedOutThisSession = false; + export const gmailProvider = new GoogleAuthProvider(); export async function sendVerificationEmail(): Promise { @@ -260,7 +262,7 @@ export async function loadUser(user: UserType): Promise { // showFavouriteThemesAtTheTop(); - if (TestLogic.notSignedInLastResult !== null) { + if (TestLogic.notSignedInLastResult !== null && !signedOutThisSession) { TestLogic.setNotSignedInUid(user.uid); const response = await Ape.results.save(TestLogic.notSignedInLastResult); @@ -716,6 +718,7 @@ $("#top .signInOut").on("click", () => { } if (Auth.currentUser) { signOut(); + signedOutThisSession = true; } else { navigate("/login"); } From b93ed1670b43de500d19091b4491c404e513a368 Mon Sep 17 00:00:00 2001 From: Miodec Date: Fri, 3 Mar 2023 12:12:09 +0100 Subject: [PATCH 21/50] removed comments --- frontend/src/ts/controllers/pw-ad-controller.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index c29fa90b3..67a2c7399 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -8,35 +8,35 @@ import * as TestUI from "../test/test-ui"; const resultUnits = [ { type: "leaderboard_atf", - selectorId: "ad-result-wrapper", // fill in appropriate selectorId as needed. + selectorId: "ad-result-wrapper", }, ]; const onUnits = [ { type: "leaderboard_atf", - selectorId: "ad-result-wrapper", // fill in appropriate selectorId as needed. + selectorId: "ad-result-wrapper", }, { type: "sky_atf", //160x600 - selectorId: "ad-vertical-right-wrapper", // fill in appropriate selectorId as needed. + selectorId: "ad-vertical-right-wrapper", }, { type: "sky_atf", //160x600 - selectorId: "ad-vertical-left-wrapper", // fill in appropriate selectorId as needed. + selectorId: "ad-vertical-left-wrapper", }, ]; const selloutUnits = [ { type: "leaderboard_atf", - selectorId: "ad-result-wrapper", // fill in appropriate selectorId as needed. + selectorId: "ad-result-wrapper", }, { type: "sky_atf", //160x600 - selectorId: "ad-vertical-right-wrapper", // fill in appropriate selectorId as needed. + selectorId: "ad-vertical-right-wrapper", }, { type: "sky_atf", //160x600 - selectorId: "ad-vertical-left-wrapper", // fill in appropriate selectorId as needed. + selectorId: "ad-vertical-left-wrapper", }, { type: "leaderboard_btf", From 8d140bed0f0ed9ac7a79cb29e751bfa2d267b1ad Mon Sep 17 00:00:00 2001 From: Miodec Date: Fri, 3 Mar 2023 12:33:34 +0100 Subject: [PATCH 22/50] added small versions to all units --- .../src/ts/controllers/pw-ad-controller.ts | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index 67a2c7399..82ada80ab 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -10,12 +10,20 @@ const resultUnits = [ type: "leaderboard_atf", selectorId: "ad-result-wrapper", }, + { + type: "med_rect_btf", + selectorId: "ad-result-small-wrapper", + }, ]; const onUnits = [ { type: "leaderboard_atf", selectorId: "ad-result-wrapper", }, + { + type: "med_rect_btf", + selectorId: "ad-result-small-wrapper", + }, { type: "sky_atf", //160x600 selectorId: "ad-vertical-right-wrapper", @@ -30,6 +38,10 @@ const selloutUnits = [ type: "leaderboard_atf", selectorId: "ad-result-wrapper", }, + { + type: "med_rect_btf", + selectorId: "ad-result-small-wrapper", + }, { type: "sky_atf", //160x600 selectorId: "ad-vertical-right-wrapper", @@ -42,14 +54,26 @@ const selloutUnits = [ type: "leaderboard_btf", selectorId: "ad-footer-wrapper", }, + { + type: "med_rect_btf", + selectorId: "ad-footer-small-wrapper", + }, { type: "leaderboard_btf", selectorId: "ad-about-1-wrapper", }, + { + type: "med_rect_btf", + selectorId: "ad-about-1-small-wrapper", + }, { type: "leaderboard_btf", selectorId: "ad-about-2-wrapper", }, + { + type: "med_rect_btf", + selectorId: "ad-about-2-small-wrapper", + }, { type: "leaderboard_btf", selectorId: "ad-settings-1-wrapper", @@ -62,18 +86,34 @@ const selloutUnits = [ type: "leaderboard_btf", selectorId: "ad-settings-2-wrapper", }, + { + type: "med_rect_btf", + selectorId: "ad-settings-2-small-wrapper", + }, { type: "leaderboard_btf", selectorId: "ad-settings-3-wrapper", }, + { + type: "med_rect_btf", + selectorId: "ad-settings-3-small-wrapper", + }, { type: "leaderboard_btf", selectorId: "ad-account-1-wrapper", }, + { + type: "med_rect_btf", + selectorId: "ad-account-1-small-wrapper", + }, { type: "leaderboard_btf", selectorId: "ad-account-2-wrapper", }, + { + type: "med_rect_btf", + selectorId: "ad-account-2-small-wrapper", + }, ]; let rampReady = false; @@ -177,7 +217,10 @@ export async function refreshVisible(): Promise { export function renderResult(): void { if (!rampReady) return; - if (ramp.getUnits().includes("leaderboard_atf")) { + if ( + ramp.getUnits().includes("leaderboard_atf") || + ramp.getUnits().includes("med_rect_btf") + ) { ramp.triggerRefresh(); } else { reinstate(); From ce82379dcee1c50d3123f83a1d07fce15908aafd Mon Sep 17 00:00:00 2001 From: Miodec Date: Fri, 3 Mar 2023 12:52:02 +0100 Subject: [PATCH 23/50] fixed not being able to view cookie popup --- frontend/src/ts/popups/cookie-popup.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/ts/popups/cookie-popup.ts b/frontend/src/ts/popups/cookie-popup.ts index d2e214b78..ad5a00586 100644 --- a/frontend/src/ts/popups/cookie-popup.ts +++ b/frontend/src/ts/popups/cookie-popup.ts @@ -35,6 +35,7 @@ export function check(): void { export function show(): void { Skeleton.append(wrapperId); + $("#cookiePopupWrapper").removeClass("hidden"); if ( $("#cookiePopupWrapper")[0] === undefined || $("#cookiePopupWrapper").is(":visible") === false || From 1157f1e7c01e937fb49681a66330436a780042d9 Mon Sep 17 00:00:00 2001 From: Miodec Date: Fri, 3 Mar 2023 12:57:30 +0100 Subject: [PATCH 24/50] showing consent in both ad controllers --- frontend/src/ts/controllers/ad-controller.ts | 11 +++++++++++ frontend/src/ts/popups/cookie-popup.ts | 6 ++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/frontend/src/ts/controllers/ad-controller.ts b/frontend/src/ts/controllers/ad-controller.ts index 79163afbe..60235a8d1 100644 --- a/frontend/src/ts/controllers/ad-controller.ts +++ b/frontend/src/ts/controllers/ad-controller.ts @@ -256,6 +256,17 @@ export function updateTestPageAds(visible: boolean): void { } } +export function showConsentPopup(): void { + if (choice === "eg") { + //@ts-ignore + window.__tcfapi("displayConsentUi", 2, function () { + // + }); + } else { + //todo + } +} + export function destroyResult(): void { // $("#ad-result-wrapper").empty(); // $("#ad-result-small-wrapper").empty(); diff --git a/frontend/src/ts/popups/cookie-popup.ts b/frontend/src/ts/popups/cookie-popup.ts index ad5a00586..8e6beca8b 100644 --- a/frontend/src/ts/popups/cookie-popup.ts +++ b/frontend/src/ts/popups/cookie-popup.ts @@ -3,6 +3,7 @@ import { focusWords } from "../test/test-ui"; import * as Notifications from "../elements/notifications"; import * as Skeleton from "./skeleton"; import { isPopupVisible } from "../utils/misc"; +import * as AdController from "../controllers/ad-controller"; const wrapperId = "cookiePopupWrapper"; @@ -148,10 +149,7 @@ $(document).on("keypress", (e) => { $("#cookiePopup .cookie.ads .textButton").on("click", () => { try { - //@ts-ignore - window.__tcfapi("displayConsentUi", 2, function () { - // - }); + AdController.showConsentPopup(); } catch (e) { console.error("Failed to open ad consent UI"); Notifications.add( From 88b02d51fbf553a4e16aa9e99ea0b46414ac77d0 Mon Sep 17 00:00:00 2001 From: Miodec Date: Fri, 3 Mar 2023 19:49:26 +0100 Subject: [PATCH 25/50] showing consent popup --- frontend/src/ts/controllers/ad-controller.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/ts/controllers/ad-controller.ts b/frontend/src/ts/controllers/ad-controller.ts index 60235a8d1..ab5aae093 100644 --- a/frontend/src/ts/controllers/ad-controller.ts +++ b/frontend/src/ts/controllers/ad-controller.ts @@ -263,7 +263,8 @@ export function showConsentPopup(): void { // }); } else { - //todo + //@ts-ignore + ramp.showCmpModal(); } } From 2044a839f0f59f7e097fd608f83ca2066f172cca Mon Sep 17 00:00:00 2001 From: Miodec Date: Fri, 3 Mar 2023 19:55:02 +0100 Subject: [PATCH 26/50] using same code for both sides --- frontend/src/ts/controllers/ad-controller.ts | 38 +++++++++----------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/frontend/src/ts/controllers/ad-controller.ts b/frontend/src/ts/controllers/ad-controller.ts index ab5aae093..eb8ac0a27 100644 --- a/frontend/src/ts/controllers/ad-controller.ts +++ b/frontend/src/ts/controllers/ad-controller.ts @@ -155,28 +155,24 @@ export async function checkAdblock(): Promise { export async function checkCookieblocker(): Promise { return new Promise((resolve) => { - if (choice === "eg") { - if (cookieBlocker === undefined) { - //@ts-ignore - if (window.__tcfapi === undefined) { - cookieBlocker = true; - resolve(); - } - //@ts-ignore - window.__tcfapi("getTCData", 2, (tcData, success) => { - if (success) { - if (tcData.eventStatus === "cmpuishown") { - cookieBlocker = true; - } else { - cookieBlocker = false; - } - } else { - cookieBlocker = true; - } - }); + if (cookieBlocker === undefined) { + //@ts-ignore + if (window.__tcfapi === undefined) { + cookieBlocker = true; + resolve(); } - } else if (choice === "pw") { - //todo + //@ts-ignore + window.__tcfapi("getTCData", 2, (tcData, success) => { + if (success) { + if (tcData.eventStatus === "cmpuishown") { + cookieBlocker = true; + } else { + cookieBlocker = false; + } + } else { + cookieBlocker = true; + } + }); } resolve(); }); From 5809d55fac7acb8ab7b726fa0582461da0d50de7 Mon Sep 17 00:00:00 2001 From: Miodec Date: Sat, 4 Mar 2023 16:40:12 +0100 Subject: [PATCH 27/50] allowing escape to close the mini result graph popup --- frontend/src/ts/account/mini-result-chart.ts | 10 ++++++++++ frontend/src/ts/commandline/index.ts | 5 ++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/frontend/src/ts/account/mini-result-chart.ts b/frontend/src/ts/account/mini-result-chart.ts index 808363190..1208ca88c 100644 --- a/frontend/src/ts/account/mini-result-chart.ts +++ b/frontend/src/ts/account/mini-result-chart.ts @@ -61,6 +61,16 @@ export function updateData(data: MonkeyTypes.ChartData): void { ChartController.miniResult.updateColors(); } +$(document).on("keydown", (event) => { + if ( + event.key === "Escape" && + Misc.isElementVisible(".pageAccount .miniResultChartWrapper") + ) { + hide(); + event.preventDefault(); + } +}); + $(".pageAccount").on("click", ".miniResultChartBg", () => { hide(); }); diff --git a/frontend/src/ts/commandline/index.ts b/frontend/src/ts/commandline/index.ts index bf01fff3a..2b07462e9 100644 --- a/frontend/src/ts/commandline/index.ts +++ b/frontend/src/ts/commandline/index.ts @@ -485,8 +485,11 @@ $(document).ready(() => { event.shiftKey) ) { const popupVisible = isAnyPopupVisible(); + const miniResultPopupVisible = isElementVisible( + ".pageAccount .miniResultChartWrapper" + ); - if (popupVisible) return; + if (popupVisible || miniResultPopupVisible) return; if (Config.quickRestart === "esc" && ActivePage.get() === "login") return; event.preventDefault(); From 1e8542d569086cc914766cea01a46d2a70c72f6e Mon Sep 17 00:00:00 2001 From: Miodec Date: Mon, 6 Mar 2023 17:25:50 +0100 Subject: [PATCH 28/50] changed to btf --- frontend/src/ts/controllers/pw-ad-controller.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index 82ada80ab..68c26074a 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -25,11 +25,11 @@ const onUnits = [ selectorId: "ad-result-small-wrapper", }, { - type: "sky_atf", //160x600 + type: "sky_btf", //160x600 selectorId: "ad-vertical-right-wrapper", }, { - type: "sky_atf", //160x600 + type: "sky_btf", //160x600 selectorId: "ad-vertical-left-wrapper", }, ]; @@ -43,11 +43,11 @@ const selloutUnits = [ selectorId: "ad-result-small-wrapper", }, { - type: "sky_atf", //160x600 + type: "sky_btf", //160x600 selectorId: "ad-vertical-right-wrapper", }, { - type: "sky_atf", //160x600 + type: "sky_btf", //160x600 selectorId: "ad-vertical-left-wrapper", }, { @@ -171,7 +171,7 @@ function getUnits(): unknown { const toReturn = []; for (const unit of units) { - // const isSky = unit.type === "sky_atf"; + // const isSky = unit.type === "sky_btf"; const element = document.querySelector(`#${unit.selectorId}`); From 7a4fe1d14db50e1b17f7acc2f532884117ed76d0 Mon Sep 17 00:00:00 2001 From: Miodec Date: Mon, 6 Mar 2023 18:45:43 +0100 Subject: [PATCH 29/50] console logging choice --- frontend/src/ts/controllers/ad-controller.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/src/ts/controllers/ad-controller.ts b/frontend/src/ts/controllers/ad-controller.ts index eb8ac0a27..723811eb1 100644 --- a/frontend/src/ts/controllers/ad-controller.ts +++ b/frontend/src/ts/controllers/ad-controller.ts @@ -18,14 +18,18 @@ let initialised = false; export let adBlock: boolean; export let cookieBlocker: boolean; -// const choice: "eg" | "pw" = Math.random() < 0.5 ? "eg" : "pw"; -let choice: "eg" | "pw" = "eg"; +let choice: "eg" | "pw" = Math.random() < 0.5 ? "eg" : "pw"; +// let choice: "eg" | "pw" = "eg"; + +console.log("AB choice: " + choice); const adChoiceForce = window.localStorage.getItem("adChoiceForce"); if (adChoiceForce === "eg") { choice = "eg"; + console.log("AB choice forced: " + choice); } else if (adChoiceForce === "pw") { choice = "pw"; + console.log("AB choice forced: " + choice); } export function init(): void { From 7ffcd7f918c71fb1a71d8d57ba923073e8944512 Mon Sep 17 00:00:00 2001 From: Miodec Date: Wed, 8 Mar 2023 12:59:23 +0100 Subject: [PATCH 30/50] when using practice words, not remembering custom mode --- frontend/src/ts/test/practise-words.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/ts/test/practise-words.ts b/frontend/src/ts/test/practise-words.ts index 3a7848719..7af2473ee 100644 --- a/frontend/src/ts/test/practise-words.ts +++ b/frontend/src/ts/test/practise-words.ts @@ -91,7 +91,7 @@ export function init(missed: boolean, slow: boolean): boolean { const punctuation = before.punctuation === null ? Config.punctuation : before.punctuation; const numbers = before.numbers === null ? Config.numbers : before.numbers; - UpdateConfig.setMode("custom"); + UpdateConfig.setMode("custom", true); CustomText.setText(newCustomText); CustomText.setIsWordRandom(true); From a941c287d59d94615cb47baaf9a22f65860cb6be Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 9 Mar 2023 00:18:52 +0100 Subject: [PATCH 31/50] removed console log --- frontend/src/ts/utils/misc.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/ts/utils/misc.ts b/frontend/src/ts/utils/misc.ts index 9b3c20110..4185601f6 100644 --- a/frontend/src/ts/utils/misc.ts +++ b/frontend/src/ts/utils/misc.ts @@ -254,7 +254,6 @@ export function blendTwoHexColors(color1: string, color2: string): string { a: 0.5, }; const blended = normalBlend(rgba1, rgba2); - console.log(blended); return rgbToHex(blended.r, blended.g, blended.b); } else { return "#000000"; From b3391135ce5e4b0c0c352936b4911efacf90e544 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 9 Mar 2023 00:29:11 +0100 Subject: [PATCH 32/50] cookie check --- frontend/src/ts/controllers/ad-controller.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/frontend/src/ts/controllers/ad-controller.ts b/frontend/src/ts/controllers/ad-controller.ts index 723811eb1..06d0c0f0b 100644 --- a/frontend/src/ts/controllers/ad-controller.ts +++ b/frontend/src/ts/controllers/ad-controller.ts @@ -160,10 +160,17 @@ export async function checkAdblock(): Promise { export async function checkCookieblocker(): Promise { return new Promise((resolve) => { if (cookieBlocker === undefined) { + if (choice === "pw") { + cookieBlocker = false; + resolve(); + return; + } + //@ts-ignore if (window.__tcfapi === undefined) { cookieBlocker = true; resolve(); + return; } //@ts-ignore window.__tcfapi("getTCData", 2, (tcData, success) => { From 504859671fcc75d238071de1fc5fe1410e501c14 Mon Sep 17 00:00:00 2001 From: Miodec Date: Mon, 13 Mar 2023 21:06:49 +0100 Subject: [PATCH 33/50] ad result change --- frontend/src/ts/controllers/pw-ad-controller.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index 68c26074a..946c5d4b4 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -217,14 +217,14 @@ export async function refreshVisible(): Promise { export function renderResult(): void { if (!rampReady) return; - if ( - ramp.getUnits().includes("leaderboard_atf") || - ramp.getUnits().includes("med_rect_btf") - ) { - ramp.triggerRefresh(); - } else { - reinstate(); - } + // if ( + // ramp.getUnits().includes("leaderboard_atf") || + // ramp.getUnits().includes("med_rect_btf") + // ) { + // ramp.triggerRefresh(); + // } else { + reinstate(); + // } } export function setMobile(tf: boolean): void { From 3363eaef504b610d211400b845ff85a575d5ac97 Mon Sep 17 00:00:00 2001 From: Miodec Date: Mon, 13 Mar 2023 21:32:12 +0100 Subject: [PATCH 34/50] added function to destroy all destroying all on leaving result page changed render result code --- frontend/src/ts/controllers/ad-controller.ts | 3 +++ frontend/src/ts/controllers/pw-ad-controller.ts | 12 ++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/frontend/src/ts/controllers/ad-controller.ts b/frontend/src/ts/controllers/ad-controller.ts index 06d0c0f0b..0770aa2cd 100644 --- a/frontend/src/ts/controllers/ad-controller.ts +++ b/frontend/src/ts/controllers/ad-controller.ts @@ -276,6 +276,9 @@ export function showConsentPopup(): void { } export function destroyResult(): void { + if (choice === "pw") { + PW.destroyAll(); + } // $("#ad-result-wrapper").empty(); // $("#ad-result-small-wrapper").empty(); } diff --git a/frontend/src/ts/controllers/pw-ad-controller.ts b/frontend/src/ts/controllers/pw-ad-controller.ts index 946c5d4b4..b53531d8e 100644 --- a/frontend/src/ts/controllers/pw-ad-controller.ts +++ b/frontend/src/ts/controllers/pw-ad-controller.ts @@ -215,7 +215,12 @@ export async function refreshVisible(): Promise { // ramp.triggerRefresh(); } -export function renderResult(): void { +export function destroyAll(): void { + if (!rampReady) return; + ramp.destroyUnits("all"); +} + +export async function renderResult(): Promise { if (!rampReady) return; // if ( // ramp.getUnits().includes("leaderboard_atf") || @@ -223,7 +228,10 @@ export function renderResult(): void { // ) { // ramp.triggerRefresh(); // } else { - reinstate(); + // reinstate(); + const units = getUnits(); + await ramp.addUnits(units); + await ramp.displayUnits(); // } } From 3fb761d3ee15d76f466d0958728cdaf84c4a30c7 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 16 Mar 2023 14:43:54 +0100 Subject: [PATCH 35/50] loggign ad provider to prometheus --- backend/src/api/controllers/psa.ts | 13 ++++++++++++- backend/src/utils/prometheus.ts | 10 ++++++++++ frontend/src/ts/ape/endpoints/psas.ts | 5 ++++- frontend/src/ts/controllers/ad-controller.ts | 3 +-- frontend/src/ts/elements/psa.ts | 3 ++- 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/backend/src/api/controllers/psa.ts b/backend/src/api/controllers/psa.ts index f3f41e8f9..f45ec07e6 100644 --- a/backend/src/api/controllers/psa.ts +++ b/backend/src/api/controllers/psa.ts @@ -1,9 +1,20 @@ import * as PsaDAL from "../../dal/psa"; import { MonkeyResponse } from "../../utils/monkey-response"; +import { recordAdAbTest } from "../../utils/prometheus"; export async function getPsas( - _req: MonkeyTypes.Request + req: MonkeyTypes.Request ): Promise { + const { adChoiceRaw } = req.query; + + //ensure adchoice raw is a string and either "pw" or "eg" + const adChoice = + typeof adChoiceRaw === "string" && ["pw", "eg"].includes(adChoiceRaw) + ? adChoiceRaw + : "unknown"; + + recordAdAbTest(adChoice); + const data = await PsaDAL.get(); return new MonkeyResponse("PSAs retrieved", data); } diff --git a/backend/src/utils/prometheus.ts b/backend/src/utils/prometheus.ts index 17c250ab7..e0b93ba99 100644 --- a/backend/src/utils/prometheus.ts +++ b/backend/src/utils/prometheus.ts @@ -322,3 +322,13 @@ export function recordTimeToCompleteJob( timeToCompleteJobTotal.inc({ queueName, jobName }, time); timeToCompleteJobCount.inc({ queueName, jobName }); } + +const adAbTest = new Counter({ + name: "ad_ab_test", + help: "Ad AB test", + labelNames: ["provider"], +}); + +export function recordAdAbTest(provider: string): void { + adAbTest.inc({ provider }); +} diff --git a/frontend/src/ts/ape/endpoints/psas.ts b/frontend/src/ts/ape/endpoints/psas.ts index 9e8065bd5..8516a4b8b 100644 --- a/frontend/src/ts/ape/endpoints/psas.ts +++ b/frontend/src/ts/ape/endpoints/psas.ts @@ -7,11 +7,14 @@ export default class Psas { this.httpClient = httpClient; } - async get(): Ape.EndpointData { + async get(adChoice: string): Ape.EndpointData { return await this.httpClient.get(BASE_PATH, { headers: { "Client-Version": CLIENT_VERSION, }, + searchQuery: { + adChoice, + }, }); } } diff --git a/frontend/src/ts/controllers/ad-controller.ts b/frontend/src/ts/controllers/ad-controller.ts index 0770aa2cd..6f8a7cc15 100644 --- a/frontend/src/ts/controllers/ad-controller.ts +++ b/frontend/src/ts/controllers/ad-controller.ts @@ -18,8 +18,7 @@ let initialised = false; export let adBlock: boolean; export let cookieBlocker: boolean; -let choice: "eg" | "pw" = Math.random() < 0.5 ? "eg" : "pw"; -// let choice: "eg" | "pw" = "eg"; +export let choice: "eg" | "pw" = Math.random() < 0.5 ? "eg" : "pw"; console.log("AB choice: " + choice); diff --git a/frontend/src/ts/elements/psa.ts b/frontend/src/ts/elements/psa.ts index 7309597fe..4f1bb5cc5 100644 --- a/frontend/src/ts/elements/psa.ts +++ b/frontend/src/ts/elements/psa.ts @@ -3,6 +3,7 @@ import { isLocalhost, secondsToString } from "../utils/misc"; import * as Notifications from "./notifications"; import format from "date-fns/format"; import * as Alerts from "./alerts"; +import { choice } from "../controllers/ad-controller"; function clearMemory(): void { window.localStorage.setItem("confirmedPSAs", JSON.stringify([])); @@ -19,7 +20,7 @@ function setMemory(id: string): void { } async function getLatest(): Promise { - const response = await Ape.psas.get(); + const response = await Ape.psas.get(choice); if (response.status === 500) { if (isLocalhost()) { Notifications.addBanner( From 24af35b7aadc894158a6a8609c3901b0dd68a374 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 16 Mar 2023 14:46:34 +0100 Subject: [PATCH 36/50] optional for a while --- backend/src/api/schemas/config-schema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/api/schemas/config-schema.ts b/backend/src/api/schemas/config-schema.ts index 5c3009630..3a8b8733b 100644 --- a/backend/src/api/schemas/config-schema.ts +++ b/backend/src/api/schemas/config-schema.ts @@ -87,7 +87,7 @@ const CONFIG_SCHEMA = joi.object({ paceCaretCustomSpeed: joi.number().min(0), repeatedPace: joi.boolean(), pageWidth: joi.string().valid("100", "125", "150", "200", "max"), - accountChart: joi.array().items(joi.string()), + accountChart: joi.array().items(joi.string()).optional(), chartAccuracy: joi.boolean().optional(), //remove after a bit chartStyle: joi.string().valid("line", "scatter").optional(), //remove after a bit minWpm: joi.string().valid("off", "custom"), From b20643b41120869566ec59e435d58eb03bb943fe Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 16 Mar 2023 14:55:12 +0100 Subject: [PATCH 37/50] small bug --- backend/src/api/controllers/psa.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/api/controllers/psa.ts b/backend/src/api/controllers/psa.ts index f45ec07e6..8d6fe55d7 100644 --- a/backend/src/api/controllers/psa.ts +++ b/backend/src/api/controllers/psa.ts @@ -5,7 +5,7 @@ import { recordAdAbTest } from "../../utils/prometheus"; export async function getPsas( req: MonkeyTypes.Request ): Promise { - const { adChoiceRaw } = req.query; + const { adChoice: adChoiceRaw } = req.query; //ensure adchoice raw is a string and either "pw" or "eg" const adChoice = From 9d5f8e35592a302dab49a6d52c4bb3b032d639fd Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 16 Mar 2023 22:52:07 +0100 Subject: [PATCH 38/50] new refresh logic --- .../src/ts/controllers/eg-ad-controller.ts | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/frontend/src/ts/controllers/eg-ad-controller.ts b/frontend/src/ts/controllers/eg-ad-controller.ts index 1daf053d0..3a1c19825 100644 --- a/frontend/src/ts/controllers/eg-ad-controller.ts +++ b/frontend/src/ts/controllers/eg-ad-controller.ts @@ -15,7 +15,7 @@ export function init(): void { export function renderResult(widerThanBreakpoint: boolean): void { if (widerThanBreakpoint) { //@ts-ignore - window.egAps.refreshAds([ + window.egAps.render([ "ad-result", "ad-vertical-left", "ad-vertical-right", @@ -23,7 +23,7 @@ export function renderResult(widerThanBreakpoint: boolean): void { ]); } else { //@ts-ignore - window.egAps.refreshAds([ + window.egAps.render([ "ad-result-small", "ad-vertical-left", "ad-vertical-right", @@ -45,21 +45,20 @@ export function reinstate(): boolean { export async function refreshVisible(): Promise { //@ts-ignore - const adDivs = Object.keys(window.egAdPack.gptAdSlots); - const visibleAdDivs = []; - - for (let i = 0; i < adDivs.length; i++) { - const el = document.querySelectorAll( - "[data-adunit-name='" + adDivs[i] + "']" - )[0]; - if (!el) continue; - const elParent = el.parentElement as HTMLElement; - if ( - window.getComputedStyle(elParent).getPropertyValue("display") != "none" - ) { - visibleAdDivs.push(adDivs[i]); - } - } - //@ts-ignore - window.egAps.refreshAds(visibleAdDivs); + // const adDivs = Object.keys(window.egAdPack.gptAdSlots); + // const visibleAdDivs = []; + // for (let i = 0; i < adDivs.length; i++) { + // const el = document.querySelectorAll( + // "[data-adunit-name='" + adDivs[i] + "']" + // )[0]; + // if (!el) continue; + // const elParent = el.parentElement as HTMLElement; + // if ( + // window.getComputedStyle(elParent).getPropertyValue("display") != "none" + // ) { + // visibleAdDivs.push(adDivs[i]); + // } + // } + // //@ts-ignore + // window.egAps.refreshAds(visibleAdDivs); } From ee393978df0c7959101c7300a1d2d3f0a8e56d6f Mon Sep 17 00:00:00 2001 From: Miodec Date: Mon, 27 Mar 2023 22:24:29 +0200 Subject: [PATCH 39/50] removed duplicates --- frontend/static/languages/chinese_traditional.json | 1 - frontend/static/languages/turkish_1k.json | 4 ---- 2 files changed, 5 deletions(-) diff --git a/frontend/static/languages/chinese_traditional.json b/frontend/static/languages/chinese_traditional.json index fcd3aaefd..b7f34514e 100644 --- a/frontend/static/languages/chinese_traditional.json +++ b/frontend/static/languages/chinese_traditional.json @@ -194,7 +194,6 @@ "清新", "清爽", "清晨", - "青蛙", "情緒", "情感", "親情", diff --git a/frontend/static/languages/turkish_1k.json b/frontend/static/languages/turkish_1k.json index 0e1dee60f..c42346ade 100644 --- a/frontend/static/languages/turkish_1k.json +++ b/frontend/static/languages/turkish_1k.json @@ -306,7 +306,6 @@ "oldu", "vardır", "at", - "bu", "tarafından", "sıcak", "kelime", @@ -359,7 +358,6 @@ "düşük", "hat", "dönüş", - "yani", "sağ", "orada", "yukarı", @@ -380,7 +378,6 @@ "çağrı", "may", "aşağı", - "şimdi", "kafa", "standı", "sayfa", @@ -730,7 +727,6 @@ "elbise", "bulut", "sürpriz", - "sessiz", "taş", "küçücük", "tırmanış", From 3bbb6d3a849c83e6bfb4248c5ca700a79dfa7654 Mon Sep 17 00:00:00 2001 From: Miodec Date: Tue, 28 Mar 2023 15:39:11 +0200 Subject: [PATCH 40/50] better logging --- frontend/src/ts/test/test-input.ts | 115 ++++++++++++++++++++++------- frontend/src/ts/test/test-logic.ts | 11 ++- 2 files changed, 96 insertions(+), 30 deletions(-) diff --git a/frontend/src/ts/test/test-input.ts b/frontend/src/ts/test/test-input.ts index 282c2afd2..06e28cf70 100644 --- a/frontend/src/ts/test/test-input.ts +++ b/frontend/src/ts/test/test-input.ts @@ -229,48 +229,110 @@ export function setKeypressTimingsTooLong(): void { const keysObj: Record = {}; -let t1 = 0; -let d1 = 0; - export function pushKeypressDuration(val: number): void { - t1 += val; - d1++; (keypressTimings.duration.array as number[]).push(roundTo2(val)); } export function setKeypressDuration(val: number): void { keypressTimings.duration.current = roundTo2(val); } - -let t2 = 0; -let d2 = 0; -let a: number[] = []; +let newKeypresDurationArray: number[] = []; export function recordKeyupTime(key: string): void { const now = performance.now(); const diff = Math.abs(keysObj[key] - now); + newKeypresDurationArray.push(roundTo2(diff)); + delete keysObj[key]; - t2 += diff; - d2++; - a.push(roundTo2(diff)); + updateOverlap(); } export function recordKeydownTime(key: string): void { keysObj[key] = performance.now(); + + updateOverlap(); } -export function logOldAndNew(): void { +let totalOverlap = 0; +let lastOverlapStartTime = -1; +function updateOverlap(): void { + const now = performance.now(); + const keys = Object.keys(keysObj); + if (keys.length > 1) { + if (lastOverlapStartTime === -1) { + lastOverlapStartTime = now; + } + } else { + if (lastOverlapStartTime !== -1) { + totalOverlap += now - lastOverlapStartTime; + lastOverlapStartTime = -1; + } + } + console.log(totalOverlap); +} + +export function logOldAndNew( + wpm: number, + acc: number, + raw: number, + con: number, + test: string, + duration: number +): void { if (!spacingDebug) return; - console.log( - "old", - t1, - d1, - t1 / d1, - keypressTimings.duration.array, - stdDev(keypressTimings.duration.array as number[]), - mean(keypressTimings.duration.array as number[]) - ); - console.log("new", t2, d2, t2 / d2, a, stdDev(a), mean(a)); + // console.log( + // "old", + // t1, + // d1, + // t1 / d1, + // keypressTimings.duration.array, + // stdDev(keypressTimings.duration.array as number[]), + // mean(keypressTimings.duration.array as number[]) + // ); + // console.log("new", t2, d2, t2 / d2, a, stdDev(a), mean(a)); + + console.log("RESULT", { + wpm, + acc, + raw, + con, + test, + duration, + spacing: { + array: keypressTimings.spacing.array, + stdDev: stdDev(keypressTimings.spacing.array as number[]), + mean: mean(keypressTimings.spacing.array as number[]), + min: Math.min(...(keypressTimings.spacing.array as number[])), + max: Math.max(...(keypressTimings.spacing.array as number[])), + total: (keypressTimings.spacing.array as number[]).reduce( + (a, b) => a + b, + 0 + ) as number, + length: keypressTimings.spacing.array.length, + }, + oldDuration: { + array: keypressTimings.duration.array, + stdDev: stdDev(keypressTimings.duration.array as number[]), + mean: mean(keypressTimings.duration.array as number[]), + min: Math.min(...(keypressTimings.duration.array as number[])), + max: Math.max(...(keypressTimings.duration.array as number[])), + total: (keypressTimings.duration.array as number[]).reduce( + (a, b) => a + b, + 0 + ) as number, + length: keypressTimings.duration.array.length, + }, + newDuration: { + array: newKeypresDurationArray, + stdDev: stdDev(newKeypresDurationArray), + mean: mean(newKeypresDurationArray), + min: Math.min(...newKeypresDurationArray), + max: Math.max(...newKeypresDurationArray), + total: newKeypresDurationArray.reduce((a, b) => a + b, 0) as number, + length: newKeypresDurationArray.length, + }, + totalOverlap, + }); } function pushKeypressSpacing(val: number): void { @@ -327,11 +389,8 @@ export function resetKeypressTimings(): void { array: [], }, }; - a = []; - t1 = 0; - d1 = 0; - t2 = 0; - d2 = 0; + newKeypresDurationArray = []; + totalOverlap = 0; if (spacingDebug) console.clear(); } diff --git a/frontend/src/ts/test/test-logic.ts b/frontend/src/ts/test/test-logic.ts index 94c7ae3f3..da2185e1d 100644 --- a/frontend/src/ts/test/test-logic.ts +++ b/frontend/src/ts/test/test-logic.ts @@ -1390,8 +1390,6 @@ function buildCompletedEvent(difficultyFailed: boolean): CompletedEvent { afkDuration: undefined, }; - TestInput.logOldAndNew(); - // stats const stats = TestStats.calculateStats(); if (stats.time % 1 != 0 && Config.mode !== "time") { @@ -1514,6 +1512,15 @@ function buildCompletedEvent(difficultyFailed: boolean): CompletedEvent { if (completedEvent.mode != "custom") delete completedEvent.customText; + TestInput.logOldAndNew( + completedEvent.wpm, + completedEvent.acc, + completedEvent.rawWpm, + completedEvent.consistency, + `${completedEvent.mode} ${completedEvent.mode2}`, + completedEvent.testDuration + ); + return completedEvent; } From 7bffb095b7e45ad7b1e517f1ac4f6128d8acb3d3 Mon Sep 17 00:00:00 2001 From: Miodec Date: Wed, 5 Apr 2023 23:47:00 +0200 Subject: [PATCH 41/50] better spacing debug --- .../src/ts/controllers/input-controller.ts | 9 ---- frontend/src/ts/test/test-input.ts | 43 ++++++++++++++++--- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/frontend/src/ts/controllers/input-controller.ts b/frontend/src/ts/controllers/input-controller.ts index 43eaa19a9..ded10b2d2 100644 --- a/frontend/src/ts/controllers/input-controller.ts +++ b/frontend/src/ts/controllers/input-controller.ts @@ -824,15 +824,6 @@ $(document).keydown(async (event) => { return; } - if (TestInput.spacingDebug) { - console.log( - "spacing debug", - "keypress", - event.key, - "length", - TestInput.keypressTimings.spacing.array.length - ); - } TestInput.setKeypressNotAfk(); //blocking firefox from going back in history with backspace diff --git a/frontend/src/ts/test/test-input.ts b/frontend/src/ts/test/test-input.ts index 9bc9cdc8a..aa0381f4c 100644 --- a/frontend/src/ts/test/test-input.ts +++ b/frontend/src/ts/test/test-input.ts @@ -322,14 +322,36 @@ export function recordKeyupTime(key: string): void { } export function recordKeydownTime(key: string): void { - if (!keysToTrack.includes(key)) return; + if (!keysToTrack.includes(key)) { + if (spacingDebug) { + console.log( + "spacing debug", + "key not tracked", + key, + "spacing array", + keypressTimings.spacing.array.length + ); + } + return; + } if (key === "Android") { key = "Android" + androidIndex; androidIndex++; } - if (keyDownData[key] !== undefined) return; + if (keyDownData[key] !== undefined) { + if (spacingDebug) { + console.log( + "spacing debug", + "key already down", + key, + "spacing array", + keypressTimings.spacing.array.length + ); + } + return; + } const now = performance.now(); @@ -348,8 +370,8 @@ export function recordKeydownTime(key: string): void { console.log( "spacing debug", "recorded", - "key", - "length", + key, + "spacing array", keypressTimings.spacing.array.length, "val", roundTo2(diff) @@ -359,6 +381,9 @@ export function recordKeydownTime(key: string): void { keypressTimings.spacing.last = now; if (keypressTimings.spacing.first === -1) { keypressTimings.spacing.first = now; + if (spacingDebug) { + console.log("spacing debug", "saved first", now); + } } } @@ -393,7 +418,12 @@ export function resetKeypressTimings(): void { }; keyDownData = {}; androidIndex = 0; - if (spacingDebug) console.clear(); + if (spacingDebug) { + console.clear(); + if (spacingDebug) { + console.log("spacing debug", "reset keypress timings"); + } + } } export function pushMissedWord(word: string): void { @@ -448,4 +478,7 @@ export function restart(): void { array: [], }, }; + if (spacingDebug) { + console.log("spacing debug", "restart"); + } } From 2c893a44751c38b84fa39051cfccda2debc7bb04 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 6 Apr 2023 21:50:40 +0200 Subject: [PATCH 42/50] checking performance.now once, and passing it around checking performance.now before a setTimeout setting test end as soon as possible --- .../src/ts/controllers/input-controller.ts | 15 ++++++----- frontend/src/ts/test/test-input.ts | 11 +++----- frontend/src/ts/test/test-logic.ts | 26 +++++++++++++------ 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/frontend/src/ts/controllers/input-controller.ts b/frontend/src/ts/controllers/input-controller.ts index ded10b2d2..881ba3c7d 100644 --- a/frontend/src/ts/controllers/input-controller.ts +++ b/frontend/src/ts/controllers/input-controller.ts @@ -394,6 +394,9 @@ function handleChar( if (TestUI.resultCalculating || TestUI.resultVisible) { return; } + + const now = performance.now(); + const isCharKorean: boolean = TestInput.input.getKoreanStatus(); if (char === "…") { for (let i = 0; i < 3; i++) { @@ -442,7 +445,7 @@ function handleChar( } //start the test - if (!TestState.isActive && !TestLogic.startTest()) { + if (!TestState.isActive && !TestLogic.startTest(now)) { return; } @@ -464,7 +467,7 @@ function handleChar( } if (TestInput.input.current === "") { - TestInput.setBurstStart(performance.now()); + TestInput.setBurstStart(now); } if (!isCharKorean && !Config.language.startsWith("korean")) { @@ -958,21 +961,21 @@ $(document).keydown(async (event) => { $("#wordsInput").keydown((event) => { if (event.originalEvent?.repeat) return; - + const now = performance.now(); setTimeout(() => { const isAndroid = event.key === "Unidentified" && event.code === "" && event.which === 229; - TestInput.recordKeydownTime(isAndroid ? "Android" : event.code); + TestInput.recordKeydownTime(now, isAndroid ? "Android" : event.code); }, 0); }); $("#wordsInput").keyup((event) => { if (event.originalEvent?.repeat) return; - + const now = performance.now(); setTimeout(() => { const isAndroid = event.key === "Unidentified" && event.code === "" && event.which === 229; - TestInput.recordKeyupTime(isAndroid ? "Android" : event.code); + TestInput.recordKeyupTime(now, isAndroid ? "Android" : event.code); }, 0); }); diff --git a/frontend/src/ts/test/test-input.ts b/frontend/src/ts/test/test-input.ts index aa0381f4c..ecfd74711 100644 --- a/frontend/src/ts/test/test-input.ts +++ b/frontend/src/ts/test/test-input.ts @@ -285,7 +285,7 @@ export function incrementAccuracy(correctincorrect: boolean): void { } } -export function forceKeyup(): void { +export function forceKeyup(now: number): void { //using mean here because for words mode, the last keypress ends the test. //if we then force keyup on that last keypress, it will record a duration of 0 //skewing the average and standard deviation @@ -293,7 +293,7 @@ export function forceKeyup(): void { const keysOrder = Object.entries(keyDownData); keysOrder.sort((a, b) => a[1].timestamp - b[1].timestamp); for (let i = 0; i < keysOrder.length - 1; i++) { - recordKeyupTime(keysOrder[i][0]); + recordKeyupTime(now, keysOrder[i][0]); } const last = keysOrder[keysOrder.length - 1]; if (last !== undefined) { @@ -303,7 +303,7 @@ export function forceKeyup(): void { let androidIndex = 0; -export function recordKeyupTime(key: string): void { +export function recordKeyupTime(now: number, key: string): void { if (!keysToTrack.includes(key)) return; if (key === "Android") { @@ -313,7 +313,6 @@ export function recordKeyupTime(key: string): void { if (keyDownData[key] === undefined) return; - const now = performance.now(); const diff = Math.abs(keyDownData[key].timestamp - now); keypressTimings.duration.array[keyDownData[key].index] = diff; delete keyDownData[key]; @@ -321,7 +320,7 @@ export function recordKeyupTime(key: string): void { updateOverlap(now); } -export function recordKeydownTime(key: string): void { +export function recordKeydownTime(now: number, key: string): void { if (!keysToTrack.includes(key)) { if (spacingDebug) { console.log( @@ -353,8 +352,6 @@ export function recordKeydownTime(key: string): void { return; } - const now = performance.now(); - keyDownData[key] = { timestamp: now, index: keypressTimings.duration.array.length, diff --git a/frontend/src/ts/test/test-logic.ts b/frontend/src/ts/test/test-logic.ts index f4aa96748..b444df9a4 100644 --- a/frontend/src/ts/test/test-logic.ts +++ b/frontend/src/ts/test/test-logic.ts @@ -307,7 +307,7 @@ async function applyEnglishPunctuationToWord(word: string): Promise { return EnglishPunctuation.replace(word); } -export function startTest(): boolean { +export function startTest(now: number): boolean { if (PageTransition.get()) { return false; } @@ -348,7 +348,7 @@ export function startTest(): boolean { } } catch (e) {} //use a recursive self-adjusting timer to avoid time drift - TestStats.setStart(performance.now()); + TestStats.setStart(now); TestTimer.start(); return true; } @@ -1386,9 +1386,7 @@ function buildCompletedEvent(difficultyFailed: boolean): CompletedEvent { Config.mode === "zen" ? 0 : Misc.roundTo2(TestStats.end - TestInput.keypressTimings.spacing.last), - startToFirstKey: Misc.roundTo2( - TestInput.keypressTimings.spacing.first - TestStats.start - ), + startToFirstKey: undefined, consistency: undefined, keyConsistency: undefined, funbox: Config.funbox, @@ -1403,6 +1401,16 @@ function buildCompletedEvent(difficultyFailed: boolean): CompletedEvent { afkDuration: undefined, }; + const stfk = Misc.roundTo2( + TestInput.keypressTimings.spacing.first - TestStats.start + ); + + if (stfk > 0) { + completedEvent.startToFirstKey = stfk; + } else { + completedEvent.startToFirstKey = 0; + } + // stats const stats = TestStats.calculateStats(); if (stats.time % 1 != 0 && Config.mode !== "time") { @@ -1527,19 +1535,21 @@ function buildCompletedEvent(difficultyFailed: boolean): CompletedEvent { } export async function finish(difficultyFailed = false): Promise { - await Misc.sleep(1); //this is needed to make sure the last keypress is registered if (!TestState.isActive) return; + const now = performance.now(); + TestStats.setEnd(now); + + await Misc.sleep(1); //this is needed to make sure the last keypress is registered if (TestInput.input.current.length != 0) { TestInput.input.pushHistory(); TestInput.corrected.pushHistory(); Replay.replayGetWordsList(TestInput.input.history); } - TestInput.forceKeyup(); //this ensures that the last keypress(es) are registered + TestInput.forceKeyup(now); //this ensures that the last keypress(es) are registered TestUI.setResultCalculating(true); TestUI.setResultVisible(true); - TestStats.setEnd(performance.now()); TestState.setActive(false); Replay.stopReplayRecording(); Focus.set(false); From 7c23d92204e1814f71f53ffa315d2cbf12e7ecf2 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 6 Apr 2023 23:03:17 +0200 Subject: [PATCH 43/50] fixed 422 errors --- frontend/src/ts/test/test-logic.ts | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/frontend/src/ts/test/test-logic.ts b/frontend/src/ts/test/test-logic.ts index b444df9a4..b54b24077 100644 --- a/frontend/src/ts/test/test-logic.ts +++ b/frontend/src/ts/test/test-logic.ts @@ -1382,10 +1382,7 @@ function buildCompletedEvent(difficultyFailed: boolean): CompletedEvent { keySpacing: TestInput.keypressTimings.spacing.array, keyDuration: TestInput.keypressTimings.duration.array, keyOverlap: Misc.roundTo2(TestInput.keyOverlap.total), - lastKeyToEnd: - Config.mode === "zen" - ? 0 - : Misc.roundTo2(TestStats.end - TestInput.keypressTimings.spacing.last), + lastKeyToEnd: undefined, startToFirstKey: undefined, consistency: undefined, keyConsistency: undefined, @@ -1405,10 +1402,20 @@ function buildCompletedEvent(difficultyFailed: boolean): CompletedEvent { TestInput.keypressTimings.spacing.first - TestStats.start ); - if (stfk > 0) { - completedEvent.startToFirstKey = stfk; - } else { + if (stfk < 0) { completedEvent.startToFirstKey = 0; + } else { + completedEvent.startToFirstKey = stfk; + } + + const lkte = Misc.roundTo2( + TestStats.end - TestInput.keypressTimings.spacing.last + ); + + if (lkte < 0 || Config.mode === "zen") { + completedEvent.lastKeyToEnd = 0; + } else { + completedEvent.lastKeyToEnd = lkte; } // stats From 3da51235020e24762aa7c07f16d1560f7c850636 Mon Sep 17 00:00:00 2001 From: Miodec Date: Tue, 11 Apr 2023 18:12:55 +0200 Subject: [PATCH 44/50] possible fix for powertoys bug? --- frontend/src/ts/controllers/input-controller.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/src/ts/controllers/input-controller.ts b/frontend/src/ts/controllers/input-controller.ts index 3e6e425ed..1e0624281 100644 --- a/frontend/src/ts/controllers/input-controller.ts +++ b/frontend/src/ts/controllers/input-controller.ts @@ -970,6 +970,10 @@ $("#wordsInput").keydown((event) => { console.log("spacing debug keydown", event.key, event.code, event.which); } + if (event.key === " ") { + event.code = "Space"; //powertoys bug + } + const now = performance.now(); setTimeout(() => { const isAndroid = @@ -985,6 +989,10 @@ $("#wordsInput").keyup((event) => { console.log("spacing debug keyup", event.key, event.code, event.which); } + if (event.key === " ") { + event.code = "Space"; //powertoys bug + } + const now = performance.now(); setTimeout(() => { const isAndroid = From 12698550b97c22c4f6c7d419abc899119c371e23 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 13 Apr 2023 15:23:12 +0200 Subject: [PATCH 45/50] added fallback for no key location code (not just android) should fix some of the result validation errors --- .../src/ts/controllers/input-controller.ts | 12 ++++++------ frontend/src/ts/test/test-input.ts | 18 +++++++++--------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/frontend/src/ts/controllers/input-controller.ts b/frontend/src/ts/controllers/input-controller.ts index 0add51422..d92b71ba5 100644 --- a/frontend/src/ts/controllers/input-controller.ts +++ b/frontend/src/ts/controllers/input-controller.ts @@ -993,9 +993,8 @@ $("#wordsInput").keydown((event) => { const now = performance.now(); setTimeout(() => { - const isAndroid = - event.key === "Unidentified" && event.code === "" && event.which === 229; - TestInput.recordKeydownTime(now, isAndroid ? "Android" : event.code); + const eventCode = event.code === "" ? "NoCode" : event.code; + TestInput.recordKeydownTime(now, eventCode); }, 0); }); @@ -1010,11 +1009,12 @@ $("#wordsInput").keyup((event) => { event.code = "Space"; //powertoys bug } + event.code = ""; + const now = performance.now(); setTimeout(() => { - const isAndroid = - event.key === "Unidentified" && event.code === "" && event.which === 229; - TestInput.recordKeyupTime(now, isAndroid ? "Android" : event.code); + const eventCode = event.code === "" ? "NoCode" : event.code; + TestInput.recordKeyupTime(now, eventCode); }, 0); }); diff --git a/frontend/src/ts/test/test-input.ts b/frontend/src/ts/test/test-input.ts index 0b3f801bf..7f93c50ea 100644 --- a/frontend/src/ts/test/test-input.ts +++ b/frontend/src/ts/test/test-input.ts @@ -67,7 +67,7 @@ const keysToTrack = [ "Period", "Slash", "Space", - "Android", //smells + "NoCode", //android (smells) and some keyboards might send no location data - need to use this as a fallback ]; interface Keypress { @@ -318,14 +318,14 @@ export function forceKeyup(now: number): void { } } -let androidIndex = 0; +let noCodeIndex = 0; export function recordKeyupTime(now: number, key: string): void { if (!keysToTrack.includes(key)) return; - if (key === "Android") { - androidIndex--; - key = "Android" + androidIndex; + if (key === "NoCode") { + noCodeIndex--; + key = "NoCode" + noCodeIndex; } if (keyDownData[key] === undefined) return; @@ -351,9 +351,9 @@ export function recordKeydownTime(now: number, key: string): void { return; } - if (key === "Android") { - key = "Android" + androidIndex; - androidIndex++; + if (key === "NoCode") { + key = "NoCode" + noCodeIndex; + noCodeIndex++; } if (keyDownData[key] !== undefined) { @@ -431,7 +431,7 @@ export function resetKeypressTimings(): void { lastStartTime: -1, }; keyDownData = {}; - androidIndex = 0; + noCodeIndex = 0; if (spacingDebug) { console.clear(); if (spacingDebug) { From c87bb14cc06d9511982f50d0cbb716b29a4f4192 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 13 Apr 2023 15:33:15 +0200 Subject: [PATCH 46/50] stupid mistakes man --- frontend/src/ts/controllers/input-controller.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/src/ts/controllers/input-controller.ts b/frontend/src/ts/controllers/input-controller.ts index d92b71ba5..7f8cee052 100644 --- a/frontend/src/ts/controllers/input-controller.ts +++ b/frontend/src/ts/controllers/input-controller.ts @@ -1009,8 +1009,6 @@ $("#wordsInput").keyup((event) => { event.code = "Space"; //powertoys bug } - event.code = ""; - const now = performance.now(); setTimeout(() => { const eventCode = event.code === "" ? "NoCode" : event.code; From 335e01fbbc5f5527837eeb8ea3d5934b1e753882 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 13 Apr 2023 17:46:47 +0200 Subject: [PATCH 47/50] trying a new approach to NoCode to cover more edge cases --- .../src/ts/controllers/input-controller.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/frontend/src/ts/controllers/input-controller.ts b/frontend/src/ts/controllers/input-controller.ts index 7f8cee052..78d1831c7 100644 --- a/frontend/src/ts/controllers/input-controller.ts +++ b/frontend/src/ts/controllers/input-controller.ts @@ -987,13 +987,14 @@ $("#wordsInput").keydown((event) => { console.log("spacing debug keydown", event.key, event.code, event.which); } - if (event.key === " ") { - event.code = "Space"; //powertoys bug - } + // if (event.key === " ") { + // event.code = "Space"; //powertoys bug + // } const now = performance.now(); setTimeout(() => { - const eventCode = event.code === "" ? "NoCode" : event.code; + const eventCode = + event.code === "" || event.which === 231 ? "NoCode" : event.code; TestInput.recordKeydownTime(now, eventCode); }, 0); }); @@ -1005,13 +1006,14 @@ $("#wordsInput").keyup((event) => { console.log("spacing debug keyup", event.key, event.code, event.which); } - if (event.key === " ") { - event.code = "Space"; //powertoys bug - } + // if (event.key === " ") { + // event.code = "Space"; //powertoys bug + // } const now = performance.now(); setTimeout(() => { - const eventCode = event.code === "" ? "NoCode" : event.code; + const eventCode = + event.code === "" || event.which === 231 ? "NoCode" : event.code; TestInput.recordKeyupTime(now, eventCode); }, 0); }); From b059b72c6bc78872ea6ea4b5f1b516d59688abe0 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 13 Apr 2023 15:33:15 +0200 Subject: [PATCH 48/50] stupid mistakes man --- frontend/src/ts/controllers/input-controller.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/src/ts/controllers/input-controller.ts b/frontend/src/ts/controllers/input-controller.ts index d92b71ba5..7f8cee052 100644 --- a/frontend/src/ts/controllers/input-controller.ts +++ b/frontend/src/ts/controllers/input-controller.ts @@ -1009,8 +1009,6 @@ $("#wordsInput").keyup((event) => { event.code = "Space"; //powertoys bug } - event.code = ""; - const now = performance.now(); setTimeout(() => { const eventCode = event.code === "" ? "NoCode" : event.code; From 9f72a193e102ad6642f38e4d0d6a13cfea1dc317 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 13 Apr 2023 17:46:47 +0200 Subject: [PATCH 49/50] trying a new approach to NoCode to cover more edge cases --- .../src/ts/controllers/input-controller.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/frontend/src/ts/controllers/input-controller.ts b/frontend/src/ts/controllers/input-controller.ts index 7f8cee052..78d1831c7 100644 --- a/frontend/src/ts/controllers/input-controller.ts +++ b/frontend/src/ts/controllers/input-controller.ts @@ -987,13 +987,14 @@ $("#wordsInput").keydown((event) => { console.log("spacing debug keydown", event.key, event.code, event.which); } - if (event.key === " ") { - event.code = "Space"; //powertoys bug - } + // if (event.key === " ") { + // event.code = "Space"; //powertoys bug + // } const now = performance.now(); setTimeout(() => { - const eventCode = event.code === "" ? "NoCode" : event.code; + const eventCode = + event.code === "" || event.which === 231 ? "NoCode" : event.code; TestInput.recordKeydownTime(now, eventCode); }, 0); }); @@ -1005,13 +1006,14 @@ $("#wordsInput").keyup((event) => { console.log("spacing debug keyup", event.key, event.code, event.which); } - if (event.key === " ") { - event.code = "Space"; //powertoys bug - } + // if (event.key === " ") { + // event.code = "Space"; //powertoys bug + // } const now = performance.now(); setTimeout(() => { - const eventCode = event.code === "" ? "NoCode" : event.code; + const eventCode = + event.code === "" || event.which === 231 ? "NoCode" : event.code; TestInput.recordKeyupTime(now, eventCode); }, 0); }); From f053ca2c9656f41a7003ceef405a6bab7c1edafe Mon Sep 17 00:00:00 2001 From: Miodec Date: Mon, 17 Apr 2023 16:47:39 +0200 Subject: [PATCH 50/50] stopped ab test, removed ab test tracking code --- backend/src/api/controllers/psa.ts | 15 +------------- backend/src/utils/prometheus.ts | 10 ---------- frontend/src/ts/ape/endpoints/psas.ts | 5 +---- frontend/src/ts/controllers/ad-controller.ts | 21 ++++++++++---------- frontend/src/ts/elements/psa.ts | 3 +-- 5 files changed, 14 insertions(+), 40 deletions(-) diff --git a/backend/src/api/controllers/psa.ts b/backend/src/api/controllers/psa.ts index 8d6fe55d7..18a3e31b9 100644 --- a/backend/src/api/controllers/psa.ts +++ b/backend/src/api/controllers/psa.ts @@ -1,20 +1,7 @@ import * as PsaDAL from "../../dal/psa"; import { MonkeyResponse } from "../../utils/monkey-response"; -import { recordAdAbTest } from "../../utils/prometheus"; - -export async function getPsas( - req: MonkeyTypes.Request -): Promise { - const { adChoice: adChoiceRaw } = req.query; - - //ensure adchoice raw is a string and either "pw" or "eg" - const adChoice = - typeof adChoiceRaw === "string" && ["pw", "eg"].includes(adChoiceRaw) - ? adChoiceRaw - : "unknown"; - - recordAdAbTest(adChoice); +export async function getPsas(): Promise { const data = await PsaDAL.get(); return new MonkeyResponse("PSAs retrieved", data); } diff --git a/backend/src/utils/prometheus.ts b/backend/src/utils/prometheus.ts index e0b93ba99..17c250ab7 100644 --- a/backend/src/utils/prometheus.ts +++ b/backend/src/utils/prometheus.ts @@ -322,13 +322,3 @@ export function recordTimeToCompleteJob( timeToCompleteJobTotal.inc({ queueName, jobName }, time); timeToCompleteJobCount.inc({ queueName, jobName }); } - -const adAbTest = new Counter({ - name: "ad_ab_test", - help: "Ad AB test", - labelNames: ["provider"], -}); - -export function recordAdAbTest(provider: string): void { - adAbTest.inc({ provider }); -} diff --git a/frontend/src/ts/ape/endpoints/psas.ts b/frontend/src/ts/ape/endpoints/psas.ts index 8516a4b8b..9e8065bd5 100644 --- a/frontend/src/ts/ape/endpoints/psas.ts +++ b/frontend/src/ts/ape/endpoints/psas.ts @@ -7,14 +7,11 @@ export default class Psas { this.httpClient = httpClient; } - async get(adChoice: string): Ape.EndpointData { + async get(): Ape.EndpointData { return await this.httpClient.get(BASE_PATH, { headers: { "Client-Version": CLIENT_VERSION, }, - searchQuery: { - adChoice, - }, }); } } diff --git a/frontend/src/ts/controllers/ad-controller.ts b/frontend/src/ts/controllers/ad-controller.ts index 6f8a7cc15..4b17f5b88 100644 --- a/frontend/src/ts/controllers/ad-controller.ts +++ b/frontend/src/ts/controllers/ad-controller.ts @@ -18,18 +18,19 @@ let initialised = false; export let adBlock: boolean; export let cookieBlocker: boolean; -export let choice: "eg" | "pw" = Math.random() < 0.5 ? "eg" : "pw"; +// export let choice: "eg" | "pw" = Math.random() < 0.5 ? "eg" : "pw"; +export const choice: "eg" | "pw" = "eg"; -console.log("AB choice: " + choice); +// console.log("AB choice: " + choice); -const adChoiceForce = window.localStorage.getItem("adChoiceForce"); -if (adChoiceForce === "eg") { - choice = "eg"; - console.log("AB choice forced: " + choice); -} else if (adChoiceForce === "pw") { - choice = "pw"; - console.log("AB choice forced: " + choice); -} +// const adChoiceForce = window.localStorage.getItem("adChoiceForce"); +// if (adChoiceForce === "eg") { +// choice = "eg"; +// console.log("AB choice forced: " + choice); +// } else if (adChoiceForce === "pw") { +// choice = "pw"; +// console.log("AB choice forced: " + choice); +// } export function init(): void { if (choice === "eg") { diff --git a/frontend/src/ts/elements/psa.ts b/frontend/src/ts/elements/psa.ts index 4f1bb5cc5..7309597fe 100644 --- a/frontend/src/ts/elements/psa.ts +++ b/frontend/src/ts/elements/psa.ts @@ -3,7 +3,6 @@ import { isLocalhost, secondsToString } from "../utils/misc"; import * as Notifications from "./notifications"; import format from "date-fns/format"; import * as Alerts from "./alerts"; -import { choice } from "../controllers/ad-controller"; function clearMemory(): void { window.localStorage.setItem("confirmedPSAs", JSON.stringify([])); @@ -20,7 +19,7 @@ function setMemory(id: string): void { } async function getLatest(): Promise { - const response = await Ape.psas.get(choice); + const response = await Ape.psas.get(); if (response.status === 500) { if (isLocalhost()) { Notifications.addBanner(