summaryrefslogtreecommitdiff
path: root/freecap
diff options
context:
space:
mode:
authorspiderr <spiderr@bitweaver.org>2020-08-12 12:23:27 -0400
committerspiderr <spiderr@bitweaver.org>2020-08-12 12:23:27 -0400
commit9505b7a4c2e117bf555a739d22d13a72d1ba072a (patch)
tree491bd7336a9ae7bb8fc781a4807e134d4fd586d0 /freecap
parent0c20b1f6b3b5647c63609f3899fa106ab74d33c3 (diff)
downloadusers-9505b7a4c2e117bf555a739d22d13a72d1ba072a.tar.gz
users-9505b7a4c2e117bf555a739d22d13a72d1ba072a.tar.bz2
users-9505b7a4c2e117bf555a739d22d13a72d1ba072a.zip
move all captcha code to users/
Diffstat (limited to 'freecap')
-rw-r--r--freecap/.ht_freecap_font1.gdfbin0 -> 44216 bytes
-rw-r--r--freecap/.ht_freecap_font2.gdfbin0 -> 44216 bytes
-rw-r--r--freecap/.ht_freecap_font3.gdfbin0 -> 44216 bytes
-rw-r--r--freecap/.ht_freecap_font4.gdfbin0 -> 44216 bytes
-rw-r--r--freecap/.ht_freecap_font5.gdfbin0 -> 44216 bytes
-rw-r--r--freecap/.ht_freecap_im1.jpgbin0 -> 84564 bytes
-rw-r--r--freecap/.ht_freecap_im2.jpgbin0 -> 111193 bytes
-rw-r--r--freecap/.ht_freecap_im3.jpgbin0 -> 69645 bytes
-rw-r--r--freecap/.ht_freecap_im4.jpgbin0 -> 46182 bytes
-rw-r--r--freecap/.ht_freecap_im5.jpgbin0 -> 62563 bytes
-rw-r--r--freecap/.ht_freecap_words6698
-rw-r--r--freecap/COPYING.txt340
-rw-r--r--freecap/freecap.php827
-rw-r--r--freecap/freecap_wrap.php125
14 files changed, 7990 insertions, 0 deletions
diff --git a/freecap/.ht_freecap_font1.gdf b/freecap/.ht_freecap_font1.gdf
new file mode 100644
index 0000000..6f44158
--- /dev/null
+++ b/freecap/.ht_freecap_font1.gdf
Binary files differ
diff --git a/freecap/.ht_freecap_font2.gdf b/freecap/.ht_freecap_font2.gdf
new file mode 100644
index 0000000..0f549c2
--- /dev/null
+++ b/freecap/.ht_freecap_font2.gdf
Binary files differ
diff --git a/freecap/.ht_freecap_font3.gdf b/freecap/.ht_freecap_font3.gdf
new file mode 100644
index 0000000..fbea123
--- /dev/null
+++ b/freecap/.ht_freecap_font3.gdf
Binary files differ
diff --git a/freecap/.ht_freecap_font4.gdf b/freecap/.ht_freecap_font4.gdf
new file mode 100644
index 0000000..f9f4b6a
--- /dev/null
+++ b/freecap/.ht_freecap_font4.gdf
Binary files differ
diff --git a/freecap/.ht_freecap_font5.gdf b/freecap/.ht_freecap_font5.gdf
new file mode 100644
index 0000000..fe123f8
--- /dev/null
+++ b/freecap/.ht_freecap_font5.gdf
Binary files differ
diff --git a/freecap/.ht_freecap_im1.jpg b/freecap/.ht_freecap_im1.jpg
new file mode 100644
index 0000000..823678e
--- /dev/null
+++ b/freecap/.ht_freecap_im1.jpg
Binary files differ
diff --git a/freecap/.ht_freecap_im2.jpg b/freecap/.ht_freecap_im2.jpg
new file mode 100644
index 0000000..e9ad645
--- /dev/null
+++ b/freecap/.ht_freecap_im2.jpg
Binary files differ
diff --git a/freecap/.ht_freecap_im3.jpg b/freecap/.ht_freecap_im3.jpg
new file mode 100644
index 0000000..7e3b65d
--- /dev/null
+++ b/freecap/.ht_freecap_im3.jpg
Binary files differ
diff --git a/freecap/.ht_freecap_im4.jpg b/freecap/.ht_freecap_im4.jpg
new file mode 100644
index 0000000..f96821c
--- /dev/null
+++ b/freecap/.ht_freecap_im4.jpg
Binary files differ
diff --git a/freecap/.ht_freecap_im5.jpg b/freecap/.ht_freecap_im5.jpg
new file mode 100644
index 0000000..a2800ed
--- /dev/null
+++ b/freecap/.ht_freecap_im5.jpg
Binary files differ
diff --git a/freecap/.ht_freecap_words b/freecap/.ht_freecap_words
new file mode 100644
index 0000000..b1e1312
--- /dev/null
+++ b/freecap/.ht_freecap_words
@@ -0,0 +1,6698 @@
+aback
+abacus
+abaft
+abase
+abaser
+abate
+abated
+abater
+abbess
+abbey
+abbot
+abduct
+abeam
+abhor
+abider
+abject
+abjure
+ablate
+ablaze
+abler
+abloom
+aboard
+abode
+abound
+about
+above
+abroad
+abrupt
+abseil
+absent
+absurd
+abused
+abuses
+abuzz
+abyss
+acacia
+accede
+accent
+accept
+access
+accost
+accrue
+accuse
+acetic
+ached
+achene
+aches
+aching
+acorn
+acquit
+acrid
+across
+acting
+active
+actual
+acuity
+acumen
+acute
+adage
+adagio
+adapt
+addend
+addle
+adduct
+adept
+adhere
+adieu
+adjoin
+adjust
+adman
+admen
+admit
+adobe
+adopts
+adore
+adorn
+adrift
+adroit
+adult
+advent
+advert
+advice
+aegis
+aerial
+aether
+affair
+affine
+affix
+afford
+affray
+afield
+afire
+aflame
+afloat
+afoot
+afore
+afoul
+afraid
+afresh
+after
+afters
+again
+agape
+agate
+agave
+ageing
+ageism
+ageist
+agency
+agenda
+agent
+agents
+aghast
+agile
+agleam
+aglow
+agony
+agouti
+agreer
+ahead
+aided
+airing
+airway
+aisle
+aitch
+alack
+albeit
+albino
+album
+alcove
+aleph
+algae
+algal
+alias
+alibi
+alight
+align
+aligns
+alike
+alive
+alkali
+alkyd
+alkyl
+allay
+allele
+alley
+allier
+allies
+allot
+allots
+allow
+allows
+alloy
+almond
+almost
+alnico
+aloft
+aloha
+alone
+along
+aloof
+aloud
+alpaca
+alpha
+altar
+alter
+alumna
+alumni
+always
+amass
+amaze
+amber
+ambit
+amble
+ambles
+ambush
+amends
+amener
+amerce
+amide
+amidst
+amigo
+amine
+amino
+amiss
+amity
+amnion
+amoeba
+among
+amoral
+amount
+amour
+ampere
+ample
+amulet
+amused
+anders
+angle
+angora
+angry
+angst
+animal
+animus
+anion
+anise
+ankle
+anklet
+annal
+anneal
+annex
+annexe
+annoy
+annual
+annul
+annuli
+annum
+anode
+anoint
+anomic
+anomie
+anorak
+anther
+antic
+antler
+antral
+anvil
+anyhow
+anyone
+anyway
+aorist
+aorta
+apace
+apart
+apathy
+aphid
+apical
+apiece
+apish
+aplomb
+apogee
+apolar
+appeal
+appear
+append
+apple
+applet
+approx
+apron
+apter
+aptest
+arable
+arbour
+arcade
+arcana
+arcane
+ardent
+ardour
+areal
+arena
+areola
+argent
+argon
+argosy
+argot
+argue
+argued
+argues
+aright
+arise
+arisen
+ariser
+armada
+armed
+armer
+armful
+arming
+armlet
+armour
+armpit
+aroma
+arose
+around
+arrack
+arrant
+arras
+array
+arrive
+arrow
+arroyo
+arsine
+arson
+artful
+artist
+ascend
+ascent
+ashen
+asher
+ashlar
+ashore
+ashram
+aside
+asked
+askew
+aslant
+asleep
+aspect
+aspen
+aspic
+assay
+assen
+assent
+asses
+assess
+asset
+assign
+assist
+assize
+assort
+assume
+aster
+astern
+asthma
+astir
+astral
+astray
+astute
+asylum
+ataxia
+ataxic
+atilt
+atlas
+atoll
+atomic
+atonal
+atria
+atrial
+atrium
+attach
+attain
+attar
+attend
+attic
+attire
+attune
+auburn
+audio
+audit
+auger
+aught
+augite
+augur
+augury
+august
+auntie
+aunty
+aural
+aurora
+auteur
+author
+autumn
+auxin
+avant
+avast
+avatar
+avaunt
+avenge
+avenue
+averse
+avert
+avian
+aviary
+avouch
+avowal
+avowed
+avower
+avows
+await
+awake
+award
+aware
+awash
+aweigh
+awful
+awhile
+awing
+awning
+awoke
+awoken
+axial
+azalea
+azure
+babble
+babel
+baboon
+backer
+backup
+bacon
+baddie
+badge
+badger
+badman
+badmen
+bagel
+bagful
+bagged
+baggy
+bailee
+bailer
+bailey
+bails
+bairn
+baiter
+baize
+baked
+bakery
+baking
+balboa
+balder
+baleen
+ballet
+balls
+ballsy
+balmy
+balsa
+balun
+bamboo
+banal
+banana
+banded
+bander
+bandit
+bands
+bandy
+bangle
+banish
+banjo
+banner
+banns
+bantam
+banter
+banyan
+banzai
+baobab
+barbel
+barber
+barfly
+bargy
+barium
+barker
+barley
+baron
+barony
+barque
+barre
+barred
+barrel
+barren
+barrio
+barrow
+barter
+baryon
+basal
+basalt
+based
+baser
+bases
+basher
+basic
+basil
+basing
+basis
+basset
+basso
+baste
+batch
+bated
+bater
+bathe
+bathos
+batik
+bating
+batman
+batmen
+baton
+battle
+batty
+bauble
+baulky
+bawdy
+bawler
+bayou
+bazaar
+beach
+beadle
+beady
+beagle
+beanie
+beano
+bears
+beast
+beaten
+beaut
+beaux
+bebop
+becalm
+became
+beckon
+become
+bedaub
+bedbug
+bedeck
+bedim
+bedlam
+bedpan
+bedsit
+beech
+beefy
+beery
+beetle
+beeves
+befall
+befell
+befit
+befog
+before
+befoul
+began
+beggar
+begin
+begone
+begot
+begum
+begun
+behalf
+behead
+beheld
+behest
+behind
+behold
+behove
+beige
+being
+belate
+belay
+belch
+belfry
+belie
+belief
+belier
+belle
+bellow
+belly
+belong
+below
+belted
+beluga
+beman
+bemire
+bemoan
+bemuse
+bench
+bends
+benign
+benumb
+berate
+bereft
+beret
+berry
+berth
+beryl
+beseem
+beset
+beside
+besot
+bester
+bestir
+bestow
+betake
+betcha
+betel
+bethel
+betide
+betook
+betray
+bevel
+bewail
+beware
+beyond
+bezel
+biased
+bicarb
+biceps
+bicker
+bidden
+bidder
+biddy
+bider
+bidet
+bigamy
+biggie
+bight
+bigot
+bigwig
+bijou
+bijoux
+bikini
+bilge
+billow
+billy
+bimbo
+binary
+binder
+bindle
+binge
+bingen
+bingo
+bionic
+biopic
+biopsy
+biota
+biotin
+biped
+birch
+birdie
+birth
+births
+bisect
+bishop
+bison
+bisque
+bistro
+bitchy
+biting
+bitser
+bitten
+bitty
+bizzes
+black
+blade
+blame
+blanc
+blanch
+bland
+blank
+blare
+blast
+blazon
+bleach
+bleak
+bleary
+bleat
+bleed
+bleep
+blench
+blend
+blight
+blimey
+blimp
+blink
+blinks
+bliss
+blithe
+blitz
+bloat
+block
+bloke
+blond
+blonde
+bloody
+bloom
+bloop
+blotch
+blotto
+blouse
+blown
+blowy
+blowzy
+bluer
+bluest
+bluesy
+bluff
+bluing
+bluish
+blunt
+blurb
+blurry
+blurt
+board
+boards
+boasts
+bobbin
+bobble
+bobby
+bobcat
+boccie
+bodega
+bodice
+bodied
+boding
+bodkin
+boffin
+boggle
+boggy
+bogus
+boiled
+boiler
+bolero
+bolted
+bolter
+bolts
+bolus
+bonbon
+bongo
+bonito
+bonnet
+bonnie
+bonny
+bonsai
+bonus
+bonzes
+booby
+boodle
+boogie
+boohoo
+booked
+bookie
+books
+boomer
+boost
+bootee
+booth
+booty
+booze
+boozy
+borate
+borax
+boring
+borne
+boron
+borzoi
+bosomy
+boson
+bosser
+bossy
+bosun
+botch
+botfly
+bother
+bothy
+bottle
+bough
+bought
+bouncy
+bovine
+bowed
+bowel
+bower
+bowing
+bowser
+bowwow
+bowyer
+boxcar
+boxful
+boxing
+boyer
+boyish
+bracer
+bract
+braid
+brainy
+braise
+brake
+branch
+brand
+brands
+brandy
+brash
+brass
+brassy
+bratty
+brave
+bravo
+brawl
+brawn
+brawny
+brayer
+braze
+brazen
+breach
+bread
+bream
+breech
+breed
+breeze
+breezy
+breve
+brevet
+brewer
+briar
+brick
+bridal
+bride
+bridge
+bridle
+brief
+brier
+bright
+brine
+briner
+bring
+brink
+briny
+brisk
+broach
+broad
+brogue
+broil
+broke
+broken
+broker
+bronc
+bronco
+bronze
+brooch
+broody
+brook
+broom
+brose
+broth
+brown
+brows
+browse
+bruin
+bruise
+bruit
+brunch
+brunet
+brunt
+brush
+bruter
+bubble
+bubbly
+buboes
+bucker
+buckle
+buddy
+budge
+budgie
+buffet
+bugger
+buggy
+bugle
+build
+builds
+bulgy
+bulker
+bulky
+bullet
+bully
+bummed
+bumper
+bumpy
+bunch
+bunchy
+bundle
+bungee
+bunker
+bunkum
+bunny
+burble
+burbs
+burden
+bureau
+burgh
+burgle
+burial
+buried
+burier
+burlap
+burler
+burly
+burned
+burnt
+burrow
+bursa
+bursae
+bursar
+burst
+bursts
+bushel
+busher
+bushy
+buskin
+busman
+busmen
+busted
+butane
+butene
+butler
+butter
+butyl
+buying
+buyout
+byers
+bygone
+byline
+byname
+bypass
+bypath
+byplay
+byroad
+byway
+byword
+cabal
+cabala
+cabana
+caber
+cable
+cacao
+cache
+cacher
+cackle
+cacti
+cactus
+caddie
+caddy
+cadent
+cadet
+cadge
+cadre
+caeca
+caecal
+caecum
+caftan
+cagey
+cagier
+cahoot
+cairn
+calico
+caliph
+calla
+callee
+callow
+calls
+calve
+calves
+calyx
+camel
+cameo
+camion
+camped
+camps
+campus
+campy
+canal
+canard
+canary
+cancan
+cancel
+candid
+candle
+candy
+canine
+caning
+canker
+cannon
+cannot
+canny
+canopy
+canst
+canted
+canter
+canto
+canton
+cantor
+cants
+canvas
+canyon
+caper
+capita
+capon
+capped
+captor
+carafe
+carat
+carboy
+cared
+careen
+career
+cares
+caress
+caret
+cargo
+caries
+caring
+carnal
+carny
+carob
+carol
+carom
+carpal
+carpel
+carpi
+carpus
+carrel
+carrot
+carte
+cartel
+carven
+casaba
+casbah
+cased
+casein
+cashew
+casing
+casino
+cassia
+caste
+castle
+castor
+casual
+catchy
+cater
+catgut
+cation
+catkin
+catnap
+catnip
+cattle
+catty
+caucus
+caudal
+caught
+caulk
+causal
+caused
+caveat
+caver
+cavern
+caves
+cavil
+caving
+cavity
+cavort
+cayman
+cease
+cedar
+celery
+cellar
+cement
+censer
+cereal
+cerise
+cerium
+cermet
+cervix
+chador
+chafe
+chafer
+chaff
+chain
+chaise
+chalet
+chalky
+champ
+chancy
+chant
+chaos
+chapel
+chard
+charge
+chary
+chase
+chasm
+chaste
+chatty
+cheap
+cheat
+check
+checks
+cheek
+cheeky
+cheep
+cheer
+cheery
+cheese
+cheesy
+cheque
+cherry
+chert
+cherub
+chest
+chesty
+chewy
+chicer
+chichi
+chick
+chicle
+chide
+child
+chilli
+chilly
+chime
+chimp
+china
+chine
+chink
+chino
+chintz
+chippy
+chiral
+chirp
+chirpy
+chisel
+chitin
+chive
+chivvy
+chock
+choice
+choir
+chokes
+choler
+chomp
+choose
+choosy
+choppy
+choral
+chord
+chorea
+chorus
+chose
+chosen
+chrism
+chroma
+chrome
+chubby
+chuck
+chuff
+chukka
+chummy
+chump
+chunky
+churl
+churn
+chute
+chyme
+cicada
+cider
+cigar
+cilia
+cilium
+cinch
+cinema
+circa
+circle
+circus
+cirque
+cirri
+cirrus
+cissy
+citron
+citrus
+civet
+civic
+civics
+civil
+clack
+claim
+clammy
+clamp
+clang
+claque
+clash
+clasp
+classy
+clause
+clave
+claver
+clawer
+clean
+cleans
+clear
+cleat
+cleave
+cleft
+clench
+cleric
+clerk
+clever
+clevis
+click
+client
+cliff
+climax
+climb
+clime
+cling
+clingy
+clinic
+clink
+clique
+cloaca
+cloak
+cloche
+clock
+clomp
+clonal
+clone
+clonk
+close
+closed
+closer
+closes
+cloth
+clothe
+clouds
+cloudy
+clout
+clove
+cloven
+clown
+cluck
+clump
+clumpy
+clumsy
+clung
+clunky
+clutch
+coaler
+coarse
+coast
+coated
+coater
+coats
+cobalt
+cobble
+coble
+cobra
+cobweb
+cocci
+coccus
+coccyx
+cockle
+cocky
+cocoa
+cocoon
+coddle
+codec
+coded
+coder
+codex
+codger
+coding
+codon
+coeval
+coffee
+cogent
+cognac
+cohere
+cohort
+cokey
+coleus
+colic
+collar
+colony
+colter
+comae
+combed
+combo
+comedy
+comely
+comer
+comes
+comet
+cometh
+comfit
+comfy
+comic
+coming
+comity
+commie
+commit
+common
+comply
+conch
+conchs
+concur
+condo
+condom
+condor
+confab
+conga
+conger
+conic
+conics
+conman
+conmen
+conner
+consul
+contd
+convex
+convoy
+cooked
+cooker
+cookie
+cooled
+coolie
+cooper
+cootie
+copay
+coper
+copied
+copies
+coping
+copper
+copra
+copse
+copter
+coral
+corbel
+corder
+cords
+corgi
+coring
+corked
+corks
+cornea
+corner
+cornet
+corny
+corona
+corps
+corpse
+corpus
+corral
+corset
+cortex
+corves
+cosign
+cosine
+cosmic
+cosmos
+costly
+cotton
+couch
+cougar
+cough
+could
+counts
+county
+couple
+coupon
+course
+court
+cousin
+covary
+coven
+covers
+covert
+covet
+covey
+coward
+cowboy
+cowpox
+cowrie
+coyed
+coyote
+coypu
+cozen
+crabby
+cradle
+crafty
+craggy
+cramp
+crane
+cranky
+cranny
+crape
+crass
+crate
+crater
+cravat
+crave
+craver
+crawl
+crawly
+craze
+crazy
+creak
+creaky
+creamy
+crease
+create
+credo
+creed
+creeds
+creek
+creel
+creepy
+creme
+creole
+crepe
+crept
+cress
+crest
+cretin
+crewel
+crick
+cries
+crime
+crimp
+cringe
+crises
+crisis
+crispy
+criss
+croak
+croaky
+crock
+crocus
+croft
+crone
+crony
+crook
+croon
+crops
+crouch
+croup
+croupy
+crowds
+crown
+cruddy
+crude
+cruel
+cruet
+cruise
+crumb
+crumby
+crummy
+crump
+crunch
+cruse
+crusty
+crutch
+crypt
+cuber
+cubic
+cubism
+cubit
+cuboid
+cuckoo
+cuddly
+cudgel
+cueing
+culler
+culpa
+cumber
+cumin
+cumuli
+cupful
+cupid
+cupola
+cupric
+curacy
+curare
+curate
+curdle
+curfew
+curia
+curiae
+curial
+curie
+curio
+curium
+curled
+curlew
+curls
+curly
+curry
+curse
+cursed
+cursor
+curtsy
+curve
+curved
+curvy
+cushy
+cussed
+cusser
+cusses
+cutesy
+cutler
+cutlet
+cuttle
+cutup
+cyborg
+cycad
+cycled
+cycler
+cycles
+cyder
+cygnet
+cynic
+cypher
+dabber
+dabble
+dacha
+dactyl
+daddy
+daemon
+daffy
+dahlia
+daily
+dainty
+daisy
+daleth
+dally
+damask
+dammit
+damner
+dampen
+damsel
+damson
+dance
+dandle
+dandy
+danger
+dapper
+dapple
+daring
+darken
+darkly
+dative
+datum
+davit
+dawdle
+daybed
+deaden
+deadly
+deafen
+deals
+dealt
+dearth
+deary
+debar
+debark
+debase
+debate
+debit
+debris
+debtor
+debug
+decade
+decaf
+decal
+decay
+deceit
+decent
+decile
+decoy
+decree
+deduct
+deeds
+deejay
+deepen
+deface
+defame
+defeat
+defend
+defer
+defile
+define
+defog
+deform
+defuse
+degas
+degree
+deign
+deist
+deity
+delay
+delft
+delta
+deluge
+deluxe
+delve
+demean
+demise
+demit
+demob
+demon
+demote
+demur
+demure
+dengue
+denial
+denim
+dense
+denser
+dental
+dented
+dents
+denude
+depart
+depict
+deploy
+depot
+depth
+deputy
+derail
+derby
+derive
+dermal
+dermis
+desalt
+descry
+desert
+desist
+despot
+detain
+deter
+detest
+detox
+detune
+devise
+devote
+devour
+devout
+dewar
+dexes
+dexter
+dhoti
+dials
+diaper
+diatom
+dibble
+dicer
+dices
+dicey
+dicier
+dicing
+dickey
+dicta
+dictum
+diddle
+didst
+diesel
+differ
+digit
+digram
+diker
+diktat
+dilate
+dilute
+dimity
+dimmed
+dimple
+dimply
+dimwit
+dinar
+dinghy
+dingle
+dingo
+dingy
+dinky
+diode
+dioxin
+dipole
+dippy
+dirge
+dirty
+disant
+disarm
+disbar
+disco
+discus
+dismal
+dismay
+dispel
+distal
+distil
+disuse
+ditch
+dither
+ditto
+ditty
+divan
+dived
+divers
+divert
+divest
+divot
+divvy
+dobbin
+docile
+dodder
+dodge
+dodgem
+dodgy
+dogged
+doggo
+doggy
+dogleg
+dogma
+doily
+doing
+doings
+doled
+doles
+doling
+dollar
+dolly
+dolmen
+dolour
+domain
+domes
+domino
+donate
+dongle
+donkey
+donor
+doodle
+dooper
+dopant
+dopey
+dopier
+dorky
+dorsal
+dosage
+dotage
+dotard
+dotty
+double
+doubts
+douche
+dough
+doughy
+douse
+douser
+dowdy
+dowel
+downy
+dowry
+dowse
+doyen
+dozen
+dozer
+draggy
+dragon
+drain
+drake
+drama
+drank
+drawee
+draws
+dreamt
+dreamy
+drear
+dreary
+dredge
+drench
+dressy
+drill
+drippy
+drive
+drivel
+driven
+drives
+drogue
+droll
+droner
+drool
+droop
+droopy
+drops
+dropsy
+dross
+drove
+drown
+drowse
+drowsy
+drudge
+druid
+drunk
+drupe
+dryad
+dryer
+dryish
+dryly
+dubbed
+dubbin
+ducal
+ducat
+duchy
+ducker
+ducky
+ducted
+ducts
+duenna
+duffel
+dugout
+dulcet
+dumdum
+dummy
+dumpy
+dunce
+dunker
+dunno
+dupion
+duple
+duplex
+duress
+during
+durst
+durum
+dusky
+dusty
+duvet
+duxes
+dwarf
+dwell
+dwells
+dwelt
+dybbuk
+dyeing
+dying
+dynamo
+eagle
+eaglet
+earful
+early
+earned
+earthy
+earwax
+earwig
+eased
+easel
+easer
+eases
+easily
+easing
+eater
+eatery
+eating
+ebony
+echoes
+echoic
+eczema
+edging
+edible
+edict
+edited
+editor
+edits
+eerie
+eerily
+efface
+effete
+effigy
+efflux
+eggcup
+egger
+eggnog
+egoism
+egress
+egret
+eider
+eight
+eighty
+either
+eject
+ejecta
+eland
+elans
+elapse
+elate
+elated
+elater
+elbow
+elder
+eldest
+elects
+elegy
+eleven
+elfin
+elfish
+elicit
+elide
+elite
+elixir
+elodea
+elope
+eloper
+eluate
+elute
+elven
+elver
+elves
+elvish
+email
+embalm
+embank
+embark
+embed
+ember
+emblem
+embody
+emboss
+embryo
+emcee
+emend
+emerge
+emery
+emetic
+emote
+employ
+emptor
+empty
+enable
+enact
+enacts
+enamel
+encamp
+encase
+encode
+encore
+encyst
+ending
+endive
+endow
+endue
+enema
+enemy
+enfold
+engage
+engine
+engram
+engulf
+enigma
+enjoin
+enlist
+enmesh
+enmity
+ennui
+enough
+enrage
+enrich
+enrol
+ensign
+ensue
+ensure
+entail
+enters
+entire
+entity
+entomb
+entrap
+entry
+envied
+envoy
+enzyme
+eolith
+epoch
+epochs
+epoxy
+equal
+equine
+equip
+equips
+equity
+equiv
+erase
+erbium
+erect
+ergot
+ermine
+erode
+erotic
+errand
+errant
+errata
+erring
+error
+ersatz
+eschew
+escort
+escrow
+escudo
+esprit
+estate
+esteem
+etalon
+ethane
+ether
+ethic
+ethnic
+ethos
+ethyl
+euchre
+eunuch
+eureka
+evener
+evenly
+event
+evict
+evince
+evoke
+evolve
+exact
+exacts
+excel
+excise
+exempt
+exeunt
+exhume
+exile
+exist
+exodus
+exotic
+expect
+expend
+expert
+expiry
+expose
+extant
+extend
+extent
+extol
+extort
+extra
+exude
+exurb
+eyeful
+eyelet
+eyelid
+fable
+fabled
+fabler
+fables
+fabric
+facer
+facial
+facile
+facing
+facto
+factor
+fading
+faerie
+faint
+faire
+fairly
+fairy
+fakir
+falcon
+fallen
+fallow
+falls
+false
+falter
+family
+famine
+famish
+famous
+fanout
+farad
+farce
+farer
+farina
+farrow
+fascia
+fasten
+fatale
+fatso
+fatten
+fatty
+fatwa
+fault
+faulty
+fauna
+fealty
+feast
+fedora
+feeble
+feeds
+feign
+feint
+feisty
+feline
+fellah
+fellow
+felon
+felony
+female
+femme
+femur
+fence
+fenced
+fencer
+fennel
+feral
+ferny
+ferret
+ferro
+ferule
+fervid
+fesses
+festal
+fester
+fetter
+fettle
+feudal
+fiasco
+fibre
+fibrin
+fibula
+fiche
+fichu
+fickle
+ficus
+fiddle
+fidget
+fiend
+fierce
+fiery
+fiesta
+fifth
+fifty
+fight
+filch
+filial
+filing
+fills
+filly
+filmy
+filthy
+finale
+finch
+finely
+finer
+finery
+finest
+finger
+finial
+fining
+finis
+finish
+finite
+finny
+fiord
+fires
+firing
+firkin
+firmer
+firmly
+first
+firth
+fiscal
+fished
+fisher
+fishy
+fitful
+fitted
+fitter
+fiver
+fixate
+fixed
+fixes
+fixing
+fixity
+fizzer
+fizzle
+fizzy
+fjord
+flabby
+flack
+flagon
+flail
+flair
+flake
+flaker
+flaky
+flamed
+flamen
+flamer
+flames
+flange
+flank
+flanks
+flaps
+flashy
+flask
+flatus
+flaxen
+fleck
+fledge
+fleece
+fleecy
+fleer
+fleet
+fleshy
+flews
+flexes
+flick
+flier
+fliest
+flimsy
+flinch
+fling
+flinty
+flirt
+float
+flock
+flood
+floor
+floozy
+floppy
+floral
+floret
+florid
+florin
+floss
+flossy
+flour
+floury
+flout
+flowed
+flown
+fluent
+fluffy
+fluke
+fluky
+flume
+flung
+flunk
+flunky
+flurry
+flush
+flute
+fluxes
+flyby
+flybys
+flyer
+flying
+foamer
+foamy
+fogey
+foggy
+foible
+foist
+folder
+foliar
+folio
+folks
+folksy
+folly
+foment
+fondue
+foodie
+forage
+foray
+forbid
+force
+forced
+forcer
+forego
+forged
+forges
+forget
+forgo
+forgot
+forker
+format
+formed
+former
+formic
+forms
+forte
+forth
+forty
+forum
+fought
+fouls
+found
+founds
+fount
+fourth
+fovea
+foveae
+foveal
+fowler
+foxed
+foxes
+foxing
+foyer
+fracas
+frail
+frame
+framed
+franc
+frank
+fraud
+freak
+freaky
+freeze
+freon
+fresco
+friar
+friary
+fridge
+fried
+fries
+frieze
+frigid
+frill
+frilly
+fringe
+frisky
+frizz
+frizzy
+frock
+froid
+frolic
+frond
+front
+frosts
+frosty
+froth
+frothy
+frowzy
+froze
+frozen
+frugal
+fruit
+fruity
+frump
+frumpy
+fryer
+fuddle
+fudge
+fugal
+fugue
+fuhrer
+fulfil
+fuller
+funds
+fungal
+fungi
+fungus
+funky
+funnel
+funny
+furore
+furrow
+furry
+furze
+fused
+fusee
+fuses
+fusing
+fusion
+fusser
+fussy
+fusty
+futile
+futon
+future
+fuzzy
+gabble
+gabby
+gable
+gabler
+gadfly
+gaffe
+gaggle
+gaiety
+gaily
+gained
+gains
+galaxy
+galen
+galena
+galley
+gallon
+gallop
+galoot
+galore
+galosh
+gambit
+gamble
+gambol
+gamest
+gamete
+gamin
+gamine
+gaming
+gamma
+gamut
+gander
+ganger
+gannet
+gantry
+gaper
+garage
+garble
+garde
+garden
+gargle
+garish
+garlic
+garner
+garnet
+garret
+gasbag
+gasket
+gasses
+gassy
+gateau
+gauche
+gaucho
+gaudy
+gauger
+gaunt
+gauss
+gauze
+gauzy
+gavel
+gawker
+gawky
+gazebo
+gecko
+geese
+geezer
+geisha
+gelcap
+gelid
+genial
+genii
+genius
+genome
+genre
+gentry
+genus
+geode
+gerbil
+gerund
+getup
+gewgaw
+ghetto
+ghost
+ghoul
+giant
+gibber
+gibbon
+giber
+giddy
+gifted
+giggly
+gigolo
+giller
+gillie
+gimlet
+gimpy
+ginkgo
+gipsy
+girdle
+girlie
+girth
+given
+giveth
+giving
+glade
+gladly
+gland
+glans
+glassy
+glaze
+glazed
+gleam
+glean
+glide
+glint
+glitch
+glitz
+glitzy
+global
+globe
+gloomy
+glory
+glossy
+glower
+glued
+gluier
+gluon
+glutei
+gluten
+glycol
+glyph
+gnarl
+gnash
+gnawer
+gneiss
+gnome
+gnomic
+goalie
+goatee
+gobbet
+gobble
+goblet
+goblin
+godly
+godson
+goggle
+going
+goitre
+golden
+golly
+gonad
+gooder
+goodly
+goody
+goofy
+googly
+gooier
+goose
+gopher
+gorge
+gorger
+gorgon
+goring
+gorse
+gospel
+gotta
+gotten
+gouge
+gourd
+gouty
+graded
+grades
+graft
+grail
+grain
+grainy
+gramme
+grand
+grange
+granny
+grant
+grape
+graph
+grass
+grassy
+grates
+gratis
+grave
+gravel
+graven
+gravid
+gravy
+grazer
+grease
+greasy
+great
+grebe
+greedy
+green
+greet
+greyer
+grief
+grill
+grille
+grilse
+grime
+grimy
+grinds
+gringo
+gripe
+grisly
+grist
+gritty
+groan
+groat
+grocer
+groggy
+groin
+groom
+groove
+groovy
+gross
+grotto
+ground
+group
+groups
+grouse
+grout
+grove
+grovel
+grows
+grubby
+gruff
+grumpy
+grunge
+grungy
+grunt
+guano
+guard
+guava
+guest
+guffaw
+guide
+guider
+guides
+guild
+guile
+guilty
+guinea
+guise
+gulden
+gullet
+gulley
+gully
+gummy
+gunky
+gunman
+gunmen
+gunny
+guppy
+gurgle
+gushy
+gusset
+gusto
+gusty
+gutsy
+gutta
+gutter
+guzzle
+gypped
+gypsum
+gypsy
+habeas
+habits
+hackle
+hades
+hadron
+hadst
+haggis
+haggle
+haiku
+hairdo
+hairy
+hajjes
+hajji
+halal
+haled
+haler
+hales
+halide
+haling
+halite
+hallo
+hallow
+haloes
+halon
+halter
+halve
+halves
+hamlet
+hammer
+hammy
+hamper
+handed
+handle
+hands
+hangar
+hangs
+hangup
+hankie
+hanky
+hansom
+happen
+happy
+harass
+harden
+hardy
+harem
+harken
+harmed
+harmer
+harpy
+harrow
+harry
+harsh
+hasher
+hassle
+haste
+hasten
+hasty
+hatred
+hauled
+hauler
+hauls
+haunch
+haven
+haver
+havoc
+hayer
+haymow
+hazard
+hazel
+hazing
+hdqrs
+heads
+heady
+healed
+health
+heard
+hearer
+hears
+hearse
+hearth
+hearty
+heave
+heaven
+heaves
+heavy
+heckle
+hectic
+hector
+heeded
+heehaw
+hefty
+hegira
+heifer
+heigh
+height
+helium
+helix
+hello
+helmet
+helot
+helter
+helve
+hempen
+hence
+henge
+henna
+henry
+herbal
+hereat
+hereby
+herein
+hereof
+heresy
+hereto
+hermit
+heroes
+heroic
+heroin
+heron
+herpes
+hertz
+hexane
+hexer
+heyday
+hiatus
+hicks
+hidden
+hidey
+hiding
+hieing
+hight
+hijack
+hilly
+hinder
+hinge
+hinged
+hinger
+hinges
+hippie
+hippo
+hippy
+hired
+hires
+hiring
+hisser
+hitch
+hither
+hoard
+hoarse
+hoary
+hobbit
+hobble
+hobby
+hobnob
+hockey
+hocus
+hodge
+hogan
+hogger
+hoist
+hoity
+hokey
+holder
+holds
+holey
+hollow
+holly
+homage
+homely
+homey
+homier
+homily
+homing
+honer
+honest
+honey
+hooded
+hoodoo
+hooey
+hoofer
+hookah
+hooker
+hookup
+hooper
+hoopla
+hooray
+hoover
+hooves
+hoper
+horde
+horned
+horner
+hornet
+horny
+horrid
+horror
+horsey
+hosier
+hotbed
+hotbox
+hotel
+hotpot
+hotrod
+hough
+hound
+houri
+hourly
+housed
+houser
+hovel
+howdah
+hoyden
+hubbub
+hubby
+hubris
+huddle
+huffy
+hullo
+humane
+humble
+humbug
+humeri
+humid
+hummus
+humph
+humus
+hunch
+hunger
+hungry
+hunky
+hurdle
+hurrah
+hurray
+hurter
+hurtle
+husky
+hussar
+hussy
+hustle
+hutch
+hyaena
+hydra
+hydro
+hyena
+hymnal
+hyper
+hyrax
+hyssop
+iambi
+iambic
+iambus
+ibidem
+icebox
+icecap
+icicle
+icing
+ictus
+ideate
+idiocy
+idiom
+igloo
+ignite
+ignore
+iguana
+ileum
+iliac
+ilium
+illume
+imago
+imbibe
+imbue
+immure
+impact
+impair
+impala
+impale
+impart
+imped
+impede
+impend
+imping
+impish
+imply
+import
+impose
+impugn
+impute
+inane
+inborn
+inbred
+incest
+incite
+income
+incurs
+indeed
+indict
+indigo
+indite
+indium
+indoor
+induct
+inept
+inert
+infamy
+infant
+infect
+infill
+infirm
+infix
+inflow
+influx
+inform
+infra
+ingot
+inhere
+inject
+injure
+inlaid
+inland
+inlay
+inlet
+inlier
+inmate
+inmost
+innate
+inner
+input
+inroad
+inrush
+insane
+insert
+inset
+inside
+instal
+insure
+intact
+intake
+intend
+intent
+inter
+intern
+inters
+intone
+intra
+intro
+intuit
+inure
+invent
+invest
+inward
+iodate
+iodide
+iodine
+iodise
+iodize
+ionic
+ionise
+ionize
+ipecac
+irate
+irenic
+ironer
+irony
+irrupt
+island
+islet
+isobar
+isomer
+ispell
+issued
+issues
+italic
+itchy
+itself
+ivory
+jabber
+jabot
+jackal
+jaded
+jagged
+jaggy
+jaguar
+jalopy
+jangle
+jarful
+jargon
+jasper
+jaunty
+jazzy
+jeans
+jeerer
+jejuna
+jejune
+jelly
+jemmy
+jennet
+jenny
+jerker
+jerkin
+jerky
+jerry
+jersey
+jetsam
+jetty
+jewel
+jiffy
+jigger
+jiggle
+jiggly
+jigsaw
+jihad
+jilter
+jingle
+jingly
+jingo
+jinked
+jitsu
+jitter
+jobber
+jockey
+jocose
+jocund
+joggle
+johnny
+joined
+joiner
+joins
+joint
+joints
+joist
+jokey
+jolly
+jongg
+jostle
+joule
+jounce
+joust
+jovial
+jowly
+joyed
+joyful
+joyous
+judder
+judger
+jugful
+juice
+juicy
+jujube
+jumble
+jumbo
+jumpy
+junco
+jungle
+junior
+junket
+junkie
+junky
+junta
+juries
+jurist
+juror
+juster
+justly
+kaboom
+kabuki
+kaftan
+kaiser
+kaolin
+kapok
+kappa
+kaput
+karate
+karma
+karmic
+kayak
+kazoo
+kebab
+keeler
+keener
+kelvin
+kennel
+kerned
+kernel
+ketch
+ketone
+kettle
+keypad
+khaki
+kibble
+kibosh
+kicky
+kiddie
+kiddo
+kidnap
+kidney
+killer
+kilohm
+kilter
+kimono
+kinda
+kindle
+kindly
+kingly
+kinked
+kinky
+kiosk
+kipper
+kirsch
+kismet
+kitbag
+kitsch
+kitty
+klaxon
+kludge
+knack
+knead
+kneel
+knell
+knelt
+knick
+knife
+knight
+knish
+knives
+knobby
+knock
+knoll
+knotty
+knower
+known
+knurl
+koala
+kooky
+kopeck
+kopeks
+kosher
+kowtow
+kraal
+kraft
+krill
+krona
+krone
+kroner
+kronor
+kronur
+kudos
+kudzu
+kulaks
+label
+labia
+labial
+labile
+labium
+labour
+laced
+lacer
+laces
+lacier
+lacing
+lackey
+lactic
+lacuna
+ladder
+laddie
+laden
+lading
+ladle
+lagoon
+laird
+laity
+lambda
+lamber
+lamed
+lament
+lamina
+lamper
+lance
+lancet
+landau
+lander
+lanky
+lapdog
+lapel
+lapin
+lappet
+lapse
+lapser
+laptop
+larch
+lards
+lardy
+large
+largo
+lariat
+larker
+larva
+larvae
+larval
+larynx
+lashed
+lasher
+lassie
+lasso
+lasted
+lasts
+latch
+latent
+later
+latest
+latex
+lathe
+lather
+latish
+latte
+latter
+lauder
+lauds
+launch
+laurel
+lavage
+lavish
+lawful
+lawyer
+laxes
+laxity
+layer
+laying
+layman
+laymen
+layout
+layup
+lazuli
+leach
+leaded
+leaden
+leader
+leafy
+league
+leaker
+leaky
+leaner
+leant
+leaper
+leapt
+learn
+learns
+learnt
+lease
+leash
+least
+leave
+leaves
+lecher
+ledge
+leech
+leery
+leeway
+legacy
+legal
+legato
+legend
+leggy
+legit
+legume
+lemma
+lemme
+lemon
+lemony
+lemur
+length
+lenser
+lentil
+lento
+leper
+lepta
+lepton
+lesion
+lessee
+lesser
+lessor
+lethal
+letter
+letup
+level
+levity
+lewis
+lexeme
+liable
+liaise
+libel
+libero
+libido
+lichee
+lichen
+licit
+licker
+lieder
+liege
+lieut
+lieux
+ligand
+light
+lignum
+likely
+liken
+liker
+likest
+liking
+lilac
+lilly
+limbo
+limper
+limpet
+limpid
+linage
+linden
+lineal
+linear
+lined
+linen
+lines
+linger
+lingo
+lining
+linked
+links
+linnet
+lintel
+linty
+lipase
+lipid
+lippy
+liquid
+liquor
+lisle
+lissom
+listed
+listen
+litany
+lithe
+litmus
+litre
+litter
+little
+lived
+lively
+liven
+lives
+livest
+livid
+living
+lizard
+llama
+loads
+loamy
+loath
+loathe
+loaves
+lobar
+lobule
+local
+locale
+lochs
+locked
+locket
+locks
+locus
+locust
+lodge
+lodged
+lodges
+lofter
+lofty
+loggia
+logia
+logic
+login
+logjam
+logout
+loiter
+loller
+lolly
+lonely
+loofah
+looked
+looks
+lookup
+loony
+looper
+loopy
+loose
+loosed
+looses
+loper
+lordly
+loris
+lorry
+lossy
+lotion
+lotto
+lotus
+louden
+lounge
+loupe
+louse
+lousy
+louvre
+loved
+lovely
+loving
+lowish
+lowly
+loyal
+lubber
+lucent
+lucid
+lucky
+lucre
+luger
+lumbar
+lumber
+lumen
+lumpen
+lumper
+lumpy
+lunacy
+lunar
+lunate
+lunch
+lunge
+lunger
+lupin
+lupine
+lupus
+lurch
+lurer
+lurex
+lurid
+lustre
+lusty
+luting
+luxury
+lyceum
+lychee
+lying
+lymph
+lynch
+lyric
+lyrist
+lysine
+macaw
+macer
+macho
+macro
+macron
+madam
+madame
+madcap
+madden
+madman
+madmen
+madras
+maggot
+magic
+magma
+magnum
+magpie
+mahout
+maiden
+mainly
+mains
+maize
+major
+makes
+making
+malady
+malice
+malign
+mallet
+mallow
+malted
+malty
+mamba
+mambo
+mammal
+mammy
+manage
+mangle
+mango
+mangy
+mania
+maniac
+manic
+manioc
+manly
+manna
+manned
+manner
+manor
+manse
+manta
+mantel
+mantis
+mantle
+mantra
+manual
+manure
+maple
+mapped
+maraca
+maraud
+marble
+march
+margin
+maria
+marine
+marked
+market
+markka
+marks
+marlin
+marmot
+maroon
+marque
+marred
+marrow
+marry
+marshy
+marten
+martin
+martyr
+marvel
+mascot
+masked
+masks
+mason
+masque
+massif
+master
+maths
+mating
+matins
+matrix
+matron
+matte
+matter
+mature
+matzo
+mauve
+maxim
+maxima
+maxing
+maybe
+mayday
+mayfly
+mayhap
+mayhem
+mayor
+mayst
+mazer
+meadow
+meagre
+mealy
+meaner
+meanie
+meanly
+meant
+measly
+meaty
+medal
+meddle
+media
+medial
+median
+medico
+medium
+medley
+meeter
+megohm
+mellow
+melon
+melted
+melter
+melts
+member
+memoir
+memory
+mender
+menial
+meninx
+mental
+mentor
+mercer
+merge
+merino
+merlin
+merry
+mescal
+meshed
+meson
+messy
+metal
+meter
+method
+methyl
+metier
+metro
+mettle
+mezzo
+miasma
+mickey
+midday
+midden
+middle
+middy
+midge
+midget
+midrib
+midst
+midway
+mighty
+mikado
+milady
+milch
+milden
+mildew
+miler
+milieu
+milky
+millet
+mimer
+mimosa
+minded
+minder
+mined
+mines
+mingle
+minim
+minima
+mining
+minion
+minke
+minnow
+minor
+minty
+minuet
+minus
+minute
+mirage
+misery
+misfit
+mishap
+mislay
+misled
+missal
+misses
+missus
+misty
+misuse
+mitre
+mitten
+mixed
+mixes
+mixing
+mizzen
+mobber
+mocha
+mocker
+modal
+model
+modem
+modern
+modest
+modish
+moduli
+modulo
+modus
+moggie
+mogul
+mohair
+moiety
+moire
+moist
+molal
+molar
+molly
+molten
+moment
+momma
+monad
+money
+monger
+monies
+monism
+monkey
+monody
+month
+mooch
+moody
+moose
+mooter
+moped
+mopish
+moppet
+moral
+morass
+moray
+morbid
+morel
+morgue
+morose
+morph
+morris
+morrow
+morsel
+mortal
+mortar
+mortem
+mosaic
+mosey
+mosque
+mossy
+motel
+motet
+mother
+motif
+motile
+motion
+motive
+motley
+mottle
+motto
+mould
+moulds
+mouldy
+moult
+mound
+mounts
+mouse
+mousey
+mousse
+mousy
+mouthy
+moved
+mover
+moves
+moving
+mowing
+mucker
+mucky
+mucosa
+mucous
+mucus
+muddle
+muddy
+muesli
+muffin
+muffle
+mufti
+muggy
+mulch
+mulct
+mulish
+mullah
+mullet
+multi
+mumble
+mumbo
+mummer
+mummy
+mumps
+munch
+munge
+mural
+murder
+murky
+murmur
+muscat
+muscle
+muser
+museum
+mushy
+music
+muskeg
+musky
+muslin
+mussel
+muster
+musty
+mutant
+mutate
+muted
+mutely
+muter
+mutest
+mutiny
+mutter
+mutton
+mutual
+muumuu
+muzzle
+mynah
+myopia
+myopic
+myriad
+myrrh
+myself
+mystic
+nabob
+nacho
+nacre
+nadir
+naffer
+naiad
+naifs
+nailer
+naive
+naked
+namby
+named
+namely
+namer
+nanny
+napalm
+napkin
+nappy
+narky
+narrow
+nasty
+natal
+natch
+nation
+native
+natter
+natty
+nature
+nausea
+naval
+navel
+navvy
+nearby
+neaten
+nebula
+necker
+nectar
+needed
+needer
+needy
+negate
+neigh
+nelson
+nephew
+nerdy
+nerve
+nervy
+nester
+nestle
+nether
+netter
+nettle
+neural
+neuron
+never
+newbie
+newel
+newish
+newsy
+newton
+nexus
+niacin
+nibble
+nicety
+niche
+nickel
+niece
+nifty
+night
+nights
+nimbi
+nimble
+nimbus
+ninety
+ninja
+ninny
+nippy
+nitwit
+nobody
+nodal
+noddle
+noddy
+nodule
+noggin
+nohow
+noire
+noisy
+nomad
+nonage
+nonce
+nones
+noodle
+noose
+normal
+north
+nosey
+nosing
+notary
+notch
+notify
+notion
+nougat
+nought
+nounal
+novae
+novena
+novice
+noway
+nozzle
+nuance
+nubby
+nubile
+nuclei
+nuder
+nudes
+nudge
+nudger
+nugget
+number
+nuncio
+nurse
+nurser
+nutate
+nutmeg
+nutria
+nutty
+nuzzle
+nylon
+nymph
+oafish
+oaken
+oakum
+oases
+oasis
+oaten
+obese
+obeyer
+oblate
+oblige
+oblong
+oboist
+obtuse
+occult
+occur
+ocean
+ocelot
+ochre
+octal
+octane
+octant
+octave
+octavo
+octet
+octile
+ocular
+oddity
+odious
+odium
+odour
+oedema
+oeuvre
+offal
+offer
+offing
+offish
+offset
+often
+ogive
+ogress
+ogrish
+okapi
+olden
+oldie
+oldish
+olefin
+olive
+omega
+omelet
+oncer
+onion
+onrush
+onset
+onside
+onward
+oodles
+opaque
+opened
+opens
+opiate
+opine
+opioid
+opium
+oppose
+optic
+optics
+optima
+option
+oracle
+orang
+orate
+orator
+orchid
+ordain
+ordeal
+ordure
+oriel
+origin
+oriole
+orison
+ormolu
+ornate
+orphan
+orris
+osier
+osmium
+osprey
+ossify
+ostler
+other
+otiose
+otter
+ought
+ounce
+outang
+outcry
+outdo
+outer
+outfit
+outfox
+outgo
+outing
+outlay
+output
+overdo
+overly
+overt
+owlet
+owlish
+owned
+owner
+oxalic
+oxbow
+oxide
+oxtail
+oyster
+ozone
+pacer
+paces
+pacey
+packed
+packs
+padded
+paddle
+paddy
+padre
+paean
+paella
+paeony
+pagan
+paged
+pagoda
+paint
+paired
+palace
+palate
+palely
+paler
+palest
+paling
+palish
+pallid
+pallor
+palmer
+palmy
+palsy
+paltry
+pamby
+pampas
+panama
+panda
+pander
+panel
+panic
+panky
+pansy
+pantry
+panzer
+papacy
+papal
+papaw
+papaya
+papers
+papery
+papist
+papyri
+parade
+parcel
+parch
+pardon
+parer
+parers
+pares
+pariah
+paring
+parish
+parity
+parka
+parky
+parley
+parody
+parole
+parry
+parse
+parsec
+parsed
+parson
+parter
+partly
+parts
+party
+pascal
+pasha
+passim
+pasta
+paste
+pastel
+paster
+pastis
+pastor
+pastry
+pasts
+pasty
+patch
+patchy
+paten
+patent
+pater
+pathos
+patina
+patio
+patois
+patrol
+patten
+patter
+patty
+paunch
+pause
+paved
+paver
+paves
+paving
+pawner
+paxes
+payee
+payer
+payout
+peace
+peach
+peachy
+peahen
+peaky
+pealed
+peals
+peanut
+pearl
+pearly
+peats
+peaty
+pebble
+pebbly
+pecan
+pectic
+pectin
+pedal
+peddle
+pedlar
+peeled
+peeler
+peeve
+peewee
+pekoe
+pelmet
+pelter
+pelvic
+pelvis
+penal
+pence
+pencil
+penman
+penmen
+pennon
+penury
+peony
+people
+pepper
+peppy
+pepsin
+peptic
+perch
+percha
+peril
+perky
+permit
+peruke
+peruse
+peseta
+pesky
+pestle
+pesto
+petal
+petard
+petite
+petrel
+petrol
+petty
+pewee
+pewit
+pewter
+peyote
+phage
+phalli
+phase
+phenol
+phenyl
+phial
+phlegm
+phloem
+phlox
+phobia
+phobic
+phoebe
+phoney
+phonic
+phonon
+phony
+phooey
+photo
+photon
+phrase
+phyla
+phylum
+physic
+piano
+piazza
+picked
+picket
+pickle
+picky
+picnic
+picot
+piddle
+pidgin
+piece
+piecer
+pieing
+piety
+piffle
+piggy
+piglet
+pigsty
+pilaf
+pilers
+pileup
+pilfer
+piling
+pillar
+pillow
+pimple
+pimply
+pince
+pincer
+pinch
+pineal
+pinged
+pinger
+pinion
+pinkie
+pinky
+pinna
+pinnae
+pinned
+pious
+piping
+pipit
+pippin
+pique
+piracy
+pisser
+piste
+pistil
+pistol
+piston
+pitch
+pithy
+pitman
+piton
+pixel
+pixie
+pixmap
+pizazz
+pizza
+placed
+placer
+placid
+plague
+plaice
+plaid
+plains
+plaint
+plait
+planar
+plane
+planet
+plank
+plant
+plaque
+plash
+plasm
+plasma
+plate
+platen
+played
+plays
+plaza
+please
+pleat
+pledge
+plenty
+plenum
+pleura
+plexus
+pliant
+pliers
+plight
+plinth
+plover
+plucky
+plugs
+plumb
+plume
+plummy
+plump
+plunge
+plunk
+plural
+plush
+plushy
+poach
+pocket
+pocus
+podgy
+podium
+poesy
+poetic
+poetry
+pogrom
+point
+pointy
+poise
+poison
+polar
+poler
+policy
+polio
+polish
+polite
+polka
+pollen
+poller
+pomade
+pommel
+pompom
+ponce
+poncho
+ponder
+pongee
+pooch
+poodle
+popgun
+poplar
+poplin
+poppet
+poppy
+porch
+porky
+porous
+portal
+porter
+portly
+poser
+poseur
+posing
+posses
+possum
+postal
+posted
+poster
+posts
+potage
+potash
+potato
+potent
+potful
+potion
+potty
+pouch
+pouffe
+pounce
+pound
+pourri
+powder
+power
+powwow
+praise
+prank
+prawn
+praxes
+praxis
+prayer
+preach
+precut
+preen
+prefab
+prefix
+premed
+premix
+press
+presto
+pretty
+price
+priced
+pricer
+pricey
+prick
+priest
+primal
+prime
+primp
+prince
+print
+prints
+prions
+prior
+priori
+priory
+prise
+priser
+prism
+prissy
+privet
+privy
+prize
+prober
+prolix
+promo
+prompt
+prone
+prong
+pronto
+proof
+proper
+prose
+proser
+prosy
+protea
+proton
+proud
+prove
+proved
+proven
+proves
+prowl
+proxy
+prune
+pseudo
+pshaw
+psych
+psyche
+psycho
+psychs
+puddle
+pudgy
+pueblo
+puffer
+puffin
+puffy
+pukka
+pullet
+pulley
+pulper
+pulpit
+pulpy
+pulsar
+pulse
+pulsed
+pulser
+pulses
+pumice
+pummel
+pumper
+punchy
+pundit
+punky
+punnet
+pupae
+pupal
+pupate
+pupil
+puppy
+purdah
+purge
+purine
+purism
+purist
+purity
+purple
+purse
+pursue
+purvey
+pushy
+putrid
+putsch
+puttee
+putter
+putty
+pygmy
+pyjama
+pyknic
+pylon
+pylori
+pyrite
+python
+pyxis
+quack
+quaff
+quail
+quaint
+quake
+quaky
+qualm
+quango
+quanta
+quark
+quarry
+quart
+quarto
+quartz
+quasar
+quash
+quasi
+quaver
+queasy
+queen
+queer
+quell
+quench
+quern
+query
+quest
+quests
+queue
+queuer
+quiche
+quick
+quiet
+quiff
+quill
+quilt
+quince
+quinsy
+quint
+quire
+quirk
+quirky
+quirt
+quite
+quiver
+quizzy
+quoin
+quoit
+quorum
+quoted
+quoter
+quoth
+qwerty
+rabbi
+rabble
+rabid
+rabies
+raceme
+racism
+racket
+radar
+radial
+radian
+radii
+radish
+radium
+radius
+radix
+radon
+raffia
+raffle
+ragbag
+ragged
+raglan
+ragout
+ragtag
+railer
+rainy
+raise
+raisin
+raison
+rajah
+raker
+rakish
+rally
+ramie
+ramjet
+ranch
+rancid
+randy
+ranee
+range
+rangy
+ranked
+ranker
+rankle
+rapid
+rapier
+rapine
+rappel
+rarefy
+rarity
+rascal
+rasper
+raspy
+raster
+rather
+rating
+ratio
+ration
+rattan
+rattle
+rattly
+ratty
+ravage
+ravel
+raven
+ravine
+rayon
+razor
+reach
+react
+reacts
+reader
+reads
+ready
+realm
+rebate
+rebel
+rebook
+rebut
+recall
+recap
+recent
+recipe
+recite
+reckon
+recoil
+recopy
+record
+recoup
+rector
+recur
+recurs
+redact
+redbud
+redcap
+redden
+redeem
+redial
+redraw
+reedy
+reeve
+refile
+refill
+refine
+refit
+reflex
+refuge
+refund
+refuse
+regain
+regale
+regard
+reggae
+regime
+regrow
+rehab
+rehang
+rehear
+reheat
+rehire
+reign
+reject
+rejoin
+reknit
+relax
+relay
+relic
+relict
+relief
+reline
+relish
+relit
+reload
+relock
+remain
+remake
+remand
+remap
+remark
+remelt
+remind
+remiss
+remit
+remix
+remote
+remove
+renal
+render
+renege
+rennet
+rennin
+renown
+rental
+reopen
+repack
+repair
+repast
+repave
+repeal
+repel
+repent
+replay
+reply
+report
+repose
+repost
+reread
+resat
+rescue
+resent
+reset
+reship
+resift
+resign
+resin
+resiny
+resole
+result
+resume
+retail
+retain
+retch
+retest
+retina
+retool
+retort
+retro
+retry
+retune
+revamp
+revere
+revet
+revile
+revise
+revive
+revue
+rewash
+rewed
+rewind
+rhesus
+rheum
+rheumy
+rhino
+rhyme
+ribald
+ribbon
+richen
+ridden
+riddle
+rider
+riders
+ridge
+ridgy
+riding
+riffle
+rifled
+rigger
+right
+rights
+rigid
+rigour
+rinse
+rinser
+ripely
+riper
+ripple
+ripply
+ripsaw
+risen
+risky
+ritual
+ritzy
+riven
+river
+riyal
+roach
+roadie
+roast
+robber
+robed
+robin
+robot
+robust
+rocker
+rocky
+rococo
+rodent
+rodeo
+roger
+rogue
+roller
+rondo
+rookie
+roomy
+roost
+ropey
+rosary
+roster
+rotary
+rotate
+rotor
+rotten
+rotter
+rotund
+rouble
+rouge
+rough
+rouse
+rouser
+roust
+route
+rowdy
+rowel
+royal
+rubati
+rubato
+rubber
+rubble
+rubout
+rubric
+ruddy
+ruffle
+rugby
+ruled
+ruler
+ruling
+rumba
+rumble
+rumen
+rummer
+rummy
+rumour
+rumple
+rumply
+rumpus
+runlet
+runnel
+runner
+runny
+runty
+runway
+rupee
+rupiah
+rural
+rushy
+russet
+rustic
+rustle
+rustre
+rutty
+sable
+sabot
+sabra
+sabre
+sachem
+sachet
+sacker
+sacra
+sacral
+sacred
+sacrum
+sadden
+saddle
+safari
+safely
+safety
+sagely
+saggy
+sahib
+sailor
+saint
+saker
+salaam
+salad
+salami
+salary
+saline
+sallow
+sally
+salmon
+salon
+saloon
+salsa
+salted
+salts
+salty
+salvo
+samba
+sampan
+sample
+sandal
+sander
+sandy
+sanely
+sappy
+sarong
+sateen
+satin
+satiny
+satori
+satrap
+satyr
+saucer
+saucy
+sauna
+savant
+saved
+savour
+savoy
+sawfly
+sawyer
+saying
+scabby
+scalar
+scald
+scale
+scaled
+scales
+scalp
+scaly
+scamp
+scampi
+scans
+scanty
+scape
+scarab
+scarce
+scarer
+scarf
+scarp
+scary
+scathe
+scent
+schema
+scheme
+schism
+schist
+schizo
+school
+schuss
+schwa
+scion
+scoff
+scold
+sconce
+scone
+scoot
+scope
+scored
+scores
+scotch
+scour
+scout
+scowl
+scrag
+scram
+scrap
+scrape
+scrawl
+scree
+screed
+screen
+screw
+screwy
+scribe
+scrim
+scrimp
+scrip
+script
+scroll
+scrub
+scrum
+scuba
+scuff
+scull
+sculpt
+scummy
+scurf
+scurfy
+scurry
+scurvy
+scythe
+seabed
+sealer
+seaman
+seamer
+seance
+season
+seater
+seaway
+secant
+secede
+second
+secret
+sector
+sects
+secure
+sedan
+sedge
+sedgy
+seeded
+seeder
+seedy
+seeing
+seemly
+seethe
+segue
+seine
+seisin
+seize
+seldom
+select
+seller
+selves
+sempre
+senate
+sender
+senile
+senior
+senna
+sense
+sensor
+sentry
+sepal
+sepia
+sepoy
+sepses
+sepsis
+septa
+septet
+septum
+sequel
+sequin
+serape
+serene
+serge
+series
+serif
+sermon
+serous
+serum
+serve
+served
+server
+serves
+servo
+sesame
+settee
+settle
+seven
+severe
+sewage
+sewer
+sexpot
+sextet
+sexton
+shabby
+shack
+shaded
+shady
+shaft
+shaggy
+shake
+shaken
+shaky
+shale
+shall
+shalom
+shaman
+shandy
+shank
+shanty
+shaped
+shapes
+shard
+share
+shared
+shark
+sharp
+shave
+shaven
+shawl
+shawm
+shchi
+sheaf
+shear
+sheath
+sheave
+sheen
+sheeny
+sheep
+sheer
+sheet
+sheik
+sheikh
+shekel
+shelf
+shell
+shelve
+sherds
+sherry
+shield
+shifty
+shimmy
+shine
+shiny
+ships
+shire
+shirk
+shirr
+shirt
+shiver
+shoal
+shoat
+shoddy
+shogun
+shone
+shook
+shoot
+shoots
+shore
+shorn
+short
+shorty
+shots
+should
+shout
+shouts
+shove
+showed
+shower
+shown
+shows
+showy
+shrank
+shred
+shrew
+shrewd
+shriek
+shrift
+shrike
+shrill
+shrimp
+shrine
+shrink
+shrive
+shroud
+shrub
+shrug
+shrunk
+shtick
+shunt
+shush
+shyer
+shyest
+shyly
+sicken
+sickie
+sickly
+sided
+sides
+siding
+sidle
+siege
+sienna
+sierra
+siesta
+sieve
+sifted
+sifts
+sigma
+signet
+signor
+signs
+silage
+silent
+silica
+silken
+silky
+silly
+silty
+simian
+simile
+simmer
+simon
+simony
+simoom
+simper
+simple
+since
+sinew
+sinful
+singe
+single
+sinter
+sinus
+siphon
+siren
+sisal
+sissy
+sister
+sitcom
+sitter
+sixer
+sixth
+sixty
+sized
+sizes
+sizing
+sizzle
+skate
+skeet
+skein
+skewer
+skiff
+skill
+skimpy
+skinny
+skirt
+skirts
+skivvy
+skulk
+skull
+skunk
+skyway
+slack
+slain
+slake
+slalom
+slang
+slangy
+slant
+slash
+slate
+slaver
+sledge
+sleek
+sleeps
+sleepy
+sleet
+sleety
+sleeve
+sleigh
+slept
+sleuth
+slice
+slick
+slide
+slime
+slimy
+sling
+slink
+slinky
+sliver
+slogan
+sloop
+slope
+sloppy
+slosh
+slouch
+slough
+sloven
+sludge
+sludgy
+sluice
+slummy
+slump
+slung
+slunk
+slurp
+slurry
+slushy
+slyly
+smack
+small
+smarmy
+smart
+smarts
+smear
+smell
+smelly
+smelt
+smiler
+smiley
+smirch
+smirk
+smite
+smiter
+smithy
+smock
+smoggy
+smoke
+smoky
+smooch
+smote
+smudgy
+snack
+snafu
+snail
+snake
+snaky
+snappy
+snaps
+snare
+snarer
+snarly
+snatch
+snazzy
+sneaky
+sneeze
+snick
+snide
+sniff
+snipe
+snippy
+snitch
+snivel
+snobby
+snood
+snook
+snoop
+snoopy
+snooty
+snooze
+snore
+snort
+snotty
+snout
+snowy
+snuff
+soaker
+soapy
+soarer
+soccer
+socio
+sodden
+sodium
+soever
+soften
+softer
+softly
+softy
+soggy
+soiled
+soiree
+solace
+solar
+solder
+soled
+solely
+soles
+solid
+soling
+solute
+solve
+solved
+sombre
+sonar
+sonata
+sonnet
+sonny
+soothe
+sooty
+soppy
+sorbet
+sordid
+sorrel
+sorrow
+sorry
+sorted
+sorter
+sortie
+sough
+sought
+sound
+soupy
+source
+souse
+south
+soviet
+sower
+spacey
+spadix
+spank
+spare
+spark
+sparky
+spars
+sparse
+spasm
+spate
+spathe
+spatio
+spavin
+spawn
+speak
+speaks
+spear
+specie
+speck
+speedy
+spell
+spelt
+spend
+spent
+sphinx
+spice
+spicy
+spider
+spiel
+spiffy
+spigot
+spike
+spiky
+spill
+spilt
+spinal
+spinet
+spiny
+spiral
+spire
+spired
+spires
+spirit
+spiry
+spite
+splat
+splay
+spleen
+splice
+spline
+splint
+split
+spoil
+spoilt
+spoken
+spongy
+spoof
+spook
+spooky
+spool
+spoor
+spore
+sporty
+spots
+spotty
+spouse
+spout
+sprain
+sprang
+sprat
+sprawl
+spray
+spree
+sprig
+sprint
+sprite
+sprout
+spruce
+sprue
+sprung
+spryer
+spryly
+spume
+spumy
+spurge
+spurn
+spurt
+sputa
+squab
+squad
+squall
+square
+squash
+squat
+squaw
+squawk
+squeal
+squib
+squid
+squint
+squire
+squirl
+squirm
+squirt
+stably
+stadia
+staff
+stager
+stagy
+staid
+stair
+stake
+stale
+stalk
+stall
+stamen
+stamp
+stance
+stank
+stanza
+staple
+stare
+stark
+starry
+start
+starts
+starve
+stash
+stasis
+state
+stated
+stater
+states
+static
+stator
+statue
+status
+stave
+stayer
+stead
+steady
+steak
+steal
+steamy
+steed
+steel
+steely
+steep
+steers
+stein
+stench
+steno
+steppe
+stereo
+stern
+sticky
+stiff
+stigma
+stile
+still
+stingy
+stink
+stinky
+stint
+stitch
+stoat
+stock
+stodgy
+stoic
+stoke
+stole
+stolen
+stolid
+stolon
+stoma
+stomal
+stomp
+stoner
+stony
+stood
+stooge
+stool
+stoop
+store
+storer
+storey
+stork
+stormy
+story
+stoup
+stout
+stove
+strafe
+strain
+strait
+strand
+strap
+strata
+strati
+straw
+stray
+streak
+stream
+street
+strew
+strewn
+stria
+striae
+stride
+strife
+strim
+string
+strip
+stripe
+strive
+strobe
+strode
+stroke
+stroll
+strop
+strove
+struck
+strum
+strung
+strut
+stubby
+stucco
+stuck
+studio
+stuff
+stuffs
+stuffy
+stump
+stumpy
+stung
+stunk
+stupid
+stupor
+sturdy
+style
+styler
+styli
+stylus
+stymie
+suave
+subdue
+sublet
+submit
+subnet
+suborn
+subset
+subtle
+subtly
+suburb
+subway
+sucker
+suckle
+sudden
+sudsy
+suede
+sugar
+sugary
+suite
+suited
+suitor
+sulky
+sullen
+sully
+sultan
+sultry
+sumac
+summon
+sundae
+sunder
+sundry
+sunken
+sunlit
+sunny
+sunset
+suntan
+super
+superb
+supine
+supple
+supply
+supra
+surer
+surety
+surge
+surly
+surtax
+survey
+sushi
+sutler
+suture
+svelte
+swain
+swami
+swampy
+swanky
+sward
+swarm
+swart
+swash
+swatch
+swath
+swathe
+swear
+sweaty
+swede
+sweet
+swell
+swept
+swerve
+swift
+swill
+swine
+swipe
+swirl
+swirly
+swish
+switch
+swivel
+swizz
+swoon
+swoop
+swoosh
+swore
+sworn
+swung
+sylph
+sylvan
+synch
+syndic
+synod
+syntax
+syphon
+syrup
+syrupy
+syzygy
+tabby
+tabla
+table
+tablet
+taboo
+tabor
+tacit
+tackle
+tacky
+tactic
+tagged
+taiga
+taint
+taken
+taker
+talcum
+talkie
+talky
+tallow
+tally
+talon
+talus
+tamale
+tamed
+tamper
+tandem
+tangle
+tango
+tangy
+tanned
+tannin
+tansy
+tantra
+taper
+tapir
+tapped
+tappet
+tardy
+target
+tariff
+tarmac
+tarot
+tarpon
+tarry
+tarsal
+tarsi
+tarsus
+tartan
+tartar
+tassel
+tastes
+tasty
+tatter
+tattle
+tattoo
+taught
+taupe
+tavern
+tawdry
+tawny
+taxer
+taxies
+taxing
+teabag
+teapot
+tease
+teasel
+teazel
+teazle
+techs
+teddy
+tedium
+teens
+teeny
+teepee
+teeter
+teeth
+teethe
+telex
+teller
+telly
+temper
+tempi
+temple
+tempo
+tempt
+tenant
+tench
+tended
+tendon
+tends
+tenet
+tenner
+tennis
+tenon
+tenor
+tenpin
+tense
+tensor
+tenter
+tenth
+tents
+tenure
+tepee
+tepid
+tercel
+terns
+terry
+terse
+tested
+tests
+testy
+tetchy
+tether
+tetra
+thane
+thatch
+theft
+their
+theism
+theist
+theme
+thence
+there
+therm
+these
+thesis
+theta
+thick
+thief
+thieve
+thigh
+thine
+thing
+think
+third
+thirst
+thirty
+thole
+thorax
+thorny
+those
+though
+thrall
+thrash
+thread
+threat
+three
+thresh
+threw
+thrice
+throb
+throe
+throne
+throng
+throw
+thrown
+thrum
+thrush
+thrust
+thumb
+thump
+thunk
+thwack
+thwart
+thyme
+thymus
+tiara
+tibia
+tibiae
+tickle
+tidal
+tiger
+tight
+tilde
+tiled
+tilled
+tiller
+tilth
+timber
+timbre
+timed
+timely
+timer
+timid
+timing
+tinder
+tinge
+tingle
+tingly
+tinker
+tinkle
+tinny
+tinpot
+tinsel
+tippet
+tipple
+tipsy
+tiptoe
+tiptop
+tirade
+tired
+tiring
+tissue
+titan
+titbit
+tithe
+title
+titled
+titre
+titter
+tittle
+tizzy
+toady
+toast
+toasty
+tocsin
+today
+toddle
+toddy
+toecap
+toffee
+toggle
+toilet
+toity
+token
+tomato
+tomboy
+tomcat
+tomtit
+tonal
+toned
+toner
+tongue
+tonic
+toning
+tonne
+tonsil
+tooled
+tools
+tooth
+toothy
+tootle
+toots
+tootsy
+topaz
+toper
+topic
+topple
+toque
+torch
+toroid
+torpid
+torpor
+torque
+torrid
+torso
+torte
+torus
+total
+totem
+totter
+toucan
+touch
+touchy
+tough
+toupee
+tourer
+tousle
+toward
+towbar
+towel
+tower
+townee
+townie
+toxic
+toxin
+trace
+traced
+traces
+tracts
+tragic
+trail
+trails
+train
+trains
+trait
+traits
+tramp
+trance
+tranny
+trashy
+trauma
+travel
+trawl
+tread
+treat
+treats
+treaty
+treble
+tremor
+trench
+trendy
+trews
+triad
+triage
+tribal
+trice
+tricky
+tried
+tries
+trifle
+trike
+trilby
+trill
+triode
+tripe
+triple
+triply
+tripod
+tripos
+trite
+triune
+trivet
+trivia
+troika
+troll
+tromp
+troop
+trophy
+tropic
+troth
+trough
+troupe
+trout
+trove
+trowel
+truant
+truce
+truck
+trudge
+truism
+truly
+trump
+trunk
+truss
+trusty
+truth
+tryst
+tsetse
+tubby
+tubing
+tubule
+tucker
+tulip
+tulle
+tumble
+tumid
+tummy
+tumour
+tumult
+tundra
+tuned
+tunes
+tunic
+tuning
+tunnel
+tunny
+tupelo
+turban
+turbid
+turbo
+turbot
+tureen
+turfy
+turgid
+turkey
+turned
+turner
+turnip
+turret
+turtle
+turvy
+tussle
+tutor
+tutti
+tuxedo
+twain
+twang
+twangy
+tweak
+tweed
+tweedy
+tweet
+tweeze
+twelve
+twenty
+twerp
+twice
+twiggy
+twilit
+twill
+twine
+twinge
+twirl
+twist
+twisty
+twitch
+tycoon
+typed
+typhus
+typify
+tyrant
+tyred
+ukase
+ulcer
+ulnae
+ulnar
+ulster
+ultimo
+ultra
+umbel
+umber
+umbra
+umbrae
+umlaut
+umpire
+unable
+unary
+unban
+unbar
+unbend
+unbolt
+uncial
+unclad
+uncle
+uncool
+uncork
+uncurl
+uncut
+under
+undue
+unease
+uneven
+unfair
+unfelt
+unfit
+unfix
+unhand
+unholy
+unhurt
+union
+unique
+unisex
+unison
+unite
+unity
+unjust
+unkind
+unkink
+unlace
+unlap
+unlike
+unlink
+unlit
+unload
+unlock
+unmake
+unmask
+unmesh
+unmet
+unpack
+unpick
+unpin
+unplug
+unread
+unreal
+unrest
+unruly
+unsafe
+unset
+unshod
+unsnap
+unsure
+unties
+until
+untrue
+unwind
+unwire
+unyoke
+upbeat
+update
+upend
+upheld
+uphill
+uphold
+upkeep
+upland
+uplift
+uplink
+upload
+upped
+upper
+upping
+uppish
+uppity
+uprate
+uproar
+uproot
+upset
+upshot
+upside
+uptake
+uptime
+uptown
+upturn
+upward
+upwind
+uracil
+urban
+urbane
+urchin
+ureter
+urgent
+urinal
+ursine
+usable
+usage
+useful
+using
+usual
+usurer
+usury
+utile
+utmost
+utopia
+utter
+uvula
+uvular
+vacant
+vacate
+vacua
+vacuum
+vagary
+vague
+valet
+valise
+valley
+valour
+valued
+valuer
+values
+vamped
+vamps
+vandal
+vanity
+vapid
+vapour
+varied
+varlet
+vassal
+vault
+vaunt
+vector
+vegan
+veggie
+velar
+veldt
+vellum
+velour
+velum
+velvet
+vendor
+venial
+venom
+venous
+vented
+venue
+verbal
+verge
+verger
+verify
+verity
+vermin
+vernal
+versa
+verse
+versed
+verso
+versus
+vertex
+verve
+vesper
+vessel
+vestal
+vetch
+vetoes
+viable
+viand
+vicar
+victor
+video
+views
+vigil
+vigour
+viking
+viler
+vilify
+villa
+villi
+villus
+vinous
+vinyl
+violet
+violin
+viper
+virago
+viral
+vireo
+virus
+visage
+viscid
+viscus
+vision
+visit
+visits
+visor
+vista
+visual
+vitae
+vitro
+vivace
+vivid
+vivify
+vixen
+vizier
+vocab
+vodka
+vogue
+voice
+voiced
+voices
+voided
+voids
+voile
+volley
+volte
+volume
+volute
+voodoo
+vortex
+votary
+vouch
+vowel
+voyage
+vulgar
+wacky
+waddle
+wafer
+waffle
+wager
+waggle
+wagon
+wailer
+waist
+waive
+waken
+wakeup
+walkie
+wallet
+wallop
+wallow
+walnut
+walrus
+waltz
+wampum
+wander
+wangle
+wanted
+wanton
+wapiti
+warble
+warded
+warden
+warder
+warier
+warmer
+warmly
+warmth
+warren
+washed
+washes
+waste
+watery
+wattle
+waver
+waxen
+waylay
+weaken
+wealth
+wearer
+wears
+weasel
+weave
+weaves
+wedded
+wedge
+weedy
+weekly
+weenie
+weensy
+weeny
+weepy
+weevil
+weigh
+weight
+weird
+welled
+wells
+welsh
+welter
+wench
+whack
+whale
+wharf
+wheal
+wheat
+wheel
+wheeze
+wheezy
+whelk
+whelm
+whelp
+whence
+where
+which
+whiff
+while
+whilom
+whilst
+whims
+whimsy
+whinny
+whiny
+whirl
+whirr
+whisk
+whisky
+whist
+white
+whiten
+whitey
+whole
+wholly
+whoop
+whoosh
+whorl
+whose
+whoso
+wicked
+wicket
+widen
+widget
+widow
+width
+wield
+wifely
+wiggle
+wiggly
+wigwag
+wigwam
+wilder
+wilful
+willed
+willow
+willy
+wimple
+wimpy
+wince
+winch
+winds
+windy
+winery
+winkle
+winnow
+winter
+wintry
+wired
+wirer
+wiring
+wisdom
+wised
+wiser
+wises
+wisest
+wising
+wispy
+withal
+wither
+within
+witty
+wives
+wizen
+wobbly
+woken
+wolves
+woman
+wombat
+women
+wonky
+wooden
+woods
+woody
+woolly
+woozy
+wordy
+worker
+wormer
+wormy
+worse
+worsen
+worst
+worthy
+would
+wound
+wounds
+woven
+wrack
+wraith
+wrasse
+wreak
+wreath
+wreck
+wrest
+wring
+write
+writes
+writhe
+wrong
+wroth
+wrung
+wryer
+wryest
+wryly
+wurzel
+xenon
+xylem
+xylol
+yammer
+yarrow
+yeasty
+yellow
+yeoman
+yeomen
+yield
+yikes
+yippee
+yobbo
+yodel
+yoked
+yokel
+yokes
+yoking
+yonder
+young
+youth
+yucca
+yucky
+yummy
+yuppie
+zealot
+zebra
+zenith
+zephyr
+zeroes
+zeugma
+zigzag
+zilch
+zinnia
+zippy
+zither
+zloty
+zodiac
+zombie
+zonked
+zygote \ No newline at end of file
diff --git a/freecap/COPYING.txt b/freecap/COPYING.txt
new file mode 100644
index 0000000..45645b4
--- /dev/null
+++ b/freecap/COPYING.txt
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/freecap/freecap.php b/freecap/freecap.php
new file mode 100644
index 0000000..f639c75
--- /dev/null
+++ b/freecap/freecap.php
@@ -0,0 +1,827 @@
+<?php
+/************************************************************\
+*
+* freeCap v1.4.1 Copyright 2005 Howard Yeend
+* www.puremango.co.uk
+*
+* This file is part of freeCap.
+*
+* freeCap is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* freeCap is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with freeCap; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*
+*
+\************************************************************/
+
+// {{{ BIT_MOD
+// hmm. too many session tweaks in setup_smarty ... we need to call this
+// also allows us to use $gBitSystem config settings
+require_once( '../../kernel/setup_inc.php' );
+//session_start();
+// }}} BIT_MOD
+
+//////////////////////////////////////////////////////
+////// User Defined Vars:
+//////////////////////////////////////////////////////
+
+// try to avoid the 'free p*rn' method of CAPTCHA circumvention
+// see www.wikipedia.com/captcha for more info
+$site_tags[0] = "To avoid spam, please do NOT enter the text if";
+$site_tags[1] = "this site is not puremango.co.uk";
+// or more simply:
+//$site_tags[0] = "for use only on puremango.co.uk";
+// reword or add lines as you please
+// or if you don't want any text:
+$site_tags = null;
+
+// where to write the above:
+// 0=top
+// 1=bottom
+// 2=both
+$tag_pos = 1;
+
+// functions to call for random number generation
+// mt_rand produces 'better' random numbers
+// but if your server doesn't support it, it's fine to use rand instead
+$rand_func = "mt_rand";
+$seed_func = "mt_srand";
+
+// which type of hash to use?
+// possible values: "sha1", "md5", "crc32"
+// sha1 supported by PHP4.3.0+
+// md5 supported by PHP3+
+// crc32 supported by PHP4.0.1+
+$hash_func = "md5";
+// store in session so can validate in form processor
+$_SESSION['hash_func'] = $hash_func;
+
+// image type:
+// possible values: "jpg", "png", "gif"
+// jpg doesn't support transparency (transparent bg option ends up white)
+// png isn't supported by old browsers (see http://www.libpng.org/pub/png/pngstatus.html)
+// gif may not be supported by your GD Lib.
+$output = "png";
+
+// 0=generate pseudo-random string, 1=use dictionary
+// dictionary is easier to recognise
+// - both for humans and computers, so use random string if you're paranoid.
+$use_dict = $gBitSystem->isFeatureActive( 'freecap_use_dict' );;
+// if your server is NOT set up to deny web access to files beginning ".ht"
+// then you should ensure the dictionary file is kept outside the web directory
+// eg: if www.foo.com/index.html points to c:\website\www\index.html
+// then the dictionary should be placed in c:\website\dict.txt
+// test your server's config by trying to access the dictionary through a web browser
+// you should NOT be able to view the contents.
+// can leave this blank if not using dictionary
+$dict_location = "./.ht_freecap_words";
+
+// used to calculate image width, and for non-dictionary word generation
+$max_word_length = 6;
+
+// text colour
+// 0=one random colour for all letters
+// 1=different random colour for each letter
+$col_type = 1;
+
+// maximum times a user can refresh the image
+// on a 6500 word dictionary, I think 15-50 is enough to not annoy users and make BF unfeasble.
+// further notes re: BF attacks in "avoid brute force attacks" section, below
+// on the other hand, those attempting OCR will find the ability to request new images
+// very useful; if they can't crack one, just grab an easier target...
+// for the ultra-paranoid, setting it to <5 will still work for most users
+$max_attempts = 100;
+
+// list of fonts to use
+// font size should be around 35 pixels wide for each character.
+// you can use my GD fontmaker script at www.puremango.co.uk to create your own fonts
+// There are other programs to can create GD fonts, but my script allows a greater
+// degree of control over exactly how wide each character is, and is therefore
+// recommended for 'special' uses. For normal use of GD fonts,
+// the GDFontGenerator @ http://www.philiplb.de is excellent for convering ttf to GD
+
+// the fonts included with freeCap *only* include lowercase alphabetic characters
+// so are not suitable for most other uses
+// to increase security, you really should add other fonts
+$font_locations = Array("./.ht_freecap_font1.gdf","./.ht_freecap_font2.gdf","./.ht_freecap_font3.gdf","./.ht_freecap_font4.gdf","./.ht_freecap_font5.gdf");
+
+// background:
+// 0=transparent (if jpg, white)
+// 1=white bg with grid
+// 2=white bg with squiggles
+// 3=morphed image blocks
+// 'random' background from v1.3 didn't provide any extra security (according to 2 independent experts)
+// many thanks to http://ocr-research.org.ua and http://sam.zoy.org/pwntcha/ for testing
+// for jpgs, 'transparent' is white
+$bg_type = 2;
+// should we blur the background? (looks nicer, makes text easier to read, takes longer)
+$blur_bg = true;
+// for bg_type 3, which images should we use?
+// if you add your own, make sure they're fairly 'busy' images (ie a lot of shapes in them)
+$bg_images = Array("./.ht_freecap_im1.jpg","./.ht_freecap_im2.jpg","./.ht_freecap_im3.jpg","./.ht_freecap_im4.jpg","./.ht_freecap_im5.jpg");
+// for non-transparent backgrounds only:
+ // if 0, merges CAPTCHA with bg
+ // if 1, write CAPTCHA over bg
+ $merge_type = 1;
+ // should we morph the bg? (recommend yes, but takes a little longer to compute)
+ $morph_bg = true;
+
+// you shouldn't need to edit anything below this, but it's extensively commented if you do want to play
+// have fun, and email me with ideas, or improvements to the code (very interested in speed improvements)
+// hope this script saves some spam :-)
+
+
+
+//////////////////////////////////////////////////////
+////// Create Images + initialise a few things
+//////////////////////////////////////////////////////
+
+// seed random number generator
+// PHP 4.2.0+ doesn't need this, but lower versions will
+$seed_func(make_seed());
+
+// how faded should the bg be? (100=totally gone, 0=bright as the day)
+// to test how much protection the bg noise gives, take a screenshot of the freeCap image
+// and take it into a photo editor. play with contrast and brightness.
+// If you can remove most of the bg, then it's not a good enough percentage
+switch($bg_type)
+{
+ case 0:
+ break;
+ case 1:
+ case 2:
+ $bg_fade_pct = 65;
+ break;
+ case 3:
+ $bg_fade_pct = 50;
+ break;
+}
+// slightly randomise the bg fade
+$bg_fade_pct += $rand_func(-2,2);
+
+// read each font and get font character widths
+$font_widths = Array();
+for($i=0 ; $i<sizeof($font_locations) ; $i++)
+{
+ $handle = fopen($font_locations[$i],"r");
+ // read header of GD font, up to char width
+ $c_wid = fread($handle,12);
+ $font_widths[$i] = ord($c_wid{8})+ord($c_wid{9})+ord($c_wid{10})+ord($c_wid{11});
+ fclose($handle);
+}
+
+// modify image width depending on maximum possible length of word
+// you shouldn't need to use words > 6 chars in length really.
+$width = ($max_word_length*(array_sum($font_widths)/sizeof($font_widths))+20);
+$height = !empty( $_REQUEST['height'] ) ? $_REQUEST['height'] : 75;
+
+$im = ImageCreate($width, $height);
+$im2 = ImageCreate($width, $height);
+
+
+
+//////////////////////////////////////////////////////
+////// Avoid Brute Force Attacks:
+//////////////////////////////////////////////////////
+if(empty($_SESSION['freecap_attempts']))
+{
+ $_SESSION['freecap_attempts'] = 1;
+} else {
+ $_SESSION['freecap_attempts']++;
+
+ // if more than ($max_attempts) refreshes, block further refreshes
+ // can be negated by connecting with new session id
+ // could get round this by storing num attempts in database against IP
+ // could get round that by connecting with different IP (eg, using proxy servers)
+ // in short, there's little point trying to avoid brute forcing
+ // the best way to protect against BF attacks is to ensure the dictionary is not
+ // accessible via the web or use random string option
+ if($_SESSION['freecap_attempts']>$max_attempts)
+ {
+ $_SESSION['captcha'] = false;
+
+ $bg = ImageColorAllocate($im,255,255,255);
+ ImageColorTransparent($im,$bg);
+
+ $red = ImageColorAllocate($im, 255, 0, 0);
+ // depending on how rude you want to be :-)
+ //ImageString($im,5,0,20,"bugger off you spamming bastards!",$red);
+ // {{{ BIT_MOD
+ ImageString($im,5,15,5,"Please close browser",$red);
+ ImageString($im,5,15,25,"and load page again",$red);
+ ImageString($im,5,15,45,"to retry",$red);
+ // }}} BIT_MOD
+
+ sendImage($im);
+ }
+}
+
+
+
+
+
+//////////////////////////////////////////////////////
+////// Functions:
+//////////////////////////////////////////////////////
+function make_seed() {
+// from http://php.net/srand
+ list($usec, $sec) = explode(' ', microtime());
+ return (float) $sec + ((float) $usec * 100000);
+}
+
+function rand_color() {
+ global $bg_type,$rand_func;
+ if($bg_type==3)
+ {
+ // needs darker colour..
+ return $rand_func(10,100);
+ } else {
+ return $rand_func(60,170);
+ }
+}
+
+function myImageBlur($im)
+{
+ // w00t. my very own blur function
+ // in GD2, there's a gaussian blur function. bunch of bloody show-offs... :-)
+
+ $width = imagesx($im);
+ $height = imagesy($im);
+
+ $temp_im = ImageCreateTrueColor($width,$height);
+ $bg = ImageColorAllocate($temp_im,150,150,150);
+
+ // preserves transparency if in orig image
+ ImageColorTransparent($temp_im,$bg);
+
+ // fill bg
+ ImageFill($temp_im,0,0,$bg);
+
+ // anything higher than 3 makes it totally unreadable
+ // might be useful in a 'real' blur function, though (ie blurring pictures not text)
+ $distance = 1;
+ // use $distance=30 to have multiple copies of the word. not sure if this is useful.
+
+ // blur by merging with itself at different x/y offsets:
+ ImageCopyMerge($temp_im, $im, 0, 0, 0, $distance, $width, $height-$distance, 70);
+ ImageCopyMerge($im, $temp_im, 0, 0, $distance, 0, $width-$distance, $height, 70);
+ ImageCopyMerge($temp_im, $im, 0, $distance, 0, 0, $width, $height, 70);
+ ImageCopyMerge($im, $temp_im, $distance, 0, 0, 0, $width, $height, 70);
+ // remove temp image
+ ImageDestroy($temp_im);
+
+ return $im;
+}
+
+function sendImage($pic)
+{
+ // output image with appropriate headers
+ global $output,$im,$im2,$im3;
+ header(base64_decode("WC1DYXB0Y2hhOiBmcmVlQ2FwIDEuNCAtIHd3dy5wdXJlbWFuZ28uY28udWs="));
+ switch($output)
+ {
+ // add other cases as desired
+ case "jpg":
+ header("Content-Type: image/jpeg");
+ ImageJPEG($pic);
+ break;
+ case "gif":
+ header("Content-Type: image/gif");
+ ImageGIF($pic);
+ break;
+ case "png":
+ default:
+ header("Content-Type: image/png");
+ ImagePNG($pic);
+ break;
+ }
+
+ // kill GD images (removes from memory)
+ ImageDestroy($im);
+ ImageDestroy($im2);
+ ImageDestroy($pic);
+ if(!empty($im3))
+ {
+ ImageDestroy($im3);
+ }
+ exit();
+}
+
+
+
+
+//////////////////////////////////////////////////////
+////// Choose Word:
+//////////////////////////////////////////////////////
+if($use_dict==1)
+{
+ // load dictionary and choose random word
+ $words = @file($dict_location);
+ $word = strtolower($words[$rand_func(0,sizeof($words)-1)]);
+ // cut off line endings/other possible odd chars
+ $word = preg_replace("/[^a-z]/","",$word);
+ // might be large file so forget it now (frees memory)
+ $words = "";
+ unset($words);
+} else {
+ // based on code originally by breakzero at hotmail dot com
+ // (http://uk.php.net/manual/en/function.rand.php)
+ // generate pseudo-random string
+ // doesn't use ijtf as are easily mistaken
+
+ // I'm not using numbers because the custom fonts I've created don't support anything other than
+ // lowercase or space (but you can download new fonts or create your own using my GD fontmaker script)
+ $consonants = 'bcdghklmnpqrsvwxyz';
+ $vowels = 'aeuo';
+ $word = "";
+
+ $wordlen = $rand_func(5,$max_word_length);
+
+ for($i=0 ; $i<$wordlen ; $i++)
+ {
+ // don't allow to start with 'vowel'
+ if($rand_func(0,4)>=2 && $i!=0)
+ {
+ $word .= $vowels{$rand_func(0,strlen($vowels)-1)};
+ } else {
+ $word .= $consonants{$rand_func(0,strlen($consonants)-1)};
+ }
+ }
+}
+
+// save hash of word for comparison
+// using hash so that if there's an insecurity elsewhere (eg on the form processor),
+// an attacker could only get the hash
+// also, shared servers usually give all users access to the session files
+// echo `ls /tmp`; and echo `more /tmp/someone_elses_session_file`; usually work
+// so even if your site is 100% secure, someone else's site on your server might not be
+// hence, even if attackers can read the session file, they can't get the freeCap word
+// (though most hashes are easy to brute force for simple strings)
+$_SESSION['captcha'] = $hash_func($word);
+
+
+
+
+//////////////////////////////////////////////////////
+////// Fill BGs and Allocate Colours:
+//////////////////////////////////////////////////////
+
+// set tag colour
+// have to do this before any distortion
+// (otherwise colour allocation fails when bg type is 1)
+$tag_col = ImageColorAllocate($im,10,10,10);
+$site_tag_col2 = ImageColorAllocate($im2,0,0,0);
+
+// set debug colours (text colours are set later)
+$debug = ImageColorAllocate($im, 255, 0, 0);
+$debug2 = ImageColorAllocate($im2, 255, 0, 0);
+
+// set background colour (can change to any colour not in possible $text_col range)
+// it doesn't matter as it'll be transparent or coloured over.
+// if you're using bg_type 3, you might want to try to ensure that the color chosen
+// below doesn't appear too much in any of your background images.
+$bg = ImageColorAllocate($im, 254, 254, 254);
+$bg2 = ImageColorAllocate($im2, 254, 254, 254);
+
+// set transparencies
+ImageColorTransparent($im,$bg);
+// im2 transparent to allow characters to overlap slightly while morphing
+ImageColorTransparent($im2,$bg2);
+
+// fill backgrounds
+ImageFill($im,0,0,$bg);
+ImageFill($im2,0,0,$bg2);
+
+if($bg_type!=0)
+{
+ // generate noisy background, to be merged with CAPTCHA later
+ // any suggestions on how best to do this much appreciated
+ // sample code would be even better!
+ // I'm not an OCR expert (hell, I'm not even an image expert; puremango.co.uk was designed in MsPaint)
+ // so the noise models are based around my -guesswork- as to what would make it hard for an OCR prog
+ // ideally, the character obfuscation would be strong enough not to need additional background noise
+ // in any case, I hope at least one of the options given here provide some extra security!
+
+ $im3 = ImageCreateTrueColor($width,$height);
+ $temp_bg = ImageCreateTrueColor($width*1.5,$height*1.5);
+ $bg3 = ImageColorAllocate($im3,255,255,255);
+ ImageFill($im3,0,0,$bg3);
+ $temp_bg_col = ImageColorAllocate($temp_bg,255,255,255);
+ ImageFill($temp_bg,0,0,$temp_bg_col);
+
+ // we draw all noise onto temp_bg
+ // then if we're morphing, merge from temp_bg to im3
+ // or if not, just copy a $widthx$height portion of $temp_bg to $im3
+ // temp_bg is much larger so that when morphing, the edges retain the noise.
+
+ if($bg_type==1)
+ {
+ // grid bg:
+
+ // draw grid on x
+ for($i=$rand_func(6,20) ; $i<$width*2 ; $i+=$rand_func(10,25))
+ {
+ ImageSetThickness($temp_bg,$rand_func(2,6));
+ $text_r = $rand_func(100,150);
+ $text_g = $rand_func(100,150);
+ $text_b = $rand_func(100,150);
+ $text_colour3 = ImageColorAllocate($temp_bg, $text_r, $text_g, $text_b);
+
+ ImageLine($temp_bg,$i,0,$i,$height*2,$text_colour3);
+ }
+ // draw grid on y
+ for($i=$rand_func(6,20) ; $i<$height*2 ; $i+=$rand_func(10,25))
+ {
+ ImageSetThickness($temp_bg,$rand_func(2,6));
+ $text_r = $rand_func(100,150);
+ $text_g = $rand_func(100,150);
+ $text_b = $rand_func(100,150);
+ $text_colour3 = ImageColorAllocate($temp_bg, $text_r, $text_g, $text_b);
+
+ ImageLine($temp_bg,0,$i,$width*2, $i ,$text_colour3);
+ }
+ } else if($bg_type==2) {
+ // draw squiggles!
+
+ $bg3 = ImageColorAllocate($im3,255,255,255);
+ ImageFill($im3,0,0,$bg3);
+ ImageSetThickness($temp_bg,4);
+
+ for($i=0 ; $i<strlen($word)+1 ; $i++)
+ {
+ $text_r = $rand_func(100,150);
+ $text_g = $rand_func(100,150);
+ $text_b = $rand_func(100,150);
+ $text_colour3 = ImageColorAllocate($temp_bg, $text_r, $text_g, $text_b);
+
+ $points = Array();
+ // draw random squiggle for each character
+ // the longer the loop, the more complex the squiggle
+ // keep random so OCR can't say "if found shape has 10 points, ignore it"
+ // each squiggle will, however, be a closed shape, so OCR could try to find
+ // line terminations and start from there. (I don't think they're that advanced yet..)
+ for($j=1 ; $j<$rand_func(5,10) ; $j++)
+ {
+ $points[] = $rand_func(1*(20*($i+1)),1*(50*($i+1)));
+ $points[] = $rand_func(30,$height+30);
+ }
+
+ ImagePolygon($temp_bg,$points,intval(sizeof($points)/2),$text_colour3);
+ }
+
+ } else if($bg_type==3) {
+ // take random chunks of $bg_images and paste them onto the background
+
+ for($i=0 ; $i<sizeof($bg_images) ; $i++)
+ {
+ // read each image and its size
+ $temp_im[$i] = ImageCreateFromJPEG($bg_images[$i]);
+ $temp_width[$i] = imagesx($temp_im[$i]);
+ $temp_height[$i] = imagesy($temp_im[$i]);
+ }
+
+ $blocksize = $rand_func(20,60);
+ for($i=0 ; $i<$width*2 ; $i+=$blocksize)
+ {
+ // could randomise blocksize here... hardly matters
+ for($j=0 ; $j<$height*2 ; $j+=$blocksize)
+ {
+ $image_index = $rand_func(0,sizeof($temp_im)-1);
+ $cut_x = $rand_func(0,$temp_width[$image_index]-$blocksize);
+ $cut_y = $rand_func(0,$temp_height[$image_index]-$blocksize);
+ ImageCopy($temp_bg, $temp_im[$image_index], $i, $j, $cut_x, $cut_y, $blocksize, $blocksize);
+ }
+ }
+ for($i=0 ; $i<sizeof($temp_im) ; $i++)
+ {
+ // remove bgs from memory
+ ImageDestroy($temp_im[$i]);
+ }
+
+ // for debug:
+ //sendImage($temp_bg);
+ }
+
+ // for debug:
+ //sendImage($im3);
+
+ if($morph_bg)
+ {
+ // morph background
+ // we do this separately to the main text morph because:
+ // a) the main text morph is done char-by-char, this is done across whole image
+ // b) if an attacker could un-morph the bg, it would un-morph the CAPTCHA
+ // hence bg is morphed differently to text
+ // why do we morph it at all? it might make it harder for an attacker to remove the background
+ // morph_chunk 1 looks better but takes longer
+
+ // this is a different and less perfect morph than the one we do on the CAPTCHA
+ // occasonally you get some dark background showing through around the edges
+ // it doesn't need to be perfect as it's only the bg.
+ $morph_chunk = $rand_func(1,5);
+ $morph_y = 0;
+ for($x=0 ; $x<$width ; $x+=$morph_chunk)
+ {
+ $morph_chunk = $rand_func(1,5);
+ $morph_y += $rand_func(-1,1);
+ ImageCopy($im3, $temp_bg, $x, 0, $x+30, 30+$morph_y, $morph_chunk, $height*2);
+ }
+
+ ImageCopy($temp_bg, $im3, 0, 0, 0, 0, $width, $height);
+
+ $morph_x = 0;
+ for($y=0 ; $y<=$height; $y+=$morph_chunk)
+ {
+ $morph_chunk = $rand_func(1,5);
+ $morph_x += $rand_func(-1,1);
+ ImageCopy($im3, $temp_bg, $morph_x, $y, 0, $y, $width, $morph_chunk);
+
+ }
+ } else {
+ // just copy temp_bg onto im3
+ ImageCopy($im3,$temp_bg,0,0,30,30,$width,$height);
+ }
+
+ ImageDestroy($temp_bg);
+
+ if($blur_bg)
+ {
+ myImageBlur($im3);
+ }
+}
+// for debug:
+//sendImage($im3);
+
+
+
+
+//////////////////////////////////////////////////////
+////// Write Word
+//////////////////////////////////////////////////////
+
+// write word in random starting X position
+$word_start_x = $rand_func(5,32);
+// y positions jiggled about later
+$word_start_y = 15;
+
+if($col_type==0)
+{
+ $text_r = rand_color();
+ $text_g = rand_color();
+ $text_b = rand_color();
+ $text_colour2 = ImageColorAllocate($im2, $text_r, $text_g, $text_b);
+}
+
+// write each char in different font
+for($i=0 ; $i<strlen($word) ; $i++)
+{
+ if($col_type==1)
+ {
+ $text_r = rand_color();
+ $text_g = rand_color();
+ $text_b = rand_color();
+ $text_colour2 = ImageColorAllocate($im2, $text_r, $text_g, $text_b);
+ }
+
+ $j = $rand_func(0,sizeof($font_locations)-1);
+ $font = ImageLoadFont($font_locations[$j]);
+ ImageString($im2, $font, $word_start_x+($font_widths[$j]*$i), $word_start_y, $word{$i}, $text_colour2);
+}
+// use last pixelwidth
+$font_pixelwidth = $font_widths[$j];
+
+// for debug:
+//sendImage($im2);
+
+
+
+
+
+//////////////////////////////////////////////////////
+////// Morph Image:
+//////////////////////////////////////////////////////
+
+// calculate how big the text is in pixels
+// (so we only morph what we need to)
+$word_pix_size = $word_start_x+(strlen($word)*$font_pixelwidth);
+
+$y_pos = 0;
+// firstly move each character up or down a bit:
+for($i=$word_start_x ; $i<$word_pix_size ; $i+=$font_pixelwidth)
+{
+ // move on Y axis
+ // deviates at least 4 pixels between each letter
+ $prev_y = $y_pos;
+ do{
+ $y_pos = $rand_func(-3,3);
+ } while($y_pos<$prev_y+2 && $y_pos>$prev_y-2);
+ ImageCopy($im, $im2, $i, $y_pos, $i, 0, $font_pixelwidth, $height);
+
+ // for debug:
+ //ImageRectangle($im,$i,$y_pos+10,$i+$font_pixelwidth,$y_pos+70,$debug);
+}
+
+// for debug:
+//sendImage($im);
+
+ImageFilledRectangle($im2,0,0,$width,$height,$bg2);
+
+// randomly morph each character individually on x-axis
+// this is where the main distortion happens
+// massively improved since v1.2
+$y_chunk = 1;
+$morph_factor = .1;
+$morph_x = 0;
+for($j=0 ; $j<strlen($word) ; $j++)
+{
+ $y_pos = 0;
+ for($i=0 ; $i<=$height; $i+=$y_chunk)
+ {
+ $orig_x = $word_start_x+($j*$font_pixelwidth);
+ // morph x += so that instead of deviating from orig x each time, we deviate from where we last deviated to
+ // get it? instead of a zig zag, we get more of a sine wave.
+ // I wish we could deviate more but it looks crap if we do.
+ $morph_x += $rand_func(-$morph_factor,$morph_factor);
+ // had to change this to ImageCopyMerge when starting using ImageCreateTrueColor
+ // according to the manual; "when (pct is) 100 this function behaves identically to imagecopy()"
+ // but this is NOT true when dealing with transparencies...
+ ImageCopyMerge($im2, $im, $orig_x+$morph_x, $i+$y_pos, $orig_x, $i, $font_pixelwidth, $y_chunk, 100);
+
+ // for debug:
+ //ImageLine($im2, $orig_x+$morph_x, $i, $orig_x+$morph_x+1, $i+$y_chunk, $debug2);
+ //ImageLine($im2, $orig_x+$morph_x+$font_pixelwidth, $i, $orig_x+$morph_x+$font_pixelwidth+1, $i+$y_chunk, $debug2);
+ }
+}
+
+// for debug:
+//sendImage($im2);
+
+ImageFilledRectangle($im,0,0,$width,$height,$bg);
+// now do the same on the y-axis
+// (much easier because we can just do it across the whole image, don't have to do it char-by-char)
+$y_pos = 0;
+$x_chunk = 1;
+for($i=0 ; $i<=$width ; $i+=$x_chunk)
+{
+ // can result in image going too far off on Y-axis;
+ // not much I can do about that, apart from make image bigger
+ // again, I wish I could do 1.5 pixels
+ $y_pos += $rand_func(-1,1);
+ ImageCopy($im, $im2, $i, $y_pos, $i, 0, $x_chunk, $height);
+
+ // for debug:
+ //ImageLine($im,$i+$x_chunk,0,$i+$x_chunk,100,$debug);
+ //ImageLine($im,$i,$y_pos+25,$i+$x_chunk,$y_pos+25,$debug);
+}
+
+// for debug:
+//sendImage($im);
+
+// blur edges:
+// doesn't really add any security, but looks a lot nicer, and renders text a little easier to read
+// for humans (hopefully not for OCRs, but if you know better, feel free to disable this function)
+// (and if you do, let me know why)
+myImageBlur($im);
+
+// for debug:
+//sendImage($im);
+
+if($output!="jpg" && $bg_type==0)
+{
+ // make background transparent
+ ImageColorTransparent($im,$bg);
+}
+
+
+
+
+
+//////////////////////////////////////////////////////
+////// Try to avoid 'free p*rn' style CAPTCHA re-use
+//////////////////////////////////////////////////////
+// ('*'ed to stop my site coming up for certain keyword searches on google)
+
+// can obscure CAPTCHA word in some cases..
+
+// write site tags 'shining through' the morphed image
+ImageFilledRectangle($im2,0,0,$width,$height,$bg2);
+if(is_array($site_tags))
+{
+ for($i=0 ; $i<sizeof($site_tags) ; $i++)
+ {
+ // ensure tags are centered
+ $tag_width = strlen($site_tags[$i])*6;
+ // write tag is chosen position
+ if($tag_pos==0 || $tag_pos==2)
+ {
+ // write at top
+ ImageString($im2, 2, intval($width/2)-intval($tag_width/2), (10*$i), $site_tags[$i], $site_tag_col2);
+ }
+ if($tag_pos==1 || $tag_pos==2)
+ {
+ // write at bottom
+ ImageString($im2, 2, intval($width/2)-intval($tag_width/2), ($height-34+($i*10)), $site_tags[$i], $site_tag_col2);
+ }
+ }
+}
+ImageCopyMerge($im2,$im,0,0,0,0,$width,$height,80);
+ImageCopy($im,$im2,0,0,0,0,$width,$height);
+// for debug:
+//sendImage($im);
+
+
+
+
+//////////////////////////////////////////////////////
+////// Merge with obfuscated background
+//////////////////////////////////////////////////////
+
+if($bg_type!=0)
+{
+ // merge bg image with CAPTCHA image to create smooth background
+
+ // fade bg:
+ if($bg_type!=3)
+ {
+ $temp_im = ImageCreateTrueColor($width,$height);
+ $white = ImageColorAllocate($temp_im,255,255,255);
+ ImageFill($temp_im,0,0,$white);
+ ImageCopyMerge($im3,$temp_im,0,0,0,0,$width,$height,$bg_fade_pct);
+ // for debug:
+ //sendImage($im3);
+ ImageDestroy($temp_im);
+ $c_fade_pct = 50;
+ } else {
+ $c_fade_pct = $bg_fade_pct;
+ }
+
+ // captcha over bg:
+ // might want to not blur if using this method
+ // otherwise leaves white-ish border around each letter
+ if($merge_type==1)
+ {
+ ImageCopyMerge($im3,$im,0,0,0,0,$width,$height,100);
+ ImageCopy($im,$im3,0,0,0,0,$width,$height);
+ } else {
+ // bg over captcha:
+ ImageCopyMerge($im,$im3,0,0,0,0,$width,$height,$c_fade_pct);
+ }
+}
+// for debug:
+//sendImage($im);
+
+
+//////////////////////////////////////////////////////
+////// Write tags, remove variables and output!
+//////////////////////////////////////////////////////
+
+// tag it
+// feel free to remove/change
+// but if it's not essential I'd appreciate you leaving it
+// after all, I've put a lot of work into this and am giving it away for free
+// the least you could do is give me credit (or buy me stuff from amazon!)
+// but I understand that in professional environments, your boss might not like this tag
+// so that's cool.
+$tag_str = "";
+// for debug:
+//$tag_str = "[".$word."]";
+
+// ensure tag is right-aligned
+$tag_width = strlen($tag_str)*6;
+// write tag
+ImageString($im, 2, $width-$tag_width, $height-13, $tag_str, $tag_col);
+
+// unset all sensetive vars
+// in case someone include()s this file on a shared server
+// you might think this unneccessary, as it exit()s
+// but by using register_shutdown_function
+// on a -very- insecure shared server, they -might- be able to get the word
+unset($word);
+// the below aren't really essential, but might aid an OCR attack if discovered.
+// so we unset them
+unset($use_dict);
+unset($dict_location);
+unset($max_word_length);
+unset($bg_type);
+unset($bg_images);
+unset($merge_type);
+unset($bg_fade_pct);
+unset($morph_bg);
+unset($col_type);
+unset($max_attempts);
+unset($font_locations);
+
+
+// output final image :-)
+sendImage($im);
+// (sendImage also destroys all used images)
+?>
diff --git a/freecap/freecap_wrap.php b/freecap/freecap_wrap.php
new file mode 100644
index 0000000..5a0f89b
--- /dev/null
+++ b/freecap/freecap_wrap.php
@@ -0,0 +1,125 @@
+<?php
+/************************************************************\
+*
+* freeCap v1.4.1 Copyright 2005 Howard Yeend
+* www.puremango.co.uk
+*
+* This file is part of freeCap.
+*
+* freeCap is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* freeCap is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with freeCap; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*
+*
+\************************************************************/
+
+// this is the 'form' side of the script.
+// I suggest making the user fill in the main form
+// then take them here and update the information with a 'freecap_passed' flag if they enter the
+// correct word. This way, if they don't enter the right word, they don't lose all their data
+// and you don't have to code a form that remembers all their data
+// also, if someone is spamming you, you've got a log of all the failed attempts
+// which might prove useful for legal action or just for amusement, plus you'll be able to see
+// if you're stopping spammers or if the majority of failed registrations are valid users who
+// just can't read the word properly...
+
+// To avoid blocking out partially sighted users, I'd suggest having a 'submit without entering word'
+// button, which sends the info to you for manual verification. It's a lot simpler than trying to
+// implement a secure audio-captcha.
+
+session_start();
+
+if(!empty($_SESSION['freecap_word_hash']) && !empty($_POST['word']))
+{
+ // all freeCap words are lowercase.
+ // font #4 looks uppercase, but trust me, it's not...
+ if($_SESSION['hash_func'](strtolower($_POST['word']))==$_SESSION['freecap_word_hash'])
+ {
+ // reset freeCap session vars
+ // cannot stress enough how important it is to do this
+ // defeats re-use of known image with spoofed session id
+ $_SESSION['freecap_attempts'] = 0;
+ $_SESSION['freecap_word_hash'] = false;
+
+
+ // now process form
+
+
+ // now go somewhere else
+ // header("Location: somewhere.php");
+ $word_ok = "yes";
+ } else {
+ $word_ok = "no";
+ }
+} else {
+ $word_ok = false;
+}
+?>
+<html>
+<head>
+<script language="javascript">
+<!--
+function new_freecap()
+{
+ // loads new freeCap image
+ if(document.getElementById)
+ {
+ // extract image name from image source (i.e. cut off ?randomness)
+ thesrc = document.getElementById("freecap").src;
+ thesrc = thesrc.substring(0,thesrc.lastIndexOf(".")+4);
+ // add ?(random) to prevent browser/isp caching
+ document.getElementById("freecap").src = thesrc+"?"+Math.round(Math.random()*100000);
+ } else {
+ alert("Sorry, cannot autoreload freeCap image\nSubmit the form and a new freeCap will be loaded");
+ }
+}
+//-->
+</script>
+<style type="text/css">
+ body{
+ font-family: verdana;
+ font-size: 14px;
+ background: #CCC;
+ }
+ td{
+ font-family: verdana;
+ font-size: 10px;
+ }
+</style>
+</head>
+<body>
+<b>freeCap v1.4 - <a href="http://www.puremango.co.uk" target="_blank">www.puremango.co.uk</a></b><br /><br />
+<?
+if($word_ok!==false)
+{
+ if($word_ok=="yes")
+ {
+ echo "you got the word correct, rock on.<br />";
+ } else {
+ echo "sorry, that's not the right word, try again.<br />";
+ }
+}
+?>
+<form action="<?=$_SERVER['SCRIPT_NAME']?>" method="post">
+<table cellpadding="0" cellspacing="0">
+<tr><td>Name:</td><td><input type="text" name="name" value="<?=htmlspecialchars($_POST['name'])?>"></td></tr>
+<tr><td>Foo:</td><td><input type="text" name="foo" value="<?=htmlspecialchars($_POST['foo'])?>"></td></tr>
+<tr><td>Bar:</td><td><input type="text" name="bar" value="<?=htmlspecialchars($_POST['bar'])?>"></td></tr>
+<tr><td colspan="2"><img src="freecap.php" id="freecap"></td></tr>
+<tr><td colspan="2">If you can't read the word, <a href="#" onClick="this.blur();new_freecap();return false;">click here</a></td></tr>
+<tr><td>word above:</td><td><input type="text" name="word"></td></tr>
+<tr><td colspan="2"><input type="submit" value="submit"></td></tr>
+</table><br /><br />
+</form>
+</body>
+</html>