diff --git a/.travis.yml b/.travis.yml index 3e25d1cf..96d383d4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,44 @@ language: python - +sudo: true +os: + - linux + - osx python: - "2.7" - +services: + - docker install: - - pip install --upgrade pip - - pip install -r requirements.txt - - pip install -r test_requirements.txt - + - pip install --upgrade pip + - pip install -r requirements.txt + - pip install -r test_requirements.txt script: - - make -s - + - if [ "$TRAVIS_OS_NAME" == "linux" ] && [ ! -z "$TRAVIS_TAG" ]; then sudo bash travis-linux.sh; fi + - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ ! -z "$TRAVIS_TAG" ]; then sudo bash travis-osx.sh; fi after_success: - - coveralls + - coveralls +before_deploy: + - export RELEASE_PKG_FILE=$(ls dist/openbazaard*) +deploy: + - provider: releases + api_key: "$GITHUB_TOKEN" + file_glob: true + file: + - dist/openbazaard-linux32 + - dist/openbazaard-linux64 + - dist/openbazaard-windows32.exe + - dist/openbazaard-windows64.exe + skip_cleanup: true + on: + all_branches: true + condition: $TRAVIS_OS_NAME = linux + tags: true + - provider: releases + api_key: "$GITHUB_TOKEN" + file_glob: true + file: + - dist/openbazaard-osx + skip_cleanup: true + on: + all_branches: true + condition: $TRAVIS_OS_NAME = osx + tags: true diff --git a/.travis/openbazaard.linux32.spec b/.travis/openbazaard.linux32.spec new file mode 100644 index 00000000..e339a636 --- /dev/null +++ b/.travis/openbazaard.linux32.spec @@ -0,0 +1,31 @@ +# -*- mode: python -*- + +block_cipher = None + + +a = Analysis(['../openbazaard.py'], + pathex=['../'], + binaries=None, + datas=None, + hiddenimports=['pystun', 'zmq', 'cryptography', 'cffi', 'packaging'], + hookspath=[], + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher) +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +a.datas += [('../ob.cfg', 'ob.cfg', 'DATA'),('./bitcointools/english.txt','virt/bitcointools/english.txt','DATA')] +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + name='openbazaard-linux32', + debug=False, + strip=False, + upx=True, + console=True ) diff --git a/.travis/openbazaard.linux64.spec b/.travis/openbazaard.linux64.spec new file mode 100644 index 00000000..39a99c3d --- /dev/null +++ b/.travis/openbazaard.linux64.spec @@ -0,0 +1,31 @@ +# -*- mode: python -*- + +block_cipher = None + + +a = Analysis(['../openbazaard.py'], + pathex=['../'], + binaries=None, + datas=None, + hiddenimports=['pystun', 'zmq', 'cryptography', 'cffi', 'packaging'], + hookspath=[], + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher) +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +a.datas += [('../ob.cfg', 'ob.cfg', 'DATA'),('./bitcointools/english.txt','virt64/bitcointools/english.txt','DATA')] +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + name='openbazaard-linux64', + debug=False, + strip=False, + upx=True, + console=True ) diff --git a/.travis/openbazaard.mac.spec b/.travis/openbazaard.mac.spec new file mode 100644 index 00000000..e7d34a97 --- /dev/null +++ b/.travis/openbazaard.mac.spec @@ -0,0 +1,29 @@ +# -*- mode: python -*- + +block_cipher = None + + +a = Analysis(['./OpenBazaar-Server/openbazaard.py'], + pathex=['./OpenBazaar-Server'], + binaries=None, + datas=None, + hiddenimports=['zmq', 'cryptography', 'cffi', 'packaging'], + hookspath=None, + runtime_hooks=None, + excludes=None, + win_no_prefer_redirects=None, + win_private_assemblies=None, + cipher=block_cipher) +a.datas += [('ob.cfg', 'ob.cfg', 'DATA'),('bitcointools/english.txt','env/lib/python2.7/site-packages/bitcointools/english.txt','DATA')] +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + name='openbazaard-osx', + debug=True, + strip=None, + upx=True, + console=True) diff --git a/.travis/openbazaard.win.spec b/.travis/openbazaard.win.spec new file mode 100644 index 00000000..a084370f --- /dev/null +++ b/.travis/openbazaard.win.spec @@ -0,0 +1,38 @@ +# -*- mode: python -*- + +block_cipher = None + + +a = Analysis(['..\\openbazaard.py'], + pathex=['..\\'], + binaries=None, + datas=None, + hiddenimports=['cryptography', 'bitcoin','zmq.backend.cython' ,'zmq.backend.cffi'], + hookspath=None, + runtime_hooks=None, + excludes=None, + win_no_prefer_redirects=None, + win_private_assemblies=None, + cipher=block_cipher) +a.binaries += [('ssleay32.dll', 'windows\\32\\ssleay32.dll', 'BINARY'), +('libeay32.dll', 'windows\\32\\libeay32.dll', 'BINARY')] +a.datas += [ +('ob.cfg', 'ob.cfg', 'DATA'), +('bitcointools\\english.txt', 'windows\\english.txt', 'DATA'), +('msvcr120.dll', 'windows\\32\\msvcr120.dll', 'DATA'), +('msvcr90.dll', 'c:\\Python27\\msvcr90.dll', 'DATA'), +('msvcp90.dll', 'c:\\Python27\\msvcp90.dll', 'DATA') +] +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + a.binaries, +a.zipfiles, +a.datas, + name='openbazaard-windows32', + icon='windows\\icon.ico', + debug=True, + strip=False, + upx=True, + console=True ) diff --git a/.travis/openbazaard.win64.spec b/.travis/openbazaard.win64.spec new file mode 100644 index 00000000..d4abf057 --- /dev/null +++ b/.travis/openbazaard.win64.spec @@ -0,0 +1,38 @@ +# -*- mode: python -*- + +block_cipher = None + + +a = Analysis(['..\\openbazaard.py'], + pathex=['..\\'], + binaries=None, + datas=None, + hiddenimports=['cryptography', 'bitcoin','zmq.backend.cython' ,'zmq.backend.cffi'], + hookspath=None, + runtime_hooks=None, + excludes=None, + win_no_prefer_redirects=None, + win_private_assemblies=None, + cipher=block_cipher) +a.binaries += [('ssleay32.dll', 'windows\\64\\ssleay32.dll', 'BINARY'), +('libeay32.dll', 'windows\\64\\libeay32.dll', 'BINARY')] +a.datas += [ +('ob.cfg', 'ob.cfg', 'DATA'), +('bitcointools\\english.txt', 'windows\\english.txt', 'DATA'), +#('msvcr120.dll', 'c:\\Python27\\msvcr120.dll', 'DATA'), +('msvcr90.dll', 'c:\\Python27\\msvcr90.dll', 'DATA'), +('msvcp90.dll', 'c:\\Python27\\msvcp90.dll', 'DATA') +] +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + a.binaries, +a.zipfiles, +a.datas, + name='openbazaard-windows64', + icon='windows\\icon.ico', + debug=False, + strip=False, + upx=True, + console=True ) diff --git a/build-linux32.sh b/build-linux32.sh new file mode 100755 index 00000000..b89b3503 --- /dev/null +++ b/build-linux32.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +OS="${1}" + +mkdir dist + + +# case "$TRAVIS_OS_NAME" in +# "linux") + cd OpenBazaar/ + + echo "Building Linux Binaries...." + sudo apt-get -qq update + sudo apt-get install -qq -y wget + + echo "32-bit..." + + wget -q https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz + tar xzf Python-2.7.10.tgz + sudo apt-get -qq -y install gcc-multilib g++-multilib + CFLAGS=-m32 LDFLAGS=-m32 ./configure --prefix=/opt/Python2.7-32bits + make + make install + + echo "Installing APT packages" + sudo apt-get -y -qq install npm python-pip python-virtualenv python-dev libffi-dev + + echo "Set up virtualenv" + virtualenv virt + . virt/bin/activate + + echo "Install Python dependencies" + virt/bin/pip install -q -r requirements.txt + virt/bin/pip install -q pyinstaller==3.1 + virt/bin/pip install -q cryptography + virt/bin/pip install -q setuptools==19.2 + virt/bin/pyinstaller -D -F .travis/openbazaard.linux32.spec + + +# ;; +# +# "osx") +# +# ;; +# esac diff --git a/build-linux64.sh b/build-linux64.sh new file mode 100755 index 00000000..1ff08d15 --- /dev/null +++ b/build-linux64.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +virtualenv virt64 +source virt64/bin/activate +pip install -r requirements.txt +pip install -q pyinstaller==3.1 +pip install -q setuptools==19.2 +pip install -q cryptography +pyinstaller -D -F .travis/openbazaard.linux64.spec diff --git a/build-win.sh b/build-win.sh new file mode 100755 index 00000000..288e766f --- /dev/null +++ b/build-win.sh @@ -0,0 +1,79 @@ +#!/bin/sh + +sudo dpkg --add-architecture i386 +sudo apt-get update -qq +sudo apt-get install -qq wine1.6 + +sudo mkdir -p dist/windows32 +cd dist/windows32 +#wget -O python.msi "http://www.python.org/ftp/python/2.7.12/python-2.7.12.msi" +#wget -O pywin32.exe "http://downloads.sourceforge.net/project/pywin32/pywin32/Build%20220/pywin32-220.win32-py2.7.exe?r=https%3A%2F%2Fsourceforge.net%2Fprojects%2Fpywin32%2Ffiles%2Fpywin32%2FBuild%2520220%2F&ts=1473864354&use_mirror=superb-sea2" + +THIS_SCRIPT_PATH=`readlink -f $0` +THIS_SCRIPT_DIR=`dirname ${THIS_SCRIPT_PATH}` + +WINE_TARBALL=${THIS_SCRIPT_DIR}/wine.tar.gz + +export WINEPREFIX=`mktemp -d --suffix=_wine` +export WINEARCH="win32 wine wineboot" + +echo "Created wine environment at $WINEPREFIX" + +if [ "$1" = "--update" ]; then + echo "Update option given. Starting from existing wine.tar.gz" + tar --directory=${WINEPREFIX} -xzf ${WINE_TARBALL} +fi + +WINEPREFIX=${WINEPREFIX} + +# Install Python +wget -N http://python.org/ftp/python/2.7.11/python-2.7.11.msi +wine msiexec /i python-2.7.11.msi /qn + +# Install MSVC +wget -N https://download.microsoft.com/download/7/9/6/796EF2E4-801B-4FC4-AB28-B59FBF6D907B/VCForPython27.msi +wine msiexec /i VCForPython27.msi /qn +wine cmd /c "c:\\Program Files (x86)\\Common Files\\Microsoft\\Visual C++ for Python\\9.0\\vcvarsall.bat" x86 + +#wget -N https://download.microsoft.com/download/1/1/1/1116b75a-9ec3-481a-a3c8-1777b5381140/vcredist_x86.exe +#wine vcredist_x86.exe /qn + +#wine cmd /c "copy c:\\Windows\\System32\\msvcr120.dll c:\\python27" +wine cmd /c "copy c:\\Windows\\System32\\msvcp90.dll c:\\python27" +wine cmd /c "copy c:\\Windows\\System32\\msvcm90.dll c:\\python27" + +# Install pip + +wget -N https://bootstrap.pypa.io/get-pip.py +wine c:/Python27/python.exe get-pip.py + +wget -N http://downloads.sourceforge.net/project/pywin32/pywin32/Build%20218/pywin32-218.win32-py2.7.exe?r=https%3A%2F%2Fsourceforge.net%2Fprojects%2Fpywin32%2Ffiles%2Fpywin32%2FBuild%2520218%2F&ts=1475598942&use_mirror=heanet -O pywin32.exe +wine pywin32.exe /s + +# Fix TLS Certs issue +wine c:/Python27/python -m pip install pyopenssl ndg-httpsclient pyasn1 + +# Set up Virtualenv +wine c:/Python27/python -m pip install virtualenv +wine c:/Python27/Scripts/virtualenv env +wine c:/Python27/Scripts/activate.bat + +wine c:/Python27/python -m pip install vcversioner +wine c:/Python27/python -m pip install https://openbazaar.org/downloads/miniupnpc-1.9-cp27-none-win32.whl +wine c:/Python27/python -m pip install https://openbazaar.org/downloads/PyNaCl-0.3.0-cp27-none-win32.whl +wine c:/Python27/python -m pip install https://openbazaar.org/downloads/Twisted-16.4.1-cp27-cp27m-win32.whl +#wine c:/Python27/python -m pip install https://openbazaar.org/downloads/Twisted-16.4.1-cp27m-win_amd64.whl +#wine c:/Python27/python -m pip install pefile +wine c:/Python27/python -m pip install -r ../../requirements.txt + +wine c:/Python27/python -m pip install pyinstaller==3.1 +wine c:/Python27/python -m pip install setuptools==19.2 +wine c:/Python27/python -m pip install pystun +wine c:/Python27/python -m pip install https://pypi.python.org/packages/7a/ec/47559abcfd6328c802036e8cf00a73885b5a71b4228e7f2dfb51f3ab2d69/pyzmq-15.3.0+fix-cp27-cp27m-win32.whl#md5=fdaa98a1dd2d201cb86229ad59baac17 + +wget -N https://github.com/pyinstaller/pyinstaller/releases/download/v3.1/PyInstaller-3.1.zip +unzip -o PyInstaller-3.1.zip +cd ../.. +wine C:/Python27/python.exe dist/windows32/PyInstaller-3.1/pyinstaller.py -F -n openbazaard-windows32.exe -i images/icon.ico .travis/openbazaard.win.spec --noconfirm --log-level=DEBUG + + diff --git a/build-win64.sh b/build-win64.sh new file mode 100755 index 00000000..4dd61b9b --- /dev/null +++ b/build-win64.sh @@ -0,0 +1,72 @@ +#!/bin/sh + + +sudo mkdir -p dist/windows64 +cd dist/windows64 + + +THIS_SCRIPT_PATH=`readlink -f $0` +THIS_SCRIPT_DIR=`dirname ${THIS_SCRIPT_PATH}` + +WINE_TARBALL=${THIS_SCRIPT_DIR}/wine.tar.gz + +export WINEPREFIX=`mktemp -d --suffix=_wine` +export WINEARCH="wine wineboot" + +echo "Created wine environment at $WINEPREFIX" + +if [ "$1" = "--update" ]; then + echo "Update option given. Starting from existing wine.tar.gz" + tar --directory=${WINEPREFIX} -xzf ${WINE_TARBALL} +fi + +WINEPREFIX=${WINEPREFIX} + +# Install Python +wget -N https://www.python.org/ftp/python/2.7.11/python-2.7.11.amd64.msi +wine msiexec /i python-2.7.11.amd64.msi /qn + +# Install MSVC +wget -N https://download.microsoft.com/download/7/9/6/796EF2E4-801B-4FC4-AB28-B59FBF6D907B/VCForPython27.msi +wine msiexec /i VCForPython27.msi /qn +wine cmd /c "c:\\Program Files (x86)\\Common Files\\Microsoft\\Visual C++ for Python\\9.0\\vcvarsall.bat" amd64 + +wine cmd /c "copy c:\\Windows\\System32\\msvcr90.dll ." +wine cmd /c "copy c:\\Windows\\System32\\msvcr120.dll c:\\python27" +wine cmd /c "copy c:\\Windows\\System32\\msvcp90.dll c:\\python27" +wine cmd /c "copy c:\\Windows\\System32\\msvcm90.dll c:\\python27" + +# Install pip +wget -N https://bootstrap.pypa.io/get-pip.py +wine c:/Python27/python.exe get-pip.py + +wget -N http://downloads.sourceforge.net/project/pywin32/pywin32/Build%20218/pywin32-218.win-amd64-py2.7.exe?r=&ts=1475526189&use_mirror=pilotfiber -O pywin32.exe +wine pywin32.exe /s + +# Fix TLS Certs issue +wine c:/Python27/python -m pip install pyopenssl ndg-httpsclient pyasn1 + +# Set up Virtualenv +#wine c:/Python27/python -m pip install virtualenv +#wine c:/Python27/Scripts/virtualenv env +#wine c:/Python27/Scripts/activate.bat + +wine c:/Python27/python -m pip install vcversioner +wine c:/Python27/python -m pip install https://openbazaar.org/downloads/miniupnpc-1.9-cp27-none-win_amd64.whl +wine c:/Python27/python -m pip install https://openbazaar.org/downloads/PyNaCl-0.3.0-cp27-none-win_amd64.whl +wine c:/Python27/python -m pip install https://openbazaar.org/downloads/Twisted-16.4.1-cp27m-win_amd64.whl +wine c:/Python27/python -m pip install -r ../../requirements.txt + +wine c:/Python27/python -m pip install pyinstaller==3.1 +wine c:/Python27/python -m pip install setuptools==19.2 +wine c:/Python27/python -m pip install pystun +wine c:/Python27/python -m pip install https://pypi.python.org/packages/a1/0c/f2029939f3ed0ebdfcd68451ffb5433d9b6268632cf9874a3edbff101008/pyzmq-15.3.0+fix-cp27-cp27m-win_amd64.whl#md5=708b0bb576b8827c4f31a5377a653be5 + +wine cmd /c "copy c:\\Windows\\System32\\msvcm90.dll c:\\python27" +wine cmd /c "copy c:\\Windows\\System32\\msvcm90.dll c:\\python27" + +wget -N https://github.com/pyinstaller/pyinstaller/releases/download/v3.1/PyInstaller-3.1.zip +unzip -o PyInstaller-3.1.zip +cd ../.. +wine C:/Python27/python.exe dist/windows64/PyInstaller-3.1/pyinstaller.py -F -n openbazaard-windows64.exe -i images/icon.ico .travis/openbazaard.win64.spec --noconfirm + diff --git a/travis-linux.sh b/travis-linux.sh new file mode 100755 index 00000000..e80afab2 --- /dev/null +++ b/travis-linux.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +sudo bash build-linux64.sh +sudo docker run -i -v "${PWD}:/OpenBazaar" toopher/ubuntu-i386:14.04 /bin/bash -c "linux32 --32bit i386 /OpenBazaar/build-linux32.sh" +sudo bash build-win.sh +sudo bash build-win64.sh +sudo chmod 777 dist/openbazaard-linux32 +sudo chmod a+x dist/openbazaard-linux32 +sudo chmod 777 dist/openbazaard-linux64 +sudo chmod a+x dist/openbazaard-linux64 +sudo chmod 777 dist/openbazaard-windows64.exe +sudo chmod 777 dist/openbazaard-windows32.exe diff --git a/travis-osx.sh b/travis-osx.sh new file mode 100755 index 00000000..5a284d7a --- /dev/null +++ b/travis-osx.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +virtualenv env +. env/bin/activate +pip install --upgrade pip +pip install --ignore-installed -r requirements.txt +pip install --ignore-installed pyinstaller==3.1 +pip install setuptools==19.1 +env/bin/pyinstaller -F -n openbazaard-osx -i osx/tent.icns --osx-bundle-identifier=com.openbazaar.openbazaard .travis/openbazaard.mac.spec +echo 'Completed building OpenBazaar-Server binary...' + diff --git a/windows/32/libeay32.dll b/windows/32/libeay32.dll new file mode 100644 index 00000000..de83cbe3 Binary files /dev/null and b/windows/32/libeay32.dll differ diff --git a/windows/32/msvcr120.dll b/windows/32/msvcr120.dll new file mode 100644 index 00000000..8c36149a Binary files /dev/null and b/windows/32/msvcr120.dll differ diff --git a/windows/32/ssleay32.dll b/windows/32/ssleay32.dll new file mode 100644 index 00000000..e8ab021e Binary files /dev/null and b/windows/32/ssleay32.dll differ diff --git a/windows/64/libeay32.dll b/windows/64/libeay32.dll new file mode 100644 index 00000000..2efbfe48 Binary files /dev/null and b/windows/64/libeay32.dll differ diff --git a/windows/64/ssleay32.dll b/windows/64/ssleay32.dll new file mode 100644 index 00000000..97f1db05 Binary files /dev/null and b/windows/64/ssleay32.dll differ diff --git a/windows/english.txt b/windows/english.txt new file mode 100644 index 00000000..942040ed --- /dev/null +++ b/windows/english.txt @@ -0,0 +1,2048 @@ +abandon +ability +able +about +above +absent +absorb +abstract +absurd +abuse +access +accident +account +accuse +achieve +acid +acoustic +acquire +across +act +action +actor +actress +actual +adapt +add +addict +address +adjust +admit +adult +advance +advice +aerobic +affair +afford +afraid +again +age +agent +agree +ahead +aim +air +airport +aisle +alarm +album +alcohol +alert +alien +all +alley +allow +almost +alone +alpha +already +also +alter +always +amateur +amazing +among +amount +amused +analyst +anchor +ancient +anger +angle +angry +animal +ankle +announce +annual +another +answer +antenna +antique +anxiety +any +apart +apology +appear +apple +approve +april +arch +arctic +area +arena +argue +arm +armed +armor +army +around +arrange +arrest +arrive +arrow +art +artefact +artist +artwork +ask +aspect +assault +asset +assist +assume +asthma +athlete +atom +attack +attend +attitude +attract +auction +audit +august +aunt +author +auto +autumn +average +avocado +avoid +awake +aware +away +awesome +awful +awkward +axis +baby +bachelor +bacon +badge +bag +balance +balcony +ball +bamboo +banana +banner +bar +barely +bargain +barrel +base +basic +basket +battle +beach +bean +beauty +because +become +beef +before +begin +behave +behind +believe +below +belt +bench +benefit +best +betray +better +between +beyond +bicycle +bid +bike +bind +biology +bird +birth +bitter +black +blade +blame +blanket +blast +bleak +bless +blind +blood +blossom +blouse +blue +blur +blush +board +boat +body +boil +bomb +bone +bonus +book +boost +border +boring +borrow +boss +bottom +bounce +box +boy +bracket +brain +brand +brass +brave +bread +breeze +brick +bridge +brief +bright +bring +brisk +broccoli +broken +bronze +broom +brother +brown +brush +bubble +buddy +budget +buffalo +build +bulb +bulk +bullet +bundle +bunker +burden +burger +burst +bus +business +busy +butter +buyer +buzz +cabbage +cabin +cable +cactus +cage +cake +call +calm +camera +camp +can +canal +cancel +candy +cannon +canoe +canvas +canyon +capable +capital +captain +car +carbon +card +cargo +carpet +carry +cart +case +cash +casino +castle +casual +cat +catalog +catch +category +cattle +caught +cause +caution +cave +ceiling +celery +cement +census +century +cereal +certain +chair +chalk +champion +change +chaos +chapter +charge +chase +chat +cheap +check +cheese +chef +cherry +chest +chicken +chief +child +chimney +choice +choose +chronic +chuckle +chunk +churn +cigar +cinnamon +circle +citizen +city +civil +claim +clap +clarify +claw +clay +clean +clerk +clever +click +client +cliff +climb +clinic +clip +clock +clog +close +cloth +cloud +clown +club +clump +cluster +clutch +coach +coast +coconut +code +coffee +coil +coin +collect +color +column +combine +come +comfort +comic +common +company +concert +conduct +confirm +congress +connect +consider +control +convince +cook +cool +copper +copy +coral +core +corn +correct +cost +cotton +couch +country +couple +course +cousin +cover +coyote +crack +cradle +craft +cram +crane +crash +crater +crawl +crazy +cream +credit +creek +crew +cricket +crime +crisp +critic +crop +cross +crouch +crowd +crucial +cruel +cruise +crumble +crunch +crush +cry +crystal +cube +culture +cup +cupboard +curious +current +curtain +curve +cushion +custom +cute +cycle +dad +damage +damp +dance +danger +daring +dash +daughter +dawn +day +deal +debate +debris +decade +december +decide +decline +decorate +decrease +deer +defense +define +defy +degree +delay +deliver +demand +demise +denial +dentist +deny +depart +depend +deposit +depth +deputy +derive +describe +desert +design +desk +despair +destroy +detail +detect +develop +device +devote +diagram +dial +diamond +diary +dice +diesel +diet +differ +digital +dignity +dilemma +dinner +dinosaur +direct +dirt +disagree +discover +disease +dish +dismiss +disorder +display +distance +divert +divide +divorce +dizzy +doctor +document +dog +doll +dolphin +domain +donate +donkey +donor +door +dose +double +dove +draft +dragon +drama +drastic +draw +dream +dress +drift +drill +drink +drip +drive +drop +drum +dry +duck +dumb +dune +during +dust +dutch +duty +dwarf +dynamic +eager +eagle +early +earn +earth +easily +east +easy +echo +ecology +economy +edge +edit +educate +effort +egg +eight +either +elbow +elder +electric +elegant +element +elephant +elevator +elite +else +embark +embody +embrace +emerge +emotion +employ +empower +empty +enable +enact +end +endless +endorse +enemy +energy +enforce +engage +engine +enhance +enjoy +enlist +enough +enrich +enroll +ensure +enter +entire +entry +envelope +episode +equal +equip +era +erase +erode +erosion +error +erupt +escape +essay +essence +estate +eternal +ethics +evidence +evil +evoke +evolve +exact +example +excess +exchange +excite +exclude +excuse +execute +exercise +exhaust +exhibit +exile +exist +exit +exotic +expand +expect +expire +explain +expose +express +extend +extra +eye +eyebrow +fabric +face +faculty +fade +faint +faith +fall +false +fame +family +famous +fan +fancy +fantasy +farm +fashion +fat +fatal +father +fatigue +fault +favorite +feature +february +federal +fee +feed +feel +female +fence +festival +fetch +fever +few +fiber +fiction +field +figure +file +film +filter +final +find +fine +finger +finish +fire +firm +first +fiscal +fish +fit +fitness +fix +flag +flame +flash +flat +flavor +flee +flight +flip +float +flock +floor +flower +fluid +flush +fly +foam +focus +fog +foil +fold +follow +food +foot +force +forest +forget +fork +fortune +forum +forward +fossil +foster +found +fox +fragile +frame +frequent +fresh +friend +fringe +frog +front +frost +frown +frozen +fruit +fuel +fun +funny +furnace +fury +future +gadget +gain +galaxy +gallery +game +gap +garage +garbage +garden +garlic +garment +gas +gasp +gate +gather +gauge +gaze +general +genius +genre +gentle +genuine +gesture +ghost +giant +gift +giggle +ginger +giraffe +girl +give +glad +glance +glare +glass +glide +glimpse +globe +gloom +glory +glove +glow +glue +goat +goddess +gold +good +goose +gorilla +gospel +gossip +govern +gown +grab +grace +grain +grant +grape +grass +gravity +great +green +grid +grief +grit +grocery +group +grow +grunt +guard +guess +guide +guilt +guitar +gun +gym +habit +hair +half +hammer +hamster +hand +happy +harbor +hard +harsh +harvest +hat +have +hawk +hazard +head +health +heart +heavy +hedgehog +height +hello +helmet +help +hen +hero +hidden +high +hill +hint +hip +hire +history +hobby +hockey +hold +hole +holiday +hollow +home +honey +hood +hope +horn +horror +horse +hospital +host +hotel +hour +hover +hub +huge +human +humble +humor +hundred +hungry +hunt +hurdle +hurry +hurt +husband +hybrid +ice +icon +idea +identify +idle +ignore +ill +illegal +illness +image +imitate +immense +immune +impact +impose +improve +impulse +inch +include +income +increase +index +indicate +indoor +industry +infant +inflict +inform +inhale +inherit +initial +inject +injury +inmate +inner +innocent +input +inquiry +insane +insect +inside +inspire +install +intact +interest +into +invest +invite +involve +iron +island +isolate +issue +item +ivory +jacket +jaguar +jar +jazz +jealous +jeans +jelly +jewel +job +join +joke +journey +joy +judge +juice +jump +jungle +junior +junk +just +kangaroo +keen +keep +ketchup +key +kick +kid +kidney +kind +kingdom +kiss +kit +kitchen +kite +kitten +kiwi +knee +knife +knock +know +lab +label +labor +ladder +lady +lake +lamp +language +laptop +large +later +latin +laugh +laundry +lava +law +lawn +lawsuit +layer +lazy +leader +leaf +learn +leave +lecture +left +leg +legal +legend +leisure +lemon +lend +length +lens +leopard +lesson +letter +level +liar +liberty +library +license +life +lift +light +like +limb +limit +link +lion +liquid +list +little +live +lizard +load +loan +lobster +local +lock +logic +lonely +long +loop +lottery +loud +lounge +love +loyal +lucky +luggage +lumber +lunar +lunch +luxury +lyrics +machine +mad +magic +magnet +maid +mail +main +major +make +mammal +man +manage +mandate +mango +mansion +manual +maple +marble +march +margin +marine +market +marriage +mask +mass +master +match +material +math +matrix +matter +maximum +maze +meadow +mean +measure +meat +mechanic +medal +media +melody +melt +member +memory +mention +menu +mercy +merge +merit +merry +mesh +message +metal +method +middle +midnight +milk +million +mimic +mind +minimum +minor +minute +miracle +mirror +misery +miss +mistake +mix +mixed +mixture +mobile +model +modify +mom +moment +monitor +monkey +monster +month +moon +moral +more +morning +mosquito +mother +motion +motor +mountain +mouse +move +movie +much +muffin +mule +multiply +muscle +museum +mushroom +music +must +mutual +myself +mystery +myth +naive +name +napkin +narrow +nasty +nation +nature +near +neck +need +negative +neglect +neither +nephew +nerve +nest +net +network +neutral +never +news +next +nice +night +noble +noise +nominee +noodle +normal +north +nose +notable +note +nothing +notice +novel +now +nuclear +number +nurse +nut +oak +obey +object +oblige +obscure +observe +obtain +obvious +occur +ocean +october +odor +off +offer +office +often +oil +okay +old +olive +olympic +omit +once +one +onion +online +only +open +opera +opinion +oppose +option +orange +orbit +orchard +order +ordinary +organ +orient +original +orphan +ostrich +other +outdoor +outer +output +outside +oval +oven +over +own +owner +oxygen +oyster +ozone +pact +paddle +page +pair +palace +palm +panda +panel +panic +panther +paper +parade +parent +park +parrot +party +pass +patch +path +patient +patrol +pattern +pause +pave +payment +peace +peanut +pear +peasant +pelican +pen +penalty +pencil +people +pepper +perfect +permit +person +pet +phone +photo +phrase +physical +piano +picnic +picture +piece +pig +pigeon +pill +pilot +pink +pioneer +pipe +pistol +pitch +pizza +place +planet +plastic +plate +play +please +pledge +pluck +plug +plunge +poem +poet +point +polar +pole +police +pond +pony +pool +popular +portion +position +possible +post +potato +pottery +poverty +powder +power +practice +praise +predict +prefer +prepare +present +pretty +prevent +price +pride +primary +print +priority +prison +private +prize +problem +process +produce +profit +program +project +promote +proof +property +prosper +protect +proud +provide +public +pudding +pull +pulp +pulse +pumpkin +punch +pupil +puppy +purchase +purity +purpose +purse +push +put +puzzle +pyramid +quality +quantum +quarter +question +quick +quit +quiz +quote +rabbit +raccoon +race +rack +radar +radio +rail +rain +raise +rally +ramp +ranch +random +range +rapid +rare +rate +rather +raven +raw +razor +ready +real +reason +rebel +rebuild +recall +receive +recipe +record +recycle +reduce +reflect +reform +refuse +region +regret +regular +reject +relax +release +relief +rely +remain +remember +remind +remove +render +renew +rent +reopen +repair +repeat +replace +report +require +rescue +resemble +resist +resource +response +result +retire +retreat +return +reunion +reveal +review +reward +rhythm +rib +ribbon +rice +rich +ride +ridge +rifle +right +rigid +ring +riot +ripple +risk +ritual +rival +river +road +roast +robot +robust +rocket +romance +roof +rookie +room +rose +rotate +rough +round +route +royal +rubber +rude +rug +rule +run +runway +rural +sad +saddle +sadness +safe +sail +salad +salmon +salon +salt +salute +same +sample +sand +satisfy +satoshi +sauce +sausage +save +say +scale +scan +scare +scatter +scene +scheme +school +science +scissors +scorpion +scout +scrap +screen +script +scrub +sea +search +season +seat +second +secret +section +security +seed +seek +segment +select +sell +seminar +senior +sense +sentence +series +service +session +settle +setup +seven +shadow +shaft +shallow +share +shed +shell +sheriff +shield +shift +shine +ship +shiver +shock +shoe +shoot +shop +short +shoulder +shove +shrimp +shrug +shuffle +shy +sibling +sick +side +siege +sight +sign +silent +silk +silly +silver +similar +simple +since +sing +siren +sister +situate +six +size +skate +sketch +ski +skill +skin +skirt +skull +slab +slam +sleep +slender +slice +slide +slight +slim +slogan +slot +slow +slush +small +smart +smile +smoke +smooth +snack +snake +snap +sniff +snow +soap +soccer +social +sock +soda +soft +solar +soldier +solid +solution +solve +someone +song +soon +sorry +sort +soul +sound +soup +source +south +space +spare +spatial +spawn +speak +special +speed +spell +spend +sphere +spice +spider +spike +spin +spirit +split +spoil +sponsor +spoon +sport +spot +spray +spread +spring +spy +square +squeeze +squirrel +stable +stadium +staff +stage +stairs +stamp +stand +start +state +stay +steak +steel +stem +step +stereo +stick +still +sting +stock +stomach +stone +stool +story +stove +strategy +street +strike +strong +struggle +student +stuff +stumble +style +subject +submit +subway +success +such +sudden +suffer +sugar +suggest +suit +summer +sun +sunny +sunset +super +supply +supreme +sure +surface +surge +surprise +surround +survey +suspect +sustain +swallow +swamp +swap +swarm +swear +sweet +swift +swim +swing +switch +sword +symbol +symptom +syrup +system +table +tackle +tag +tail +talent +talk +tank +tape +target +task +taste +tattoo +taxi +teach +team +tell +ten +tenant +tennis +tent +term +test +text +thank +that +theme +then +theory +there +they +thing +this +thought +three +thrive +throw +thumb +thunder +ticket +tide +tiger +tilt +timber +time +tiny +tip +tired +tissue +title +toast +tobacco +today +toddler +toe +together +toilet +token +tomato +tomorrow +tone +tongue +tonight +tool +tooth +top +topic +topple +torch +tornado +tortoise +toss +total +tourist +toward +tower +town +toy +track +trade +traffic +tragic +train +transfer +trap +trash +travel +tray +treat +tree +trend +trial +tribe +trick +trigger +trim +trip +trophy +trouble +truck +true +truly +trumpet +trust +truth +try +tube +tuition +tumble +tuna +tunnel +turkey +turn +turtle +twelve +twenty +twice +twin +twist +two +type +typical +ugly +umbrella +unable +unaware +uncle +uncover +under +undo +unfair +unfold +unhappy +uniform +unique +unit +universe +unknown +unlock +until +unusual +unveil +update +upgrade +uphold +upon +upper +upset +urban +urge +usage +use +used +useful +useless +usual +utility +vacant +vacuum +vague +valid +valley +valve +van +vanish +vapor +various +vast +vault +vehicle +velvet +vendor +venture +venue +verb +verify +version +very +vessel +veteran +viable +vibrant +vicious +victory +video +view +village +vintage +violin +virtual +virus +visa +visit +visual +vital +vivid +vocal +voice +void +volcano +volume +vote +voyage +wage +wagon +wait +walk +wall +walnut +want +warfare +warm +warrior +wash +wasp +waste +water +wave +way +wealth +weapon +wear +weasel +weather +web +wedding +weekend +weird +welcome +west +wet +whale +what +wheat +wheel +when +where +whip +whisper +wide +width +wife +wild +will +win +window +wine +wing +wink +winner +winter +wire +wisdom +wise +wish +witness +wolf +woman +wonder +wood +wool +word +work +world +worry +worth +wrap +wreck +wrestle +wrist +write +wrong +yard +year +yellow +you +young +youth +zebra +zero +zone +zoo diff --git a/windows/icon.ico b/windows/icon.ico new file mode 100644 index 00000000..e9421b7d Binary files /dev/null and b/windows/icon.ico differ