changeset 1314:dc20980a877d draft

Merge pull request #521 from laanwj/qt Qt GUI
author Gavin Andresen <gavinandresen@gmail.com>
date Mon, 26 Sep 2011 06:05:11 -0700
parents 9f30ae5dc5c4 (current diff) 58be15f1b025 (diff)
children 17e35c4c73f7
files README.md src/main.cpp src/net.cpp src/net.h src/rpc.cpp src/rpc.h
diffstat 156 files changed, 18418 insertions(+), 2443 deletions(-) [+]
line wrap: on
line diff
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,16 @@
 *.o
 *.patch
 .bitcoin
+#compilation and Qt preprocessor part
+*.o
+ui_*.h
+*.qm
+moc_*
+Makefile
+bitcoin-qt
+#resources cpp
+qrc_*.cpp
+#qt creator
+*.pro.user
+#mac specific
+.DS_Store
--- a/README.md
+++ b/README.md
@@ -27,4 +27,3 @@
 
 Feature branches are created when there are major new features being
 worked on by several people.
-
new file mode 100644
--- /dev/null
+++ b/bitcoin-qt.pro
@@ -0,0 +1,185 @@
+TEMPLATE = app
+TARGET =
+INCLUDEPATH += src src/json src/cryptopp src/qt
+DEFINES += QT_GUI
+# DEFINES += SSL
+CONFIG += no_include_pwd
+
+# for boost 1.37, add -mt to the boost libraries
+LIBS += -lssl -lcrypto -ldb_cxx
+unix:!macx:LIBS += -lboost_system -lboost_filesystem -lboost_program_options -lboost_thread
+macx:LIBS += -lboost_system-mt -lboost_filesystem-mt -lboost_program_options-mt -lboost_thread-mt
+macx:DEFINES += __WXMAC_OSX__ MSG_NOSIGNAL=0 BOOST_FILESYSTEM_VERSION=3
+windows:LIBS += -lboost_system-mgw44-mt-1_43 -lboost_filesystem-mgw44-mt-1_43 -lboost_program_options-mgw44-mt-1_43 -lboost_thread-mgw44-mt-1_43 -lws2_32 -lgdi32
+windows:DEFINES += __WXMSW__
+windows:RC_FILE = src/qt/res/bitcoin-qt.rc
+
+# use: qmake "USE_UPNP=1"
+# miniupnpc (http://miniupnp.free.fr/files/) must be installed
+count(USE_UPNP, 1) {
+    message(Building with UPNP support)
+    DEFINES += USE_UPNP=$$USE_UPNP
+    LIBS += -lminiupnpc
+}
+
+count(USE_DBUS, 1) {
+    message(Building with DBUS (Freedesktop notifications) support)
+    DEFINES += QT_DBUS
+    QT += dbus
+}
+
+# for extra security against potential buffer overflows
+QMAKE_CXXFLAGS += -fstack-protector 
+QMAKE_LFLAGS += -fstack-protector
+
+# disable quite some warnings because bitcoin core "sins" a lot
+QMAKE_CXXFLAGS_WARN_ON = -fdiagnostics-show-option -Wall -Wno-invalid-offsetof -Wno-unused-variable -Wno-unused-parameter -Wno-sign-compare -Wno-char-subscripts  -Wno-unused-value -Wno-sequence-point -Wno-parentheses -Wno-unknown-pragmas -Wno-switch
+
+# Input
+DEPENDPATH += src/qt src src/cryptopp src json/include
+HEADERS += src/qt/bitcoingui.h \
+    src/qt/transactiontablemodel.h \
+    src/qt/addresstablemodel.h \
+    src/qt/optionsdialog.h \
+    src/qt/sendcoinsdialog.h \
+    src/qt/addressbookpage.h \
+    src/qt/aboutdialog.h \
+    src/qt/editaddressdialog.h \
+    src/qt/bitcoinaddressvalidator.h \
+    src/base58.h \
+    src/bignum.h \
+    src/util.h \
+    src/uint256.h \
+    src/serialize.h \
+    src/cryptopp/stdcpp.h \
+    src/cryptopp/smartptr.h \
+    src/cryptopp/simple.h \
+    src/cryptopp/sha.h \
+    src/cryptopp/secblock.h \
+    src/cryptopp/pch.h \
+    src/cryptopp/misc.h \
+    src/cryptopp/iterhash.h \
+    src/cryptopp/cryptlib.h \
+    src/cryptopp/cpu.h \
+    src/cryptopp/config.h \
+    src/strlcpy.h \
+    src/main.h \
+    src/net.h \
+    src/key.h \
+    src/db.h \
+    src/script.h \
+    src/noui.h \
+    src/init.h \
+    src/headers.h \
+    src/irc.h \
+    src/json/json_spirit_writer_template.h \
+    src/json/json_spirit_writer.h \
+    src/json/json_spirit_value.h \
+    src/json/json_spirit_utils.h \
+    src/json/json_spirit_stream_reader.h \
+    src/json/json_spirit_reader_template.h \
+    src/json/json_spirit_reader.h \
+    src/json/json_spirit_error_position.h \
+    src/json/json_spirit.h \
+    src/qt/clientmodel.h \
+    src/qt/guiutil.h \
+    src/qt/transactionrecord.h \
+    src/qt/guiconstants.h \
+    src/qt/optionsmodel.h \
+    src/qt/monitoreddatamapper.h \
+    src/qtui.h \
+    src/qt/transactiondesc.h \
+    src/qt/transactiondescdialog.h \
+    src/qt/bitcoinamountfield.h \
+    src/wallet.h \
+    src/keystore.h \
+    src/qt/transactionfilterproxy.h \
+    src/qt/transactionview.h \
+    src/qt/walletmodel.h \
+    src/bitcoinrpc.h \
+    src/qt/overviewpage.h \
+    src/qt/csvmodelwriter.h \
+    src/crypter.h \
+    src/qt/sendcoinsentry.h \
+    src/qt/qvalidatedlineedit.h \
+    src/qt/bitcoinunits.h \
+    src/qt/qvaluecombobox.h \
+    src/qt/askpassphrasedialog.h \
+    src/protocol.h \
+    src/qt/notificator.h
+
+SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \
+    src/qt/transactiontablemodel.cpp \
+    src/qt/addresstablemodel.cpp \
+    src/qt/optionsdialog.cpp \
+    src/qt/sendcoinsdialog.cpp \
+    src/qt/addressbookpage.cpp \
+    src/qt/aboutdialog.cpp \
+    src/qt/editaddressdialog.cpp \
+    src/qt/bitcoinaddressvalidator.cpp \
+    src/cryptopp/sha.cpp \
+    src/cryptopp/cpu.cpp \
+    src/util.cpp \
+    src/script.cpp \
+    src/main.cpp \
+    src/init.cpp \
+    src/net.cpp \
+    src/irc.cpp \
+    src/db.cpp \
+    src/json/json_spirit_writer.cpp \
+    src/json/json_spirit_value.cpp \
+    src/json/json_spirit_reader.cpp \
+    src/qt/clientmodel.cpp \
+    src/qt/guiutil.cpp \
+    src/qt/transactionrecord.cpp \
+    src/qt/optionsmodel.cpp \
+    src/qt/monitoreddatamapper.cpp \
+    src/qt/transactiondesc.cpp \
+    src/qt/transactiondescdialog.cpp \
+    src/qt/bitcoinstrings.cpp \
+    src/qt/bitcoinamountfield.cpp \
+    src/wallet.cpp \
+    src/keystore.cpp \
+    src/qt/transactionfilterproxy.cpp \
+    src/qt/transactionview.cpp \
+    src/qt/walletmodel.cpp \
+    src/bitcoinrpc.cpp \
+    src/qt/overviewpage.cpp \
+    src/qt/csvmodelwriter.cpp \
+    src/crypter.cpp \
+    src/qt/sendcoinsentry.cpp \
+    src/qt/qvalidatedlineedit.cpp \
+    src/qt/bitcoinunits.cpp \
+    src/qt/qvaluecombobox.cpp \
+    src/qt/askpassphrasedialog.cpp \
+    src/protocol.cpp \
+    src/qt/notificator.cpp
+
+RESOURCES += \
+    src/qt/bitcoin.qrc
+
+FORMS += \
+    src/qt/forms/sendcoinsdialog.ui \
+    src/qt/forms/addressbookpage.ui \
+    src/qt/forms/aboutdialog.ui \
+    src/qt/forms/editaddressdialog.ui \
+    src/qt/forms/transactiondescdialog.ui \
+    src/qt/forms/overviewpage.ui \
+    src/qt/forms/sendcoinsentry.ui \
+    src/qt/forms/askpassphrasedialog.ui
+
+CODECFORTR = UTF-8
+# for lrelease/lupdate
+TRANSLATIONS = src/qt/locale/bitcoin_nl.ts src/qt/locale/bitcoin_de.ts \
+               src/qt/locale/bitcoin_ru.ts
+
+OTHER_FILES += \
+    README.rst
+
+# For use with MacPorts
+macx:INCLUDEPATH += /opt/local/include /opt/local/include/db48
+macx:LIBS += -L/opt/local/lib -L/opt/local/lib/db48
+
+# Additional Mac options
+macx:ICON = src/qt/res/icons/bitcoin.icns
+macx:TARGET = "Bitcoin Qt"
new file mode 100644
--- /dev/null
+++ b/contrib/miniupnpc/Portfile
@@ -0,0 +1,43 @@
+# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:filetype=tcl:et:sw=4:ts=4:sts=4
+# $Id$
+
+PortSystem          1.0
+
+name                miniupnpc
+epoch               2
+version             1.6
+revision            2
+categories          net
+platforms           darwin
+license             BSD
+maintainers         singingwolfboy openmaintainer
+description         Lightweight client for UPnP protocol
+long_description    \
+    ${description}
+    
+homepage            http://miniupnp.free.fr/
+master_sites        http://miniupnp.free.fr/files/download.php?file=${distname}${extract.suffix}&dummy=
+checksums           md5     88055f2d4a061cfd4cfe25a9eae22f67 \
+                    sha1    ef8f2edb17f2e7c5b8dc67ee80a65c199d823e0a \
+                    rmd160  d86b75b331a3fb5525c71708548f311977c0598f
+
+use_configure       no
+
+variant universal {}
+if {[variant_isset universal]} {
+    set archflags ${configure.universal_cflags}
+} else {
+    set archflags ${configure.cc_archflags}
+}
+
+build.args-append   CC="${configure.cc} ${archflags}"
+
+post-patch {
+    reinplace "s|-Wl,-install_name,|-Wl,-install_name,${prefix}/lib/|" ${worksrcpath}/Makefile
+}
+
+destroot.destdir    PREFIX=${prefix} INSTALLPREFIX=${destroot}${prefix}
+
+livecheck.type      regex
+livecheck.url       http://miniupnp.free.fr/files/
+livecheck.regex     ${name}-(\\d+(\\.\\d{1,4})+)${extract.suffix}
new file mode 100644
--- /dev/null
+++ b/doc/assets-attribution.txt
@@ -0,0 +1,73 @@
+Icon: src/qt/res/icons/clock*.png, src/qt/res/icons/tx*.png,
+      src/qt/res/src/*.svg
+Designer: Wladimir van der Laan
+License: Creative Commons Attribution
+
+Icon: src/qt/res/icons/send.png
+Icon Pack: Vista Style Arrow
+Designer: Icons Land
+License: Freeware Non-commercial
+Site: http://findicons.com/icon/231371/right3green
+
+Icon: src/qt/res/icons/address-book.png
+Icon Pack: Farm-Fresh Web
+Designer: FatCow Web Hosting
+License: Creative Commons Attribution (by)
+Site: http://findicons.com/icon/163938/book_open
+
+Icon: src/qt/res/icons/connect*.png, src/qt/res/icons/synced.png, src/qt/res/icons/lock_*.png
+Icon Pack: Human-O2
+Designer: schollidesign
+License: GNU/GPL
+Site: http://findicons.com/icon/93743/blocks_gnome_netstatus_0
+
+Icon: src/qt/res/icons/transaction*.png
+Designer: md2k7
+Site: https://forum.bitcoin.org/index.php?topic=15276.0
+License: You are free to do with these icons as you wish, including selling,
+ copying, modifying etc.
+
+Icon: src/qt/res/icons/configure.png, src/qt/res/icons/quit.png,
+      src/qt/res/icons/editcopy.png, src/qt/res/icons/editpaste.png,
+      src/qt/res/icons/add.png, src/qt/res/icons/edit.png,
+      src/qt/res/icons/remove.png (edited)
+Designer: http://www.everaldo.com
+Icon Pack: Crystal SVG
+License: LGPL
+
+Icon: src/qt/res/icons/receive.png, src/qt/res/icons/history.png,
+      src/qt/res/icons/export.png
+Designer: Oxygen team
+Icon Pack: Oxygen
+License: Creative Common Attribution-ShareAlike 3.0 License or LGPL
+Site: http://www.oxygen-icons.org/
+
+Icon: src/qt/res/icons/bitcoin.png, src/qt/res/icons/toolbar.png
+Designer: Bitboy (optimized for 16x16 by Wladimir van der Laan)
+License: Public Domain
+Site: http://forum.bitcoin.org/?topic=1756.0
+
+Icon: src/qt/res/icons/overview.png
+Icon Pack: Primo
+Designer: Jack Cai
+License: Creative Commons Attribution No Derivatives (by-nd)
+Site: http://findicons.com/icon/175944/home?id=176221#
+
+Icon:  scripts/img/reload.xcf (modified),src/qt/res/movies/update_spinner.mng
+Icon Pack: Kids
+Designer: Everaldo (Everaldo Coelho)
+License: GNU/GPL 
+Site: http://findicons.com/icon/17102/reload?id=17102
+
+Image: src/qt/res/images/splash2.jpg (Wallet image)
+Designer: Crobbo (forum)
+Site: https://bitcointalk.org/index.php?topic=32273.0
+License: Public domain
+
+Icon: src/qt/res/icons/key.png
+Designer: VisualPharm (Ivan Boyko)
+Icon Pack: Must Have
+Site: http://findicons.com/icon/51009/key?id=51009
+License: Creative Commons Attribution (by)
+
+
new file mode 100644
--- /dev/null
+++ b/doc/readme-qt.rst
@@ -0,0 +1,162 @@
+Bitcoin-qt: Qt4 based GUI replacement for Bitcoin
+=================================================
+
+Features
+========
+
+- All functionality of the Wx GUI, including wallet encryption
+
+- Compatibility with Linux (both GNOME and KDE), MacOSX and Windows
+
+- Notification on incoming / outgoing transactions (compatible with FreeDesktop and other desktop notification schemes)
+
+- General interface improvements: Splash screen, tabbed interface
+
+- Overview page with current balance, unconfirmed balance, and such
+
+- Better transaction list with status icons, real-time filtering and a context menu
+
+- Asks for confirmation before sending coins, for your own safety
+
+- CSV export of transactions and address book (for Excel bookkeeping)
+
+- Shows alternative icon when connected to testnet, so you never accidentally send real coins during testing
+
+- Shows a progress bar on initial block download, so that you don't have to wonder how many blocks it needs to download to be up to date
+
+- Sendmany support, send to multiple recipients at the same time
+
+- Multiple unit support, can show subdivided bitcoins (uBTC, mBTC) for users that like large numbers
+
+- Support for English, German, Russian and Dutch languages
+
+- Address books and transaction table can be sorted by any column
+
+- Accepts "bitcoin:" URLs from browsers and other sources through drag and drop
+
+Build instructions
+===================
+
+Debian
+-------
+
+First, make sure that the required packages for Qt4 development of your
+distribution are installed, for Debian and Ubuntu these are:
+
+::
+
+    apt-get install qt4-qmake libqt4-dev build-essential libboost-dev libboost-system-dev \
+        libboost-filesystem-dev libboost-program-options-dev libboost-thread-dev \
+        libssl-dev libdb4.8++-dev
+
+then execute the following:
+
+::
+
+    qmake
+    make
+
+Alternatively, install Qt Creator and open the `bitcoin-qt.pro` file.
+
+An executable named `bitcoin-qt` will be built.
+
+
+Windows
+--------
+
+Windows build instructions:
+
+- Download the `QT Windows SDK`_ and install it. You don't need the Symbian stuff, just the desktop Qt.
+
+- Download and extract the `dependencies archive`_  [#]_, or compile openssl, boost and dbcxx yourself.
+
+- Copy the contents of the folder "deps" to "X:\\QtSDK\\mingw", replace X:\\ with the location where you installed the Qt SDK. Make sure that the contents of "deps\\include" end up in the current "include" directory.
+
+- Open the .pro file in QT creator and build as normal (ctrl-B)
+
+.. _`QT Windows SDK`: http://qt.nokia.com/downloads/sdk-windows-cpp
+.. _`dependencies archive`: https://download.visucore.com/bitcoin/qtgui_deps_1.zip
+.. [#] PGP signature: https://download.visucore.com/bitcoin/qtgui_deps_1.zip.sig (signed with RSA key ID `610945D0`_)
+.. _`610945D0`: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x610945D0
+
+
+Mac OS X
+--------
+
+- Download and install the `Qt Mac OS X SDK`_. It is recommended to also install Apple's Xcode with UNIX tools.
+
+- Download and install `MacPorts`_.
+
+- Execute the following commands in a terminal to get the dependencies:
+
+::
+
+	sudo port selfupdate
+	sudo port install boost db48
+
+- Open the .pro file in Qt Creator and build as normal (cmd-B)
+
+.. _`Qt Mac OS X SDK`: http://qt.nokia.com/downloads/sdk-mac-os-cpp
+.. _`MacPorts`: http://www.macports.org/install.php
+
+
+Build configuration options
+============================
+
+UPNnP port forwarding
+---------------------
+
+To use UPnP for port forwarding behind a NAT router (recommended, as more connections overall allow for a faster and more stable bitcoin experience), pass the following argument to qmake:
+
+::
+
+    qmake "USE_UPNP=1"
+
+(in **Qt Creator**, you can find the setting for additional qmake arguments under "Projects" -> "Build Settings" -> "Build Steps", then click "Details" next to **qmake**)
+
+This requires miniupnpc for UPnP port mapping.  It can be downloaded from
+http://miniupnp.tuxfamily.org/files/.  UPnP support is not compiled in by default.
+
+Set USE_UPNP to a different value to control this:
+
++------------+--------------------------------------------------------------+
+| USE_UPNP=  | (the default) no UPnP support, miniupnpc not required;       |
++------------+--------------------------------------------------------------+
+| USE_UPNP=0 | UPnP support turned off by default at runtime;               |
++------------+--------------------------------------------------------------+
+| USE_UPNP=1 | UPnP support turned on by default at runtime.                |
++------------+--------------------------------------------------------------+
+
+Mac OS X users: miniupnpc is currently outdated on MacPorts. An updated Portfile is provided in contrib/miniupnpc within this project.
+You can execute the following commands in a terminal to install it:
+
+::
+
+	cd <location of bitcoin-qt>/contrib/miniupnpc
+	sudo port install
+
+Notification support for recent (k)ubuntu versions
+---------------------------------------------------
+
+To see desktop notifications on (k)ubuntu versions starting from 10.04, enable usage of the
+FreeDesktop notification interface through DBUS using the following qmake option:
+
+::
+
+    qmake "USE_DBUS=1"
+
+Berkely DB version warning
+==========================
+
+A warning for people using the *static binary* version of Bitcoin on a Linux/UNIX-ish system (tl;dr: **Berkely DB databases are not forward compatible**).
+
+The static binary version of Bitcoin is linked against libdb4.7 or libdb4.8 (see also `this Debian issue`_).
+
+Now the nasty thing is that databases from 5.X are not compatible with 4.X.
+
+If the globally installed development package of Berkely DB installed on your system is 5.X, any source you
+build yourself will be linked against that. The first time you run with a 5.X version the database will be upgraded,
+and 4.X cannot open the new format. This means that you cannot go back to the old statically linked version without
+significant hassle!
+
+.. _`this Debian issue`: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=621425
new file mode 100755
--- /dev/null
+++ b/scripts/qt/extract_strings_qt.py
@@ -0,0 +1,63 @@
+#!/usr/bin/python
+'''
+Extract _("...") strings for translation and convert to Qt4 stringdefs so that
+they can be picked up by Qt linguist.
+'''
+from subprocess import Popen, PIPE
+
+OUT_CPP="src/qt/bitcoinstrings.cpp"
+EMPTY=['""']
+
+def parse_po(text):
+    """
+    Parse 'po' format produced by xgettext.
+    Return a list of (msgid,msgstr) tuples.
+    """
+    messages = []
+    msgid = []
+    msgstr = []
+    in_msgid = False
+    in_msgstr = False
+
+    for line in text.split('\n'):
+        line = line.rstrip('\r')
+        if line.startswith('msgid '):
+            if in_msgstr:
+                messages.append((msgid, msgstr))
+                in_msgstr = False
+            # message start
+            in_msgid = True
+            
+            msgid = [line[6:]]
+        elif line.startswith('msgstr '):
+            in_msgid = False
+            in_msgstr = True
+            msgstr = [line[7:]]
+        elif line.startswith('"'):
+            if in_msgid:
+                msgid.append(line)
+            if in_msgstr:
+                msgstr.append(line)
+
+    if in_msgstr:
+        messages.append((msgid, msgstr))
+
+    return messages
+
+files = ['src/base58.h', 'src/bignum.h', 'src/db.cpp', 'src/db.h', 'src/headers.h', 'src/init.cpp', 'src/init.h', 'src/irc.cpp', 'src/irc.h', 'src/key.h', 'src/main.cpp', 'src/main.h', 'src/net.cpp', 'src/net.h', 'src/noui.h', 'src/script.cpp', 'src/script.h', 'src/serialize.h', 'src/strlcpy.h', 'src/uint256.h', 'src/util.cpp', 'src/util.h']
+
+# xgettext -n --keyword=_ $FILES
+child = Popen(['xgettext','--output=-','-n','--keyword=_'] + files, stdout=PIPE)
+(out, err) = child.communicate()
+
+messages = parse_po(out) 
+
+f = open(OUT_CPP, 'w')
+f.write('#include <QtGlobal>\n')
+f.write('// Automatically generated by extract_strings.py\n')
+f.write('static const char *bitcoin_strings[] = {')
+for (msgid, msgstr) in messages:
+    if msgid != EMPTY:
+        f.write('QT_TRANSLATE_NOOP("bitcoin-core", %s),\n' % ('\n'.join(msgid)))
+f.write('};')
+f.close()
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..dc8be62831673c2e99f05f5e5b42581e6e4e1db1
GIT binary patch
literal 25292
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
DhY;cx
new file mode 100755
--- /dev/null
+++ b/scripts/qt/make_spinner.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+# W.J. van der Laan, 2011
+# Make spinning .mng animation from a .png
+# Requires imagemagick 6.7+
+from __future__ import division
+from os import path
+from PIL import Image
+from subprocess import Popen
+
+SRC='img/reload_scaled.png'
+DST='../../src/qt/res/movies/update_spinner.mng'
+TMPDIR='/tmp'
+TMPNAME='tmp-%03i.png'
+NUMFRAMES=35
+FRAMERATE=10.0
+CONVERT='convert'
+CLOCKWISE=True
+DSIZE=(16,16)
+
+im_src = Image.open(SRC)
+
+if CLOCKWISE:
+    im_src = im_src.transpose(Image.FLIP_LEFT_RIGHT)
+
+def frame_to_filename(frame):
+    return path.join(TMPDIR, TMPNAME % frame)
+
+frame_files = []
+for frame in xrange(NUMFRAMES):
+    rotation = (frame + 0.5) / NUMFRAMES * 360.0
+    if CLOCKWISE:
+        rotation = -rotation
+    im_new = im_src.rotate(rotation, Image.BICUBIC)
+    im_new.thumbnail(DSIZE, Image.ANTIALIAS)
+    outfile = frame_to_filename(frame)
+    im_new.save(outfile, 'png')
+    frame_files.append(outfile)
+
+p = Popen([CONVERT, "-delay", str(FRAMERATE), "-dispose", "2"] + frame_files + [DST])
+p.communicate()
+
+
+
new file mode 100755
--- /dev/null
+++ b/scripts/qt/make_windows_icon.py
@@ -0,0 +1,9 @@
+#!/bin/bash
+# create multiresolution windows icon
+ICON_SRC=../../src/qt/res/icons/bitcoin.png
+ICON_DST=../../src/qt/res/icons/bitcoin.ico
+convert ${ICON_SRC} -resize 16x16 bitcoin-16.png
+convert ${ICON_SRC} -resize 32x32 bitcoin-32.png
+convert ${ICON_SRC} -resize 48x48 bitcoin-48.png
+convert bitcoin-16.png bitcoin-32.png bitcoin-48.png ${ICON_DST}
+
new file mode 100644
--- /dev/null
+++ b/src/bitcoinrpc.cpp
@@ -0,0 +1,2405 @@
+// Copyright (c) 2010 Satoshi Nakamoto
+// Copyright (c) 2011 The Bitcoin developers
+// Distributed under the MIT/X11 software license, see the accompanying
+// file license.txt or http://www.opensource.org/licenses/mit-license.php.
+
+#include "headers.h"
+#include "cryptopp/sha.h"
+#include "db.h"
+#include "net.h"
+#include "init.h"
+#undef printf
+#include <boost/asio.hpp>
+#include <boost/iostreams/concepts.hpp>
+#include <boost/iostreams/stream.hpp>
+#include <boost/algorithm/string.hpp>
+#ifdef USE_SSL
+#include <boost/asio/ssl.hpp> 
+#include <boost/filesystem.hpp>
+#include <boost/filesystem/fstream.hpp>
+typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> SSLStream;
+#endif
+#include "json/json_spirit_reader_template.h"
+#include "json/json_spirit_writer_template.h"
+#include "json/json_spirit_utils.h"
+#define printf OutputDebugStringF
+// MinGW 3.4.5 gets "fatal error: had to relocate PCH" if the json headers are
+// precompiled in headers.h.  The problem might be when the pch file goes over
+// a certain size around 145MB.  If we need access to json_spirit outside this
+// file, we could use the compiled json_spirit option.
+
+using namespace std;
+using namespace boost;
+using namespace boost::asio;
+using namespace json_spirit;
+
+void ThreadRPCServer2(void* parg);
+typedef Value(*rpcfn_type)(const Array& params, bool fHelp);
+extern map<string, rpcfn_type> mapCallTable;
+
+static int64 nWalletUnlockTime;
+static CCriticalSection cs_nWalletUnlockTime;
+
+
+Object JSONRPCError(int code, const string& message)
+{
+    Object error;
+    error.push_back(Pair("code", code));
+    error.push_back(Pair("message", message));
+    return error;
+}
+
+
+void PrintConsole(const std::string &format, ...)
+{
+    char buffer[50000];
+    int limit = sizeof(buffer);
+    va_list arg_ptr;
+    va_start(arg_ptr, format);
+    int ret = _vsnprintf(buffer, limit, format.c_str(), arg_ptr);
+    va_end(arg_ptr);
+    if (ret < 0 || ret >= limit)
+    {
+        ret = limit - 1;
+        buffer[limit-1] = 0;
+    }
+    printf("%s", buffer);
+#if defined(__WXMSW__) && defined(GUI)
+    MyMessageBox(buffer, "Bitcoin", wxOK | wxICON_EXCLAMATION);
+#else
+    fprintf(stdout, "%s", buffer);
+#endif
+}
+
+
+int64 AmountFromValue(const Value& value)
+{
+    double dAmount = value.get_real();
+    if (dAmount <= 0.0 || dAmount > 21000000.0)
+        throw JSONRPCError(-3, "Invalid amount");
+    int64 nAmount = roundint64(dAmount * COIN);
+    if (!MoneyRange(nAmount))
+        throw JSONRPCError(-3, "Invalid amount");
+    return nAmount;
+}
+
+Value ValueFromAmount(int64 amount)
+{
+    return (double)amount / (double)COIN;
+}
+
+void WalletTxToJSON(const CWalletTx& wtx, Object& entry)
+{
+    entry.push_back(Pair("confirmations", wtx.GetDepthInMainChain()));
+    entry.push_back(Pair("txid", wtx.GetHash().GetHex()));
+    entry.push_back(Pair("time", (boost::int64_t)wtx.GetTxTime()));
+    BOOST_FOREACH(const PAIRTYPE(string,string)& item, wtx.mapValue)
+        entry.push_back(Pair(item.first, item.second));
+}
+
+string AccountFromValue(const Value& value)
+{
+    string strAccount = value.get_str();
+    if (strAccount == "*")
+        throw JSONRPCError(-11, "Invalid account name");
+    return strAccount;
+}
+
+
+
+///
+/// Note: This interface may still be subject to change.
+///
+
+
+Value help(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() > 1)
+        throw runtime_error(
+            "help [command]\n"
+            "List commands, or get help for a command.");
+
+    string strCommand;
+    if (params.size() > 0)
+        strCommand = params[0].get_str();
+
+    string strRet;
+    set<rpcfn_type> setDone;
+    for (map<string, rpcfn_type>::iterator mi = mapCallTable.begin(); mi != mapCallTable.end(); ++mi)
+    {
+        string strMethod = (*mi).first;
+        // We already filter duplicates, but these deprecated screw up the sort order
+        if (strMethod == "getamountreceived" ||
+            strMethod == "getallreceived" ||
+            (strMethod.find("label") != string::npos))
+            continue;
+        if (strCommand != "" && strMethod != strCommand)
+            continue;
+        try
+        {
+            Array params;
+            rpcfn_type pfn = (*mi).second;
+            if (setDone.insert(pfn).second)
+                (*pfn)(params, true);
+        }
+        catch (std::exception& e)
+        {
+            // Help text is returned in an exception
+            string strHelp = string(e.what());
+            if (strCommand == "")
+                if (strHelp.find('\n') != -1)
+                    strHelp = strHelp.substr(0, strHelp.find('\n'));
+            strRet += strHelp + "\n";
+        }
+    }
+    if (strRet == "")
+        strRet = strprintf("help: unknown command: %s\n", strCommand.c_str());
+    strRet = strRet.substr(0,strRet.size()-1);
+    return strRet;
+}
+
+
+Value stop(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() != 0)
+        throw runtime_error(
+            "stop\n"
+            "Stop bitcoin server.");
+
+    // Shutdown will take long enough that the response should get back
+    CreateThread(Shutdown, NULL);
+    return "bitcoin server stopping";
+}
+
+
+Value getblockcount(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() != 0)
+        throw runtime_error(
+            "getblockcount\n"
+            "Returns the number of blocks in the longest block chain.");
+
+    return nBestHeight;
+}
+
+
+Value getblocknumber(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() != 0)
+        throw runtime_error(
+            "getblocknumber\n"
+            "Returns the block number of the latest block in the longest block chain.");
+
+    return nBestHeight;
+}
+
+
+Value getconnectioncount(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() != 0)
+        throw runtime_error(
+            "getconnectioncount\n"
+            "Returns the number of connections to other nodes.");
+
+    return (int)vNodes.size();
+}
+
+
+double GetDifficulty()
+{
+    // Floating point number that is a multiple of the minimum difficulty,
+    // minimum difficulty = 1.0.
+
+    if (pindexBest == NULL)
+        return 1.0;
+    int nShift = (pindexBest->nBits >> 24) & 0xff;
+
+    double dDiff =
+        (double)0x0000ffff / (double)(pindexBest->nBits & 0x00ffffff);
+
+    while (nShift < 29)
+    {
+        dDiff *= 256.0;
+        nShift++;
+    }
+    while (nShift > 29)
+    {
+        dDiff /= 256.0;
+        nShift--;
+    }
+
+    return dDiff;
+}
+
+Value getdifficulty(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() != 0)
+        throw runtime_error(
+            "getdifficulty\n"
+            "Returns the proof-of-work difficulty as a multiple of the minimum difficulty.");
+
+    return GetDifficulty();
+}
+
+
+Value getgenerate(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() != 0)
+        throw runtime_error(
+            "getgenerate\n"
+            "Returns true or false.");
+
+    return (bool)fGenerateBitcoins;
+}
+
+
+Value setgenerate(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() < 1 || params.size() > 2)
+        throw runtime_error(
+            "setgenerate <generate> [genproclimit]\n"
+            "<generate> is true or false to turn generation on or off.\n"
+            "Generation is limited to [genproclimit] processors, -1 is unlimited.");
+
+    bool fGenerate = true;
+    if (params.size() > 0)
+        fGenerate = params[0].get_bool();
+
+    if (params.size() > 1)
+    {
+        int nGenProcLimit = params[1].get_int();
+        fLimitProcessors = (nGenProcLimit != -1);
+        WriteSetting("fLimitProcessors", fLimitProcessors);
+        if (nGenProcLimit != -1)
+            WriteSetting("nLimitProcessors", nLimitProcessors = nGenProcLimit);
+        if (nGenProcLimit == 0)
+            fGenerate = false;
+    }
+
+    GenerateBitcoins(fGenerate, pwalletMain);
+    return Value::null;
+}
+
+
+Value gethashespersec(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() != 0)
+        throw runtime_error(
+            "gethashespersec\n"
+            "Returns a recent hashes per second performance measurement while generating.");
+
+    if (GetTimeMillis() - nHPSTimerStart > 8000)
+        return (boost::int64_t)0;
+    return (boost::int64_t)dHashesPerSec;
+}
+
+
+Value getinfo(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() != 0)
+        throw runtime_error(
+            "getinfo\n"
+            "Returns an object containing various state info.");
+
+    Object obj;
+    obj.push_back(Pair("version",       (int)VERSION));
+    obj.push_back(Pair("balance",       ValueFromAmount(pwalletMain->GetBalance())));
+    obj.push_back(Pair("blocks",        (int)nBestHeight));
+    obj.push_back(Pair("connections",   (int)vNodes.size()));
+    obj.push_back(Pair("proxy",         (fUseProxy ? addrProxy.ToStringIPPort() : string())));
+    obj.push_back(Pair("generate",      (bool)fGenerateBitcoins));
+    obj.push_back(Pair("genproclimit",  (int)(fLimitProcessors ? nLimitProcessors : -1)));
+    obj.push_back(Pair("difficulty",    (double)GetDifficulty()));
+    obj.push_back(Pair("hashespersec",  gethashespersec(params, false)));
+    obj.push_back(Pair("testnet",       fTestNet));
+    obj.push_back(Pair("keypoololdest", (boost::int64_t)pwalletMain->GetOldestKeyPoolTime()));
+    obj.push_back(Pair("keypoolsize",   pwalletMain->GetKeyPoolSize()));
+    obj.push_back(Pair("paytxfee",      ValueFromAmount(nTransactionFee)));
+    if (pwalletMain->IsCrypted())
+        obj.push_back(Pair("unlocked_until", (boost::int64_t)nWalletUnlockTime));
+    obj.push_back(Pair("errors",        GetWarnings("statusbar")));
+    return obj;
+}
+
+
+Value getnewaddress(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() > 1)
+        throw runtime_error(
+            "getnewaddress [account]\n"
+            "Returns a new bitcoin address for receiving payments.  "
+            "If [account] is specified (recommended), it is added to the address book "
+            "so payments received with the address will be credited to [account].");
+
+    // Parse the account first so we don't generate a key if there's an error
+    string strAccount;
+    if (params.size() > 0)
+        strAccount = AccountFromValue(params[0]);
+
+    if (!pwalletMain->IsLocked())
+        pwalletMain->TopUpKeyPool();
+
+    // Generate a new key that is added to wallet
+    std::vector<unsigned char> newKey;
+    if (!pwalletMain->GetKeyFromPool(newKey, false))
+        throw JSONRPCError(-12, "Error: Keypool ran out, please call keypoolrefill first");
+    CBitcoinAddress address(newKey);
+
+    pwalletMain->SetAddressBookName(address, strAccount);
+
+    return address.ToString();
+}
+
+
+CBitcoinAddress GetAccountAddress(string strAccount, bool bForceNew=false)
+{
+    CWalletDB walletdb(pwalletMain->strWalletFile);
+
+    CAccount account;
+    walletdb.ReadAccount(strAccount, account);
+
+    bool bKeyUsed = false;
+
+    // Check if the current key has been used
+    if (!account.vchPubKey.empty())
+    {
+        CScript scriptPubKey;
+        scriptPubKey.SetBitcoinAddress(account.vchPubKey);
+        for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin();
+             it != pwalletMain->mapWallet.end() && !account.vchPubKey.empty();
+             ++it)
+        {
+            const CWalletTx& wtx = (*it).second;
+            BOOST_FOREACH(const CTxOut& txout, wtx.vout)
+                if (txout.scriptPubKey == scriptPubKey)
+                    bKeyUsed = true;
+        }
+    }
+
+    // Generate a new key
+    if (account.vchPubKey.empty() || bForceNew || bKeyUsed)
+    {
+        if (!pwalletMain->GetKeyFromPool(account.vchPubKey, false))
+            throw JSONRPCError(-12, "Error: Keypool ran out, please call keypoolrefill first");
+
+        pwalletMain->SetAddressBookName(CBitcoinAddress(account.vchPubKey), strAccount);
+        walletdb.WriteAccount(strAccount, account);
+    }
+
+    return CBitcoinAddress(account.vchPubKey);
+}
+
+Value getaccountaddress(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() != 1)
+        throw runtime_error(
+            "getaccountaddress <account>\n"
+            "Returns the current bitcoin address for receiving payments to this account.");
+
+    // Parse the account first so we don't generate a key if there's an error
+    string strAccount = AccountFromValue(params[0]);
+
+    Value ret;
+
+    ret = GetAccountAddress(strAccount).ToString();
+
+    return ret;
+}
+
+
+
+Value setaccount(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() < 1 || params.size() > 2)
+        throw runtime_error(
+            "setaccount <bitcoinaddress> <account>\n"
+            "Sets the account associated with the given address.");
+
+    CBitcoinAddress address(params[0].get_str());
+    if (!address.IsValid())
+        throw JSONRPCError(-5, "Invalid bitcoin address");
+
+
+    string strAccount;
+    if (params.size() > 1)
+        strAccount = AccountFromValue(params[1]);
+
+    // Detect when changing the account of an address that is the 'unused current key' of another account:
+    if (pwalletMain->mapAddressBook.count(address))
+    {
+        string strOldAccount = pwalletMain->mapAddressBook[address];
+        if (address == GetAccountAddress(strOldAccount))
+            GetAccountAddress(strOldAccount, true);
+    }
+
+    pwalletMain->SetAddressBookName(address, strAccount);
+
+    return Value::null;
+}
+
+
+Value getaccount(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() != 1)
+        throw runtime_error(
+            "getaccount <bitcoinaddress>\n"
+            "Returns the account associated with the given address.");
+
+    CBitcoinAddress address(params[0].get_str());
+    if (!address.IsValid())
+        throw JSONRPCError(-5, "Invalid bitcoin address");
+
+    string strAccount;
+    map<CBitcoinAddress, string>::iterator mi = pwalletMain->mapAddressBook.find(address);
+    if (mi != pwalletMain->mapAddressBook.end() && !(*mi).second.empty())
+        strAccount = (*mi).second;
+    return strAccount;
+}
+
+
+Value getaddressesbyaccount(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() != 1)
+        throw runtime_error(
+            "getaddressesbyaccount <account>\n"
+            "Returns the list of addresses for the given account.");
+
+    string strAccount = AccountFromValue(params[0]);
+
+    // Find all addresses that have the given account
+    Array ret;
+    BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, string)& item, pwalletMain->mapAddressBook)
+    {
+        const CBitcoinAddress& address = item.first;
+        const string& strName = item.second;
+        if (strName == strAccount)
+            ret.push_back(address.ToString());
+    }
+    return ret;
+}
+
+Value settxfee(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() < 1 || params.size() > 1)
+        throw runtime_error(
+            "settxfee <amount>\n"
+            "<amount> is a real and is rounded to the nearest 0.00000001");
+
+    // Amount
+    int64 nAmount = 0;
+    if (params[0].get_real() != 0.0)
+        nAmount = AmountFromValue(params[0]);        // rejects 0.0 amounts
+
+    nTransactionFee = nAmount;
+    return true;
+}
+
+Value sendtoaddress(const Array& params, bool fHelp)
+{
+    if (pwalletMain->IsCrypted() && (fHelp || params.size() < 2 || params.size() > 4))
+        throw runtime_error(
+            "sendtoaddress <bitcoinaddress> <amount> [comment] [comment-to]\n"
+            "<amount> is a real and is rounded to the nearest 0.00000001\n"
+            "requires wallet passphrase to be set with walletpassphrase first");
+    if (!pwalletMain->IsCrypted() && (fHelp || params.size() < 2 || params.size() > 4))
+        throw runtime_error(
+            "sendtoaddress <bitcoinaddress> <amount> [comment] [comment-to]\n"
+            "<amount> is a real and is rounded to the nearest 0.00000001");
+
+    CBitcoinAddress address(params[0].get_str());
+    if (!address.IsValid())
+        throw JSONRPCError(-5, "Invalid bitcoin address");
+
+    // Amount
+    int64 nAmount = AmountFromValue(params[1]);
+
+    // Wallet comments
+    CWalletTx wtx;
+    if (params.size() > 2 && params[2].type() != null_type && !params[2].get_str().empty())
+        wtx.mapValue["comment"] = params[2].get_str();
+    if (params.size() > 3 && params[3].type() != null_type && !params[3].get_str().empty())
+        wtx.mapValue["to"]      = params[3].get_str();
+
+    if (pwalletMain->IsLocked())
+        throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.");
+
+    string strError = pwalletMain->SendMoneyToBitcoinAddress(address, nAmount, wtx);
+    if (strError != "")
+        throw JSONRPCError(-4, strError);
+
+    return wtx.GetHash().GetHex();
+}
+
+
+Value getreceivedbyaddress(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() < 1 || params.size() > 2)
+        throw runtime_error(
+            "getreceivedbyaddress <bitcoinaddress> [minconf=1]\n"
+            "Returns the total amount received by <bitcoinaddress> in transactions with at least [minconf] confirmations.");
+
+    // Bitcoin address
+    CBitcoinAddress address = CBitcoinAddress(params[0].get_str());
+    CScript scriptPubKey;
+    if (!address.IsValid())
+        throw JSONRPCError(-5, "Invalid bitcoin address");
+    scriptPubKey.SetBitcoinAddress(address);
+    if (!IsMine(*pwalletMain,scriptPubKey))
+        return (double)0.0;
+
+    // Minimum confirmations
+    int nMinDepth = 1;
+    if (params.size() > 1)
+        nMinDepth = params[1].get_int();
+
+    // Tally
+    int64 nAmount = 0;
+    for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
+    {
+        const CWalletTx& wtx = (*it).second;
+        if (wtx.IsCoinBase() || !wtx.IsFinal())
+            continue;
+
+        BOOST_FOREACH(const CTxOut& txout, wtx.vout)
+            if (txout.scriptPubKey == scriptPubKey)
+                if (wtx.GetDepthInMainChain() >= nMinDepth)
+                    nAmount += txout.nValue;
+    }
+
+    return  ValueFromAmount(nAmount);
+}
+
+
+void GetAccountAddresses(string strAccount, set<CBitcoinAddress>& setAddress)
+{
+    BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, string)& item, pwalletMain->mapAddressBook)
+    {
+        const CBitcoinAddress& address = item.first;
+        const string& strName = item.second;
+        if (strName == strAccount)
+            setAddress.insert(address);
+    }
+}
+
+
+Value getreceivedbyaccount(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() < 1 || params.size() > 2)
+        throw runtime_error(
+            "getreceivedbyaccount <account> [minconf=1]\n"
+            "Returns the total amount received by addresses with <account> in transactions with at least [minconf] confirmations.");
+
+    // Minimum confirmations
+    int nMinDepth = 1;
+    if (params.size() > 1)
+        nMinDepth = params[1].get_int();
+
+    // Get the set of pub keys that have the label
+    string strAccount = AccountFromValue(params[0]);
+    set<CBitcoinAddress> setAddress;
+    GetAccountAddresses(strAccount, setAddress);
+
+    // Tally
+    int64 nAmount = 0;
+    for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
+    {
+        const CWalletTx& wtx = (*it).second;
+        if (wtx.IsCoinBase() || !wtx.IsFinal())
+            continue;
+
+        BOOST_FOREACH(const CTxOut& txout, wtx.vout)
+        {
+            CBitcoinAddress address;
+            if (ExtractAddress(txout.scriptPubKey, pwalletMain, address) && setAddress.count(address))
+                if (wtx.GetDepthInMainChain() >= nMinDepth)
+                    nAmount += txout.nValue;
+        }
+    }
+
+    return (double)nAmount / (double)COIN;
+}
+
+
+int64 GetAccountBalance(CWalletDB& walletdb, const string& strAccount, int nMinDepth)
+{
+    int64 nBalance = 0;
+
+    // Tally wallet transactions
+    for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
+    {
+        const CWalletTx& wtx = (*it).second;
+        if (!wtx.IsFinal())
+            continue;
+
+        int64 nGenerated, nReceived, nSent, nFee;
+        wtx.GetAccountAmounts(strAccount, nGenerated, nReceived, nSent, nFee);
+
+        if (nReceived != 0 && wtx.GetDepthInMainChain() >= nMinDepth)
+            nBalance += nReceived;
+        nBalance += nGenerated - nSent - nFee;
+    }
+
+    // Tally internal accounting entries
+    nBalance += walletdb.GetAccountCreditDebit(strAccount);
+
+    return nBalance;
+}
+
+int64 GetAccountBalance(const string& strAccount, int nMinDepth)
+{
+    CWalletDB walletdb(pwalletMain->strWalletFile);
+    return GetAccountBalance(walletdb, strAccount, nMinDepth);
+}
+
+
+Value getbalance(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() > 2)
+        throw runtime_error(
+            "getbalance [account] [minconf=1]\n"
+            "If [account] is not specified, returns the server's total available balance.\n"
+            "If [account] is specified, returns the balance in the account.");
+
+    if (params.size() == 0)
+        return  ValueFromAmount(pwalletMain->GetBalance());
+
+    int nMinDepth = 1;
+    if (params.size() > 1)
+        nMinDepth = params[1].get_int();
+
+    if (params[0].get_str() == "*") {
+        // Calculate total balance a different way from GetBalance()
+        // (GetBalance() sums up all unspent TxOuts)
+        // getbalance and getbalance '*' should always return the same number.
+        int64 nBalance = 0;
+        for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
+        {
+            const CWalletTx& wtx = (*it).second;
+            if (!wtx.IsFinal())
+                continue;
+
+            int64 allGeneratedImmature, allGeneratedMature, allFee;
+            allGeneratedImmature = allGeneratedMature = allFee = 0;
+            string strSentAccount;
+            list<pair<CBitcoinAddress, int64> > listReceived;
+            list<pair<CBitcoinAddress, int64> > listSent;
+            wtx.GetAmounts(allGeneratedImmature, allGeneratedMature, listReceived, listSent, allFee, strSentAccount);
+            if (wtx.GetDepthInMainChain() >= nMinDepth)
+                BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress,int64)& r, listReceived)
+                    nBalance += r.second;
+            BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress,int64)& r, listSent)
+                nBalance -= r.second;
+            nBalance -= allFee;
+            nBalance += allGeneratedMature;
+        }
+        return  ValueFromAmount(nBalance);
+    }
+
+    string strAccount = AccountFromValue(params[0]);
+
+    int64 nBalance = GetAccountBalance(strAccount, nMinDepth);
+
+    return ValueFromAmount(nBalance);
+}
+
+
+Value movecmd(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() < 3 || params.size() > 5)
+        throw runtime_error(
+            "move <fromaccount> <toaccount> <amount> [minconf=1] [comment]\n"
+            "Move from one account in your wallet to another.");
+
+    string strFrom = AccountFromValue(params[0]);
+    string strTo = AccountFromValue(params[1]);
+    int64 nAmount = AmountFromValue(params[2]);
+    if (params.size() > 3)
+        // unused parameter, used to be nMinDepth, keep type-checking it though
+        (void)params[3].get_int();
+    string strComment;
+    if (params.size() > 4)
+        strComment = params[4].get_str();
+
+    CWalletDB walletdb(pwalletMain->strWalletFile);
+    walletdb.TxnBegin();
+
+    int64 nNow = GetAdjustedTime();
+
+    // Debit
+    CAccountingEntry debit;
+    debit.strAccount = strFrom;
+    debit.nCreditDebit = -nAmount;
+    debit.nTime = nNow;
+    debit.strOtherAccount = strTo;
+    debit.strComment = strComment;
+    walletdb.WriteAccountingEntry(debit);
+
+    // Credit
+    CAccountingEntry credit;
+    credit.strAccount = strTo;
+    credit.nCreditDebit = nAmount;
+    credit.nTime = nNow;
+    credit.strOtherAccount = strFrom;
+    credit.strComment = strComment;
+    walletdb.WriteAccountingEntry(credit);
+
+    walletdb.TxnCommit();
+
+    return true;
+}
+
+
+Value sendfrom(const Array& params, bool fHelp)
+{
+    if (pwalletMain->IsCrypted() && (fHelp || params.size() < 3 || params.size() > 6))
+        throw runtime_error(
+            "sendfrom <fromaccount> <tobitcoinaddress> <amount> [minconf=1] [comment] [comment-to]\n"
+            "<amount> is a real and is rounded to the nearest 0.00000001\n"
+            "requires wallet passphrase to be set with walletpassphrase first");
+    if (!pwalletMain->IsCrypted() && (fHelp || params.size() < 3 || params.size() > 6))
+        throw runtime_error(
+            "sendfrom <fromaccount> <tobitcoinaddress> <amount> [minconf=1] [comment] [comment-to]\n"
+            "<amount> is a real and is rounded to the nearest 0.00000001");
+
+    string strAccount = AccountFromValue(params[0]);
+    CBitcoinAddress address(params[1].get_str());
+    if (!address.IsValid())
+        throw JSONRPCError(-5, "Invalid bitcoin address");
+    int64 nAmount = AmountFromValue(params[2]);
+    int nMinDepth = 1;
+    if (params.size() > 3)
+        nMinDepth = params[3].get_int();
+
+    CWalletTx wtx;
+    wtx.strFromAccount = strAccount;
+    if (params.size() > 4 && params[4].type() != null_type && !params[4].get_str().empty())
+        wtx.mapValue["comment"] = params[4].get_str();
+    if (params.size() > 5 && params[5].type() != null_type && !params[5].get_str().empty())
+        wtx.mapValue["to"]      = params[5].get_str();
+
+    if (pwalletMain->IsLocked())
+        throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.");
+
+    // Check funds
+    int64 nBalance = GetAccountBalance(strAccount, nMinDepth);
+    if (nAmount > nBalance)
+        throw JSONRPCError(-6, "Account has insufficient funds");
+
+    // Send
+    string strError = pwalletMain->SendMoneyToBitcoinAddress(address, nAmount, wtx);
+    if (strError != "")
+        throw JSONRPCError(-4, strError);
+
+    return wtx.GetHash().GetHex();
+}
+
+
+Value sendmany(const Array& params, bool fHelp)
+{
+    if (pwalletMain->IsCrypted() && (fHelp || params.size() < 2 || params.size() > 4))
+        throw runtime_error(
+            "sendmany <fromaccount> {address:amount,...} [minconf=1] [comment]\n"
+            "amounts are double-precision floating point numbers\n"
+            "requires wallet passphrase to be set with walletpassphrase first");
+    if (!pwalletMain->IsCrypted() && (fHelp || params.size() < 2 || params.size() > 4))
+        throw runtime_error(
+            "sendmany <fromaccount> {address:amount,...} [minconf=1] [comment]\n"
+            "amounts are double-precision floating point numbers");
+
+    string strAccount = AccountFromValue(params[0]);
+    Object sendTo = params[1].get_obj();
+    int nMinDepth = 1;
+    if (params.size() > 2)
+        nMinDepth = params[2].get_int();
+
+    CWalletTx wtx;
+    wtx.strFromAccount = strAccount;
+    if (params.size() > 3 && params[3].type() != null_type && !params[3].get_str().empty())
+        wtx.mapValue["comment"] = params[3].get_str();
+
+    set<CBitcoinAddress> setAddress;
+    vector<pair<CScript, int64> > vecSend;
+
+    int64 totalAmount = 0;
+    BOOST_FOREACH(const Pair& s, sendTo)
+    {
+        CBitcoinAddress address(s.name_);
+        if (!address.IsValid())
+            throw JSONRPCError(-5, string("Invalid bitcoin address:")+s.name_);
+
+        if (setAddress.count(address))
+            throw JSONRPCError(-8, string("Invalid parameter, duplicated address: ")+s.name_);
+        setAddress.insert(address);
+
+        CScript scriptPubKey;
+        scriptPubKey.SetBitcoinAddress(address);
+        int64 nAmount = AmountFromValue(s.value_); 
+        totalAmount += nAmount;
+
+        vecSend.push_back(make_pair(scriptPubKey, nAmount));
+    }
+
+    if (pwalletMain->IsLocked())
+        throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.");
+
+    // Check funds
+    int64 nBalance = GetAccountBalance(strAccount, nMinDepth);
+    if (totalAmount > nBalance)
+        throw JSONRPCError(-6, "Account has insufficient funds");
+
+    // Send
+    CReserveKey keyChange(pwalletMain);
+    int64 nFeeRequired = 0;
+    bool fCreated = pwalletMain->CreateTransaction(vecSend, wtx, keyChange, nFeeRequired);
+    if (!fCreated)
+    {
+        if (totalAmount + nFeeRequired > pwalletMain->GetBalance())
+            throw JSONRPCError(-6, "Insufficient funds");
+        throw JSONRPCError(-4, "Transaction creation failed");
+    }
+    if (!pwalletMain->CommitTransaction(wtx, keyChange))
+        throw JSONRPCError(-4, "Transaction commit failed");
+
+    return wtx.GetHash().GetHex();
+}
+
+
+struct tallyitem
+{
+    int64 nAmount;
+    int nConf;
+    tallyitem()
+    {
+        nAmount = 0;
+        nConf = INT_MAX;
+    }
+};
+
+Value ListReceived(const Array& params, bool fByAccounts)
+{
+    // Minimum confirmations
+    int nMinDepth = 1;
+    if (params.size() > 0)
+        nMinDepth = params[0].get_int();
+
+    // Whether to include empty accounts
+    bool fIncludeEmpty = false;
+    if (params.size() > 1)
+        fIncludeEmpty = params[1].get_bool();
+
+    // Tally
+    map<CBitcoinAddress, tallyitem> mapTally;
+    for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
+    {
+        const CWalletTx& wtx = (*it).second;
+        if (wtx.IsCoinBase() || !wtx.IsFinal())
+            continue;
+
+        int nDepth = wtx.GetDepthInMainChain();
+        if (nDepth < nMinDepth)
+            continue;
+
+        BOOST_FOREACH(const CTxOut& txout, wtx.vout)
+        {
+            CBitcoinAddress address;
+            if (!ExtractAddress(txout.scriptPubKey, pwalletMain, address) || !address.IsValid())
+                continue;
+
+            tallyitem& item = mapTally[address];
+            item.nAmount += txout.nValue;
+            item.nConf = min(item.nConf, nDepth);
+        }
+    }
+
+    // Reply
+    Array ret;
+    map<string, tallyitem> mapAccountTally;
+    BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, string)& item, pwalletMain->mapAddressBook)
+    {
+        const CBitcoinAddress& address = item.first;
+        const string& strAccount = item.second;
+        map<CBitcoinAddress, tallyitem>::iterator it = mapTally.find(address);
+        if (it == mapTally.end() && !fIncludeEmpty)
+            continue;
+
+        int64 nAmount = 0;
+        int nConf = INT_MAX;
+        if (it != mapTally.end())
+        {
+            nAmount = (*it).second.nAmount;
+            nConf = (*it).second.nConf;
+        }
+
+        if (fByAccounts)
+        {
+            tallyitem& item = mapAccountTally[strAccount];
+            item.nAmount += nAmount;
+            item.nConf = min(item.nConf, nConf);
+        }
+        else
+        {
+            Object obj;
+            obj.push_back(Pair("address",       address.ToString()));
+            obj.push_back(Pair("account",       strAccount));
+            obj.push_back(Pair("label",         strAccount)); // deprecated
+            obj.push_back(Pair("amount",        ValueFromAmount(nAmount)));
+            obj.push_back(Pair("confirmations", (nConf == INT_MAX ? 0 : nConf)));
+            ret.push_back(obj);
+        }
+    }
+
+    if (fByAccounts)
+    {
+        for (map<string, tallyitem>::iterator it = mapAccountTally.begin(); it != mapAccountTally.end(); ++it)
+        {
+            int64 nAmount = (*it).second.nAmount;
+            int nConf = (*it).second.nConf;
+            Object obj;
+            obj.push_back(Pair("account",       (*it).first));
+            obj.push_back(Pair("label",         (*it).first)); // deprecated
+            obj.push_back(Pair("amount",        ValueFromAmount(nAmount)));
+            obj.push_back(Pair("confirmations", (nConf == INT_MAX ? 0 : nConf)));
+            ret.push_back(obj);
+        }
+    }
+
+    return ret;
+}
+
+Value listreceivedbyaddress(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() > 2)
+        throw runtime_error(
+            "listreceivedbyaddress [minconf=1] [includeempty=false]\n"
+            "[minconf] is the minimum number of confirmations before payments are included.\n"
+            "[includeempty] whether to include addresses that haven't received any payments.\n"
+            "Returns an array of objects containing:\n"
+            "  \"address\" : receiving address\n"
+            "  \"account\" : the account of the receiving address\n"
+            "  \"amount\" : total amount received by the address\n"
+            "  \"confirmations\" : number of confirmations of the most recent transaction included");
+
+    return ListReceived(params, false);
+}
+
+Value listreceivedbyaccount(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() > 2)
+        throw runtime_error(
+            "listreceivedbyaccount [minconf=1] [includeempty=false]\n"
+            "[minconf] is the minimum number of confirmations before payments are included.\n"
+            "[includeempty] whether to include accounts that haven't received any payments.\n"
+            "Returns an array of objects containing:\n"
+            "  \"account\" : the account of the receiving addresses\n"
+            "  \"amount\" : total amount received by addresses with this account\n"
+            "  \"confirmations\" : number of confirmations of the most recent transaction included");
+
+    return ListReceived(params, true);
+}
+
+void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDepth, bool fLong, Array& ret)
+{
+    int64 nGeneratedImmature, nGeneratedMature, nFee;
+    string strSentAccount;
+    list<pair<CBitcoinAddress, int64> > listReceived;
+    list<pair<CBitcoinAddress, int64> > listSent;
+    wtx.GetAmounts(nGeneratedImmature, nGeneratedMature, listReceived, listSent, nFee, strSentAccount);
+
+    bool fAllAccounts = (strAccount == string("*"));
+
+    // Generated blocks assigned to account ""
+    if ((nGeneratedMature+nGeneratedImmature) != 0 && (fAllAccounts || strAccount == ""))
+    {
+        Object entry;
+        entry.push_back(Pair("account", string("")));
+        if (nGeneratedImmature)
+        {
+            entry.push_back(Pair("category", wtx.GetDepthInMainChain() ? "immature" : "orphan"));
+            entry.push_back(Pair("amount", ValueFromAmount(nGeneratedImmature)));
+        }
+        else
+        {
+            entry.push_back(Pair("category", "generate"));
+            entry.push_back(Pair("amount", ValueFromAmount(nGeneratedMature)));
+        }
+        if (fLong)
+            WalletTxToJSON(wtx, entry);
+        ret.push_back(entry);
+    }
+
+    // Sent
+    if ((!listSent.empty() || nFee != 0) && (fAllAccounts || strAccount == strSentAccount))
+    {
+        BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64)& s, listSent)
+        {
+            Object entry;
+            entry.push_back(Pair("account", strSentAccount));
+            entry.push_back(Pair("address", s.first.ToString()));
+            entry.push_back(Pair("category", "send"));
+            entry.push_back(Pair("amount", ValueFromAmount(-s.second)));
+            entry.push_back(Pair("fee", ValueFromAmount(-nFee)));
+            if (fLong)
+                WalletTxToJSON(wtx, entry);
+            ret.push_back(entry);
+        }
+    }
+
+    // Received
+    if (listReceived.size() > 0 && wtx.GetDepthInMainChain() >= nMinDepth)
+        BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64)& r, listReceived)
+        {
+            string account;
+            if (pwalletMain->mapAddressBook.count(r.first))
+                account = pwalletMain->mapAddressBook[r.first];
+            if (fAllAccounts || (account == strAccount))
+            {
+                Object entry;
+                entry.push_back(Pair("account", account));
+                entry.push_back(Pair("address", r.first.ToString()));
+                entry.push_back(Pair("category", "receive"));
+                entry.push_back(Pair("amount", ValueFromAmount(r.second)));
+                if (fLong)
+                    WalletTxToJSON(wtx, entry);
+                ret.push_back(entry);
+            }
+        }
+}
+
+void AcentryToJSON(const CAccountingEntry& acentry, const string& strAccount, Array& ret)
+{
+    bool fAllAccounts = (strAccount == string("*"));
+
+    if (fAllAccounts || acentry.strAccount == strAccount)
+    {
+        Object entry;
+        entry.push_back(Pair("account", acentry.strAccount));
+        entry.push_back(Pair("category", "move"));
+        entry.push_back(Pair("time", (boost::int64_t)acentry.nTime));
+        entry.push_back(Pair("amount", ValueFromAmount(acentry.nCreditDebit)));
+        entry.push_back(Pair("otheraccount", acentry.strOtherAccount));
+        entry.push_back(Pair("comment", acentry.strComment));
+        ret.push_back(entry);
+    }
+}
+
+Value listtransactions(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() > 3)
+        throw runtime_error(
+            "listtransactions [account] [count=10] [from=0]\n"
+            "Returns up to [count] most recent transactions skipping the first [from] transactions for account [account].");
+
+    string strAccount = "*";
+    if (params.size() > 0)
+        strAccount = params[0].get_str();
+    int nCount = 10;
+    if (params.size() > 1)
+        nCount = params[1].get_int();
+    int nFrom = 0;
+    if (params.size() > 2)
+        nFrom = params[2].get_int();
+
+    Array ret;
+    CWalletDB walletdb(pwalletMain->strWalletFile);
+
+    // Firs: get all CWalletTx and CAccountingEntry into a sorted-by-time multimap:
+    typedef pair<CWalletTx*, CAccountingEntry*> TxPair;
+    typedef multimap<int64, TxPair > TxItems;
+    TxItems txByTime;
+
+    for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
+    {
+        CWalletTx* wtx = &((*it).second);
+        txByTime.insert(make_pair(wtx->GetTxTime(), TxPair(wtx, (CAccountingEntry*)0)));
+    }
+    list<CAccountingEntry> acentries;
+    walletdb.ListAccountCreditDebit(strAccount, acentries);
+    BOOST_FOREACH(CAccountingEntry& entry, acentries)
+    {
+        txByTime.insert(make_pair(entry.nTime, TxPair((CWalletTx*)0, &entry)));
+    }
+
+    // Now: iterate backwards until we have nCount items to return:
+    TxItems::reverse_iterator it = txByTime.rbegin();
+    if (txByTime.size() > nFrom) std::advance(it, nFrom);
+    for (; it != txByTime.rend(); ++it)
+    {
+        CWalletTx *const pwtx = (*it).second.first;
+        if (pwtx != 0)
+            ListTransactions(*pwtx, strAccount, 0, true, ret);
+        CAccountingEntry *const pacentry = (*it).second.second;
+        if (pacentry != 0)
+            AcentryToJSON(*pacentry, strAccount, ret);
+
+        if (ret.size() >= nCount) break;
+    }
+    // ret is now newest to oldest
+    
+    // Make sure we return only last nCount items (sends-to-self might give us an extra):
+    if (ret.size() > nCount)
+    {
+        Array::iterator last = ret.begin();
+        std::advance(last, nCount);
+        ret.erase(last, ret.end());
+    }
+    std::reverse(ret.begin(), ret.end()); // oldest to newest
+
+    return ret;
+}
+
+Value listaccounts(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() > 1)
+        throw runtime_error(
+            "listaccounts [minconf=1]\n"
+            "Returns Object that has account names as keys, account balances as values.");
+
+    int nMinDepth = 1;
+    if (params.size() > 0)
+        nMinDepth = params[0].get_int();
+
+    map<string, int64> mapAccountBalances;
+    BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, string)& entry, pwalletMain->mapAddressBook) {
+        if (pwalletMain->HaveKey(entry.first)) // This address belongs to me
+            mapAccountBalances[entry.second] = 0;
+    }
+
+    for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
+    {
+        const CWalletTx& wtx = (*it).second;
+        int64 nGeneratedImmature, nGeneratedMature, nFee;
+        string strSentAccount;
+        list<pair<CBitcoinAddress, int64> > listReceived;
+        list<pair<CBitcoinAddress, int64> > listSent;
+        wtx.GetAmounts(nGeneratedImmature, nGeneratedMature, listReceived, listSent, nFee, strSentAccount);
+        mapAccountBalances[strSentAccount] -= nFee;
+        BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64)& s, listSent)
+            mapAccountBalances[strSentAccount] -= s.second;
+        if (wtx.GetDepthInMainChain() >= nMinDepth)
+        {
+            mapAccountBalances[""] += nGeneratedMature;
+            BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64)& r, listReceived)
+                if (pwalletMain->mapAddressBook.count(r.first))
+                    mapAccountBalances[pwalletMain->mapAddressBook[r.first]] += r.second;
+                else
+                    mapAccountBalances[""] += r.second;
+        }
+    }
+
+    list<CAccountingEntry> acentries;
+    CWalletDB(pwalletMain->strWalletFile).ListAccountCreditDebit("*", acentries);
+    BOOST_FOREACH(const CAccountingEntry& entry, acentries)
+        mapAccountBalances[entry.strAccount] += entry.nCreditDebit;
+
+    Object ret;
+    BOOST_FOREACH(const PAIRTYPE(string, int64)& accountBalance, mapAccountBalances) {
+        ret.push_back(Pair(accountBalance.first, ValueFromAmount(accountBalance.second)));
+    }
+    return ret;
+}
+
+Value gettransaction(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() != 1)
+        throw runtime_error(
+            "gettransaction <txid>\n"
+            "Get detailed information about <txid>");
+
+    uint256 hash;
+    hash.SetHex(params[0].get_str());
+
+    Object entry;
+
+    if (!pwalletMain->mapWallet.count(hash))
+        throw JSONRPCError(-5, "Invalid or non-wallet transaction id");
+    const CWalletTx& wtx = pwalletMain->mapWallet[hash];
+
+    int64 nCredit = wtx.GetCredit();
+    int64 nDebit = wtx.GetDebit();
+    int64 nNet = nCredit - nDebit;
+    int64 nFee = (wtx.IsFromMe() ? wtx.GetValueOut() - nDebit : 0);
+
+    entry.push_back(Pair("amount", ValueFromAmount(nNet - nFee)));
+    if (wtx.IsFromMe())
+        entry.push_back(Pair("fee", ValueFromAmount(nFee)));
+
+    WalletTxToJSON(pwalletMain->mapWallet[hash], entry);
+
+    Array details;
+    ListTransactions(pwalletMain->mapWallet[hash], "*", 0, false, details);
+    entry.push_back(Pair("details", details));
+
+    return entry;
+}
+
+
+Value backupwallet(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() != 1)
+        throw runtime_error(
+            "backupwallet <destination>\n"
+            "Safely copies wallet.dat to destination, which can be a directory or a path with filename.");
+
+    string strDest = params[0].get_str();
+    BackupWallet(*pwalletMain, strDest);
+
+    return Value::null;
+}
+
+
+Value keypoolrefill(const Array& params, bool fHelp)
+{
+    if (pwalletMain->IsCrypted() && (fHelp || params.size() > 0))
+        throw runtime_error(
+            "keypoolrefill\n"
+            "Fills the keypool, requires wallet passphrase to be set.");
+    if (!pwalletMain->IsCrypted() && (fHelp || params.size() > 0))
+        throw runtime_error(
+            "keypoolrefill\n"
+            "Fills the keypool.");
+
+    if (pwalletMain->IsLocked())
+        throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.");
+
+    pwalletMain->TopUpKeyPool();
+
+    if (pwalletMain->GetKeyPoolSize() < GetArg("-keypool", 100))
+        throw JSONRPCError(-4, "Error refreshing keypool.");
+
+    return Value::null;
+}
+
+
+void ThreadTopUpKeyPool(void* parg)
+{
+    pwalletMain->TopUpKeyPool();
+}
+
+void ThreadCleanWalletPassphrase(void* parg)
+{
+    int64 nMyWakeTime = GetTime() + *((int*)parg);
+
+    if (nWalletUnlockTime == 0)
+    {
+        CRITICAL_BLOCK(cs_nWalletUnlockTime)
+        {
+            nWalletUnlockTime = nMyWakeTime;
+        }
+
+        while (GetTime() < nWalletUnlockTime)
+            Sleep(GetTime() - nWalletUnlockTime);
+
+        CRITICAL_BLOCK(cs_nWalletUnlockTime)
+        {
+            nWalletUnlockTime = 0;
+        }
+    }
+    else
+    {
+        CRITICAL_BLOCK(cs_nWalletUnlockTime)
+        {
+            if (nWalletUnlockTime < nMyWakeTime)
+                nWalletUnlockTime = nMyWakeTime;
+        }
+        free(parg);
+        return;
+    }
+
+    pwalletMain->Lock();
+
+    delete (int*)parg;
+}
+
+Value walletpassphrase(const Array& params, bool fHelp)
+{
+    if (pwalletMain->IsCrypted() && (fHelp || params.size() != 2))
+        throw runtime_error(
+            "walletpassphrase <passphrase> <timeout>\n"
+            "Stores the wallet decryption key in memory for <timeout> seconds.");
+    if (fHelp)
+        return true;
+    if (!pwalletMain->IsCrypted())
+        throw JSONRPCError(-15, "Error: running with an unencrypted wallet, but walletpassphrase was called.");
+
+    if (!pwalletMain->IsLocked())
+        throw JSONRPCError(-17, "Error: Wallet is already unlocked.");
+
+    // Note that the walletpassphrase is stored in params[0] which is not mlock()ed
+    string strWalletPass;
+    strWalletPass.reserve(100);
+    mlock(&strWalletPass[0], strWalletPass.capacity());
+    strWalletPass = params[0].get_str();
+
+    if (strWalletPass.length() > 0)
+    {
+        if (!pwalletMain->Unlock(strWalletPass))
+        {
+            fill(strWalletPass.begin(), strWalletPass.end(), '\0');
+            munlock(&strWalletPass[0], strWalletPass.capacity());
+            throw JSONRPCError(-14, "Error: The wallet passphrase entered was incorrect.");
+        }
+        fill(strWalletPass.begin(), strWalletPass.end(), '\0');
+        munlock(&strWalletPass[0], strWalletPass.capacity());
+    }
+    else
+        throw runtime_error(
+            "walletpassphrase <passphrase> <timeout>\n"
+            "Stores the wallet decryption key in memory for <timeout> seconds.");
+
+    CreateThread(ThreadTopUpKeyPool, NULL);
+    int* pnSleepTime = new int(params[1].get_int());
+    CreateThread(ThreadCleanWalletPassphrase, pnSleepTime);
+
+    return Value::null;
+}
+
+
+Value walletpassphrasechange(const Array& params, bool fHelp)
+{
+    if (pwalletMain->IsCrypted() && (fHelp || params.size() != 2))
+        throw runtime_error(
+            "walletpassphrasechange <oldpassphrase> <newpassphrase>\n"
+            "Changes the wallet passphrase from <oldpassphrase> to <newpassphrase>.");
+    if (fHelp)
+        return true;
+    if (!pwalletMain->IsCrypted())
+        throw JSONRPCError(-15, "Error: running with an unencrypted wallet, but walletpassphrasechange was called.");
+
+    string strOldWalletPass;
+    strOldWalletPass.reserve(100);
+    mlock(&strOldWalletPass[0], strOldWalletPass.capacity());
+    strOldWalletPass = params[0].get_str();
+
+    string strNewWalletPass;
+    strNewWalletPass.reserve(100);
+    mlock(&strNewWalletPass[0], strNewWalletPass.capacity());
+    strNewWalletPass = params[1].get_str();
+
+    if (strOldWalletPass.length() < 1 || strNewWalletPass.length() < 1)
+        throw runtime_error(
+            "walletpassphrasechange <oldpassphrase> <newpassphrase>\n"
+            "Changes the wallet passphrase from <oldpassphrase> to <newpassphrase>.");
+
+    if (!pwalletMain->ChangeWalletPassphrase(strOldWalletPass, strNewWalletPass))
+    {
+        fill(strOldWalletPass.begin(), strOldWalletPass.end(), '\0');
+        fill(strNewWalletPass.begin(), strNewWalletPass.end(), '\0');
+        munlock(&strOldWalletPass[0], strOldWalletPass.capacity());
+        munlock(&strNewWalletPass[0], strNewWalletPass.capacity());
+        throw JSONRPCError(-14, "Error: The wallet passphrase entered was incorrect.");
+    }
+    fill(strNewWalletPass.begin(), strNewWalletPass.end(), '\0');
+    fill(strOldWalletPass.begin(), strOldWalletPass.end(), '\0');
+    munlock(&strOldWalletPass[0], strOldWalletPass.capacity());
+    munlock(&strNewWalletPass[0], strNewWalletPass.capacity());
+
+    return Value::null;
+}
+
+
+Value walletlock(const Array& params, bool fHelp)
+{
+    if (pwalletMain->IsCrypted() && (fHelp || params.size() != 0))
+        throw runtime_error(
+            "walletlock\n"
+            "Removes the wallet encryption key from memory, locking the wallet.\n"
+            "After calling this method, you will need to call walletpassphrase again\n"
+            "before being able to call any methods which require the wallet to be unlocked.");
+    if (fHelp)
+        return true;
+    if (!pwalletMain->IsCrypted())
+        throw JSONRPCError(-15, "Error: running with an unencrypted wallet, but walletlock was called.");
+
+    pwalletMain->Lock();
+    CRITICAL_BLOCK(cs_nWalletUnlockTime)
+    {
+        nWalletUnlockTime = 0;
+    }
+
+    return Value::null;
+}
+
+
+Value encryptwallet(const Array& params, bool fHelp)
+{
+    if (!pwalletMain->IsCrypted() && (fHelp || params.size() != 1))
+        throw runtime_error(
+            "encryptwallet <passphrase>\n"
+            "Encrypts the wallet with <passphrase>.");
+    if (fHelp)
+        return true;
+    if (pwalletMain->IsCrypted())
+        throw JSONRPCError(-15, "Error: running with an encrypted wallet, but encryptwallet was called.");
+
+    string strWalletPass;
+    strWalletPass.reserve(100);
+    mlock(&strWalletPass[0], strWalletPass.capacity());
+    strWalletPass = params[0].get_str();
+
+    if (strWalletPass.length() < 1)
+        throw runtime_error(
+            "encryptwallet <passphrase>\n"
+            "Encrypts the wallet with <passphrase>.");
+
+    if (!pwalletMain->EncryptWallet(strWalletPass))
+    {
+        fill(strWalletPass.begin(), strWalletPass.end(), '\0');
+        munlock(&strWalletPass[0], strWalletPass.capacity());
+        throw JSONRPCError(-16, "Error: Failed to encrypt the wallet.");
+    }
+    fill(strWalletPass.begin(), strWalletPass.end(), '\0');
+    munlock(&strWalletPass[0], strWalletPass.capacity());
+
+    return Value::null;
+}
+
+
+Value validateaddress(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() != 1)
+        throw runtime_error(
+            "validateaddress <bitcoinaddress>\n"
+            "Return information about <bitcoinaddress>.");
+
+    CBitcoinAddress address(params[0].get_str());
+    bool isValid = address.IsValid();
+
+    Object ret;
+    ret.push_back(Pair("isvalid", isValid));
+    if (isValid)
+    {
+        // Call Hash160ToAddress() so we always return current ADDRESSVERSION
+        // version of the address:
+        string currentAddress = address.ToString();
+        ret.push_back(Pair("address", currentAddress));
+        ret.push_back(Pair("ismine", (pwalletMain->HaveKey(address) > 0)));
+        if (pwalletMain->mapAddressBook.count(address))
+            ret.push_back(Pair("account", pwalletMain->mapAddressBook[address]));
+    }
+    return ret;
+}
+
+
+Value getwork(const Array& params, bool fHelp)
+{
+    if (fHelp || params.size() > 1)
+        throw runtime_error(
+            "getwork [data]\n"
+            "If [data] is not specified, returns formatted hash data to work on:\n"
+            "  \"midstate\" : precomputed hash state after hashing the first half of the data\n"
+            "  \"data\" : block data\n"
+            "  \"hash1\" : formatted hash buffer for second hash\n"
+            "  \"target\" : little endian hash target\n"
+            "If [data] is specified, tries to solve the block and returns true if it was successful.");
+
+    if (vNodes.empty())
+        throw JSONRPCError(-9, "Bitcoin is not connected!");
+
+    if (IsInitialBlockDownload())
+        throw JSONRPCError(-10, "Bitcoin is downloading blocks...");
+
+    typedef map<uint256, pair<CBlock*, CScript> > mapNewBlock_t;
+    static mapNewBlock_t mapNewBlock;
+    static vector<CBlock*> vNewBlock;
+    static CReserveKey reservekey(pwalletMain);
+
+    if (params.size() == 0)
+    {
+        // Update block
+        static unsigned int nTransactionsUpdatedLast;
+        static CBlockIndex* pindexPrev;
+        static int64 nStart;
+        static CBlock* pblock;
+        if (pindexPrev != pindexBest ||
+            (nTransactionsUpdated != nTransactionsUpdatedLast && GetTime() - nStart > 60))
+        {
+            if (pindexPrev != pindexBest)
+            {
+                // Deallocate old blocks since they're obsolete now
+                mapNewBlock.clear();
+                BOOST_FOREACH(CBlock* pblock, vNewBlock)
+                    delete pblock;
+                vNewBlock.clear();
+            }
+            nTransactionsUpdatedLast = nTransactionsUpdated;
+            pindexPrev = pindexBest;
+            nStart = GetTime();
+
+            // Create new block
+            pblock = CreateNewBlock(reservekey);
+            if (!pblock)
+                throw JSONRPCError(-7, "Out of memory");
+            vNewBlock.push_back(pblock);
+        }
+
+        // Update nTime
+        pblock->nTime = max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime());
+        pblock->nNonce = 0;
+
+        // Update nExtraNonce
+        static unsigned int nExtraNonce = 0;
+        IncrementExtraNonce(pblock, pindexPrev, nExtraNonce);
+
+        // Save
+        mapNewBlock[pblock->hashMerkleRoot] = make_pair(pblock, pblock->vtx[0].vin[0].scriptSig);
+
+        // Prebuild hash buffers
+        char pmidstate[32];
+        char pdata[128];
+        char phash1[64];
+        FormatHashBuffers(pblock, pmidstate, pdata, phash1);
+
+        uint256 hashTarget = CBigNum().SetCompact(pblock->nBits).getuint256();
+
+        Object result;
+        result.push_back(Pair("midstate", HexStr(BEGIN(pmidstate), END(pmidstate))));
+        result.push_back(Pair("data",     HexStr(BEGIN(pdata), END(pdata))));
+        result.push_back(Pair("hash1",    HexStr(BEGIN(phash1), END(phash1))));
+        result.push_back(Pair("target",   HexStr(BEGIN(hashTarget), END(hashTarget))));
+        return result;
+    }
+    else
+    {
+        // Parse parameters
+        vector<unsigned char> vchData = ParseHex(params[0].get_str());
+        if (vchData.size() != 128)
+            throw JSONRPCError(-8, "Invalid parameter");
+        CBlock* pdata = (CBlock*)&vchData[0];
+
+        // Byte reverse
+        for (int i = 0; i < 128/4; i++)
+            ((unsigned int*)pdata)[i] = CryptoPP::ByteReverse(((unsigned int*)pdata)[i]);
+
+        // Get saved block
+        if (!mapNewBlock.count(pdata->hashMerkleRoot))
+            return false;
+        CBlock* pblock = mapNewBlock[pdata->hashMerkleRoot].first;
+
+        pblock->nTime = pdata->nTime;
+        pblock->nNonce = pdata->nNonce;
+        pblock->vtx[0].vin[0].scriptSig = mapNewBlock[pdata->hashMerkleRoot].second;
+        pblock->hashMerkleRoot = pblock->BuildMerkleTree();
+
+        return CheckWork(pblock, *pwalletMain, reservekey);
+    }
+}
+
+
+
+
+
+
+
+
+
+
+
+//
+// Call Table
+//
+
+pair<string, rpcfn_type> pCallTable[] =
+{
+    make_pair("help",                   &help),
+    make_pair("stop",                   &stop),
+    make_pair("getblockcount",          &getblockcount),
+    make_pair("getblocknumber",         &getblocknumber),
+    make_pair("getconnectioncount",     &getconnectioncount),
+    make_pair("getdifficulty",          &getdifficulty),
+    make_pair("getgenerate",            &getgenerate),
+    make_pair("setgenerate",            &setgenerate),
+    make_pair("gethashespersec",        &gethashespersec),
+    make_pair("getinfo",                &getinfo),
+    make_pair("getnewaddress",          &getnewaddress),
+    make_pair("getaccountaddress",      &getaccountaddress),
+    make_pair("setaccount",             &setaccount),
+    make_pair("setlabel",               &setaccount), // deprecated
+    make_pair("getaccount",             &getaccount),
+    make_pair("getlabel",               &getaccount), // deprecated
+    make_pair("getaddressesbyaccount",  &getaddressesbyaccount),
+    make_pair("getaddressesbylabel",    &getaddressesbyaccount), // deprecated
+    make_pair("sendtoaddress",          &sendtoaddress),
+    make_pair("getamountreceived",      &getreceivedbyaddress), // deprecated, renamed to getreceivedbyaddress
+    make_pair("getallreceived",         &listreceivedbyaddress), // deprecated, renamed to listreceivedbyaddress
+    make_pair("getreceivedbyaddress",   &getreceivedbyaddress),
+    make_pair("getreceivedbyaccount",   &getreceivedbyaccount),
+    make_pair("getreceivedbylabel",     &getreceivedbyaccount), // deprecated
+    make_pair("listreceivedbyaddress",  &listreceivedbyaddress),
+    make_pair("listreceivedbyaccount",  &listreceivedbyaccount),
+    make_pair("listreceivedbylabel",    &listreceivedbyaccount), // deprecated
+    make_pair("backupwallet",           &backupwallet),
+    make_pair("keypoolrefill",          &keypoolrefill),
+    make_pair("walletpassphrase",       &walletpassphrase),
+    make_pair("walletpassphrasechange", &walletpassphrasechange),
+    make_pair("walletlock",             &walletlock),
+    make_pair("encryptwallet",          &encryptwallet),
+    make_pair("validateaddress",        &validateaddress),
+    make_pair("getbalance",             &getbalance),
+    make_pair("move",                   &movecmd),
+    make_pair("sendfrom",               &sendfrom),
+    make_pair("sendmany",               &sendmany),
+    make_pair("gettransaction",         &gettransaction),
+    make_pair("listtransactions",       &listtransactions),
+    make_pair("getwork",                &getwork),
+    make_pair("listaccounts",           &listaccounts),
+    make_pair("settxfee",               &settxfee),
+};
+map<string, rpcfn_type> mapCallTable(pCallTable, pCallTable + sizeof(pCallTable)/sizeof(pCallTable[0]));
+
+string pAllowInSafeMode[] =
+{
+    "help",
+    "stop",
+    "getblockcount",
+    "getblocknumber",
+    "getconnectioncount",
+    "getdifficulty",
+    "getgenerate",
+    "setgenerate",
+    "gethashespersec",
+    "getinfo",
+    "getnewaddress",
+    "getaccountaddress",
+    "setlabel", // deprecated
+    "getaccount",
+    "getlabel", // deprecated
+    "getaddressesbyaccount",
+    "getaddressesbylabel", // deprecated
+    "backupwallet",
+    "keypoolrefill",
+    "walletpassphrase",
+    "walletlock",
+    "validateaddress",
+    "getwork",
+};
+set<string> setAllowInSafeMode(pAllowInSafeMode, pAllowInSafeMode + sizeof(pAllowInSafeMode)/sizeof(pAllowInSafeMode[0]));
+
+
+
+
+//
+// HTTP protocol
+//
+// This ain't Apache.  We're just using HTTP header for the length field
+// and to be compatible with other JSON-RPC implementations.
+//
+
+string HTTPPost(const string& strMsg, const map<string,string>& mapRequestHeaders)
+{
+    ostringstream s;
+    s << "POST / HTTP/1.1\r\n"
+      << "User-Agent: bitcoin-json-rpc/" << FormatFullVersion() << "\r\n"
+      << "Host: 127.0.0.1\r\n"
+      << "Content-Type: application/json\r\n"
+      << "Content-Length: " << strMsg.size() << "\r\n"
+      << "Accept: application/json\r\n";
+    BOOST_FOREACH(const PAIRTYPE(string, string)& item, mapRequestHeaders)
+        s << item.first << ": " << item.second << "\r\n";
+    s << "\r\n" << strMsg;
+
+    return s.str();
+}
+
+string rfc1123Time()
+{
+    char buffer[64];
+    time_t now;
+    time(&now);
+    struct tm* now_gmt = gmtime(&now);
+    string locale(setlocale(LC_TIME, NULL));
+    setlocale(LC_TIME, "C"); // we want posix (aka "C") weekday/month strings
+    strftime(buffer, sizeof(buffer), "%a, %d %b %Y %H:%M:%S +0000", now_gmt);
+    setlocale(LC_TIME, locale.c_str());
+    return string(buffer);
+}
+
+static string HTTPReply(int nStatus, const string& strMsg)
+{
+    if (nStatus == 401)
+        return strprintf("HTTP/1.0 401 Authorization Required\r\n"
+            "Date: %s\r\n"
+            "Server: bitcoin-json-rpc/%s\r\n"
+            "WWW-Authenticate: Basic realm=\"jsonrpc\"\r\n"
+            "Content-Type: text/html\r\n"
+            "Content-Length: 296\r\n"
+            "\r\n"
+            "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\r\n"
+            "\"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd\">\r\n"
+            "<HTML>\r\n"
+            "<HEAD>\r\n"
+            "<TITLE>Error</TITLE>\r\n"
+            "<META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=ISO-8859-1'>\r\n"
+            "</HEAD>\r\n"
+            "<BODY><H1>401 Unauthorized.</H1></BODY>\r\n"
+            "</HTML>\r\n", rfc1123Time().c_str(), FormatFullVersion().c_str());
+    string strStatus;
+         if (nStatus == 200) strStatus = "OK";
+    else if (nStatus == 400) strStatus = "Bad Request";
+    else if (nStatus == 403) strStatus = "Forbidden";
+    else if (nStatus == 404) strStatus = "Not Found";
+    else if (nStatus == 500) strStatus = "Internal Server Error";
+    return strprintf(
+            "HTTP/1.1 %d %s\r\n"
+            "Date: %s\r\n"
+            "Connection: close\r\n"
+            "Content-Length: %d\r\n"
+            "Content-Type: application/json\r\n"
+            "Server: bitcoin-json-rpc/%s\r\n"
+            "\r\n"
+            "%s",
+        nStatus,
+        strStatus.c_str(),
+        rfc1123Time().c_str(),
+        strMsg.size(),
+        FormatFullVersion().c_str(),
+        strMsg.c_str());
+}
+
+int ReadHTTPStatus(std::basic_istream<char>& stream)
+{
+    string str;
+    getline(stream, str);
+    vector<string> vWords;
+    boost::split(vWords, str, boost::is_any_of(" "));
+    if (vWords.size() < 2)
+        return 500;
+    return atoi(vWords[1].c_str());
+}
+
+int ReadHTTPHeader(std::basic_istream<char>& stream, map<string, string>& mapHeadersRet)
+{
+    int nLen = 0;
+    loop
+    {
+        string str;
+        std::getline(stream, str);
+        if (str.empty() || str == "\r")
+            break;
+        string::size_type nColon = str.find(":");
+        if (nColon != string::npos)
+        {
+            string strHeader = str.substr(0, nColon);
+            boost::trim(strHeader);
+            boost::to_lower(strHeader);
+            string strValue = str.substr(nColon+1);
+            boost::trim(strValue);
+            mapHeadersRet[strHeader] = strValue;
+            if (strHeader == "content-length")
+                nLen = atoi(strValue.c_str());
+        }
+    }
+    return nLen;
+}
+
+int ReadHTTP(std::basic_istream<char>& stream, map<string, string>& mapHeadersRet, string& strMessageRet)
+{
+    mapHeadersRet.clear();
+    strMessageRet = "";
+
+    // Read status
+    int nStatus = ReadHTTPStatus(stream);
+
+    // Read header
+    int nLen = ReadHTTPHeader(stream, mapHeadersRet);
+    if (nLen < 0 || nLen > MAX_SIZE)
+        return 500;
+
+    // Read message
+    if (nLen > 0)
+    {
+        vector<char> vch(nLen);
+        stream.read(&vch[0], nLen);
+        strMessageRet = string(vch.begin(), vch.end());
+    }
+
+    return nStatus;
+}
+
+string EncodeBase64(string s)
+{
+    BIO *b64, *bmem;
+    BUF_MEM *bptr;
+
+    b64 = BIO_new(BIO_f_base64());
+    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
+    bmem = BIO_new(BIO_s_mem());
+    b64 = BIO_push(b64, bmem);
+    BIO_write(b64, s.c_str(), s.size());
+    BIO_flush(b64);
+    BIO_get_mem_ptr(b64, &bptr);
+
+    string result(bptr->data, bptr->length);
+    BIO_free_all(b64);
+
+    return result;
+}
+
+string DecodeBase64(string s)
+{
+    BIO *b64, *bmem;
+
+    char* buffer = static_cast<char*>(calloc(s.size(), sizeof(char)));
+
+    b64 = BIO_new(BIO_f_base64());
+    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
+    bmem = BIO_new_mem_buf(const_cast<char*>(s.c_str()), s.size());
+    bmem = BIO_push(b64, bmem);
+    BIO_read(bmem, buffer, s.size());
+    BIO_free_all(bmem);
+
+    string result(buffer);
+    free(buffer);
+    return result;
+}
+
+bool HTTPAuthorized(map<string, string>& mapHeaders)
+{
+    string strAuth = mapHeaders["authorization"];
+    if (strAuth.substr(0,6) != "Basic ")
+        return false;
+    string strUserPass64 = strAuth.substr(6); boost::trim(strUserPass64);
+    string strUserPass = DecodeBase64(strUserPass64);
+    string::size_type nColon = strUserPass.find(":");
+    if (nColon == string::npos)
+        return false;
+    string strUser = strUserPass.substr(0, nColon);
+    string strPassword = strUserPass.substr(nColon+1);
+    return (strUser == mapArgs["-rpcuser"] && strPassword == mapArgs["-rpcpassword"]);
+}
+
+//
+// JSON-RPC protocol.  Bitcoin speaks version 1.0 for maximum compatibility,
+// but uses JSON-RPC 1.1/2.0 standards for parts of the 1.0 standard that were
+// unspecified (HTTP errors and contents of 'error').
+//
+// 1.0 spec: http://json-rpc.org/wiki/specification
+// 1.2 spec: http://groups.google.com/group/json-rpc/web/json-rpc-over-http
+// http://www.codeproject.com/KB/recipes/JSON_Spirit.aspx
+//
+
+string JSONRPCRequest(const string& strMethod, const Array& params, const Value& id)
+{
+    Object request;
+    request.push_back(Pair("method", strMethod));
+    request.push_back(Pair("params", params));
+    request.push_back(Pair("id", id));
+    return write_string(Value(request), false) + "\n";
+}
+
+string JSONRPCReply(const Value& result, const Value& error, const Value& id)
+{
+    Object reply;
+    if (error.type() != null_type)
+        reply.push_back(Pair("result", Value::null));
+    else
+        reply.push_back(Pair("result", result));
+    reply.push_back(Pair("error", error));
+    reply.push_back(Pair("id", id));
+    return write_string(Value(reply), false) + "\n";
+}
+
+void ErrorReply(std::ostream& stream, const Object& objError, const Value& id)
+{
+    // Send error reply from json-rpc error object
+    int nStatus = 500;
+    int code = find_value(objError, "code").get_int();
+    if (code == -32600) nStatus = 400;
+    else if (code == -32601) nStatus = 404;
+    string strReply = JSONRPCReply(Value::null, objError, id);
+    stream << HTTPReply(nStatus, strReply) << std::flush;
+}
+
+bool ClientAllowed(const string& strAddress)
+{
+    if (strAddress == asio::ip::address_v4::loopback().to_string())
+        return true;
+    const vector<string>& vAllow = mapMultiArgs["-rpcallowip"];
+    BOOST_FOREACH(string strAllow, vAllow)
+        if (WildcardMatch(strAddress, strAllow))
+            return true;
+    return false;
+}
+
+#ifdef USE_SSL
+//
+// IOStream device that speaks SSL but can also speak non-SSL
+//
+class SSLIOStreamDevice : public iostreams::device<iostreams::bidirectional> {
+public:
+    SSLIOStreamDevice(SSLStream &streamIn, bool fUseSSLIn) : stream(streamIn)
+    {
+        fUseSSL = fUseSSLIn;
+        fNeedHandshake = fUseSSLIn;
+    }
+
+    void handshake(ssl::stream_base::handshake_type role)
+    {
+        if (!fNeedHandshake) return;
+        fNeedHandshake = false;
+        stream.handshake(role);
+    }
+    std::streamsize read(char* s, std::streamsize n)
+    {
+        handshake(ssl::stream_base::server); // HTTPS servers read first
+        if (fUseSSL) return stream.read_some(asio::buffer(s, n));
+        return stream.next_layer().read_some(asio::buffer(s, n));
+    }
+    std::streamsize write(const char* s, std::streamsize n)
+    {
+        handshake(ssl::stream_base::client); // HTTPS clients write first
+        if (fUseSSL) return asio::write(stream, asio::buffer(s, n));
+        return asio::write(stream.next_layer(), asio::buffer(s, n));
+    }
+    bool connect(const std::string& server, const std::string& port)
+    {
+        ip::tcp::resolver resolver(stream.get_io_service());
+        ip::tcp::resolver::query query(server.c_str(), port.c_str());
+        ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
+        ip::tcp::resolver::iterator end;
+        boost::system::error_code error = asio::error::host_not_found;
+        while (error && endpoint_iterator != end)
+        {
+            stream.lowest_layer().close();
+            stream.lowest_layer().connect(*endpoint_iterator++, error);
+        }
+        if (error)
+            return false;
+        return true;
+    }
+
+private:
+    bool fNeedHandshake;
+    bool fUseSSL;
+    SSLStream& stream;
+};
+#endif
+
+void ThreadRPCServer(void* parg)
+{
+    IMPLEMENT_RANDOMIZE_STACK(ThreadRPCServer(parg));
+    try
+    {
+        vnThreadsRunning[4]++;
+        ThreadRPCServer2(parg);
+        vnThreadsRunning[4]--;
+    }
+    catch (std::exception& e) {
+        vnThreadsRunning[4]--;
+        PrintException(&e, "ThreadRPCServer()");
+    } catch (...) {
+        vnThreadsRunning[4]--;
+        PrintException(NULL, "ThreadRPCServer()");
+    }
+    printf("ThreadRPCServer exiting\n");
+}
+
+void ThreadRPCServer2(void* parg)
+{
+    printf("ThreadRPCServer started\n");
+
+    if (mapArgs["-rpcuser"] == "" && mapArgs["-rpcpassword"] == "")
+    {
+        string strWhatAmI = "To use bitcoind";
+        if (mapArgs.count("-server"))
+            strWhatAmI = strprintf(_("To use the %s option"), "\"-server\"");
+        else if (mapArgs.count("-daemon"))
+            strWhatAmI = strprintf(_("To use the %s option"), "\"-daemon\"");
+        PrintConsole(
+            _("Warning: %s, you must set rpcpassword=<password>\nin the configuration file: %s\n"
+              "If the file does not exist, create it with owner-readable-only file permissions.\n"),
+                strWhatAmI.c_str(),
+                GetConfigFile().c_str());
+        CreateThread(Shutdown, NULL);
+        return;
+    }
+
+    bool fUseSSL = GetBoolArg("-rpcssl");
+    asio::ip::address bindAddress = mapArgs.count("-rpcallowip") ? asio::ip::address_v4::any() : asio::ip::address_v4::loopback();
+
+    asio::io_service io_service;
+    ip::tcp::endpoint endpoint(bindAddress, GetArg("-rpcport", 8332));
+    ip::tcp::acceptor acceptor(io_service, endpoint);
+
+    acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
+
+#ifdef USE_SSL
+    ssl::context context(io_service, ssl::context::sslv23);
+    if (fUseSSL)
+    {
+        context.set_options(ssl::context::no_sslv2);
+        filesystem::path certfile = GetArg("-rpcsslcertificatechainfile", "server.cert");
+        if (!certfile.is_complete()) certfile = filesystem::path(GetDataDir()) / certfile;
+        if (filesystem::exists(certfile)) context.use_certificate_chain_file(certfile.string().c_str());
+        else printf("ThreadRPCServer ERROR: missing server certificate file %s\n", certfile.string().c_str());
+        filesystem::path pkfile = GetArg("-rpcsslprivatekeyfile", "server.pem");
+        if (!pkfile.is_complete()) pkfile = filesystem::path(GetDataDir()) / pkfile;
+        if (filesystem::exists(pkfile)) context.use_private_key_file(pkfile.string().c_str(), ssl::context::pem);
+        else printf("ThreadRPCServer ERROR: missing server private key file %s\n", pkfile.string().c_str());
+
+        string ciphers = GetArg("-rpcsslciphers",
+                                         "TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH");
+        SSL_CTX_set_cipher_list(context.impl(), ciphers.c_str());
+    }
+#else
+    if (fUseSSL)
+        throw runtime_error("-rpcssl=1, but bitcoin compiled without full openssl libraries.");
+#endif
+
+    loop
+    {
+        // Accept connection
+#ifdef USE_SSL
+        SSLStream sslStream(io_service, context);
+        SSLIOStreamDevice d(sslStream, fUseSSL);
+        iostreams::stream<SSLIOStreamDevice> stream(d);
+#else
+        ip::tcp::iostream stream;
+#endif
+
+        ip::tcp::endpoint peer;
+        vnThreadsRunning[4]--;
+#ifdef USE_SSL
+        acceptor.accept(sslStream.lowest_layer(), peer);
+#else
+        acceptor.accept(*stream.rdbuf(), peer);
+#endif
+        vnThreadsRunning[4]++;
+        if (fShutdown)
+            return;
+
+        // Restrict callers by IP
+        if (!ClientAllowed(peer.address().to_string()))
+        {
+            // Only send a 403 if we're not using SSL to prevent a DoS during the SSL handshake.
+            if (!fUseSSL)
+                stream << HTTPReply(403, "") << std::flush;
+            continue;
+        }
+
+        map<string, string> mapHeaders;
+        string strRequest;
+
+        boost::thread api_caller(ReadHTTP, boost::ref(stream), boost::ref(mapHeaders), boost::ref(strRequest));
+        if (!api_caller.timed_join(boost::posix_time::seconds(GetArg("-rpctimeout", 30))))
+        {   // Timed out:
+            acceptor.cancel();
+            printf("ThreadRPCServer ReadHTTP timeout\n");
+            continue;
+        }
+
+        // Check authorization
+        if (mapHeaders.count("authorization") == 0)
+        {
+            stream << HTTPReply(401, "") << std::flush;
+            continue;
+        }
+        if (!HTTPAuthorized(mapHeaders))
+        {
+            // Deter brute-forcing short passwords
+            if (mapArgs["-rpcpassword"].size() < 15)
+                Sleep(50);
+
+            stream << HTTPReply(401, "") << std::flush;
+            printf("ThreadRPCServer incorrect password attempt\n");
+            continue;
+        }
+
+        Value id = Value::null;
+        try
+        {
+            // Parse request
+            Value valRequest;
+            if (!read_string(strRequest, valRequest) || valRequest.type() != obj_type)
+                throw JSONRPCError(-32700, "Parse error");
+            const Object& request = valRequest.get_obj();
+
+            // Parse id now so errors from here on will have the id
+            id = find_value(request, "id");
+
+            // Parse method
+            Value valMethod = find_value(request, "method");
+            if (valMethod.type() == null_type)
+                throw JSONRPCError(-32600, "Missing method");
+            if (valMethod.type() != str_type)
+                throw JSONRPCError(-32600, "Method must be a string");
+            string strMethod = valMethod.get_str();
+            if (strMethod != "getwork")
+                printf("ThreadRPCServer method=%s\n", strMethod.c_str());
+
+            // Parse params
+            Value valParams = find_value(request, "params");
+            Array params;
+            if (valParams.type() == array_type)
+                params = valParams.get_array();
+            else if (valParams.type() == null_type)
+                params = Array();
+            else
+                throw JSONRPCError(-32600, "Params must be an array");
+
+            // Find method
+            map<string, rpcfn_type>::iterator mi = mapCallTable.find(strMethod);
+            if (mi == mapCallTable.end())
+                throw JSONRPCError(-32601, "Method not found");
+
+            // Observe safe mode
+            string strWarning = GetWarnings("rpc");
+            if (strWarning != "" && !GetBoolArg("-disablesafemode") && !setAllowInSafeMode.count(strMethod))
+                throw JSONRPCError(-2, string("Safe mode: ") + strWarning);
+
+            try
+            {
+                // Execute
+                Value result;
+                CRITICAL_BLOCK(cs_main)
+                CRITICAL_BLOCK(pwalletMain->cs_wallet)
+                    result = (*(*mi).second)(params, false);
+
+                // Send reply
+                string strReply = JSONRPCReply(result, Value::null, id);
+                stream << HTTPReply(200, strReply) << std::flush;
+            }
+            catch (std::exception& e)
+            {
+                ErrorReply(stream, JSONRPCError(-1, e.what()), id);
+            }
+        }
+        catch (Object& objError)
+        {
+            ErrorReply(stream, objError, id);
+        }
+        catch (std::exception& e)
+        {
+            ErrorReply(stream, JSONRPCError(-32700, e.what()), id);
+        }
+    }
+}
+
+
+
+
+Object CallRPC(const string& strMethod, const Array& params)
+{
+    if (mapArgs["-rpcuser"] == "" && mapArgs["-rpcpassword"] == "")
+        throw runtime_error(strprintf(
+            _("You must set rpcpassword=<password> in the configuration file:\n%s\n"
+              "If the file does not exist, create it with owner-readable-only file permissions."),
+                GetConfigFile().c_str()));
+
+    // Connect to localhost
+    bool fUseSSL = GetBoolArg("-rpcssl");
+#ifdef USE_SSL
+    asio::io_service io_service;
+    ssl::context context(io_service, ssl::context::sslv23);
+    context.set_options(ssl::context::no_sslv2);
+    SSLStream sslStream(io_service, context);
+    SSLIOStreamDevice d(sslStream, fUseSSL);
+    iostreams::stream<SSLIOStreamDevice> stream(d);
+    if (!d.connect(GetArg("-rpcconnect", "127.0.0.1"), GetArg("-rpcport", "8332")))
+        throw runtime_error("couldn't connect to server");
+#else
+    if (fUseSSL)
+        throw runtime_error("-rpcssl=1, but bitcoin compiled without full openssl libraries.");
+
+    ip::tcp::iostream stream(GetArg("-rpcconnect", "127.0.0.1"), GetArg("-rpcport", "8332"));
+    if (stream.fail())
+        throw runtime_error("couldn't connect to server");
+#endif
+
+
+    // HTTP basic authentication
+    string strUserPass64 = EncodeBase64(mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"]);
+    map<string, string> mapRequestHeaders;
+    mapRequestHeaders["Authorization"] = string("Basic ") + strUserPass64;
+
+    // Send request
+    string strRequest = JSONRPCRequest(strMethod, params, 1);
+    string strPost = HTTPPost(strRequest, mapRequestHeaders);
+    stream << strPost << std::flush;
+
+    // Receive reply
+    map<string, string> mapHeaders;
+    string strReply;
+    int nStatus = ReadHTTP(stream, mapHeaders, strReply);
+    if (nStatus == 401)
+        throw runtime_error("incorrect rpcuser or rpcpassword (authorization failed)");
+    else if (nStatus >= 400 && nStatus != 400 && nStatus != 404 && nStatus != 500)
+        throw runtime_error(strprintf("server returned HTTP error %d", nStatus));
+    else if (strReply.empty())
+        throw runtime_error("no response from server");
+
+    // Parse reply
+    Value valReply;
+    if (!read_string(strReply, valReply))
+        throw runtime_error("couldn't parse reply from server");
+    const Object& reply = valReply.get_obj();
+    if (reply.empty())
+        throw runtime_error("expected reply to have result, error and id properties");
+
+    return reply;
+}
+
+
+
+
+template<typename T>
+void ConvertTo(Value& value)
+{
+    if (value.type() == str_type)
+    {
+        // reinterpret string as unquoted json value
+        Value value2;
+        if (!read_string(value.get_str(), value2))
+            throw runtime_error("type mismatch");
+        value = value2.get_value<T>();
+    }
+    else
+    {
+        value = value.get_value<T>();
+    }
+}
+
+int CommandLineRPC(int argc, char *argv[])
+{
+    string strPrint;
+    int nRet = 0;
+    try
+    {
+        // Skip switches
+        while (argc > 1 && IsSwitchChar(argv[1][0]))
+        {
+            argc--;
+            argv++;
+        }
+
+        // Method
+        if (argc < 2)
+            throw runtime_error("too few parameters");
+        string strMethod = argv[1];
+
+        // Parameters default to strings
+        Array params;
+        for (int i = 2; i < argc; i++)
+            params.push_back(argv[i]);
+        int n = params.size();
+
+        //
+        // Special case non-string parameter types
+        //
+        if (strMethod == "setgenerate"            && n > 0) ConvertTo<bool>(params[0]);
+        if (strMethod == "setgenerate"            && n > 1) ConvertTo<boost::int64_t>(params[1]);
+        if (strMethod == "sendtoaddress"          && n > 1) ConvertTo<double>(params[1]);
+        if (strMethod == "settxfee"               && n > 0) ConvertTo<double>(params[0]);
+        if (strMethod == "getamountreceived"      && n > 1) ConvertTo<boost::int64_t>(params[1]); // deprecated
+        if (strMethod == "getreceivedbyaddress"   && n > 1) ConvertTo<boost::int64_t>(params[1]);
+        if (strMethod == "getreceivedbyaccount"   && n > 1) ConvertTo<boost::int64_t>(params[1]);
+        if (strMethod == "getreceivedbylabel"     && n > 1) ConvertTo<boost::int64_t>(params[1]); // deprecated
+        if (strMethod == "getallreceived"         && n > 0) ConvertTo<boost::int64_t>(params[0]); // deprecated
+        if (strMethod == "getallreceived"         && n > 1) ConvertTo<bool>(params[1]); // deprecated
+        if (strMethod == "listreceivedbyaddress"  && n > 0) ConvertTo<boost::int64_t>(params[0]);
+        if (strMethod == "listreceivedbyaddress"  && n > 1) ConvertTo<bool>(params[1]);
+        if (strMethod == "listreceivedbyaccount"  && n > 0) ConvertTo<boost::int64_t>(params[0]);
+        if (strMethod == "listreceivedbyaccount"  && n > 1) ConvertTo<bool>(params[1]);
+        if (strMethod == "listreceivedbylabel"    && n > 0) ConvertTo<boost::int64_t>(params[0]); // deprecated
+        if (strMethod == "listreceivedbylabel"    && n > 1) ConvertTo<bool>(params[1]); // deprecated
+        if (strMethod == "getbalance"             && n > 1) ConvertTo<boost::int64_t>(params[1]);
+        if (strMethod == "move"                   && n > 2) ConvertTo<double>(params[2]);
+        if (strMethod == "move"                   && n > 3) ConvertTo<boost::int64_t>(params[3]);
+        if (strMethod == "sendfrom"               && n > 2) ConvertTo<double>(params[2]);
+        if (strMethod == "sendfrom"               && n > 3) ConvertTo<boost::int64_t>(params[3]);
+        if (strMethod == "listtransactions"       && n > 1) ConvertTo<boost::int64_t>(params[1]);
+        if (strMethod == "listtransactions"       && n > 2) ConvertTo<boost::int64_t>(params[2]);
+        if (strMethod == "listaccounts"           && n > 0) ConvertTo<boost::int64_t>(params[0]);
+        if (strMethod == "walletpassphrase"       && n > 1) ConvertTo<boost::int64_t>(params[1]);
+        if (strMethod == "sendmany"               && n > 1)
+        {
+            string s = params[1].get_str();
+            Value v;
+            if (!read_string(s, v) || v.type() != obj_type)
+                throw runtime_error("type mismatch");
+            params[1] = v.get_obj();
+        }
+        if (strMethod == "sendmany"                && n > 2) ConvertTo<boost::int64_t>(params[2]);
+
+        // Execute
+        Object reply = CallRPC(strMethod, params);
+
+        // Parse reply
+        const Value& result = find_value(reply, "result");
+        const Value& error  = find_value(reply, "error");
+
+        if (error.type() != null_type)
+        {
+            // Error
+            strPrint = "error: " + write_string(error, false);
+            int code = find_value(error.get_obj(), "code").get_int();
+            nRet = abs(code);
+        }
+        else
+        {
+            // Result
+            if (result.type() == null_type)
+                strPrint = "";
+            else if (result.type() == str_type)
+                strPrint = result.get_str();
+            else
+                strPrint = write_string(result, true);
+        }
+    }
+    catch (std::exception& e)
+    {
+        strPrint = string("error: ") + e.what();
+        nRet = 87;
+    }
+    catch (...)
+    {
+        PrintException(NULL, "CommandLineRPC()");
+    }
+
+    if (strPrint != "")
+    {
+#if defined(__WXMSW__) && defined(GUI)
+        // Windows GUI apps can't print to command line,
+        // so settle for a message box yuck
+        MyMessageBox(strPrint, "Bitcoin", wxOK);
+#else
+        fprintf((nRet == 0 ? stdout : stderr), "%s\n", strPrint.c_str());
+#endif
+    }
+    return nRet;
+}
+
+
+
+
+#ifdef TEST
+int main(int argc, char *argv[])
+{
+#ifdef _MSC_VER
+    // Turn off microsoft heap dump noise
+    _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
+    _CrtSetReportFile(_CRT_WARN, CreateFile("NUL", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0));
+#endif
+    setbuf(stdin, NULL);
+    setbuf(stdout, NULL);
+    setbuf(stderr, NULL);
+
+    try
+    {
+        if (argc >= 2 && string(argv[1]) == "-server")
+        {
+            printf("server ready\n");
+            ThreadRPCServer(NULL);
+        }
+        else
+        {
+            return CommandLineRPC(argc, argv);
+        }
+    }
+    catch (std::exception& e) {
+        PrintException(&e, "main()");
+    } catch (...) {
+        PrintException(NULL, "main()");
+    }
+    return 0;
+}
+#endif
new file mode 100644
--- /dev/null
+++ b/src/bitcoinrpc.h
@@ -0,0 +1,7 @@
+// Copyright (c) 2010 Satoshi Nakamoto
+// Copyright (c) 2011 The Bitcoin developers
+// Distributed under the MIT/X11 software license, see the accompanying
+// file license.txt or http://www.opensource.org/licenses/mit-license.php.
+
+void ThreadRPCServer(void* parg);
+int CommandLineRPC(int argc, char *argv[]);
--- a/src/headers.h
+++ b/src/headers.h
@@ -99,8 +99,12 @@
 #include "uibase.h"
 #include "ui.h"
 #else
+#ifdef QT_GUI
+#include "qtui.h"
+#else
 #include "noui.h"
 #endif
+#endif
 
 #ifdef GUI
 #include "xpm/addressbook16.xpm"
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -4,7 +4,7 @@
 // file license.txt or http://www.opensource.org/licenses/mit-license.php.
 #include "headers.h"
 #include "db.h"
-#include "rpc.h"
+#include "bitcoinrpc.h"
 #include "net.h"
 #include "init.h"
 #include "strlcpy.h"
@@ -80,7 +80,7 @@
 //
 // Start
 //
-#ifndef GUI
+#if !defined(QT_GUI) && !defined(GUI)
 int main(int argc, char* argv[])
 {
     bool fRet = false;
@@ -240,10 +240,9 @@
         fServer = GetBoolArg("-server");
 
     /* force fServer when running without GUI */
-#ifndef GUI
+#if !defined(QT_GUI) && !defined(GUI)
     fServer = true;
 #endif
-
     fPrintToConsole = GetBoolArg("-printtoconsole");
     fPrintToDebugger = GetBoolArg("-printtodebugger");
 
@@ -252,6 +251,7 @@
     fNoListen = GetBoolArg("-nolisten") || fTOR;
     fLogTimestamps = GetBoolArg("-logtimestamps");
 
+#ifndef QT_GUI
     for (int i = 1; i < argc; i++)
         if (!IsSwitchChar(argv[i][0]))
             fCommandLine = true;
@@ -261,6 +261,7 @@
         int ret = CommandLineRPC(argc, argv);
         exit(ret);
     }
+#endif
 
 #ifndef __WXMSW__
     if (fDaemon)
@@ -373,18 +374,21 @@
     strErrors = "";
     int64 nStart;
 
+    InitMessage(_("Loading addresses..."));
     printf("Loading addresses...\n");
     nStart = GetTimeMillis();
     if (!LoadAddresses())
         strErrors += _("Error loading addr.dat      \n");
     printf(" addresses   %15"PRI64d"ms\n", GetTimeMillis() - nStart);
 
+    InitMessage(_("Loading block index..."));
     printf("Loading block index...\n");
     nStart = GetTimeMillis();
     if (!LoadBlockIndex())
         strErrors += _("Error loading blkindex.dat      \n");
     printf(" block index %15"PRI64d"ms\n", GetTimeMillis() - nStart);
 
+    InitMessage(_("Loading wallet..."));
     printf("Loading wallet...\n");
     nStart = GetTimeMillis();
     bool fFirstRun;
@@ -415,12 +419,14 @@
     }
     if (pindexBest != pindexRescan)
     {
+        InitMessage(_("Rescanning..."));
         printf("Rescanning last %i blocks (from block %i)...\n", pindexBest->nHeight - pindexRescan->nHeight, pindexRescan->nHeight);
         nStart = GetTimeMillis();
         pwalletMain->ScanForWalletTransactions(pindexRescan, true);
         printf(" rescan      %15"PRI64d"ms\n", GetTimeMillis() - nStart);
     }
 
+    InitMessage(_("Done loading"));
     printf("Done loading\n");
 
         //// debug print
@@ -543,7 +549,7 @@
     RandAddSeedPerfmon();
 
     if (!CreateThread(StartNode, NULL))
-        wxMessageBox("Error: CreateThread(StartNode) failed", "Bitcoin");
+        wxMessageBox(_("Error: CreateThread(StartNode) failed"), "Bitcoin");
 
     if (fServer)
         CreateThread(ThreadRPCServer, NULL);
@@ -553,7 +559,7 @@
         SetStartOnSystemStartup(true);
 #endif
 
-#ifndef GUI
+#if !defined(QT_GUI) && !defined(GUI)
     while (1)
         Sleep(5000);
 #endif
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -32,6 +32,7 @@
 static CBigNum bnProofOfWorkLimit(~uint256(0) >> 32);
 const int nTotalBlocksEstimate = 140700; // Conservative estimate of total nr of blocks on main chain
 const int nInitialBlockThreshold = 120; // Regard blocks up until N-threshold as "initial download"
+int nMaxBlocksOfPeers = 0; // Amount of blocks that other nodes claim to have
 CBlockIndex* pindexGenesisBlock = NULL;
 int nBestHeight = -1;
 CBigNum bnBestChainWork = 0;
@@ -726,6 +727,12 @@
     }
 }
 
+// Return maximum amount of blocks that other nodes claim to have
+int GetNumBlocksOfPeers()
+{
+    return std::max(nMaxBlocksOfPeers, GetTotalBlocksEstimate());
+}
+
 bool IsInitialBlockDownload()
 {
     if (pindexBest == NULL || nBestHeight < (GetTotalBlocksEstimate()-nInitialBlockThreshold))
@@ -1840,6 +1847,10 @@
         pfrom->fSuccessfullyConnected = true;
 
         printf("version message: version %d, blocks=%d\n", pfrom->nVersion, pfrom->nStartingHeight);
+        if(pfrom->nStartingHeight > nMaxBlocksOfPeers)
+        {
+            nMaxBlocksOfPeers = pfrom->nStartingHeight;
+        }
     }
 
 
--- a/src/main.h
+++ b/src/main.h
@@ -99,6 +99,7 @@
 bool CheckWork(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey);
 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
 int GetTotalBlocksEstimate();
+int GetNumBlocksOfPeers();
 bool IsInitialBlockDownload();
 std::string GetWarnings(std::string strFor);
 
--- a/src/makefile.linux-mingw
+++ b/src/makefile.linux-mingw
@@ -49,7 +49,7 @@
     net.h \
     noui.h \
     protocol.h \
-    rpc.h \
+    bitcoinrpc.h \
     script.h \
     serialize.h \
     strlcpy.h \
@@ -76,7 +76,7 @@
     obj/main.o \
     obj/net.o \
     obj/protocol.o \
-    obj/rpc.o \
+    obj/bitcoinrpc.o \
     obj/script.o \
     obj/util.o \
     obj/wallet.o \
--- a/src/makefile.mingw
+++ b/src/makefile.mingw
@@ -46,7 +46,7 @@
     net.h \
     noui.h \
     protocol.h \
-    rpc.h \
+    bitcoinrpc.h \
     script.h \
     serialize.h \
     strlcpy.h \
@@ -74,7 +74,7 @@
     obj/main.o \
     obj/net.o \
     obj/protocol.o \
-    obj/rpc.o \
+    obj/bitcoinrpc.o \
     obj/script.o \
     obj/util.o \
     obj/wallet.o \
--- a/src/makefile.osx
+++ b/src/makefile.osx
@@ -46,7 +46,7 @@
     net.h \
     noui.h \
     protocol.h \
-    rpc.h \
+    bitcoinrpc.h \
     script.h \
     serialize.h \
     strlcpy.h \
@@ -65,7 +65,7 @@
     obj/main.o \
     obj/net.o \
     obj/protocol.o \
-    obj/rpc.o \
+    obj/bitcoinrpc.o \
     obj/script.o \
     obj/util.o \
     obj/wallet.o \
--- a/src/makefile.unix
+++ b/src/makefile.unix
@@ -52,7 +52,7 @@
     net.h \
     noui.h \
     protocol.h \
-    rpc.h \
+    bitcoinrpc.h \
     script.h \
     serialize.h \
     strlcpy.h \
@@ -71,7 +71,7 @@
     obj/main.o \
     obj/net.o \
     obj/protocol.o \
-    obj/rpc.o \
+    obj/bitcoinrpc.o \
     obj/script.o \
     obj/util.o \
     obj/wallet.o \
--- a/src/makefile.vc
+++ b/src/makefile.vc
@@ -59,7 +59,7 @@
     net.h \
     noui.h \
     protocol.h \
-    rpc.h \
+    bitcoinrpc.h \
     script.h \
     serialize.h \
     strlcpy.h \
--- a/src/noui.h
+++ b/src/noui.h
@@ -67,4 +67,8 @@
 {
 }
 
+inline void InitMessage(const std::string &message)
+{
+}
+
 #endif
new file mode 100644
--- /dev/null
+++ b/src/qt/aboutdialog.cpp
@@ -0,0 +1,26 @@
+#include "aboutdialog.h"
+#include "ui_aboutdialog.h"
+#include "clientmodel.h"
+
+AboutDialog::AboutDialog(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::AboutDialog)
+{
+    ui->setupUi(this);
+
+}
+
+void AboutDialog::setModel(ClientModel *model)
+{
+    ui->versionLabel->setText(model->formatFullVersion());
+}
+
+AboutDialog::~AboutDialog()
+{
+    delete ui;
+}
+
+void AboutDialog::on_buttonBox_accepted()
+{
+    close();
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/aboutdialog.h
@@ -0,0 +1,27 @@
+#ifndef ABOUTDIALOG_H
+#define ABOUTDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+    class AboutDialog;
+}
+class ClientModel;
+
+class AboutDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit AboutDialog(QWidget *parent = 0);
+    ~AboutDialog();
+
+    void setModel(ClientModel *model);
+private:
+    Ui::AboutDialog *ui;
+
+private slots:
+    void on_buttonBox_accepted();
+};
+
+#endif // ABOUTDIALOG_H
new file mode 100644
--- /dev/null
+++ b/src/qt/addressbookpage.cpp
@@ -0,0 +1,215 @@
+#include "addressbookpage.h"
+#include "ui_addressbookpage.h"
+
+#include "addresstablemodel.h"
+#include "editaddressdialog.h"
+#include "csvmodelwriter.h"
+
+#include <QSortFilterProxyModel>
+#include <QClipboard>
+#include <QFileDialog>
+#include <QMessageBox>
+
+AddressBookPage::AddressBookPage(Mode mode, Tabs tab, QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::AddressBookPage),
+    model(0),
+    mode(mode),
+    tab(tab)
+{
+    ui->setupUi(this);
+    switch(mode)
+    {
+    case ForSending:
+        connect(ui->tableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(accept()));
+        ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
+        ui->tableView->setFocus();
+        break;
+    case ForEditing:
+        ui->buttonBox->hide();
+        break;
+    }
+    switch(tab)
+    {
+    case SendingTab:
+        ui->labelExplanation->hide();
+        break;
+    case ReceivingTab:
+        break;
+    }
+    ui->tableView->setTabKeyNavigation(false);
+
+    connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
+}
+
+AddressBookPage::~AddressBookPage()
+{
+    delete ui;
+}
+
+void AddressBookPage::setModel(AddressTableModel *model)
+{
+    this->model = model;
+    // Refresh list from core
+    model->updateList();
+
+    proxyModel = new QSortFilterProxyModel(this);
+    proxyModel->setSourceModel(model);
+    proxyModel->setDynamicSortFilter(true);
+    switch(tab)
+    {
+    case ReceivingTab:
+        // Receive filter
+        proxyModel->setFilterRole(AddressTableModel::TypeRole);
+        proxyModel->setFilterFixedString(AddressTableModel::Receive);
+        break;
+    case SendingTab:
+        // Send filter
+        proxyModel->setFilterRole(AddressTableModel::TypeRole);
+        proxyModel->setFilterFixedString(AddressTableModel::Send);
+        break;
+    }
+    ui->tableView->setModel(proxyModel);
+    ui->tableView->sortByColumn(0, Qt::AscendingOrder);
+
+    // Set column widths
+    ui->tableView->horizontalHeader()->resizeSection(
+            AddressTableModel::Address, 320);
+    ui->tableView->horizontalHeader()->setResizeMode(
+            AddressTableModel::Label, QHeaderView::Stretch);
+
+    connect(ui->tableView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
+            this, SLOT(selectionChanged()));
+
+    if(mode == ForSending)
+    {
+        // Auto-select first row when in sending mode
+        ui->tableView->selectRow(0);
+    }
+    selectionChanged();
+}
+
+QTableView *AddressBookPage::getCurrentTable()
+{
+    return ui->tableView;
+}
+
+void AddressBookPage::on_copyToClipboard_clicked()
+{
+    // Copy currently selected address to clipboard
+    //   (or nothing, if nothing selected)
+    QTableView *table = getCurrentTable();
+    QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
+
+    foreach (QModelIndex index, indexes)
+    {
+        QVariant address = index.data();
+        QApplication::clipboard()->setText(address.toString());
+    }
+}
+
+void AddressBookPage::on_newAddressButton_clicked()
+{
+    EditAddressDialog dlg(
+            tab == SendingTab ?
+            EditAddressDialog::NewSendingAddress :
+            EditAddressDialog::NewReceivingAddress);
+    dlg.setModel(model);
+    if(dlg.exec())
+    {
+        // Select row for newly created address
+        QString address = dlg.getAddress();
+        QModelIndexList lst = proxyModel->match(proxyModel->index(0,
+                          AddressTableModel::Address, QModelIndex()),
+                          Qt::EditRole, address, 1, Qt::MatchExactly);
+        if(!lst.isEmpty())
+        {
+            ui->tableView->setFocus();
+            ui->tableView->selectRow(lst.at(0).row());
+        }
+    }
+}
+
+void AddressBookPage::on_deleteButton_clicked()
+{
+    QTableView *table = getCurrentTable();
+    QModelIndexList indexes = table->selectionModel()->selectedRows();
+    if(!indexes.isEmpty())
+    {
+        table->model()->removeRow(indexes.at(0).row());
+    }
+}
+
+void AddressBookPage::selectionChanged()
+{
+    // Set button states based on selected tab and selection
+    QTableView *table = getCurrentTable();
+
+    if(table->selectionModel()->hasSelection())
+    {
+        switch(tab)
+        {
+        case SendingTab:
+            ui->deleteButton->setEnabled(true);
+            break;
+        case ReceivingTab:
+            ui->deleteButton->setEnabled(false);
+            break;
+        }
+        ui->copyToClipboard->setEnabled(true);
+    }
+    else
+    {
+        ui->deleteButton->setEnabled(false);
+        ui->copyToClipboard->setEnabled(false);
+    }
+}
+
+void AddressBookPage::done(int retval)
+{
+    // When this is a tab/widget and not a model dialog, ignore "done"
+    if(mode == ForEditing)
+        return;
+
+    // Figure out which address was selected, and return it
+    QTableView *table = getCurrentTable();
+    QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
+
+    foreach (QModelIndex index, indexes)
+    {
+        QVariant address = table->model()->data(index);
+        returnValue = address.toString();
+    }
+
+    if(returnValue.isEmpty())
+    {
+        retval = Rejected;
+    }
+
+    QDialog::done(retval);
+}
+
+void AddressBookPage::exportClicked()
+{
+    // CSV is currently the only supported format
+    QString filename = QFileDialog::getSaveFileName(
+            this,
+            tr("Export Address Book Data"),
+            QDir::currentPath(),
+            tr("Comma separated file (*.csv)"));
+
+    if (filename.isNull()) return;
+
+    CSVModelWriter writer(filename);
+
+    // name, column, role
+    writer.setModel(proxyModel);
+    writer.addColumn("Label", AddressTableModel::Label, Qt::EditRole);
+    writer.addColumn("Address", AddressTableModel::Address, Qt::EditRole);
+
+    if(!writer.write())
+    {
+        QMessageBox::critical(this, tr("Error exporting"), tr("Could not write to file %1.").arg(filename),
+                              QMessageBox::Abort, QMessageBox::Abort);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/addressbookpage.h
@@ -0,0 +1,59 @@
+#ifndef ADDRESSBOOKPAGE_H
+#define ADDRESSBOOKPAGE_H
+
+#include <QDialog>
+
+namespace Ui {
+    class AddressBookPage;
+}
+class AddressTableModel;
+
+QT_BEGIN_NAMESPACE
+class QTableView;
+class QItemSelection;
+class QSortFilterProxyModel;
+QT_END_NAMESPACE
+
+class AddressBookPage : public QDialog
+{
+    Q_OBJECT
+
+public:
+    enum Tabs {
+        SendingTab = 0,
+        ReceivingTab = 1
+    };
+
+    enum Mode {
+        ForSending, // Pick address for sending
+        ForEditing  // Open address book for editing
+    };
+
+    explicit AddressBookPage(Mode mode, Tabs tab, QWidget *parent = 0);
+    ~AddressBookPage();
+
+    void setModel(AddressTableModel *model);
+    const QString &getReturnValue() const { return returnValue; }
+
+public slots:
+    void done(int retval);
+    void exportClicked();
+
+private:
+    Ui::AddressBookPage *ui;
+    AddressTableModel *model;
+    Mode mode;
+    Tabs tab;
+    QString returnValue;
+    QSortFilterProxyModel *proxyModel;
+
+    QTableView *getCurrentTable();
+
+private slots:
+    void on_deleteButton_clicked();
+    void on_newAddressButton_clicked();
+    void on_copyToClipboard_clicked();
+    void selectionChanged();
+};
+
+#endif // ADDRESSBOOKDIALOG_H
new file mode 100644
--- /dev/null
+++ b/src/qt/addresstablemodel.cpp
@@ -0,0 +1,347 @@
+#include "addresstablemodel.h"
+#include "guiutil.h"
+#include "walletmodel.h"
+
+#include "headers.h"
+
+#include <QFont>
+#include <QColor>
+
+const QString AddressTableModel::Send = "S";
+const QString AddressTableModel::Receive = "R";
+
+struct AddressTableEntry
+{
+    enum Type {
+        Sending,
+        Receiving
+    };
+
+    Type type;
+    QString label;
+    QString address;
+
+    AddressTableEntry() {}
+    AddressTableEntry(Type type, const QString &label, const QString &address):
+        type(type), label(label), address(address) {}
+};
+
+// Private implementation
+struct AddressTablePriv
+{
+    CWallet *wallet;
+    QList<AddressTableEntry> cachedAddressTable;
+
+    AddressTablePriv(CWallet *wallet):
+            wallet(wallet) {}
+
+    void refreshAddressTable()
+    {
+        cachedAddressTable.clear();
+
+        CRITICAL_BLOCK(wallet->cs_wallet)
+        {
+            BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, std::string)& item, wallet->mapAddressBook)
+            {
+                const CBitcoinAddress& address = item.first;
+                const std::string& strName = item.second;
+                bool fMine = wallet->HaveKey(address);
+                cachedAddressTable.append(AddressTableEntry(fMine ? AddressTableEntry::Receiving : AddressTableEntry::Sending,
+                                  QString::fromStdString(strName),
+                                  QString::fromStdString(address.ToString())));
+            }
+        }
+    }
+
+    int size()
+    {
+        return cachedAddressTable.size();
+    }
+
+    AddressTableEntry *index(int idx)
+    {
+        if(idx >= 0 && idx < cachedAddressTable.size())
+        {
+            return &cachedAddressTable[idx];
+        }
+        else
+        {
+            return 0;
+        }
+    }
+};
+
+AddressTableModel::AddressTableModel(CWallet *wallet, WalletModel *parent) :
+    QAbstractTableModel(parent),walletModel(parent),wallet(wallet),priv(0)
+{
+    columns << tr("Label") << tr("Address");
+    priv = new AddressTablePriv(wallet);
+    priv->refreshAddressTable();
+}
+
+AddressTableModel::~AddressTableModel()
+{
+    delete priv;
+}
+
+int AddressTableModel::rowCount(const QModelIndex &parent) const
+{
+    Q_UNUSED(parent);
+    return priv->size();
+}
+
+int AddressTableModel::columnCount(const QModelIndex &parent) const
+{
+    Q_UNUSED(parent);
+    return columns.length();
+}
+
+QVariant AddressTableModel::data(const QModelIndex &index, int role) const
+{
+    if(!index.isValid())
+        return QVariant();
+
+    AddressTableEntry *rec = static_cast<AddressTableEntry*>(index.internalPointer());
+
+    if(role == Qt::DisplayRole || role == Qt::EditRole)
+    {
+        switch(index.column())
+        {
+        case Label:
+            if(rec->label.isEmpty() && role == Qt::DisplayRole)
+            {
+                return tr("(no label)");
+            }
+            else
+            {
+                return rec->label;
+            }
+        case Address:
+            return rec->address;
+        }
+    }
+    else if (role == Qt::FontRole)
+    {
+        QFont font;
+        if(index.column() == Address)
+        {
+            font = GUIUtil::bitcoinAddressFont();
+        }
+        return font;
+    }
+    else if (role == TypeRole)
+    {
+        switch(rec->type)
+        {
+        case AddressTableEntry::Sending:
+            return Send;
+        case AddressTableEntry::Receiving:
+            return Receive;
+        default: break;
+        }
+    }
+    return QVariant();
+}
+
+bool AddressTableModel::setData(const QModelIndex & index, const QVariant & value, int role)
+{
+    if(!index.isValid())
+        return false;
+    AddressTableEntry *rec = static_cast<AddressTableEntry*>(index.internalPointer());
+
+    editStatus = OK;
+
+    if(role == Qt::EditRole)
+    {
+        switch(index.column())
+        {
+        case Label:
+            wallet->SetAddressBookName(rec->address.toStdString(), value.toString().toStdString());
+            rec->label = value.toString();
+            break;
+        case Address:
+            // Refuse to set invalid address, set error status and return false
+            if(!walletModel->validateAddress(value.toString()))
+            {
+                editStatus = INVALID_ADDRESS;
+                return false;
+            }
+            // Double-check that we're not overwriting a receiving address
+            if(rec->type == AddressTableEntry::Sending)
+            {
+                CRITICAL_BLOCK(wallet->cs_wallet)
+                {
+                    // Remove old entry
+                    wallet->DelAddressBookName(rec->address.toStdString());
+                    // Add new entry with new address
+                    wallet->SetAddressBookName(value.toString().toStdString(), rec->label.toStdString());
+                }
+
+                rec->address = value.toString();
+            }
+            break;
+        }
+        emit dataChanged(index, index);
+
+        return true;
+    }
+    return false;
+}
+
+QVariant AddressTableModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+    if(orientation == Qt::Horizontal)
+    {
+        if(role == Qt::DisplayRole)
+        {
+            return columns[section];
+        }
+    }
+    return QVariant();
+}
+
+Qt::ItemFlags AddressTableModel::flags(const QModelIndex & index) const
+{
+    if(!index.isValid())
+        return 0;
+    AddressTableEntry *rec = static_cast<AddressTableEntry*>(index.internalPointer());
+
+    Qt::ItemFlags retval = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
+    // Can edit address and label for sending addresses,
+    // and only label for receiving addresses.
+    if(rec->type == AddressTableEntry::Sending ||
+      (rec->type == AddressTableEntry::Receiving && index.column()==Label))
+    {
+        retval |= Qt::ItemIsEditable;
+    }
+    return retval;
+}
+
+QModelIndex AddressTableModel::index(int row, int column, const QModelIndex & parent) const
+{
+    Q_UNUSED(parent);
+    AddressTableEntry *data = priv->index(row);
+    if(data)
+    {
+        return createIndex(row, column, priv->index(row));
+    }
+    else
+    {
+        return QModelIndex();
+    }
+}
+
+void AddressTableModel::updateList()
+{
+    // Update address book model from Bitcoin core
+    beginResetModel();
+    priv->refreshAddressTable();
+    endResetModel();
+}
+
+QString AddressTableModel::addRow(const QString &type, const QString &label, const QString &address)
+{
+    std::string strLabel = label.toStdString();
+    std::string strAddress = address.toStdString();
+
+    editStatus = OK;
+
+    if(type == Send)
+    {
+        if(!walletModel->validateAddress(address))
+        {
+            editStatus = INVALID_ADDRESS;
+            return QString();
+        }
+        // Check for duplicate addresses
+        CRITICAL_BLOCK(wallet->cs_wallet)
+        {
+            if(wallet->mapAddressBook.count(strAddress))
+            {
+                editStatus = DUPLICATE_ADDRESS;
+                return QString();
+            }
+        }
+    }
+    else if(type == Receive)
+    {
+        // Generate a new address to associate with given label
+        WalletModel::UnlockContext ctx(walletModel->requestUnlock());
+        if(!ctx.isValid())
+        {
+            // Unlock wallet failed or was cancelled
+            editStatus = WALLET_UNLOCK_FAILURE;
+            return QString();
+        }
+        std::vector<unsigned char> newKey;
+        if(!wallet->GetKeyFromPool(newKey, true))
+        {
+            editStatus = KEY_GENERATION_FAILURE;
+            return QString();
+        }
+        strAddress = CBitcoinAddress(newKey).ToString();
+    }
+    else
+    {
+        return QString();
+    }
+    // Add entry and update list
+    CRITICAL_BLOCK(wallet->cs_wallet)
+        wallet->SetAddressBookName(strAddress, strLabel);
+    updateList();
+    return QString::fromStdString(strAddress);
+}
+
+bool AddressTableModel::removeRows(int row, int count, const QModelIndex & parent)
+{
+    Q_UNUSED(parent);
+    AddressTableEntry *rec = priv->index(row);
+    if(count != 1 || !rec || rec->type == AddressTableEntry::Receiving)
+    {
+        // Can only remove one row at a time, and cannot remove rows not in model.
+        // Also refuse to remove receiving addresses.
+        return false;
+    }
+    CRITICAL_BLOCK(wallet->cs_wallet)
+    {
+        wallet->DelAddressBookName(rec->address.toStdString());
+    }
+    updateList();
+    return true;
+}
+
+void AddressTableModel::update()
+{
+
+}
+
+/* Look up label for address in address book, if not found return empty string.
+ */
+QString AddressTableModel::labelForAddress(const QString &address) const
+{
+    CRITICAL_BLOCK(wallet->cs_wallet)
+    {
+        CBitcoinAddress address_parsed(address.toStdString());
+        std::map<CBitcoinAddress, std::string>::iterator mi = wallet->mapAddressBook.find(address_parsed);
+        if (mi != wallet->mapAddressBook.end())
+        {
+            return QString::fromStdString(mi->second);
+        }
+    }
+    return QString();
+}
+
+int AddressTableModel::lookupAddress(const QString &address) const
+{
+    QModelIndexList lst = match(index(0, Address, QModelIndex()),
+                                Qt::EditRole, address, 1, Qt::MatchExactly);
+    if(lst.isEmpty())
+    {
+        return -1;
+    }
+    else
+    {
+        return lst.at(0).row();
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/src/qt/addresstablemodel.h
@@ -0,0 +1,83 @@
+#ifndef ADDRESSTABLEMODEL_H
+#define ADDRESSTABLEMODEL_H
+
+#include <QAbstractTableModel>
+#include <QStringList>
+
+class AddressTablePriv;
+class CWallet;
+class WalletModel;
+
+class AddressTableModel : public QAbstractTableModel
+{
+    Q_OBJECT
+public:
+    explicit AddressTableModel(CWallet *wallet, WalletModel *parent = 0);
+    ~AddressTableModel();
+
+    enum ColumnIndex {
+        Label = 0,   /* User specified label */
+        Address = 1  /* Bitcoin address */
+    };
+
+    enum RoleIndex {
+        TypeRole = Qt::UserRole
+    };
+
+    // Return status of last edit/insert operation
+    enum EditStatus {
+        OK,
+        INVALID_ADDRESS,
+        DUPLICATE_ADDRESS,
+        WALLET_UNLOCK_FAILURE,
+        KEY_GENERATION_FAILURE
+    };
+
+    static const QString Send; /* Send addres */
+    static const QString Receive; /* Receive address */
+
+    /* Overridden methods from QAbstractTableModel */
+    int rowCount(const QModelIndex &parent) const;
+    int columnCount(const QModelIndex &parent) const;
+    QVariant data(const QModelIndex &index, int role) const;
+    bool setData(const QModelIndex & index, const QVariant & value, int role);
+    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+    QModelIndex index(int row, int column, const QModelIndex & parent) const;
+    bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex());
+    Qt::ItemFlags flags(const QModelIndex & index) const;
+
+    /* Add an address to the model.
+       Returns the added address on success, and an empty string otherwise.
+     */
+    QString addRow(const QString &type, const QString &label, const QString &address);
+
+    /* Update address list from core. Invalidates any indices.
+     */
+    void updateList();
+
+    /* Look up label for address in address book, if not found return empty string.
+     */
+    QString labelForAddress(const QString &address) const;
+
+    /* Look up row index of an address in the model.
+       Return -1 if not found.
+     */
+    int lookupAddress(const QString &address) const;
+
+    EditStatus getEditStatus() const { return editStatus; }
+
+private:
+    WalletModel *walletModel;
+    CWallet *wallet;
+    AddressTablePriv *priv;
+    QStringList columns;
+    EditStatus editStatus;
+
+signals:
+    void defaultAddressChanged(const QString &address);
+
+public slots:
+    void update();
+};
+
+#endif // ADDRESSTABLEMODEL_H
new file mode 100644
--- /dev/null
+++ b/src/qt/askpassphrasedialog.cpp
@@ -0,0 +1,186 @@
+#include "askpassphrasedialog.h"
+#include "ui_askpassphrasedialog.h"
+
+#include "guiconstants.h"
+#include "walletmodel.h"
+
+#include <QMessageBox>
+#include <QPushButton>
+
+AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::AskPassphraseDialog),
+    mode(mode),
+    model(0)
+{
+    ui->setupUi(this);
+    ui->passEdit1->setMaxLength(MAX_PASSPHRASE_SIZE);
+    ui->passEdit2->setMaxLength(MAX_PASSPHRASE_SIZE);
+    ui->passEdit3->setMaxLength(MAX_PASSPHRASE_SIZE);
+
+    switch(mode)
+    {
+        case Encrypt: // Ask passphrase x2
+            ui->passLabel1->hide();
+            ui->passEdit1->hide();
+            ui->warningLabel->setText(tr("Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>."));
+            setWindowTitle(tr("Encrypt wallet"));
+            break;
+        case Unlock: // Ask passphrase
+            ui->warningLabel->setText(tr("This operation needs your wallet passphrase to unlock the wallet."));
+            ui->passLabel2->hide();
+            ui->passEdit2->hide();
+            ui->passLabel3->hide();
+            ui->passEdit3->hide();
+            setWindowTitle(tr("Unlock wallet"));
+            break;
+        case Decrypt:   // Ask passphrase
+            ui->warningLabel->setText(tr("This operation needs your wallet passphrase to decrypt the wallet."));
+            ui->passLabel2->hide();
+            ui->passEdit2->hide();
+            ui->passLabel3->hide();
+            ui->passEdit3->hide();
+            setWindowTitle(tr("Decrypt wallet"));
+            break;
+        case ChangePass: // Ask old passphrase + new passphrase x2
+            setWindowTitle(tr("Change passphrase"));
+            ui->warningLabel->setText(tr("Enter the old and new passphrase to the wallet."));
+            break;
+    }
+    resize(minimumSize()); // Get rid of extra space in dialog
+
+    textChanged();
+    connect(ui->passEdit1, SIGNAL(textChanged(QString)), this, SLOT(textChanged()));
+    connect(ui->passEdit2, SIGNAL(textChanged(QString)), this, SLOT(textChanged()));
+    connect(ui->passEdit3, SIGNAL(textChanged(QString)), this, SLOT(textChanged()));
+}
+
+AskPassphraseDialog::~AskPassphraseDialog()
+{
+    // Attempt to overwrite text so that they do not linger around in memory
+    ui->passEdit1->setText(QString(" ").repeated(ui->passEdit1->text().size()));
+    ui->passEdit2->setText(QString(" ").repeated(ui->passEdit2->text().size()));
+    ui->passEdit3->setText(QString(" ").repeated(ui->passEdit3->text().size()));
+    delete ui;
+}
+
+void AskPassphraseDialog::setModel(WalletModel *model)
+{
+    this->model = model;
+}
+
+void AskPassphraseDialog::accept()
+{
+    std::string oldpass, newpass1, newpass2;
+    // TODO: mlock memory / munlock on return so they will not be swapped out, really need "mlockedstring" wrapper class to do this safely
+    oldpass.reserve(MAX_PASSPHRASE_SIZE);
+    newpass1.reserve(MAX_PASSPHRASE_SIZE);
+    newpass2.reserve(MAX_PASSPHRASE_SIZE);
+    oldpass.assign(ui->passEdit1->text().toStdString());
+    newpass1.assign(ui->passEdit2->text().toStdString());
+    newpass2.assign(ui->passEdit3->text().toStdString());
+
+    switch(mode)
+    {
+    case Encrypt: {
+        if(newpass1.empty() || newpass2.empty())
+        {
+            // Cannot encrypt with empty passphrase
+            break;
+        }
+        QMessageBox::StandardButton retval = QMessageBox::question(this, tr("Confirm wallet encryption"),
+                 tr("WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>!\nAre you sure you wish to encrypt your wallet?"),
+                 QMessageBox::Yes|QMessageBox::Cancel,
+                 QMessageBox::Cancel);
+        if(retval == QMessageBox::Yes)
+        {
+            if(newpass1 == newpass2)
+            {
+                if(model->setWalletEncrypted(true, newpass1))
+                {
+                    QMessageBox::warning(this, tr("Wallet encrypted"),
+                                         tr("Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer."));
+                }
+                else
+                {
+                    QMessageBox::critical(this, tr("Wallet encryption failed"),
+                                         tr("Wallet encryption failed due to an internal error. Your wallet was not encrypted."));
+                }
+                QDialog::accept(); // Success
+            }
+            else
+            {
+                QMessageBox::critical(this, tr("Wallet encryption failed"),
+                                     tr("The supplied passphrases do not match."));
+            }
+        }
+        else
+        {
+            QDialog::reject(); // Cancelled
+        }
+        } break;
+    case Unlock:
+        if(!model->setWalletLocked(false, oldpass))
+        {
+            QMessageBox::critical(this, tr("Wallet unlock failed"),
+                                  tr("The passphrase entered for the wallet decryption was incorrect."));
+        }
+        else
+        {
+            QDialog::accept(); // Success
+        }
+        break;
+    case Decrypt:
+        if(!model->setWalletEncrypted(false, oldpass))
+        {
+            QMessageBox::critical(this, tr("Wallet decryption failed"),
+                                  tr("The passphrase entered for the wallet decryption was incorrect."));
+        }
+        else
+        {
+            QDialog::accept(); // Success
+        }
+        break;
+    case ChangePass:
+        if(newpass1 == newpass2)
+        {
+            if(model->changePassphrase(oldpass, newpass1))
+            {
+                QMessageBox::information(this, tr("Wallet encrypted"),
+                                     tr("Wallet passphrase was succesfully changed."));
+                QDialog::accept(); // Success
+            }
+            else
+            {
+                QMessageBox::critical(this, tr("Wallet encryption failed"),
+                                     tr("The passphrase entered for the wallet decryption was incorrect."));
+            }
+        }
+        else
+        {
+            QMessageBox::critical(this, tr("Wallet encryption failed"),
+                                 tr("The supplied passphrases do not match."));
+        }
+        break;
+    }
+}
+
+void AskPassphraseDialog::textChanged()
+{
+    // Validate input, set Ok button to enabled when accepable
+    bool acceptable = false;
+    switch(mode)
+    {
+    case Encrypt: // New passphrase x2
+        acceptable = !ui->passEdit2->text().isEmpty() && !ui->passEdit3->text().isEmpty();
+        break;
+    case Unlock: // Old passphrase x1
+    case Decrypt:
+        acceptable = !ui->passEdit1->text().isEmpty();
+        break;
+    case ChangePass: // Old passphrase x1, new passphrase x2
+        acceptable = !ui->passEdit1->text().isEmpty() && !ui->passEdit2->text().isEmpty() && !ui->passEdit3->text().isEmpty();
+        break;
+    }
+    ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(acceptable);
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/askpassphrasedialog.h
@@ -0,0 +1,40 @@
+#ifndef ASKPASSPHRASEDIALOG_H
+#define ASKPASSPHRASEDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+    class AskPassphraseDialog;
+}
+
+class WalletModel;
+
+class AskPassphraseDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    enum Mode {
+        Encrypt,    // Ask passphrase x2
+        Unlock,     // Ask passphrase
+        ChangePass, // Ask old passphrase + new passphrase x2
+        Decrypt   // Ask passphrase
+    };
+
+    explicit AskPassphraseDialog(Mode mode, QWidget *parent = 0);
+    ~AskPassphraseDialog();
+
+    void accept();
+
+    void setModel(WalletModel *model);
+
+private:
+    Ui::AskPassphraseDialog *ui;
+    Mode mode;
+    WalletModel *model;
+
+private slots:
+    void textChanged();
+};
+
+#endif // ASKPASSPHRASEDIALOG_H
new file mode 100644
--- /dev/null
+++ b/src/qt/bitcoin.cpp
@@ -0,0 +1,170 @@
+/*
+ * W.J. van der Laan 2011
+ */
+#include "bitcoingui.h"
+#include "clientmodel.h"
+#include "walletmodel.h"
+#include "optionsmodel.h"
+
+#include "headers.h"
+#include "init.h"
+
+#include <QApplication>
+#include <QMessageBox>
+#include <QThread>
+#include <QTextCodec>
+#include <QLocale>
+#include <QTranslator>
+#include <QSplashScreen>
+
+// Need a global reference for the notifications to find the GUI
+BitcoinGUI *guiref;
+QSplashScreen *splashref;
+
+int MyMessageBox(const std::string& message, const std::string& caption, int style, wxWindow* parent, int x, int y)
+{
+    // Message from main thread
+    if(guiref)
+    {
+        guiref->error(QString::fromStdString(caption),
+                      QString::fromStdString(message));
+    }
+    else
+    {
+        QMessageBox::critical(0, QString::fromStdString(caption),
+            QString::fromStdString(message),
+            QMessageBox::Ok, QMessageBox::Ok);
+    }
+    return 4;
+}
+
+int ThreadSafeMessageBox(const std::string& message, const std::string& caption, int style, wxWindow* parent, int x, int y)
+{
+    // Message from network thread
+    if(guiref)
+    {
+        QMetaObject::invokeMethod(guiref, "error", Qt::QueuedConnection,
+                                   Q_ARG(QString, QString::fromStdString(caption)),
+                                   Q_ARG(QString, QString::fromStdString(message)));
+    }
+    else
+    {
+        printf("%s: %s\n", caption.c_str(), message.c_str());
+        fprintf(stderr, "%s: %s\n", caption.c_str(), message.c_str());
+    }
+    return 4;
+}
+
+bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption, wxWindow* parent)
+{
+    if(!guiref)
+        return false;
+    if(nFeeRequired < MIN_TX_FEE || nFeeRequired <= nTransactionFee || fDaemon)
+        return true;
+    bool payFee = false;
+
+    // Call slot on GUI thread.
+    // If called from another thread, use a blocking QueuedConnection.
+    Qt::ConnectionType connectionType = Qt::DirectConnection;
+    if(QThread::currentThread() != QCoreApplication::instance()->thread())
+    {
+        connectionType = Qt::BlockingQueuedConnection;
+    }
+
+    QMetaObject::invokeMethod(guiref, "askFee", connectionType,
+                               Q_ARG(qint64, nFeeRequired),
+                               Q_ARG(bool*, &payFee));
+
+    return payFee;
+}
+
+void CalledSetStatusBar(const std::string& strText, int nField)
+{
+    // Only used for built-in mining, which is disabled, simple ignore
+}
+
+void UIThreadCall(boost::function0<void> fn)
+{
+    // Only used for built-in mining, which is disabled, simple ignore
+}
+
+void MainFrameRepaint()
+{
+}
+
+void InitMessage(const std::string &message)
+{
+    if(splashref)
+    {
+        splashref->showMessage(QString::fromStdString(message), Qt::AlignBottom|Qt::AlignHCenter, QColor(255,255,200));
+        QApplication::instance()->processEvents();
+    }
+}
+
+/*
+   Translate string to current locale using Qt.
+ */
+std::string _(const char* psz)
+{
+    return QCoreApplication::translate("bitcoin-core", psz).toStdString();
+}
+
+int main(int argc, char *argv[])
+{
+    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
+    QTextCodec::setCodecForCStrings(QTextCodec::codecForTr());
+
+    Q_INIT_RESOURCE(bitcoin);
+    QApplication app(argc, argv);
+
+    // Load language file for system locale
+    QString locale = QLocale::system().name();
+    QTranslator translator;
+    translator.load("bitcoin_"+locale);
+    app.installTranslator(&translator);
+
+    QSplashScreen splash(QPixmap(":/images/splash"), 0);
+    splash.show();
+    splash.setAutoFillBackground(true);
+    splashref = &splash;
+
+    app.processEvents();
+
+    app.setQuitOnLastWindowClosed(false);
+
+    try
+    {
+        if(AppInit2(argc, argv))
+        {
+            {
+                // Put this in a block, so that BitcoinGUI is cleaned up properly before
+                // calling Shutdown().
+                BitcoinGUI window;
+                splash.finish(&window);
+                OptionsModel optionsModel(pwalletMain);
+                ClientModel clientModel(&optionsModel);
+                WalletModel walletModel(pwalletMain, &optionsModel);
+
+                guiref = &window;
+                window.setClientModel(&clientModel);
+                window.setWalletModel(&walletModel);
+
+                window.show();
+
+                app.exec();
+
+                guiref = 0;
+            }
+            Shutdown(NULL);
+        }
+        else
+        {
+            return 1;
+        }
+    } catch (std::exception& e) {
+        PrintException(&e, "Runaway exception");
+    } catch (...) {
+        PrintException(NULL, "Runaway exception");
+    }
+    return 0;
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/bitcoin.qrc
@@ -0,0 +1,48 @@
+<RCC>
+    <qresource prefix="/icons" lang="edit">
+        <file alias="bitcoin">res/icons/bitcoin.png</file>
+        <file alias="address-book">res/icons/address-book.png</file>
+        <file alias="quit">res/icons/quit.png</file>
+        <file alias="send">res/icons/send.png</file>
+        <file alias="toolbar">res/icons/toolbar.png</file>
+        <file alias="connect_0">res/icons/connect0_16.png</file>
+        <file alias="connect_1">res/icons/connect1_16.png</file>
+        <file alias="connect_2">res/icons/connect2_16.png</file>
+        <file alias="connect_3">res/icons/connect3_16.png</file>
+        <file alias="connect_4">res/icons/connect4_16.png</file>
+        <file alias="transaction_0">res/icons/transaction0.png</file>
+        <file alias="transaction_confirmed">res/icons/transaction2.png</file>
+        <file alias="transaction_1">res/icons/clock1.png</file>
+        <file alias="transaction_2">res/icons/clock2.png</file>
+        <file alias="transaction_3">res/icons/clock3.png</file>
+        <file alias="transaction_4">res/icons/clock4.png</file>
+        <file alias="transaction_5">res/icons/clock5.png</file>
+        <file alias="options">res/icons/configure.png</file>
+        <file alias="receiving_addresses">res/icons/receive.png</file>
+        <file alias="editpaste">res/icons/editpaste.png</file>
+        <file alias="editcopy">res/icons/editcopy.png</file>
+        <file alias="add">res/icons/add.png</file>
+        <file alias="bitcoin_testnet">res/icons/bitcoin_testnet.png</file>
+        <file alias="toolbar_testnet">res/icons/toolbar_testnet.png</file>
+        <file alias="edit">res/icons/edit.png</file>
+        <file alias="history">res/icons/history.png</file>
+        <file alias="overview">res/icons/overview.png</file>
+        <file alias="export">res/icons/export.png</file>
+        <file alias="synced">res/icons/synced.png</file>
+        <file alias="remove">res/icons/remove.png</file>
+        <file alias="tx_mined">res/icons/tx_mined.png</file>
+        <file alias="tx_input">res/icons/tx_input.png</file>
+        <file alias="tx_output">res/icons/tx_output.png</file>
+        <file alias="tx_inout">res/icons/tx_inout.png</file>
+        <file alias="lock_closed">res/icons/lock_closed.png</file>
+        <file alias="lock_open">res/icons/lock_open.png</file>
+        <file alias="key">res/icons/key.png</file>
+    </qresource>
+    <qresource prefix="/images">
+        <file alias="about">res/images/about.png</file>
+        <file alias="splash">res/images/splash2.jpg</file>
+    </qresource>
+    <qresource prefix="/movies">
+        <file alias="update_spinner">res/movies/update_spinner.mng</file>
+    </qresource>
+</RCC>
new file mode 100644
--- /dev/null
+++ b/src/qt/bitcoinaddressvalidator.cpp
@@ -0,0 +1,67 @@
+#include "bitcoinaddressvalidator.h"
+
+/* Base58 characters are:
+     "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
+
+  This is:
+  - All numbers except for '0'
+  - All uppercase letters except for 'I' and 'O'
+  - All lowercase letters except for 'l'
+
+  User friendly Base58 input can map
+  - 'l' and 'I' to '1'
+  - '0' and 'O' to 'o'
+*/
+
+BitcoinAddressValidator::BitcoinAddressValidator(QObject *parent) :
+    QValidator(parent)
+{
+}
+
+QValidator::State BitcoinAddressValidator::validate(QString &input, int &pos) const
+{
+    // Correction
+    for(int idx=0; idx<input.size(); ++idx)
+    {
+        switch(input.at(idx).unicode())
+        {
+        case 'l':
+        case 'I':
+            input[idx] = QChar('1');
+            break;
+        case '0':
+        case 'O':
+            input[idx] = QChar('o');
+            break;
+        default:
+            break;
+        }
+    }
+
+    // Validation
+    QValidator::State state = QValidator::Acceptable;
+    for(int idx=0; idx<input.size(); ++idx)
+    {
+        int ch = input.at(idx).unicode();
+
+        if(((ch >= '0' && ch<='9') ||
+           (ch >= 'a' && ch<='z') ||
+           (ch >= 'A' && ch<='Z')) &&
+           ch != 'l' && ch != 'I' && ch != '0' && ch != 'O')
+        {
+            // Alphanumeric and not a 'forbidden' character
+        }
+        else
+        {
+            state = QValidator::Invalid;
+        }
+    }
+
+    // Empty address is "intermediate" input
+    if(input.isEmpty())
+    {
+        state = QValidator::Intermediate;
+    }
+
+    return state;
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/bitcoinaddressvalidator.h
@@ -0,0 +1,24 @@
+#ifndef BITCOINADDRESSVALIDATOR_H
+#define BITCOINADDRESSVALIDATOR_H
+
+#include <QRegExpValidator>
+
+/* Base48 entry widget validator.
+   Corrects near-miss characters and refuses characters that are no part of base48.
+ */
+class BitcoinAddressValidator : public QValidator
+{
+    Q_OBJECT
+public:
+    explicit BitcoinAddressValidator(QObject *parent = 0);
+
+    State validate(QString &input, int &pos) const;
+
+    static const int MaxAddressLength = 34;
+signals:
+
+public slots:
+
+};
+
+#endif // BITCOINADDRESSVALIDATOR_H
new file mode 100644
--- /dev/null
+++ b/src/qt/bitcoinamountfield.cpp
@@ -0,0 +1,178 @@
+#include "bitcoinamountfield.h"
+#include "qvalidatedlineedit.h"
+#include "qvaluecombobox.h"
+#include "bitcoinunits.h"
+
+#include <QLabel>
+#include <QLineEdit>
+#include <QRegExpValidator>
+#include <QHBoxLayout>
+#include <QKeyEvent>
+#include <QComboBox>
+
+BitcoinAmountField::BitcoinAmountField(QWidget *parent):
+        QWidget(parent), amount(0), decimals(0), currentUnit(-1)
+{
+    amount = new QValidatedLineEdit(this);
+    amount->setValidator(new QRegExpValidator(QRegExp("[0-9]*"), this));
+    amount->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
+    amount->installEventFilter(this);
+    amount->setMaximumWidth(75);
+    decimals = new QValidatedLineEdit(this);
+    decimals->setValidator(new QRegExpValidator(QRegExp("[0-9]+"), this));
+    decimals->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
+    decimals->setMaximumWidth(75);
+
+    QHBoxLayout *layout = new QHBoxLayout(this);
+    layout->setSpacing(0);
+    layout->addWidget(amount);
+    layout->addWidget(new QLabel(QString("<b>.</b>")));
+    layout->addWidget(decimals);
+    unit = new QValueComboBox(this);
+    unit->setModel(new BitcoinUnits(this));
+    layout->addWidget(unit);
+    layout->addStretch(1);
+    layout->setContentsMargins(0,0,0,0);
+
+    setLayout(layout);
+
+    setFocusPolicy(Qt::TabFocus);
+    setFocusProxy(amount);
+
+    // If one if the widgets changes, the combined content changes as well
+    connect(amount, SIGNAL(textChanged(QString)), this, SIGNAL(textChanged()));
+    connect(decimals, SIGNAL(textChanged(QString)), this, SIGNAL(textChanged()));
+    connect(unit, SIGNAL(currentIndexChanged(int)), this, SLOT(unitChanged(int)));
+
+    // Set default based on configuration
+    unitChanged(unit->currentIndex());
+}
+
+void BitcoinAmountField::setText(const QString &text)
+{
+    const QStringList parts = text.split(QString("."));
+    if(parts.size() == 2)
+    {
+        amount->setText(parts[0]);
+        decimals->setText(parts[1]);
+    }
+    else
+    {
+        amount->setText(QString());
+        decimals->setText(QString());
+    }
+}
+
+void BitcoinAmountField::clear()
+{
+    amount->clear();
+    decimals->clear();
+    unit->setCurrentIndex(0);
+}
+
+bool BitcoinAmountField::validate()
+{
+    bool valid = true;
+    if(decimals->text().isEmpty())
+    {
+        decimals->setValid(false);
+        valid = false;
+    }
+    if(!BitcoinUnits::parse(currentUnit, text(), 0))
+    {
+        setValid(false);
+        valid = false;
+    }
+
+    return valid;
+}
+
+void BitcoinAmountField::setValid(bool valid)
+{
+    amount->setValid(valid);
+    decimals->setValid(valid);
+}
+
+QString BitcoinAmountField::text() const
+{
+    if(decimals->text().isEmpty() && amount->text().isEmpty())
+    {
+        return QString();
+    }
+    return amount->text() + QString(".") + decimals->text();
+}
+
+// Intercept '.' and ',' keys, if pressed focus a specified widget
+bool BitcoinAmountField::eventFilter(QObject *object, QEvent *event)
+{
+    Q_UNUSED(object);
+    if(event->type() == QEvent::KeyPress)
+    {
+        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
+        if(keyEvent->key() == Qt::Key_Period || keyEvent->key() == Qt::Key_Comma)
+        {
+            decimals->setFocus();
+            decimals->selectAll();
+        }
+    }
+    return false;
+}
+
+QWidget *BitcoinAmountField::setupTabChain(QWidget *prev)
+{
+    QWidget::setTabOrder(prev, amount);
+    QWidget::setTabOrder(amount, decimals);
+    return decimals;
+}
+
+qint64 BitcoinAmountField::value(bool *valid_out) const
+{
+    qint64 val_out = 0;
+    bool valid = BitcoinUnits::parse(currentUnit, text(), &val_out);
+    if(valid_out)
+    {
+        *valid_out = valid;
+    }
+    return val_out;
+}
+
+void BitcoinAmountField::setValue(qint64 value)
+{
+    setText(BitcoinUnits::format(currentUnit, value));
+}
+
+void BitcoinAmountField::unitChanged(int idx)
+{
+    // Use description tooltip for current unit for the combobox
+    unit->setToolTip(unit->itemData(idx, Qt::ToolTipRole).toString());
+
+    // Determine new unit ID
+    int newUnit = unit->itemData(idx, BitcoinUnits::UnitRole).toInt();
+
+    // Parse current value and convert to new unit
+    bool valid = false;
+    qint64 currentValue = value(&valid);
+
+    currentUnit = newUnit;
+
+    // Set max length after retrieving the value, to prevent truncation
+    amount->setMaxLength(BitcoinUnits::amountDigits(currentUnit));
+    decimals->setMaxLength(BitcoinUnits::decimals(currentUnit));
+
+    if(valid)
+    {
+        // If value was valid, re-place it in the widget with the new unit
+        setValue(currentValue);
+    }
+    else
+    {
+        // If current value is invalid, just clear field
+        setText("");
+    }
+    setValid(true);
+}
+
+void BitcoinAmountField::setDisplayUnit(int newUnit)
+{
+    unit->setValue(newUnit);
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/bitcoinamountfield.h
@@ -0,0 +1,59 @@
+#ifndef BITCOINFIELD_H
+#define BITCOINFIELD_H
+
+#include <QWidget>
+
+QT_BEGIN_NAMESPACE
+class QValidatedLineEdit;
+class QValueComboBox;
+QT_END_NAMESPACE
+
+// Coin amount entry widget with separate parts for whole
+// coins and decimals.
+class BitcoinAmountField: public QWidget
+{
+    Q_OBJECT
+    Q_PROPERTY(qint64 value READ value WRITE setValue NOTIFY textChanged USER true);
+public:
+    explicit BitcoinAmountField(QWidget *parent = 0);
+
+    qint64 value(bool *valid=0) const;
+    void setValue(qint64 value);
+
+    // Mark current valid as invalid in UI
+    void setValid(bool valid);
+    bool validate();
+
+    // Change current unit
+    void setDisplayUnit(int unit);
+
+    // Make field empty and ready for new input
+    void clear();
+
+    // Qt messes up the tab chain by default in some cases (issue http://bugreports.qt.nokia.com/browse/QTBUG-10907)
+    // Hence we have to set it up manually
+    QWidget *setupTabChain(QWidget *prev);
+
+signals:
+    void textChanged();
+
+protected:
+    // Intercept '.' and ',' keys, if pressed focus a specified widget
+    bool eventFilter(QObject *object, QEvent *event);
+
+private:
+    QValidatedLineEdit *amount;
+    QValidatedLineEdit *decimals;
+    QValueComboBox *unit;
+    int currentUnit;
+
+    void setText(const QString &text);
+    QString text() const;
+
+private slots:
+    void unitChanged(int idx);
+
+};
+
+
+#endif // BITCOINFIELD_H
new file mode 100644
--- /dev/null
+++ b/src/qt/bitcoingui.cpp
@@ -0,0 +1,613 @@
+/*
+ * Qt4 bitcoin GUI.
+ *
+ * W.J. van der Laan 2011
+ */
+#include "bitcoingui.h"
+#include "transactiontablemodel.h"
+#include "addressbookpage.h"
+#include "sendcoinsdialog.h"
+#include "optionsdialog.h"
+#include "aboutdialog.h"
+#include "clientmodel.h"
+#include "walletmodel.h"
+#include "editaddressdialog.h"
+#include "optionsmodel.h"
+#include "transactiondescdialog.h"
+#include "addresstablemodel.h"
+#include "transactionview.h"
+#include "overviewpage.h"
+#include "bitcoinunits.h"
+#include "guiconstants.h"
+#include "askpassphrasedialog.h"
+#include "notificator.h"
+
+#include <QApplication>
+#include <QMainWindow>
+#include <QMenuBar>
+#include <QMenu>
+#include <QIcon>
+#include <QTabWidget>
+#include <QVBoxLayout>
+#include <QToolBar>
+#include <QStatusBar>
+#include <QLabel>
+#include <QLineEdit>
+#include <QPushButton>
+#include <QLocale>
+#include <QMessageBox>
+#include <QProgressBar>
+#include <QStackedWidget>
+#include <QDateTime>
+#include <QMovie>
+
+#include <QDragEnterEvent>
+#include <QUrl>
+
+#include <iostream>
+
+BitcoinGUI::BitcoinGUI(QWidget *parent):
+    QMainWindow(parent),
+    clientModel(0),
+    walletModel(0),
+    encryptWalletAction(0),
+    changePassphraseAction(0),
+    trayIcon(0),
+    notificator(0)
+{
+    resize(850, 550);
+    setWindowTitle(tr("Bitcoin Wallet"));
+    setWindowIcon(QIcon(":icons/bitcoin"));
+    // Accept D&D of URIs
+    setAcceptDrops(true);
+
+    createActions();
+
+    // Menus
+    QMenu *file = menuBar()->addMenu(tr("&File"));
+    file->addAction(sendCoinsAction);
+    file->addAction(receiveCoinsAction);
+    file->addSeparator();
+    file->addAction(quitAction);
+    
+    QMenu *settings = menuBar()->addMenu(tr("&Settings"));
+    settings->addAction(encryptWalletAction);
+    settings->addAction(changePassphraseAction);
+    settings->addSeparator();
+    settings->addAction(optionsAction);
+
+    QMenu *help = menuBar()->addMenu(tr("&Help"));
+    help->addAction(aboutAction);
+    
+    // Toolbars
+    QToolBar *toolbar = addToolBar(tr("Tabs toolbar"));
+    toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    toolbar->addAction(overviewAction);
+    toolbar->addAction(sendCoinsAction);
+    toolbar->addAction(receiveCoinsAction);
+    toolbar->addAction(historyAction);
+    toolbar->addAction(addressBookAction);
+
+    QToolBar *toolbar2 = addToolBar(tr("Actions toolbar"));
+    toolbar2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    toolbar2->addAction(exportAction);
+
+    // Create tabs
+    overviewPage = new OverviewPage();
+
+    transactionsPage = new QWidget(this);
+    QVBoxLayout *vbox = new QVBoxLayout();
+    transactionView = new TransactionView(this);
+    vbox->addWidget(transactionView);
+    transactionsPage->setLayout(vbox);
+
+    addressBookPage = new AddressBookPage(AddressBookPage::ForEditing, AddressBookPage::SendingTab);
+
+    receiveCoinsPage = new AddressBookPage(AddressBookPage::ForEditing, AddressBookPage::ReceivingTab);
+
+    sendCoinsPage = new SendCoinsDialog(this);
+
+    centralWidget = new QStackedWidget(this);
+    centralWidget->addWidget(overviewPage);
+    centralWidget->addWidget(transactionsPage);
+    centralWidget->addWidget(addressBookPage);
+    centralWidget->addWidget(receiveCoinsPage);
+    centralWidget->addWidget(sendCoinsPage);
+    setCentralWidget(centralWidget);
+
+    // Create status bar
+    statusBar();
+
+    // Status bar notification icons
+    QFrame *frameBlocks = new QFrame();
+    //frameBlocks->setFrameStyle(QFrame::Panel | QFrame::Sunken);
+    frameBlocks->setContentsMargins(0,0,0,0);
+    frameBlocks->setMinimumWidth(56);
+    frameBlocks->setMaximumWidth(56);
+    QHBoxLayout *frameBlocksLayout = new QHBoxLayout(frameBlocks);
+    frameBlocksLayout->setContentsMargins(3,0,3,0);
+    frameBlocksLayout->setSpacing(3);
+    labelEncryptionIcon = new QLabel();
+    labelConnectionsIcon = new QLabel();
+    labelBlocksIcon = new QLabel();
+    frameBlocksLayout->addStretch();
+    frameBlocksLayout->addWidget(labelEncryptionIcon);
+    frameBlocksLayout->addStretch();
+    frameBlocksLayout->addWidget(labelConnectionsIcon);
+    frameBlocksLayout->addStretch();
+    frameBlocksLayout->addWidget(labelBlocksIcon);
+    frameBlocksLayout->addStretch();
+
+    // Progress bar for blocks download
+    progressBarLabel = new QLabel(tr("Synchronizing with network..."));
+    progressBarLabel->setVisible(false);
+    progressBar = new QProgressBar();
+    progressBar->setToolTip(tr("Block chain synchronization in progress"));
+    progressBar->setVisible(false);
+
+    statusBar()->addWidget(progressBarLabel);
+    statusBar()->addWidget(progressBar);
+    statusBar()->addPermanentWidget(frameBlocks);
+
+    createTrayIcon();
+
+    syncIconMovie = new QMovie(":/movies/update_spinner", "mng", this);
+
+    // Clicking on a transaction on the overview page simply sends you to transaction history page
+    connect(overviewPage, SIGNAL(transactionClicked(QModelIndex)), this, SLOT(gotoHistoryPage()));
+
+    // Doubleclicking on a transaction on the transaction history page shows details
+    connect(transactionView, SIGNAL(doubleClicked(QModelIndex)), transactionView, SLOT(showDetails()));
+
+    gotoOverviewPage();
+}
+
+void BitcoinGUI::createActions()
+{
+    QActionGroup *tabGroup = new QActionGroup(this);
+
+    overviewAction = new QAction(QIcon(":/icons/overview"), tr("&Overview"), this);
+    overviewAction->setToolTip(tr("Show general overview of wallet"));
+    overviewAction->setCheckable(true);
+    tabGroup->addAction(overviewAction);
+
+    historyAction = new QAction(QIcon(":/icons/history"), tr("&Transactions"), this);
+    historyAction->setToolTip(tr("Browse transaction history"));
+    historyAction->setCheckable(true);
+    tabGroup->addAction(historyAction);
+
+    addressBookAction = new QAction(QIcon(":/icons/address-book"), tr("&Address Book"), this);
+    addressBookAction->setToolTip(tr("Edit the list of stored addresses and labels"));
+    addressBookAction->setCheckable(true);
+    tabGroup->addAction(addressBookAction);
+
+    receiveCoinsAction = new QAction(QIcon(":/icons/receiving_addresses"), tr("&Receive coins"), this);
+    receiveCoinsAction->setToolTip(tr("Show the list of addresses for receiving payments"));
+    receiveCoinsAction->setCheckable(true);
+    tabGroup->addAction(receiveCoinsAction);
+
+    sendCoinsAction = new QAction(QIcon(":/icons/send"), tr("&Send coins"), this);
+    sendCoinsAction->setToolTip(tr("Send coins to a bitcoin address"));
+    sendCoinsAction->setCheckable(true);
+    tabGroup->addAction(sendCoinsAction);
+
+    connect(overviewAction, SIGNAL(triggered()), this, SLOT(gotoOverviewPage()));
+    connect(historyAction, SIGNAL(triggered()), this, SLOT(gotoHistoryPage()));
+    connect(addressBookAction, SIGNAL(triggered()), this, SLOT(gotoAddressBookPage()));
+    connect(receiveCoinsAction, SIGNAL(triggered()), this, SLOT(gotoReceiveCoinsPage()));
+    connect(sendCoinsAction, SIGNAL(triggered()), this, SLOT(gotoSendCoinsPage()));
+
+    quitAction = new QAction(QIcon(":/icons/quit"), tr("&Exit"), this);
+    quitAction->setToolTip(tr("Quit application"));
+    aboutAction = new QAction(QIcon(":/icons/bitcoin"), tr("&About"), this);
+    aboutAction->setToolTip(tr("Show information about Bitcoin"));
+    optionsAction = new QAction(QIcon(":/icons/options"), tr("&Options..."), this);
+    optionsAction->setToolTip(tr("Modify configuration options for bitcoin"));
+    openBitcoinAction = new QAction(QIcon(":/icons/bitcoin"), tr("Open &Bitcoin"), this);
+    openBitcoinAction->setToolTip(tr("Show the Bitcoin window"));
+    exportAction = new QAction(QIcon(":/icons/export"), tr("&Export..."), this);
+    exportAction->setToolTip(tr("Export the current view to a file"));
+    encryptWalletAction = new QAction(QIcon(":/icons/lock_closed"), tr("&Encrypt Wallet"), this);
+    encryptWalletAction->setToolTip(tr("Encrypt or decrypt wallet"));
+    encryptWalletAction->setCheckable(true);
+    changePassphraseAction = new QAction(QIcon(":/icons/key"), tr("&Change Passphrase"), this);
+    changePassphraseAction->setToolTip(tr("Change the passphrase used for wallet encryption"));
+
+    connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
+    connect(optionsAction, SIGNAL(triggered()), this, SLOT(optionsClicked()));
+    connect(aboutAction, SIGNAL(triggered()), this, SLOT(aboutClicked()));
+    connect(openBitcoinAction, SIGNAL(triggered()), this, SLOT(showNormal()));
+    connect(encryptWalletAction, SIGNAL(triggered(bool)), this, SLOT(encryptWallet(bool)));
+    connect(changePassphraseAction, SIGNAL(triggered()), this, SLOT(changePassphrase()));
+}
+
+void BitcoinGUI::setClientModel(ClientModel *clientModel)
+{
+    this->clientModel = clientModel;
+
+    if(clientModel->isTestNet())
+    {
+        QString title_testnet = windowTitle() + QString(" ") + tr("[testnet]");
+        setWindowTitle(title_testnet);
+        setWindowIcon(QIcon(":icons/bitcoin_testnet"));
+        if(trayIcon)
+        {
+            trayIcon->setToolTip(title_testnet);
+            trayIcon->setIcon(QIcon(":/icons/toolbar_testnet"));
+        }
+    }
+
+    // Keep up to date with client
+    setNumConnections(clientModel->getNumConnections());
+    connect(clientModel, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int)));
+
+    setNumBlocks(clientModel->getNumBlocks());
+    connect(clientModel, SIGNAL(numBlocksChanged(int)), this, SLOT(setNumBlocks(int)));
+
+    // Report errors from network/worker thread
+    connect(clientModel, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString)));
+}
+
+void BitcoinGUI::setWalletModel(WalletModel *walletModel)
+{
+    this->walletModel = walletModel;
+
+    // Report errors from wallet thread
+    connect(walletModel, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString)));
+
+    // Put transaction list in tabs
+    transactionView->setModel(walletModel);
+
+    overviewPage->setModel(walletModel);
+    addressBookPage->setModel(walletModel->getAddressTableModel());
+    receiveCoinsPage->setModel(walletModel->getAddressTableModel());
+    sendCoinsPage->setModel(walletModel);
+
+    setEncryptionStatus(walletModel->getEncryptionStatus());
+    connect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SLOT(setEncryptionStatus(int)));
+
+    // Balloon popup for new transaction
+    connect(walletModel->getTransactionTableModel(), SIGNAL(rowsInserted(QModelIndex,int,int)),
+            this, SLOT(incomingTransaction(QModelIndex,int,int)));
+
+    // Ask for passphrase if needed
+    connect(walletModel, SIGNAL(requireUnlock()), this, SLOT(unlockWallet()));
+}
+
+void BitcoinGUI::createTrayIcon()
+{
+    QMenu *trayIconMenu = new QMenu(this);
+    trayIconMenu->addAction(openBitcoinAction);
+    trayIconMenu->addAction(optionsAction);
+    trayIconMenu->addSeparator();
+    trayIconMenu->addAction(quitAction);
+
+    trayIcon = new QSystemTrayIcon(this);
+    trayIcon->setContextMenu(trayIconMenu);
+    trayIcon->setToolTip("Bitcoin client");
+    trayIcon->setIcon(QIcon(":/icons/toolbar"));
+    connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
+            this, SLOT(trayIconActivated(QSystemTrayIcon::ActivationReason)));
+    trayIcon->show();
+
+    notificator = new Notificator(tr("bitcoin-qt"), trayIcon);
+}
+
+void BitcoinGUI::trayIconActivated(QSystemTrayIcon::ActivationReason reason)
+{
+    if(reason == QSystemTrayIcon::Trigger)
+    {
+        // Click on system tray icon triggers "open bitcoin"
+        openBitcoinAction->trigger();
+    }
+
+}
+
+void BitcoinGUI::optionsClicked()
+{
+    OptionsDialog dlg;
+    dlg.setModel(clientModel->getOptionsModel());
+    dlg.exec();
+}
+
+void BitcoinGUI::aboutClicked()
+{
+    AboutDialog dlg;
+    dlg.setModel(clientModel);
+    dlg.exec();
+}
+
+void BitcoinGUI::setNumConnections(int count)
+{
+    QString icon;
+    switch(count)
+    {
+    case 0: icon = ":/icons/connect_0"; break;
+    case 1: case 2: case 3: icon = ":/icons/connect_1"; break;
+    case 4: case 5: case 6: icon = ":/icons/connect_2"; break;
+    case 7: case 8: case 9: icon = ":/icons/connect_3"; break;
+    default: icon = ":/icons/connect_4"; break;
+    }
+    labelConnectionsIcon->setPixmap(QIcon(icon).pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
+    labelConnectionsIcon->setToolTip(tr("%n active connection(s) to Bitcoin network", "", count));
+}
+
+void BitcoinGUI::setNumBlocks(int count)
+{
+    int initTotal = clientModel->getNumBlocksAtStartup();
+    int total = clientModel->getNumBlocksOfPeers();
+    QString tooltip;
+
+    if(count < total)
+    {
+        progressBarLabel->setVisible(true);
+        progressBar->setVisible(true);
+        progressBar->setMaximum(total - initTotal);
+        progressBar->setValue(count - initTotal);
+        tooltip = tr("Downloaded %1 of %2 blocks of transaction history.").arg(count).arg(total);
+    }
+    else
+    {
+        progressBarLabel->setVisible(false);
+        progressBar->setVisible(false);
+        tooltip = tr("Downloaded %1 blocks of transaction history.").arg(count);
+    }
+
+    QDateTime now = QDateTime::currentDateTime();
+    QDateTime lastBlockDate = clientModel->getLastBlockDate();
+    int secs = lastBlockDate.secsTo(now);
+    QString text;
+
+    // Represent time from last generated block in human readable text
+    if(secs < 60)
+    {
+        text = tr("%n second(s) ago","",secs);
+    }
+    else if(secs < 60*60)
+    {
+        text = tr("%n minute(s) ago","",secs/60);
+    }
+    else if(secs < 24*60*60)
+    {
+        text = tr("%n hour(s) ago","",secs/(60*60));
+    }
+    else
+    {
+        text = tr("%n day(s) ago","",secs/(60*60*24));
+    }
+
+    // Set icon state: spinning if catching up, tick otherwise
+    if(secs < 30*60)
+    {
+        tooltip = tr("Up to date") + QString("\n") + tooltip;
+        labelBlocksIcon->setPixmap(QIcon(":/icons/synced").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
+    }
+    else
+    {
+        tooltip = tr("Catching up...") + QString("\n") + tooltip;
+        labelBlocksIcon->setMovie(syncIconMovie);
+        syncIconMovie->start();
+    }
+
+    tooltip += QString("\n");
+    tooltip += tr("Last received block was generated %1.").arg(text);
+
+    labelBlocksIcon->setToolTip(tooltip);
+    progressBarLabel->setToolTip(tooltip);
+    progressBar->setToolTip(tooltip);
+}
+
+void BitcoinGUI::error(const QString &title, const QString &message)
+{
+    // Report errors from network/worker thread
+    notificator->notify(Notificator::Critical, title, message);
+}
+
+void BitcoinGUI::changeEvent(QEvent *e)
+{
+    if (e->type() == QEvent::WindowStateChange)
+    {
+        if(clientModel->getOptionsModel()->getMinimizeToTray())
+        {
+            if (isMinimized())
+            {
+                hide();
+                e->ignore();
+            }
+            else
+            {
+                show();
+                e->accept();
+            }
+        }
+    }
+    QMainWindow::changeEvent(e);
+}
+
+void BitcoinGUI::closeEvent(QCloseEvent *event)
+{
+    if(!clientModel->getOptionsModel()->getMinimizeToTray() &&
+       !clientModel->getOptionsModel()->getMinimizeOnClose())
+    {
+        qApp->quit();
+    }
+    QMainWindow::closeEvent(event);
+}
+
+void BitcoinGUI::askFee(qint64 nFeeRequired, bool *payFee)
+{
+    QString strMessage =
+        tr("This transaction is over the size limit.  You can still send it for a fee of %1, "
+          "which goes to the nodes that process your transaction and helps to support the network.  "
+          "Do you want to pay the fee?").arg(
+                BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nFeeRequired));
+    QMessageBox::StandardButton retval = QMessageBox::question(
+          this, tr("Sending..."), strMessage,
+          QMessageBox::Yes|QMessageBox::Cancel, QMessageBox::Yes);
+    *payFee = (retval == QMessageBox::Yes);
+}
+
+void BitcoinGUI::incomingTransaction(const QModelIndex & parent, int start, int end)
+{
+    TransactionTableModel *ttm = walletModel->getTransactionTableModel();
+    qint64 amount = ttm->index(start, TransactionTableModel::Amount, parent)
+                    .data(Qt::EditRole).toULongLong();
+    if(!clientModel->inInitialBlockDownload())
+    {
+        // On new transaction, make an info balloon
+        // Unless the initial block download is in progress, to prevent balloon-spam
+        QString date = ttm->index(start, TransactionTableModel::Date, parent)
+                        .data().toString();
+        QString type = ttm->index(start, TransactionTableModel::Type, parent)
+                        .data().toString();
+        QString address = ttm->index(start, TransactionTableModel::ToAddress, parent)
+                        .data().toString();
+        QIcon icon = qvariant_cast<QIcon>(ttm->index(start,
+                            TransactionTableModel::ToAddress, parent)
+                        .data(Qt::DecorationRole));
+
+        notificator->notify(Notificator::Information,
+                            (amount)<0 ? tr("Sent transaction") :
+                                         tr("Incoming transaction"),
+                              tr("Date: %1\n"
+                                 "Amount: %2\n"
+                                 "Type: %3\n"
+                                 "Address: %4\n")
+                              .arg(date)
+                              .arg(BitcoinUnits::formatWithUnit(walletModel->getOptionsModel()->getDisplayUnit(), amount, true))
+                              .arg(type)
+                              .arg(address), icon);
+    }
+}
+
+void BitcoinGUI::gotoOverviewPage()
+{
+    overviewAction->setChecked(true);
+    centralWidget->setCurrentWidget(overviewPage);
+
+    exportAction->setEnabled(false);
+    disconnect(exportAction, SIGNAL(triggered()), 0, 0);
+}
+
+void BitcoinGUI::gotoHistoryPage()
+{
+    historyAction->setChecked(true);
+    centralWidget->setCurrentWidget(transactionsPage);
+
+    exportAction->setEnabled(true);
+    disconnect(exportAction, SIGNAL(triggered()), 0, 0);
+    connect(exportAction, SIGNAL(triggered()), transactionView, SLOT(exportClicked()));
+}
+
+void BitcoinGUI::gotoAddressBookPage()
+{
+    addressBookAction->setChecked(true);
+    centralWidget->setCurrentWidget(addressBookPage);
+
+    exportAction->setEnabled(true);
+    disconnect(exportAction, SIGNAL(triggered()), 0, 0);
+    connect(exportAction, SIGNAL(triggered()), addressBookPage, SLOT(exportClicked()));
+}
+
+void BitcoinGUI::gotoReceiveCoinsPage()
+{
+    receiveCoinsAction->setChecked(true);
+    centralWidget->setCurrentWidget(receiveCoinsPage);
+
+    exportAction->setEnabled(true);
+    disconnect(exportAction, SIGNAL(triggered()), 0, 0);
+    connect(exportAction, SIGNAL(triggered()), receiveCoinsPage, SLOT(exportClicked()));
+}
+
+void BitcoinGUI::gotoSendCoinsPage()
+{
+    sendCoinsAction->setChecked(true);
+    if(centralWidget->currentWidget() != sendCoinsPage)
+    {
+        // Clear the current contents if we arrived from another tab
+        sendCoinsPage->clear();
+    }
+    centralWidget->setCurrentWidget(sendCoinsPage);
+
+    exportAction->setEnabled(false);
+    disconnect(exportAction, SIGNAL(triggered()), 0, 0);
+}
+
+void BitcoinGUI::dragEnterEvent(QDragEnterEvent *event)
+{
+    // Accept only URLs
+    if(event->mimeData()->hasUrls())
+        event->acceptProposedAction();
+}
+
+void BitcoinGUI::dropEvent(QDropEvent *event)
+{
+    if(event->mimeData()->hasUrls())
+    {
+        gotoSendCoinsPage();
+        QList<QUrl> urls = event->mimeData()->urls();
+        foreach(const QUrl &url, urls)
+        {
+            sendCoinsPage->handleURL(&url);
+        }
+    }
+
+    event->acceptProposedAction();
+}
+
+void BitcoinGUI::setEncryptionStatus(int status)
+{
+    switch(status)
+    {
+    case WalletModel::Unencrypted:
+        labelEncryptionIcon->hide();
+        encryptWalletAction->setChecked(false);
+        changePassphraseAction->setEnabled(false);
+        encryptWalletAction->setEnabled(true);
+        break;
+    case WalletModel::Unlocked:
+        labelEncryptionIcon->show();
+        labelEncryptionIcon->setPixmap(QIcon(":/icons/lock_open").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
+        labelEncryptionIcon->setToolTip(tr("Wallet is <b>encrypted</b> and currently <b>unlocked</b>"));
+        encryptWalletAction->setChecked(true);
+        changePassphraseAction->setEnabled(true);
+        encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported
+        break;
+    case WalletModel::Locked:
+        labelEncryptionIcon->show();
+        labelEncryptionIcon->setPixmap(QIcon(":/icons/lock_closed").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
+        labelEncryptionIcon->setToolTip(tr("Wallet is <b>encrypted</b> and currently <b>locked</b>"));
+        encryptWalletAction->setChecked(true);
+        changePassphraseAction->setEnabled(true);
+        encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported
+        break;
+    }
+}
+
+void BitcoinGUI::encryptWallet(bool status)
+{
+    AskPassphraseDialog dlg(status ? AskPassphraseDialog::Encrypt:
+                                     AskPassphraseDialog::Decrypt, this);
+    dlg.setModel(walletModel);
+    dlg.exec();
+
+    setEncryptionStatus(walletModel->getEncryptionStatus());
+}
+
+void BitcoinGUI::changePassphrase()
+{
+    AskPassphraseDialog dlg(AskPassphraseDialog::ChangePass, this);
+    dlg.setModel(walletModel);
+    dlg.exec();
+}
+
+void BitcoinGUI::unlockWallet()
+{
+    // Unlock wallet when requested by wallet model
+    if(walletModel->getEncryptionStatus() == WalletModel::Locked)
+    {
+        AskPassphraseDialog dlg(AskPassphraseDialog::Unlock, this);
+        dlg.setModel(walletModel);
+        dlg.exec();
+    }
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/bitcoingui.h
@@ -0,0 +1,120 @@
+#ifndef BITCOINGUI_H
+#define BITCOINGUI_H
+
+#include <QMainWindow>
+#include <QSystemTrayIcon>
+
+class TransactionTableModel;
+class ClientModel;
+class WalletModel;
+class TransactionView;
+class OverviewPage;
+class AddressBookPage;
+class SendCoinsDialog;
+class Notificator;
+
+QT_BEGIN_NAMESPACE
+class QLabel;
+class QLineEdit;
+class QTableView;
+class QAbstractItemModel;
+class QModelIndex;
+class QProgressBar;
+class QStackedWidget;
+class QUrl;
+QT_END_NAMESPACE
+
+class BitcoinGUI : public QMainWindow
+{
+    Q_OBJECT
+public:
+    explicit BitcoinGUI(QWidget *parent = 0);
+    void setClientModel(ClientModel *clientModel);
+    void setWalletModel(WalletModel *walletModel);
+    
+    /* Transaction table tab indices */
+    enum {
+        AllTransactions = 0,
+        SentReceived = 1,
+        Sent = 2,
+        Received = 3
+    } TabIndex;
+
+protected:
+    void changeEvent(QEvent *e);
+    void closeEvent(QCloseEvent *event);
+    void dragEnterEvent(QDragEnterEvent *event);
+    void dropEvent(QDropEvent *event);
+
+private:
+    ClientModel *clientModel;
+    WalletModel *walletModel;
+
+    QStackedWidget *centralWidget;
+
+    OverviewPage *overviewPage;
+    QWidget *transactionsPage;
+    AddressBookPage *addressBookPage;
+    AddressBookPage *receiveCoinsPage;
+    SendCoinsDialog *sendCoinsPage;
+
+    QLabel *labelEncryptionIcon;
+    QLabel *labelConnectionsIcon;
+    QLabel *labelBlocksIcon;
+    QLabel *progressBarLabel;
+    QProgressBar *progressBar;
+
+    QAction *overviewAction;
+    QAction *historyAction;
+    QAction *quitAction;
+    QAction *sendCoinsAction;
+    QAction *addressBookAction;
+    QAction *aboutAction;
+    QAction *receiveCoinsAction;
+    QAction *optionsAction;
+    QAction *openBitcoinAction;
+    QAction *exportAction;
+    QAction *encryptWalletAction;
+    QAction *changePassphraseAction;
+
+    QSystemTrayIcon *trayIcon;
+    Notificator *notificator;
+    TransactionView *transactionView;
+
+    QMovie *syncIconMovie;
+
+    void createActions();
+    QWidget *createTabs();
+    void createTrayIcon();
+
+public slots:
+    void setNumConnections(int count);
+    void setNumBlocks(int count);
+    void setEncryptionStatus(int status);
+
+    void error(const QString &title, const QString &message);
+    /* It is currently not possible to pass a return value to another thread through
+       BlockingQueuedConnection, so use an indirected pointer.
+       http://bugreports.qt.nokia.com/browse/QTBUG-10440
+    */
+    void askFee(qint64 nFeeRequired, bool *payFee);
+
+private slots:
+    // UI pages
+    void gotoOverviewPage();
+    void gotoHistoryPage();
+    void gotoAddressBookPage();
+    void gotoReceiveCoinsPage();
+    void gotoSendCoinsPage();
+
+    // Misc actions
+    void optionsClicked();
+    void aboutClicked();
+    void trayIconActivated(QSystemTrayIcon::ActivationReason reason);
+    void incomingTransaction(const QModelIndex & parent, int start, int end);
+    void encryptWallet(bool status);
+    void changePassphrase();
+    void unlockWallet();
+};
+
+#endif
new file mode 100644
--- /dev/null
+++ b/src/qt/bitcoinstrings.cpp
@@ -0,0 +1,217 @@
+#include <QtGlobal>
+// Automatically generated by extract_strings.py
+static const char *bitcoin_strings[] = {QT_TRANSLATE_NOOP("bitcoin-core", "Bitcoin version"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Usage:"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Send command to -server or bitcoind\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "List commands\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Get help for a command\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Options:\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Specify configuration file (default: bitcoin.conf)\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Specify pid file (default: bitcoind.pid)\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Generate coins\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Don't generate coins\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Start minimized\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Specify data directory\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Specify connection timeout (in milliseconds)\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Connect through socks4 proxy\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Allow DNS lookups for addnode and connect\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Add a node to connect to\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Connect only to the specified node\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Don't accept connections from outside\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Don't attempt to use UPnP to map the listening port\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Attempt to use UPnP to map the listening port\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Fee per KB to add to transactions you send\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Accept command line and JSON-RPC commands\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Run in the background as a daemon and accept commands\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Use the test network\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Username for JSON-RPC connections\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Password for JSON-RPC connections\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Listen for JSON-RPC connections on <port> (default: 8332)\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Allow JSON-RPC connections from specified IP address\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Send commands to node running on <ip> (default: 127.0.0.1)\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Set key pool size to <n> (default: 100)\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Rescan the block chain for missing wallet transactions\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"\n"
+"SSL options: (see the Bitcoin Wiki for SSL setup instructions)\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Use OpenSSL (https) for JSON-RPC connections\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Server certificate file (default: server.cert)\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Server private key (default: server.pem)\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:"
+"@STRENGTH)\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "This help message\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Cannot obtain a lock on data directory %s.  Bitcoin is probably already "
+"running."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Loading addresses..."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error loading addr.dat      \n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Loading block index..."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error loading blkindex.dat      \n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Loading wallet..."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error loading wallet.dat: Wallet corrupted      \n"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Error loading wallet.dat: Wallet requires newer version of Bitcoin      \n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error loading wallet.dat      \n"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Rescanning..."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Done loading"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Invalid -proxy address"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -paytxfee=<amount>"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Warning: -paytxfee is set very high.  This is the transaction fee you will "
+"pay if you send a transaction."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error: CreateThread(StartNode) failed"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Warning: Disk space is low  "),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Unable to bind to port %d on this computer.  Bitcoin is probably already "
+"running."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"This transaction is over the size limit.  You can still send it for a fee of "
+"%s, which goes to the nodes that process your transaction and helps to "
+"support the network.  Do you want to pay the fee?"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Enter the current passphrase to the wallet."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Passphrase"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Please supply the current wallet decryption passphrase."),
+QT_TRANSLATE_NOOP("bitcoin-core", "The passphrase entered for the wallet decryption was incorrect."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Status"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Date"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Description"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Debit"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Credit"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Open for %d blocks"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Open until %s"),
+QT_TRANSLATE_NOOP("bitcoin-core", "%d/offline?"),
+QT_TRANSLATE_NOOP("bitcoin-core", "%d/unconfirmed"),
+QT_TRANSLATE_NOOP("bitcoin-core", "%d confirmations"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Generated"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Generated (%s matures in %d more blocks)"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Generated - Warning: This block was not received by any other nodes and will "
+"probably not be accepted!"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Generated (not accepted)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "From: "),
+QT_TRANSLATE_NOOP("bitcoin-core", "Received with: "),
+QT_TRANSLATE_NOOP("bitcoin-core", "Payment to yourself"),
+QT_TRANSLATE_NOOP("bitcoin-core", "To: "),
+QT_TRANSLATE_NOOP("bitcoin-core", "    Generating"),
+QT_TRANSLATE_NOOP("bitcoin-core", "(not connected)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "     %d connections     %d blocks     %d transactions"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Wallet already encrypted."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Enter the new passphrase to the wallet.\n"
+"Please use a passphrase of 10 or more random characters, or eight or more "
+"words."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error: The supplied passphrase was too short."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE "
+"ALL OF YOUR BITCOINS!\n"
+"Are you sure you wish to encrypt your wallet?"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Please re-enter your new wallet passphrase."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error: the supplied passphrases didn't match."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Wallet encryption failed."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Wallet Encrypted.\n"
+"Remember that encrypting your wallet cannot fully protect your bitcoins from "
+"being stolen by malware infecting your computer."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Wallet is unencrypted, please encrypt it first."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Enter the new passphrase for the wallet."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Re-enter the new passphrase for the wallet."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Wallet Passphrase Changed."),
+QT_TRANSLATE_NOOP("bitcoin-core", "New Receiving Address"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"You should use a new address for each payment you receive.\n"
+"\n"
+"Label"),
+QT_TRANSLATE_NOOP("bitcoin-core", "<b>Status:</b> "),
+QT_TRANSLATE_NOOP("bitcoin-core", ", has not been successfully broadcast yet"),
+QT_TRANSLATE_NOOP("bitcoin-core", ", broadcast through %d node"),
+QT_TRANSLATE_NOOP("bitcoin-core", ", broadcast through %d nodes"),
+QT_TRANSLATE_NOOP("bitcoin-core", "<b>Date:</b> "),
+QT_TRANSLATE_NOOP("bitcoin-core", "<b>Source:</b> Generated<br>"),
+QT_TRANSLATE_NOOP("bitcoin-core", "<b>From:</b> "),
+QT_TRANSLATE_NOOP("bitcoin-core", "unknown"),
+QT_TRANSLATE_NOOP("bitcoin-core", "<b>To:</b> "),
+QT_TRANSLATE_NOOP("bitcoin-core", " (yours, label: "),
+QT_TRANSLATE_NOOP("bitcoin-core", " (yours)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "<b>Credit:</b> "),
+QT_TRANSLATE_NOOP("bitcoin-core", "(%s matures in %d more blocks)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "(not accepted)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "<b>Debit:</b> "),
+QT_TRANSLATE_NOOP("bitcoin-core", "<b>Transaction fee:</b> "),
+QT_TRANSLATE_NOOP("bitcoin-core", "<b>Net amount:</b> "),
+QT_TRANSLATE_NOOP("bitcoin-core", "Message:"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Comment:"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Generated coins must wait 120 blocks before they can be spent.  When you "
+"generated this block, it was broadcast to the network to be added to the "
+"block chain.  If it fails to get into the chain, it will change to \"not "
+"accepted\" and not be spendable.  This may occasionally happen if another "
+"node generates a block within a few seconds of yours."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Cannot write autostart/bitcoin.desktop file"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Main"),
+QT_TRANSLATE_NOOP("bitcoin-core", "&Start Bitcoin on window system startup"),
+QT_TRANSLATE_NOOP("bitcoin-core", "&Minimize on close"),
+QT_TRANSLATE_NOOP("bitcoin-core", "version %s"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error in amount  "),
+QT_TRANSLATE_NOOP("bitcoin-core", "Send Coins"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Amount exceeds your balance  "),
+QT_TRANSLATE_NOOP("bitcoin-core", "Total exceeds your balance when the "),
+QT_TRANSLATE_NOOP("bitcoin-core", " transaction fee is included  "),
+QT_TRANSLATE_NOOP("bitcoin-core", "Payment sent  "),
+QT_TRANSLATE_NOOP("bitcoin-core", "Sending..."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Invalid address  "),
+QT_TRANSLATE_NOOP("bitcoin-core", "Sending %s to %s"),
+QT_TRANSLATE_NOOP("bitcoin-core", "CANCELLED"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Cancelled"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Transfer cancelled  "),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error: "),
+QT_TRANSLATE_NOOP("bitcoin-core", "Insufficient funds"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Connecting..."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Unable to connect"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Requesting public key..."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Received public key..."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Recipient is not accepting transactions sent by IP address"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Transfer was not accepted"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Invalid response received"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Creating transaction..."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"This transaction requires a transaction fee of at least %s because of its "
+"amount, complexity, or use of recently received funds"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Transaction creation failed"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Transaction aborted"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Lost connection, transaction cancelled"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Sending payment..."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"The transaction was rejected.  This might happen if some of the coins in "
+"your wallet were already spent, such as if you used a copy of wallet.dat and "
+"coins were spent in the copy but not marked as spent here."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Waiting for confirmation..."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"The payment was sent, but the recipient was unable to verify it.\n"
+"The transaction is recorded and will credit to the recipient,\n"
+"but the comment information will be blank."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Payment was sent, but an invalid response was received"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Payment completed"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Name"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Address"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Label"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Bitcoin Address"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"This is one of your own addresses for receiving payments and cannot be "
+"entered in the address book.  "),
+QT_TRANSLATE_NOOP("bitcoin-core", "Edit Address"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Edit Address Label"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Add Address"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Bitcoin"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Bitcoin - Generating"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Bitcoin - (not connected)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "&Open Bitcoin"),
+QT_TRANSLATE_NOOP("bitcoin-core", "&Send Bitcoins"),
+QT_TRANSLATE_NOOP("bitcoin-core", "O&ptions..."),
+QT_TRANSLATE_NOOP("bitcoin-core", "E&xit"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Program has crashed and will terminate.  "),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Warning: Please check that your computer's date and time are correct.  If "
+"your clock is wrong Bitcoin will not work properly."),
+QT_TRANSLATE_NOOP("bitcoin-core", "beta"),
+};
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/src/qt/bitcoinunits.cpp
@@ -0,0 +1,181 @@
+#include "bitcoinunits.h"
+
+#include <QStringList>
+
+BitcoinUnits::BitcoinUnits(QObject *parent):
+        QAbstractListModel(parent),
+        unitlist(availableUnits())
+{
+}
+
+QList<BitcoinUnits::Unit> BitcoinUnits::availableUnits()
+{
+    QList<BitcoinUnits::Unit> unitlist;
+    unitlist.append(BTC);
+    unitlist.append(mBTC);
+    unitlist.append(uBTC);
+    return unitlist;
+}
+
+bool BitcoinUnits::valid(int unit)
+{
+    switch(unit)
+    {
+    case BTC:
+    case mBTC:
+    case uBTC:
+        return true;
+    default:
+        return false;
+    }
+}
+
+QString BitcoinUnits::name(int unit)
+{
+    switch(unit)
+    {
+    case BTC: return QString("BTC");
+    case mBTC: return QString("mBTC");
+    case uBTC: return QString::fromUtf8("μBTC");
+    default: return QString("???");
+    }
+}
+
+QString BitcoinUnits::description(int unit)
+{
+    switch(unit)
+    {
+    case BTC: return QString("Bitcoins");
+    case mBTC: return QString("Milli-Bitcoins (1 / 1,000)");
+    case uBTC: return QString("Micro-Bitcoins (1 / 1,000,000)");
+    default: return QString("???");
+    }
+}
+
+qint64 BitcoinUnits::factor(int unit)
+{
+    switch(unit)
+    {
+    case BTC:  return 100000000;
+    case mBTC: return 100000;
+    case uBTC: return 100;
+    default:   return 100000000;
+    }
+}
+
+int BitcoinUnits::amountDigits(int unit)
+{
+    switch(unit)
+    {
+    case BTC: return 8; // 21,000,000 (# digits, without commas)
+    case mBTC: return 11; // 21,000,000,000
+    case uBTC: return 14; // 21,000,000,000,000
+    default: return 0;
+    }
+}
+
+int BitcoinUnits::decimals(int unit)
+{
+    switch(unit)
+    {
+    case BTC: return 8;
+    case mBTC: return 5;
+    case uBTC: return 2;
+    default: return 0;
+    }
+}
+
+QString BitcoinUnits::format(int unit, qint64 n, bool fPlus)
+{
+    // Note: not using straight sprintf here because we do NOT want
+    // localized number formatting.
+    if(!valid(unit))
+        return QString(); // Refuse to format invalid unit
+    qint64 coin = factor(unit);
+    int num_decimals = decimals(unit);
+    qint64 n_abs = (n > 0 ? n : -n);
+    qint64 quotient = n_abs / coin;
+    qint64 remainder = n_abs % coin;
+    QString quotient_str = QString::number(quotient);
+    QString remainder_str = QString::number(remainder).rightJustified(num_decimals, '0');
+
+    // Right-trim excess 0's after the decimal point
+    int nTrim = 0;
+    for (int i = remainder_str.size()-1; i>=2 && (remainder_str.at(i) == '0'); --i)
+        ++nTrim;
+    remainder_str.chop(nTrim);
+
+    if (n < 0)
+        quotient_str.insert(0, '-');
+    else if (fPlus && n > 0)
+        quotient_str.insert(0, '+');
+    return quotient_str + QString(".") + remainder_str;
+}
+
+QString BitcoinUnits::formatWithUnit(int unit, qint64 amount, bool plussign)
+{
+    return format(unit, amount, plussign) + QString(" ") + name(unit);
+}
+
+bool BitcoinUnits::parse(int unit, const QString &value, qint64 *val_out)
+{
+    if(!valid(unit) || value.isEmpty())
+        return false; // Refuse to parse invalid unit or empty string
+    int num_decimals = decimals(unit);
+    QStringList parts = value.split(".");
+
+    if(parts.size() > 2)
+    {
+        return false; // More than one dot
+    }
+    QString whole = parts[0];
+    QString decimals;
+
+    if(parts.size() > 1)
+    {
+        decimals = parts[1];
+    }
+    if(decimals.size() > num_decimals)
+    {
+        return false; // Exceeds max precision
+    }
+    bool ok = false;
+    QString str = whole + decimals.leftJustified(num_decimals, '0');
+
+    if(str.size() > 18)
+    {
+        return false; // Longer numbers will exceed 63 bits
+    }
+    qint64 retvalue = str.toLongLong(&ok);
+    if(val_out)
+    {
+        *val_out = retvalue;
+    }
+    return ok;
+}
+
+int BitcoinUnits::rowCount(const QModelIndex &parent) const
+{
+    Q_UNUSED(parent);
+    return unitlist.size();
+}
+
+QVariant BitcoinUnits::data(const QModelIndex &index, int role) const
+{
+    int row = index.row();
+    if(row >= 0 && row < unitlist.size())
+    {
+        Unit unit = unitlist.at(row);
+        switch(role)
+        {
+        case Qt::EditRole:
+        case Qt::DisplayRole:
+            return QVariant(name(unit));
+        case Qt::ToolTipRole:
+            return QVariant(description(unit));
+        case UnitRole:
+            return QVariant(static_cast<int>(unit));
+        }
+    }
+    return QVariant();
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/bitcoinunits.h
@@ -0,0 +1,57 @@
+#ifndef BITCOINUNITS_H
+#define BITCOINUNITS_H
+
+#include <QString>
+#include <QAbstractListModel>
+
+// Bitcoin unit definitions, encapsulates parsing and formatting
+// and serves as list model for dropdown selection boxes.
+class BitcoinUnits: public QAbstractListModel
+{
+public:
+    explicit BitcoinUnits(QObject *parent);
+
+    enum Unit
+    {
+        // Source: https://en.bitcoin.it/wiki/Units
+        // Please add only sensible ones
+        BTC,
+        mBTC,
+        uBTC
+    };
+
+    /// Static API
+    // Get list of units, for dropdown box
+    static QList<Unit> availableUnits();
+    // Is unit ID valid?
+    static bool valid(int unit);
+    // Short name
+    static QString name(int unit);
+    // Longer description
+    static QString description(int unit);
+    // Number of satoshis / unit
+    static qint64 factor(int unit);
+    // Number of amount digits (to represent max number of coins)
+    static int amountDigits(int unit);
+    // Number of decimals left
+    static int decimals(int unit);
+    // Format as string
+    static QString format(int unit, qint64 amount, bool plussign=false);
+    // Format as string (with unit)
+    static QString formatWithUnit(int unit, qint64 amount, bool plussign=false);
+    // Parse string to coin amount
+    static bool parse(int unit, const QString &value, qint64 *val_out);
+
+    /// AbstractListModel implementation
+    enum {
+        // Unit identifier
+        UnitRole = Qt::UserRole
+    } RoleIndex;
+    int rowCount(const QModelIndex &parent) const;
+    QVariant data(const QModelIndex &index, int role) const;
+private:
+    QList<BitcoinUnits::Unit> unitlist;
+};
+typedef BitcoinUnits::Unit BitcoinUnit;
+
+#endif // BITCOINUNITS_H
new file mode 100644
--- /dev/null
+++ b/src/qt/clientmodel.cpp
@@ -0,0 +1,83 @@
+#include "clientmodel.h"
+#include "guiconstants.h"
+#include "optionsmodel.h"
+#include "addresstablemodel.h"
+#include "transactiontablemodel.h"
+
+#include "headers.h"
+
+#include <QTimer>
+#include <QDateTime>
+
+ClientModel::ClientModel(OptionsModel *optionsModel, QObject *parent) :
+    QObject(parent), optionsModel(optionsModel),
+    cachedNumConnections(0), cachedNumBlocks(0)
+{
+    // Until signal notifications is built into the bitcoin core,
+    //  simply update everything after polling using a timer.
+    QTimer *timer = new QTimer(this);
+    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
+    timer->start(MODEL_UPDATE_DELAY);
+
+    numBlocksAtStartup = -1;
+}
+
+int ClientModel::getNumConnections() const
+{
+    return vNodes.size();
+}
+
+int ClientModel::getNumBlocks() const
+{
+    return nBestHeight;
+}
+
+int ClientModel::getNumBlocksAtStartup()
+{
+    if (numBlocksAtStartup == -1) numBlocksAtStartup = getNumBlocks();
+    return numBlocksAtStartup;
+}
+
+QDateTime ClientModel::getLastBlockDate() const
+{
+    return QDateTime::fromTime_t(pindexBest->GetBlockTime());
+}
+
+void ClientModel::update()
+{
+    int newNumConnections = getNumConnections();
+    int newNumBlocks = getNumBlocks();
+
+    if(cachedNumConnections != newNumConnections)
+        emit numConnectionsChanged(newNumConnections);
+    if(cachedNumBlocks != newNumBlocks)
+        emit numBlocksChanged(newNumBlocks);
+
+    cachedNumConnections = newNumConnections;
+    cachedNumBlocks = newNumBlocks;
+}
+
+bool ClientModel::isTestNet() const
+{
+    return fTestNet;
+}
+
+bool ClientModel::inInitialBlockDownload() const
+{
+    return IsInitialBlockDownload();
+}
+
+int ClientModel::getNumBlocksOfPeers() const
+{
+    return GetNumBlocksOfPeers();
+}
+
+OptionsModel *ClientModel::getOptionsModel()
+{
+    return optionsModel;
+}
+
+QString ClientModel::formatFullVersion() const
+{
+    return QString::fromStdString(FormatFullVersion());
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/clientmodel.h
@@ -0,0 +1,60 @@
+#ifndef CLIENTMODEL_H
+#define CLIENTMODEL_H
+
+#include <QObject>
+
+class OptionsModel;
+class AddressTableModel;
+class TransactionTableModel;
+class CWallet;
+
+QT_BEGIN_NAMESPACE
+class QDateTime;
+QT_END_NAMESPACE
+
+// Model for Bitcoin network client
+class ClientModel : public QObject
+{
+    Q_OBJECT
+public:
+    explicit ClientModel(OptionsModel *optionsModel, QObject *parent = 0);
+
+    OptionsModel *getOptionsModel();
+
+    int getNumConnections() const;
+    int getNumBlocks() const;
+    int getNumBlocksAtStartup();
+
+    QDateTime getLastBlockDate() const;
+
+    // Return true if client connected to testnet
+    bool isTestNet() const;
+    // Return true if core is doing initial block download
+    bool inInitialBlockDownload() const;
+    // Return conservative estimate of total number of blocks, or 0 if unknown
+    int getNumBlocksOfPeers() const;
+
+    QString formatFullVersion() const;
+
+private:
+    OptionsModel *optionsModel;
+
+    int cachedNumConnections;
+    int cachedNumBlocks;
+
+    int numBlocksAtStartup;
+
+signals:
+    void numConnectionsChanged(int count);
+    void numBlocksChanged(int count);
+
+    // Asynchronous error notification
+    void error(const QString &title, const QString &message);
+
+public slots:
+
+private slots:
+    void update();
+};
+
+#endif // CLIENTMODEL_H
new file mode 100644
--- /dev/null
+++ b/src/qt/csvmodelwriter.cpp
@@ -0,0 +1,83 @@
+#include "csvmodelwriter.h"
+
+#include <QAbstractItemModel>
+#include <QFile>
+#include <QTextStream>
+
+CSVModelWriter::CSVModelWriter(const QString &filename, QObject *parent) :
+    QObject(parent),
+    filename(filename)
+{
+}
+
+void CSVModelWriter::setModel(const QAbstractItemModel *model)
+{
+    this->model = model;
+}
+
+void CSVModelWriter::addColumn(const QString &title, int column, int role)
+{
+    Column col;
+    col.title = title;
+    col.column = column;
+    col.role = role;
+
+    columns.append(col);
+}
+
+static void writeValue(QTextStream &f, const QString &value)
+{
+    // TODO: quoting if " or \n in string
+    f << "\"" << value << "\"";
+}
+
+static void writeSep(QTextStream &f)
+{
+    f << ",";
+}
+
+static void writeNewline(QTextStream &f)
+{
+    f << "\n";
+}
+
+bool CSVModelWriter::write()
+{
+    QFile file(filename);
+    if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
+        return false;
+    QTextStream out(&file);
+
+    int numRows = model->rowCount();
+
+    // Header row
+    for(int i=0; i<columns.size(); ++i)
+    {
+        if(i!=0)
+        {
+            writeSep(out);
+        }
+        writeValue(out, columns[i].title);
+    }
+    writeNewline(out);
+
+    // Data rows
+    for(int j=0; j<numRows; ++j)
+    {
+        for(int i=0; i<columns.size(); ++i)
+        {
+            if(i!=0)
+            {
+                writeSep(out);
+            }
+            QVariant data = model->index(j, columns[i].column).data(columns[i].role);
+            writeValue(out, data.toString());
+        }
+        writeNewline(out);
+    }
+
+    file.close();
+
+    return file.error() == QFile::NoError;
+}
+
new file mode 100644
--- /dev/null
+++ b/src/qt/csvmodelwriter.h
@@ -0,0 +1,43 @@
+#ifndef CSVMODELWRITER_H
+#define CSVMODELWRITER_H
+
+#include <QObject>
+#include <QList>
+
+QT_BEGIN_NAMESPACE
+class QAbstractItemModel;
+QT_END_NAMESPACE
+
+// Export TableModel to CSV file
+class CSVModelWriter : public QObject
+{
+    Q_OBJECT
+public:
+    explicit CSVModelWriter(const QString &filename, QObject *parent = 0);
+
+    void setModel(const QAbstractItemModel *model);
+    void addColumn(const QString &title, int column, int role=Qt::EditRole);
+
+    // Perform write operation
+    // Returns true on success, false otherwise
+    bool write();
+
+private:
+    QString filename;
+    const QAbstractItemModel *model;
+
+    struct Column
+    {
+        QString title;
+        int column;
+        int role;
+    };
+    QList<Column> columns;
+
+signals:
+
+public slots:
+
+};
+
+#endif // CSVMODELWRITER_H
new file mode 100644
--- /dev/null
+++ b/src/qt/editaddressdialog.cpp
@@ -0,0 +1,115 @@
+#include "editaddressdialog.h"
+#include "ui_editaddressdialog.h"
+#include "addresstablemodel.h"
+#include "guiutil.h"
+
+#include <QDataWidgetMapper>
+#include <QMessageBox>
+
+EditAddressDialog::EditAddressDialog(Mode mode, QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::EditAddressDialog), mapper(0), mode(mode), model(0)
+{
+    ui->setupUi(this);
+
+    GUIUtil::setupAddressWidget(ui->addressEdit, this);
+
+    switch(mode)
+    {
+    case NewReceivingAddress:
+        setWindowTitle(tr("New receiving address"));
+        ui->addressEdit->setEnabled(false);
+        break;
+    case NewSendingAddress:
+        setWindowTitle(tr("New sending address"));
+        break;
+    case EditReceivingAddress:
+        setWindowTitle(tr("Edit receiving address"));
+        ui->addressEdit->setDisabled(true);
+        break;
+    case EditSendingAddress:
+        setWindowTitle(tr("Edit sending address"));
+        break;
+    }
+
+    mapper = new QDataWidgetMapper(this);
+    mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
+}
+
+EditAddressDialog::~EditAddressDialog()
+{
+    delete ui;
+}
+
+void EditAddressDialog::setModel(AddressTableModel *model)
+{
+    this->model = model;
+    mapper->setModel(model);
+    mapper->addMapping(ui->labelEdit, AddressTableModel::Label);
+    mapper->addMapping(ui->addressEdit, AddressTableModel::Address);
+}
+
+void EditAddressDialog::loadRow(int row)
+{
+    mapper->setCurrentIndex(row);
+}
+
+bool EditAddressDialog::saveCurrentRow()
+{
+    switch(mode)
+    {
+    case NewReceivingAddress:
+    case NewSendingAddress:
+        address = model->addRow(
+                mode == NewSendingAddress ? AddressTableModel::Send : AddressTableModel::Receive,
+                ui->labelEdit->text(),
+                ui->addressEdit->text());
+        break;
+    case EditReceivingAddress:
+    case EditSendingAddress:
+        if(mapper->submit())
+        {
+            address = ui->addressEdit->text();
+        }
+        break;
+    }
+    return !address.isEmpty();
+}
+
+void EditAddressDialog::accept()
+{
+    if(!saveCurrentRow())
+    {
+        switch(model->getEditStatus())
+        {
+        case AddressTableModel::DUPLICATE_ADDRESS:
+            QMessageBox::warning(this, windowTitle(),
+                tr("The entered address \"%1\" is already in the address book.").arg(ui->addressEdit->text()),
+                QMessageBox::Ok, QMessageBox::Ok);
+            break;
+        case AddressTableModel::INVALID_ADDRESS:
+            QMessageBox::warning(this, windowTitle(),
+                tr("The entered address \"%1\" is not a valid bitcoin address.").arg(ui->addressEdit->text()),
+                QMessageBox::Ok, QMessageBox::Ok);
+            return;
+        case AddressTableModel::WALLET_UNLOCK_FAILURE:
+            QMessageBox::critical(this, windowTitle(),
+                tr("Could not unlock wallet."),
+                QMessageBox::Ok, QMessageBox::Ok);
+            return;
+        case AddressTableModel::KEY_GENERATION_FAILURE:
+            QMessageBox::critical(this, windowTitle(),
+                tr("New key generation failed."),
+                QMessageBox::Ok, QMessageBox::Ok);
+            return;
+        }
+
+        return;
+    }
+    QDialog::accept();
+}
+
+QString EditAddressDialog::getAddress() const
+{
+    return address;
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/editaddressdialog.h
@@ -0,0 +1,47 @@
+#ifndef EDITADDRESSDIALOG_H
+#define EDITADDRESSDIALOG_H
+
+#include <QDialog>
+
+QT_BEGIN_NAMESPACE
+class QDataWidgetMapper;
+QT_END_NAMESPACE
+
+namespace Ui {
+    class EditAddressDialog;
+}
+class AddressTableModel;
+
+class EditAddressDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    enum Mode {
+        NewReceivingAddress,
+        NewSendingAddress,
+        EditReceivingAddress,
+        EditSendingAddress
+    };
+
+    explicit EditAddressDialog(Mode mode, QWidget *parent = 0);
+    ~EditAddressDialog();    
+
+    void setModel(AddressTableModel *model);
+    void loadRow(int row);
+
+    void accept();
+
+    QString getAddress() const;
+private:
+    bool saveCurrentRow();
+
+    Ui::EditAddressDialog *ui;
+    QDataWidgetMapper *mapper;
+    Mode mode;
+    AddressTableModel *model;
+
+    QString address;
+};
+
+#endif // EDITADDRESSDIALOG_H
new file mode 100644
--- /dev/null
+++ b/src/qt/forms/aboutdialog.ui
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AboutDialog</class>
+ <widget class="QDialog" name="AboutDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>593</width>
+    <height>319</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>About Bitcoin</string>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout_2">
+   <item>
+    <widget class="QLabel" name="label_4">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Ignored">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
+     <property name="pixmap">
+      <pixmap resource="../bitcoin.qrc">:/images/about</pixmap>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout_2">
+     <item>
+      <spacer name="verticalSpacer_2">
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>40</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <item>
+        <widget class="QLabel" name="label">
+         <property name="text">
+          <string>&lt;b&gt;Bitcoin&lt;/b&gt; version</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="versionLabel">
+         <property name="text">
+          <string notr="true">0.3.666-beta</string>
+         </property>
+         <property name="textFormat">
+          <enum>Qt::RichText</enum>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QLabel" name="label_2">
+       <property name="text">
+        <string>Copyright © 2009-2011 Bitcoin Developers
+
+This is experimental software.
+
+Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php.
+
+This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard.</string>
+       </property>
+       <property name="wordWrap">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="verticalSpacer">
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>40</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QDialogButtonBox" name="buttonBox">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="standardButtons">
+        <set>QDialogButtonBox::Ok</set>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="../bitcoin.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>AboutDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>360</x>
+     <y>308</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>AboutDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>428</x>
+     <y>308</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
new file mode 100644
--- /dev/null
+++ b/src/qt/forms/addressbookpage.ui
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AddressBookPage</class>
+ <widget class="QWidget" name="AddressBookPage">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>627</width>
+    <height>347</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Address Book</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="labelExplanation">
+     <property name="text">
+      <string>These are your Bitcoin addresses for receiving payments.  You may want to give a different one to each sender so you can keep track of who is paying you.</string>
+     </property>
+     <property name="textFormat">
+      <enum>Qt::AutoText</enum>
+     </property>
+     <property name="wordWrap">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QTableView" name="tableView">
+     <property name="toolTip">
+      <string>Double-click to edit address or label</string>
+     </property>
+     <property name="alternatingRowColors">
+      <bool>true</bool>
+     </property>
+     <property name="selectionMode">
+      <enum>QAbstractItemView::SingleSelection</enum>
+     </property>
+     <property name="selectionBehavior">
+      <enum>QAbstractItemView::SelectRows</enum>
+     </property>
+     <property name="sortingEnabled">
+      <bool>true</bool>
+     </property>
+     <attribute name="verticalHeaderVisible">
+      <bool>false</bool>
+     </attribute>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QPushButton" name="newAddressButton">
+       <property name="toolTip">
+        <string>Create a new address</string>
+       </property>
+       <property name="text">
+        <string>&amp;New Address...</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../bitcoin.qrc">
+         <normaloff>:/icons/add</normaloff>:/icons/add</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="copyToClipboard">
+       <property name="toolTip">
+        <string>Copy the currently selected address to the system clipboard</string>
+       </property>
+       <property name="text">
+        <string>&amp;Copy to Clipboard</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../bitcoin.qrc">
+         <normaloff>:/icons/editcopy</normaloff>:/icons/editcopy</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="deleteButton">
+       <property name="toolTip">
+        <string>Delete the currently selected address from the list. Only sending addresses can be deleted.</string>
+       </property>
+       <property name="text">
+        <string>&amp;Delete</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../bitcoin.qrc">
+         <normaloff>:/icons/remove</normaloff>:/icons/remove</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QDialogButtonBox" name="buttonBox">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="standardButtons">
+        <set>QDialogButtonBox::Ok</set>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="../bitcoin.qrc"/>
+ </resources>
+ <connections/>
+</ui>
new file mode 100644
--- /dev/null
+++ b/src/qt/forms/askpassphrasedialog.ui
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AskPassphraseDialog</class>
+ <widget class="QDialog" name="AskPassphraseDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>589</width>
+    <height>228</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="minimumSize">
+   <size>
+    <width>550</width>
+    <height>0</height>
+   </size>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="warningLabel">
+     <property name="text">
+      <string>TextLabel</string>
+     </property>
+     <property name="textFormat">
+      <enum>Qt::RichText</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <layout class="QFormLayout" name="formLayout">
+     <property name="fieldGrowthPolicy">
+      <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+     </property>
+     <item row="1" column="0">
+      <widget class="QLabel" name="passLabel1">
+       <property name="text">
+        <string>Enter passphrase</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="1">
+      <widget class="QLineEdit" name="passEdit1">
+       <property name="echoMode">
+        <enum>QLineEdit::Password</enum>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="0">
+      <widget class="QLabel" name="passLabel2">
+       <property name="text">
+        <string>New passphrase</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="1">
+      <widget class="QLineEdit" name="passEdit2">
+       <property name="echoMode">
+        <enum>QLineEdit::Password</enum>
+       </property>
+      </widget>
+     </item>
+     <item row="3" column="0">
+      <widget class="QLabel" name="passLabel3">
+       <property name="text">
+        <string>Repeat new passphrase</string>
+       </property>
+      </widget>
+     </item>
+     <item row="3" column="1">
+      <widget class="QLineEdit" name="passEdit3">
+       <property name="echoMode">
+        <enum>QLineEdit::Password</enum>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>AskPassphraseDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>AskPassphraseDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
new file mode 100644
--- /dev/null
+++ b/src/qt/forms/editaddressdialog.ui
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>EditAddressDialog</class>
+ <widget class="QDialog" name="EditAddressDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>457</width>
+    <height>126</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Edit Address</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QFormLayout" name="formLayout">
+     <property name="fieldGrowthPolicy">
+      <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+     </property>
+     <item row="0" column="0">
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>&amp;Label</string>
+       </property>
+       <property name="buddy">
+        <cstring>labelEdit</cstring>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="1">
+      <widget class="QLineEdit" name="labelEdit">
+       <property name="toolTip">
+        <string>The label associated with this address book entry</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="0">
+      <widget class="QLabel" name="label_2">
+       <property name="text">
+        <string>&amp;Address</string>
+       </property>
+       <property name="buddy">
+        <cstring>addressEdit</cstring>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="1">
+      <widget class="QLineEdit" name="addressEdit">
+       <property name="toolTip">
+        <string>The address associated with this address book entry. This can only be modified for sending addresses.</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>EditAddressDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>EditAddressDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
new file mode 100644
--- /dev/null
+++ b/src/qt/forms/overviewpage.ui
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>OverviewPage</class>
+ <widget class="QWidget" name="OverviewPage">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>552</width>
+    <height>342</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,1">
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout_2">
+     <item>
+      <widget class="QFrame" name="frame">
+       <property name="frameShape">
+        <enum>QFrame::StyledPanel</enum>
+       </property>
+       <property name="frameShadow">
+        <enum>QFrame::Raised</enum>
+       </property>
+       <layout class="QFormLayout" name="formLayout_2">
+        <property name="fieldGrowthPolicy">
+         <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+        </property>
+        <property name="horizontalSpacing">
+         <number>12</number>
+        </property>
+        <property name="verticalSpacing">
+         <number>12</number>
+        </property>
+        <item row="2" column="0">
+         <widget class="QLabel" name="label">
+          <property name="text">
+           <string>Balance:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="1">
+         <widget class="QLabel" name="labelBalance">
+          <property name="text">
+           <string>123.456 BTC</string>
+          </property>
+         </widget>
+        </item>
+        <item row="4" column="0">
+         <widget class="QLabel" name="label_2">
+          <property name="text">
+           <string>Number of transactions:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="4" column="1">
+         <widget class="QLabel" name="labelNumTransactions">
+          <property name="text">
+           <string>0</string>
+          </property>
+         </widget>
+        </item>
+        <item row="3" column="0">
+         <widget class="QLabel" name="label_3">
+          <property name="text">
+           <string>Unconfirmed:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="3" column="1">
+         <widget class="QLabel" name="labelUnconfirmed">
+          <property name="text">
+           <string>0 BTC</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="0">
+         <widget class="QLabel" name="label_5">
+          <property name="text">
+           <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Wallet&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+     </item>
+     <item>
+      <spacer name="verticalSpacer">
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>40</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout_3">
+     <item>
+      <widget class="QFrame" name="frame_2">
+       <property name="frameShape">
+        <enum>QFrame::StyledPanel</enum>
+       </property>
+       <property name="frameShadow">
+        <enum>QFrame::Raised</enum>
+       </property>
+       <layout class="QVBoxLayout" name="verticalLayout">
+        <item>
+         <widget class="QLabel" name="label_4">
+          <property name="text">
+           <string>&lt;b&gt;Recent transactions&lt;/b&gt;</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QListView" name="listTransactions">
+          <property name="frameShape">
+           <enum>QFrame::NoFrame</enum>
+          </property>
+          <property name="verticalScrollBarPolicy">
+           <enum>Qt::ScrollBarAlwaysOff</enum>
+          </property>
+          <property name="horizontalScrollBarPolicy">
+           <enum>Qt::ScrollBarAlwaysOff</enum>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+     </item>
+     <item>
+      <spacer name="verticalSpacer_2">
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>40</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
new file mode 100644
--- /dev/null
+++ b/src/qt/forms/sendcoinsdialog.ui
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SendCoinsDialog</class>
+ <widget class="QDialog" name="SendCoinsDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>686</width>
+    <height>217</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Send Coins</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QScrollArea" name="scrollArea">
+     <property name="widgetResizable">
+      <bool>true</bool>
+     </property>
+     <widget class="QWidget" name="scrollAreaWidgetContents">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>666</width>
+        <height>162</height>
+       </rect>
+      </property>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <property name="margin">
+        <number>0</number>
+       </property>
+       <item>
+        <layout class="QVBoxLayout" name="entries">
+         <property name="spacing">
+          <number>6</number>
+         </property>
+        </layout>
+       </item>
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <property name="spacing">
+      <number>12</number>
+     </property>
+     <item>
+      <widget class="QPushButton" name="addButton">
+       <property name="toolTip">
+        <string>Send to multiple recipients at once</string>
+       </property>
+       <property name="text">
+        <string>&amp;Add recipient...</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../bitcoin.qrc">
+         <normaloff>:/icons/add</normaloff>:/icons/add</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="sendButton">
+       <property name="minimumSize">
+        <size>
+         <width>150</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="toolTip">
+        <string>Confirm the send action</string>
+       </property>
+       <property name="text">
+        <string>&amp;Send</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../bitcoin.qrc">
+         <normaloff>:/icons/send</normaloff>:/icons/send</iconset>
+       </property>
+       <property name="default">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="../bitcoin.qrc"/>
+ </resources>
+ <connections/>
+</ui>
new file mode 100644
--- /dev/null
+++ b/src/qt/forms/sendcoinsentry.ui
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SendCoinsEntry</class>
+ <widget class="QFrame" name="SendCoinsEntry">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>729</width>
+    <height>136</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <property name="frameShape">
+   <enum>QFrame::StyledPanel</enum>
+  </property>
+  <property name="frameShadow">
+   <enum>QFrame::Sunken</enum>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <property name="spacing">
+    <number>12</number>
+   </property>
+   <item row="5" column="0">
+    <widget class="QLabel" name="label">
+     <property name="text">
+      <string>A&amp;mount:</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+     </property>
+     <property name="buddy">
+      <cstring>payAmount</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="0">
+    <widget class="QLabel" name="label_2">
+     <property name="text">
+      <string>Pay &amp;To:</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+     </property>
+     <property name="buddy">
+      <cstring>payTo</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="5" column="1">
+    <widget class="BitcoinAmountField" name="payAmount"/>
+   </item>
+   <item row="4" column="1">
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <property name="spacing">
+      <number>0</number>
+     </property>
+     <item>
+      <widget class="QValidatedLineEdit" name="addAsLabel">
+       <property name="enabled">
+        <bool>true</bool>
+       </property>
+       <property name="toolTip">
+        <string>Enter a label for this address to add it to your address book</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="4" column="0">
+    <widget class="QLabel" name="label_4">
+     <property name="text">
+      <string>&amp;Label:</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+     </property>
+     <property name="buddy">
+      <cstring>addAsLabel</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="1">
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <property name="spacing">
+      <number>0</number>
+     </property>
+     <item>
+      <widget class="QValidatedLineEdit" name="payTo">
+       <property name="toolTip">
+        <string>The address to send the payment to  (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</string>
+       </property>
+       <property name="maxLength">
+        <number>34</number>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="addressBookButton">
+       <property name="toolTip">
+        <string>Choose adress from address book</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../bitcoin.qrc">
+         <normaloff>:/icons/address-book</normaloff>:/icons/address-book</iconset>
+       </property>
+       <property name="shortcut">
+        <string>Alt+A</string>
+       </property>
+       <property name="autoDefault">
+        <bool>false</bool>
+       </property>
+       <property name="flat">
+        <bool>false</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="pasteButton">
+       <property name="toolTip">
+        <string>Paste address from clipboard</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../bitcoin.qrc">
+         <normaloff>:/icons/editpaste</normaloff>:/icons/editpaste</iconset>
+       </property>
+       <property name="shortcut">
+        <string>Alt+P</string>
+       </property>
+       <property name="autoDefault">
+        <bool>false</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="deleteButton">
+       <property name="toolTip">
+        <string>Remove this recipient</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../bitcoin.qrc">
+         <normaloff>:/icons/remove</normaloff>:/icons/remove</iconset>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>BitcoinAmountField</class>
+   <extends>QLineEdit</extends>
+   <header>bitcoinamountfield.h</header>
+   <container>1</container>
+  </customwidget>
+  <customwidget>
+   <class>QValidatedLineEdit</class>
+   <extends>QLineEdit</extends>
+   <header>qvalidatedlineedit.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources>
+  <include location="../bitcoin.qrc"/>
+ </resources>
+ <connections/>
+</ui>
new file mode 100644
--- /dev/null
+++ b/src/qt/forms/transactiondescdialog.ui
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>TransactionDescDialog</class>
+ <widget class="QDialog" name="TransactionDescDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>300</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Transaction details</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QTextEdit" name="detailText">
+     <property name="toolTip">
+      <string>This pane shows a detailed description of the transaction</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Close</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>TransactionDescDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>TransactionDescDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
new file mode 100644
--- /dev/null
+++ b/src/qt/guiconstants.h
@@ -0,0 +1,23 @@
+#ifndef GUICONSTANTS_H
+#define GUICONSTANTS_H
+
+/* Milliseconds between model updates */
+static const int MODEL_UPDATE_DELAY = 500;
+
+/* Maximum  passphrase length */
+static const int MAX_PASSPHRASE_SIZE = 1024;
+
+/* Size of icons in status bar */
+static const int STATUSBAR_ICONSIZE = 16;
+
+/* Invalid field background style */
+#define STYLE_INVALID "background:#FF8080"
+
+/* Transaction list -- unconfirmed transaction */
+#define COLOR_UNCONFIRMED QColor(128, 128, 128)
+/* Transaction list -- negative amount */
+#define COLOR_NEGATIVE QColor(255, 0, 0)
+/* Transaction list -- bare address (without label) */
+#define COLOR_BAREADDRESS QColor(140, 140, 140)
+
+#endif // GUICONSTANTS_H
new file mode 100644
--- /dev/null
+++ b/src/qt/guiutil.cpp
@@ -0,0 +1,74 @@
+#include "guiutil.h"
+#include "bitcoinaddressvalidator.h"
+#include "walletmodel.h"
+#include "bitcoinunits.h"
+
+#include "headers.h"
+
+#include <QString>
+#include <QDateTime>
+#include <QDoubleValidator>
+#include <QFont>
+#include <QLineEdit>
+#include <QUrl>
+
+QString GUIUtil::dateTimeStr(qint64 nTime)
+{
+    return dateTimeStr(QDateTime::fromTime_t((qint32)nTime));
+}
+
+QString GUIUtil::dateTimeStr(const QDateTime &date)
+{
+    return date.date().toString(Qt::SystemLocaleShortDate) + QString(" ") + date.toString("hh:mm");
+}
+
+QFont GUIUtil::bitcoinAddressFont()
+{
+    QFont font("Monospace");
+    font.setStyleHint(QFont::TypeWriter);
+    return font;
+}
+
+void GUIUtil::setupAddressWidget(QLineEdit *widget, QWidget *parent)
+{
+    widget->setMaxLength(BitcoinAddressValidator::MaxAddressLength);
+    widget->setValidator(new BitcoinAddressValidator(parent));
+    widget->setFont(bitcoinAddressFont());
+}
+
+void GUIUtil::setupAmountWidget(QLineEdit *widget, QWidget *parent)
+{
+    QDoubleValidator *amountValidator = new QDoubleValidator(parent);
+    amountValidator->setDecimals(8);
+    amountValidator->setBottom(0.0);
+    widget->setValidator(amountValidator);
+    widget->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
+}
+
+bool GUIUtil::parseBitcoinURL(const QUrl *url, SendCoinsRecipient *out)
+{
+    if(url->scheme() != QString("bitcoin"))
+        return false;
+
+    SendCoinsRecipient rv;
+    rv.address = url->path();
+    rv.label = url->queryItemValue("label");
+
+    QString amount = url->queryItemValue("amount");
+    if(amount.isEmpty())
+    {
+        rv.amount = 0;
+    }
+    else // Amount is non-empty
+    {
+        if(!BitcoinUnits::parse(BitcoinUnits::BTC, amount, &rv.amount))
+        {
+            return false;
+        }
+    }
+    if(out)
+    {
+        *out = rv;
+    }
+    return true;
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/guiutil.h
@@ -0,0 +1,34 @@
+#ifndef GUIUTIL_H
+#define GUIUTIL_H
+
+#include <QString>
+
+QT_BEGIN_NAMESPACE
+class QFont;
+class QLineEdit;
+class QWidget;
+class QDateTime;
+class QUrl;
+QT_END_NAMESPACE
+class SendCoinsRecipient;
+
+class GUIUtil
+{
+public:
+    // Create human-readable string from date
+    static QString dateTimeStr(qint64 nTime);
+    static QString dateTimeStr(const QDateTime &datetime);
+
+    // Render bitcoin addresses in monospace font
+    static QFont bitcoinAddressFont();
+
+    // Set up widgets for address and amounts
+    static void setupAddressWidget(QLineEdit *widget, QWidget *parent);
+    static void setupAmountWidget(QLineEdit *widget, QWidget *parent);
+
+    // Parse "bitcoin:" URL into recipient object, return true on succesful parsing
+    // See Bitcoin URL definition discussion here: https://bitcointalk.org/index.php?topic=33490.0
+    static bool parseBitcoinURL(const QUrl *url, SendCoinsRecipient *out);
+};
+
+#endif // GUIUTIL_H
new file mode 100644
--- /dev/null
+++ b/src/qt/locale/bitcoin_de.ts
@@ -0,0 +1,1155 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="de_DE">
+<defaultcodec>UTF-8</defaultcodec>
+<context>
+    <name>AboutDialog</name>
+    <message>
+        <location filename="../forms/aboutdialog.ui" line="14"/>
+        <source>About Bitcoin</source>
+        <translation>Über Bitcoin</translation>
+    </message>
+    <message>
+        <location filename="../forms/aboutdialog.ui" line="53"/>
+        <source>&lt;b&gt;Bitcoin&lt;/b&gt; version</source>
+        <translation>&lt;b&gt;Bitcoin&lt;/b&gt; Version</translation>
+    </message>
+    <message>
+        <location filename="../forms/aboutdialog.ui" line="85"/>
+        <source>Copyright © 2009-2011 Bitcoin Developers
+
+This is experimental software.
+
+Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php.
+
+This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard.</source>
+        <translation>Copyright © 2009-2011 Bitcoin Developers
+
+Dies ist experimentelle Software.
+
+Veröffentlicht unter der MIT/X11 Software-Lizenz. Sie können diese in der beiligenden Datei license.txt oder unter http://www.opensource.org/licenses/mit-license.php nachlesen.
+
+Dieses Produkt enthält Software, welche vom OpenSSL Projekt zur Verwendung im OpenSSL Toolkit (http://www.openssl.org/) entwickelt wurde, kryptographische Software von Eric Young (eay@cryptsoft.com) und UPnP Software von Thomas-Bernard.</translation>
+    </message>
+</context>
+<context>
+    <name>AddressBookPage</name>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="14"/>
+        <source>Address Book</source>
+        <translation>Adressbuch</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="20"/>
+        <source>These are your Bitcoin addresses for receiving payments.  You may want to give a different one to each sender so you can keep track of who is paying you.</source>
+        <translation>Dies sind ihre Bitcoin-Adressen zum empfangen von Zahlungen. Um Ihre Zahlungen zurückverfolgen zu können ist es möglich jedem Sender eine andere Empfangsaddresse mitzuteilen.</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="33"/>
+        <source>Double-click to edit address or label</source>
+        <translation>Doppelklick zum Ändern der Adresse oder Beschreibung</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="57"/>
+        <source>Create a new address</source>
+        <translation>Neue Adresse erstellen</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="60"/>
+        <source>&amp;New Address...</source>
+        <translation>&amp;Neue Adresse...</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="71"/>
+        <source>Copy the currently selected address to the system clipboard</source>
+        <translation>Ausgewählte Adresse in die Zwischenablage kopieren</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="74"/>
+        <source>&amp;Copy to Clipboard</source>
+        <translation>&amp;In die Zwischenablage kopieren</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="85"/>
+        <source>Delete the currently selected address from the list. Only sending addresses can be deleted.</source>
+        <translation>Die ausgewählte Adresse aus der Liste entfernen. Sie können nur ausgehende Adressen entfernen.</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="88"/>
+        <source>&amp;Delete</source>
+        <translation>&amp;Löschen</translation>
+    </message>
+</context>
+<context>
+    <name>AddressTableModel</name>
+    <message>
+        <location filename="../addresstablemodel.cpp" line="78"/>
+        <source>Label</source>
+        <translation>Bezeichnung</translation>
+    </message>
+    <message>
+        <location filename="../addresstablemodel.cpp" line="78"/>
+        <source>Address</source>
+        <translation>Adresse</translation>
+    </message>
+    <message>
+        <location filename="../addresstablemodel.cpp" line="114"/>
+        <source>(no label)</source>
+        <translation>(keine Bezeichnung)</translation>
+    </message>
+</context>
+<context>
+    <name>BitcoinGUI</name>
+    <message>
+        <location filename="../bitcoingui.cpp" line="50"/>
+        <source>Bitcoin Wallet</source>
+        <translation>Bitcoin Wallet</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="112"/>
+        <source>Number of connections to other clients</source>
+        <translation>Anzahl der Verbindungen zu anderen Clients</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="117"/>
+        <source>Number of blocks in the block chain</source>
+        <translation>Anzahl der Blöcke in der Block-Chain</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="120"/>
+        <source>Synchronizing with network...</source>
+        <translation>Mit Netzwerk synchronisieren...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="123"/>
+        <source>Block chain synchronization in progress</source>
+        <translation>Synchronisierung der Block-Chain...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="140"/>
+        <source>&amp;Overview</source>
+        <translation>Übersicht</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="144"/>
+        <source>&amp;Transactions</source>
+        <translation>Transaktionen</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="148"/>
+        <source>&amp;Address Book</source>
+        <translation>Adressbuch</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="149"/>
+        <source>Edit the list of stored addresses and labels</source>
+        <translation>Adressen bearbeiten</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="153"/>
+        <source>&amp;Receive coins</source>
+        <translation>Bitcoins empfangen</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="154"/>
+        <source>Show the list of addresses for receiving payments</source>
+        <translation>Empfangsadressen anzeigen</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="158"/>
+        <source>&amp;Send coins</source>
+        <translation>Bitcoins senden</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="159"/>
+        <source>Send coins to a bitcoin address</source>
+        <translation>Bitcoins an eine Bitcoin-Adresse senden</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="169"/>
+        <source>&amp;Exit</source>
+        <translation>Beenden</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="170"/>
+        <source>Quit application</source>
+        <translation>Anwendung beenden</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="171"/>
+        <source>&amp;About</source>
+        <translation>Über</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="172"/>
+        <source>Show information about Bitcoin</source>
+        <translation>Informationen über Bitcoin</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="173"/>
+        <source>&amp;Options...</source>
+        <translation>Einstellungen</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="174"/>
+        <source>Modify configuration options for bitcoin</source>
+        <translation>Einstellungen ändern</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="175"/>
+        <source>Open &amp;Bitcoin</source>
+        <translation>Bitcoin öffnen</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="176"/>
+        <source>Show the Bitcoin window</source>
+        <translation>Bitcoin-Fenster anzeigen</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="177"/>
+        <source>&amp;Export...</source>
+        <translation>Exportieren...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="178"/>
+        <source>Export data in current view to a file</source>
+        <translation>Angezeigte Daten als Datei exportieren</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="193"/>
+        <source>Bitcoin Wallet [testnet]</source>
+        <translation>Bitcoin Wallet [testnet]</translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../bitcoingui.cpp" line="298"/>
+        <source>%n connection(s)</source>
+        <translation>
+            <numerusform>%n Verbindung(en)</numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../bitcoingui.cpp" line="317"/>
+        <source>%n block(s)</source>
+        <translation>
+            <numerusform>%n Blöcke</numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="375"/>
+        <source>This transaction is over the size limit.  You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network.  Do you want to pay the fee?</source>
+        <translation>Die Größe dieser Transaktion übersteigt das Limit.
+ Sie können die Coins jedoch senden, wenn sie einen zusätzlichen Betrag von 1% zahlen, 
+welcher an die Teilnehmer des Bitcoin-Netzwerkes ausgeschüttet wird und dieses unterstützt.
+Möchten Sie die zusätzliche Gebühr zahlen?</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="379"/>
+        <source>Sending...</source>
+        <translation>Senden...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="407"/>
+        <source>Incoming transaction</source>
+        <translation>Eingehende Transaktion</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="408"/>
+        <source>Date: </source>
+        <translation>Datum:</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="409"/>
+        <source>Amount: </source>
+        <translation>Betrag:</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="410"/>
+        <source>Type: </source>
+        <translation>Beschreibung:</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="411"/>
+        <source>Address: </source>
+        <translation>Adresse:</translation>
+    </message>
+</context>
+<context>
+    <name>EditAddressDialog</name>
+    <message>
+        <location filename="../forms/editaddressdialog.ui" line="14"/>
+        <source>Edit Address</source>
+        <translation>Adresse bearbeiten</translation>
+    </message>
+    <message>
+        <location filename="../forms/editaddressdialog.ui" line="25"/>
+        <source>&amp;Label</source>
+        <translation>Beschreibung</translation>
+    </message>
+    <message>
+        <location filename="../forms/editaddressdialog.ui" line="35"/>
+        <source>The label associated with this address book entry</source>
+        <translation>Name/Beschreibung des Adressbucheintrags</translation>
+    </message>
+    <message>
+        <location filename="../forms/editaddressdialog.ui" line="42"/>
+        <source>&amp;Address</source>
+        <translation>Adresse</translation>
+    </message>
+    <message>
+        <location filename="../forms/editaddressdialog.ui" line="52"/>
+        <source>The address associated with this address book entry. This can only be modified for sending addresses.</source>
+        <translation>Die Adresse des Adressbucheintrag. Diese kann nur für Zahlungsadressen bearbeitet werden.</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="20"/>
+        <source>New receiving address</source>
+        <translation>Neue Empfangsadresse</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="24"/>
+        <source>New sending address</source>
+        <translation>Neue Zahlungsadresse</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="27"/>
+        <source>Edit receiving address</source>
+        <translation>Empfangsadresse bearbeiten</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="31"/>
+        <source>Edit sending address</source>
+        <translation>Zahlungsadresse bearbeiten</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="89"/>
+        <source>The entered address &quot;%1&quot; is not a valid bitcoin address.</source>
+        <translation>Die eingegebene Adresse (&quot;%1&quot;) ist keine gültige Bitcoin-Adresse.</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="97"/>
+        <source>The entered address &quot;%1&quot; is already in the address book.</source>
+        <translation>Die eingegebene Adresse (&quot;%1&quot;) befindet sich bereits in Ihrem Adressbuch.</translation>
+    </message>
+</context>
+<context>
+    <name>MainOptionsPage</name>
+    <message>
+        <location filename="../optionsdialog.cpp" line="142"/>
+        <source>&amp;Start Bitcoin on window system startup</source>
+        <translation>Bitcoin beim Start des Systems ausführen</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="143"/>
+        <source>Automatically start Bitcoin after the computer is turned on</source>
+        <translation>Bitcoin automatisch beim Systemstart ausführen</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="146"/>
+        <source>&amp;Minimize to the tray instead of the taskbar</source>
+        <translation>In den Infobereich statt der Taskleiste minimieren</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="147"/>
+        <source>Show only a tray icon after minimizing the window</source>
+        <translation>Minimiert nur im Infobereich anzeigen.</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="150"/>
+        <source>Map port using &amp;UPnP</source>
+        <translation>Portweiterleitung via UPnP</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="151"/>
+        <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+        <translation>Öffnet den Bitcoin Client-Port automatisch auf dem Router. Dies funktioniert nur, wenn Ihr Router UPnP unterstützt und dies aktiviert ist.</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="154"/>
+        <source>M&amp;inimize on close</source>
+        <translation>Beim Schließen minimieren</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="155"/>
+        <source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu.</source>
+        <translation>Minimiert die Anwendung, wenn das Fenster geschlossen wird. Wenn dies aktiviert ist, müssen Sie das Programm über &quot;Beenden&quot; im Menü schließen.</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="158"/>
+        <source>&amp;Connect through SOCKS4 proxy:</source>
+        <translation>Über SOCKS4-Proxy verbinden:</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="159"/>
+        <source>Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor)</source>
+        <translation>Über SOCKS4-Proxy zum Bitcoin-Netzwerk verbinden (bspw. für eine Verbindung über Tor)</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="164"/>
+        <source>Proxy &amp;IP: </source>
+        <translation>Proxy-IP:</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="170"/>
+        <source>IP address of the proxy (e.g. 127.0.0.1)</source>
+        <translation>IP-Adresse des Proxys (z.B. 127.0.0.1)</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="173"/>
+        <source>&amp;Port: </source>
+        <translation>Port:</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="179"/>
+        <source>Port of the proxy (e.g. 1234)</source>
+        <translation>Port des Proxy-Servers (z.B. 1234)</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="185"/>
+        <source>Optional transaction fee per KB that helps make sure your transactions are processed quickly.  Most transactions are 1KB.  Fee 0.01 recommended.</source>
+        <translation>Zusätzliche Transaktionsgebühr per KB, welche sicherstellt dass Ihre Transaktionen schnell bearbeitet werden. Die meisten Transaktionen sind 1KB groß. Eine Gebühr von 0.01 wird empfohlen.</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="191"/>
+        <source>Pay transaction &amp;fee</source>
+        <translation>Transaktionsgebühr bezahlen</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="194"/>
+        <source>Optional transaction fee per KB that helps make sure your transactions are processed quickly. Most transactions are 1KB. Fee 0.01 recommended.</source>
+        <translation>Zusätzliche Transaktionsgebühr per KB, welche sicherstellt dass Ihre Transaktionen schnell bearbeitet werden. Die meisten Transaktionen sind 1KB groß. Eine Gebühr von 0.01 wird empfohlen.</translation>
+    </message>
+</context>
+<context>
+    <name>OptionsDialog</name>
+    <message>
+        <location filename="../optionsdialog.cpp" line="54"/>
+        <source>Main</source>
+        <translation>Haupt</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="74"/>
+        <source>Options</source>
+        <translation>Einstellungen</translation>
+    </message>
+</context>
+<context>
+    <name>OverviewPage</name>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="14"/>
+        <source>Form</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="38"/>
+        <source>Balance:</source>
+        <translation>Kontostand:</translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="45"/>
+        <source>123.456 BTC</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="52"/>
+        <source>Number of transactions:</source>
+        <translation>Anzahl der Transaktionen:</translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="59"/>
+        <source>0</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../overviewpage.cpp" line="14"/>
+        <source>Your current balance</source>
+        <translation>Kontostand</translation>
+    </message>
+</context>
+<context>
+    <name>SendCoinsDialog</name>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="14"/>
+        <location filename="../sendcoinsdialog.cpp" line="56"/>
+        <location filename="../sendcoinsdialog.cpp" line="78"/>
+        <location filename="../sendcoinsdialog.cpp" line="84"/>
+        <location filename="../sendcoinsdialog.cpp" line="90"/>
+        <location filename="../sendcoinsdialog.cpp" line="96"/>
+        <source>Send Coins</source>
+        <translation>Bitcoins überweisen</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="27"/>
+        <source>The address to send the payment to  (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
+        <translation>Empfangsadresse für die Überweisung (z.B. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="37"/>
+        <source>Look up adress in address book</source>
+        <translation>Adressbuch</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="47"/>
+        <source>Alt+A</source>
+        <translation>Alt+A</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="60"/>
+        <source>Paste address from system clipboard</source>
+        <translation>Adresse aus der Zwischenanlage einfügen</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="70"/>
+        <source>Alt+P</source>
+        <translation>Alt+P</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="82"/>
+        <source>A&amp;mount:</source>
+        <translation>Betrag:</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="95"/>
+        <source>Pay &amp;To:</source>
+        <translation>Empfänger:</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="113"/>
+        <source>Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
+        <translation>Bitcoin-Adresse eingeben (z.B. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="131"/>
+        <location filename="../sendcoinsdialog.cpp" line="23"/>
+        <source>Enter a label for this address to add it to your address book</source>
+        <translation>Beschreibung der Adresse im Adressbuch</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="140"/>
+        <source>&amp;Label:</source>
+        <translation>Beschreibung:</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="183"/>
+        <source>Confirm the send action</source>
+        <translation>Überweisung bestätigen</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="186"/>
+        <source>&amp;Send</source>
+        <translation>Überweisen</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="206"/>
+        <source>Abort the send action</source>
+        <translation>Überweisung abbrechen</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="57"/>
+        <source>Must fill in an amount to pay.</source>
+        <translation>Bitte geben Sie einen Betrag ein.</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="65"/>
+        <source>Confirm send coins</source>
+        <translation>Überweisung bestätigen</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="66"/>
+        <source>Are you sure you want to send %1 BTC to %2 (%3)?</source>
+        <translation>Möchten Sie %1 BTC an %2 (%3) überweisen?</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="79"/>
+        <source>The recepient address is not valid, please recheck.</source>
+        <translation>Die Empfangsadresse ist ungültig.</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="85"/>
+        <source>The amount to pay must be larger than 0.</source>
+        <translation>Der Betrag muss mehr als 0 betragen.</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="91"/>
+        <source>Amount exceeds your balance</source>
+        <translation>Der Betrag übersteigt ihren Kontostand</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="97"/>
+        <source>Total exceeds your balance when the %1 transaction fee is included</source>
+        <translation>Betrag übersteigt ihren Kontostand aufgrund der Transaktionsgebühren in Höhe von %1</translation>
+    </message>
+</context>
+<context>
+    <name>TransactionDescDialog</name>
+    <message>
+        <location filename="../forms/transactiondescdialog.ui" line="14"/>
+        <source>Transaction details</source>
+        <translation>Transaktionsübersicht</translation>
+    </message>
+    <message>
+        <location filename="../forms/transactiondescdialog.ui" line="20"/>
+        <source>This pane shows a detailed description of the transaction</source>
+        <translation>Dieses Fenster zeigt ihnen eine detaillierte Übersicht der Transaktion an</translation>
+    </message>
+</context>
+<context>
+    <name>TransactionTableModel</name>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="211"/>
+        <source>Status</source>
+        <translation>Status</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="211"/>
+        <source>Date</source>
+        <translation>Datum</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="211"/>
+        <source>Type</source>
+        <translation>Beschreibung</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="211"/>
+        <source>Address</source>
+        <translation>Adresse</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="211"/>
+        <source>Amount</source>
+        <translation>Betrag</translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../transactiontablemodel.cpp" line="272"/>
+        <source>Open for %n block(s)</source>
+        <translation>
+            <numerusform>Offen für %n Blöcke</numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="275"/>
+        <source>Open until %1</source>
+        <translation>Offen bis %1</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="278"/>
+        <source>Offline (%1 confirmations)</source>
+        <translation>Nicht verbunden (%1 Bestätigungen)</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="281"/>
+        <source>Unconfirmed (%1/%2 confirmations)</source>
+        <translation>Unbestätigt (%1/%2 Bestätigungen)</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="284"/>
+        <source>Confirmed (%1 confirmations)</source>
+        <translation>Bestätigt (%1 Bestätigungen)</translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../transactiontablemodel.cpp" line="293"/>
+        <source>Mined balance will be available in %n more blocks</source>
+        <translation>
+            <numerusform>Der Betrag wird in %n Blöcken verfügbar sein</numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="299"/>
+        <source>This block was not received by any other nodes and will probably not be accepted!</source>
+        <translation>Dieser Block wurde vom Netzwerk nicht angenommen und wird wahrscheinlich nicht bestätigt werden!</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="302"/>
+        <source>Generated but not accepted</source>
+        <translation>Generiert, jedoch nicht angenommen</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="348"/>
+        <source>Received with</source>
+        <translation>Empfangen durch</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="351"/>
+        <source>Received from IP</source>
+        <translation>Empfangen durch IP</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="354"/>
+        <source>Sent to</source>
+        <translation>An</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="357"/>
+        <source>Sent to IP</source>
+        <translation>An IP</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="360"/>
+        <source>Payment to yourself</source>
+        <translation>Überweisung an Sie selbst</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="363"/>
+        <source>Mined</source>
+        <translation>Erarbeitet</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="578"/>
+        <source>Transaction status. Hover over this field to show number of confirmations.</source>
+        <translation>Transaktionsstatus. Fahren Sie mit der Maus über dieses Feld um die Anzahl der Bestätigungen zu sehen.</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="580"/>
+        <source>Date and time that the transaction was received.</source>
+        <translation>Datum und Uhrzeit als die Transaktion empfangen wurde.</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="582"/>
+        <source>Type of transaction.</source>
+        <translation>Art der Transaktion.</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="584"/>
+        <source>Destination address of transaction.</source>
+        <translation>Empfangsadresse der Transaktion</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="586"/>
+        <source>Amount removed from or added to balance.</source>
+        <translation>Betrag vom Kontostand entfernt oder hinzugefügt.</translation>
+    </message>
+</context>
+<context>
+    <name>TransactionView</name>
+    <message>
+        <location filename="../transactionview.cpp" line="39"/>
+        <location filename="../transactionview.cpp" line="52"/>
+        <source>All</source>
+        <translation>Alle</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="40"/>
+        <source>Today</source>
+        <translation>Heute</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="41"/>
+        <source>This week</source>
+        <translation>Diese Woche</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="42"/>
+        <source>This month</source>
+        <translation>Diesen Monat</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="43"/>
+        <source>Last month</source>
+        <translation>Letzten Monat</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="44"/>
+        <source>This year</source>
+        <translation>Dieses Jahr</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="45"/>
+        <source>Range...</source>
+        <translation>Bereich...</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="53"/>
+        <source>Received with</source>
+        <translation>Empfangen durch</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="55"/>
+        <source>Sent to</source>
+        <translation>An</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="57"/>
+        <source>To yourself</source>
+        <translation>Zu Ihnen selbst</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="58"/>
+        <source>Mined</source>
+        <translation>Erarbeitet</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="59"/>
+        <source>Other</source>
+        <translation>Andere</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="208"/>
+        <source>Export Transaction Data</source>
+        <translation>Transaktionen exportieren</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="210"/>
+        <source>Comma separated file (*.csv)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="230"/>
+        <source>Error exporting</source>
+        <translation>Fehler beim exportieren</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="230"/>
+        <source>Could not write to file %1.</source>
+        <translation>Konnte Datei %1 nicht zum beschreiben öffnen</translation>
+    </message>
+</context>
+<context>
+    <name>WalletModel</name>
+    <message>
+        <location filename="../walletmodel.cpp" line="95"/>
+        <source>Sending...</source>
+        <translation>Senden...</translation>
+    </message>
+</context>
+<context>
+    <name>bitcoin-core</name>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="3"/>
+        <source>Bitcoin version</source>
+        <translation>Bitcoin Version</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="4"/>
+        <source>Usage:</source>
+        <translation>Verwendung:</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="5"/>
+        <source>Send command to -server or bitcoind
+</source>
+        <translation>RPC-Befehl an bitcoind schicken</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="6"/>
+        <source>List commands
+</source>
+        <translation>RPC-Befehle auflisten</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="7"/>
+        <source>Get help for a command
+</source>
+        <translation>Hilfe</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="8"/>
+        <source>Options:
+</source>
+        <translation>Einstellungen</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="9"/>
+        <source>Specify configuration file (default: bitcoin.conf)
+</source>
+        <translation>Bitte wählen Sie eine Konfigurationsdatei (Standard: bitcoin.conf)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="10"/>
+        <source>Specify pid file (default: bitcoind.pid)
+</source>
+        <translation>Bitte wählen Sie den Namen der PID Datei (Standard bitcoind.pid)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="11"/>
+        <source>Generate coins
+</source>
+        <translation>Erarbeite Bitcoins</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="12"/>
+        <source>Don&apos;t generate coins
+</source>
+        <translation>Keine BitCoins erstellen</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="13"/>
+        <source>Start minimized
+</source>
+        <translation>minimiert starten</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="14"/>
+        <source>Specify data directory
+</source>
+        <translation>Bitte wählen Sie das Datenverzeichnis</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="15"/>
+        <source>Specify connection timeout (in milliseconds)
+</source>
+        <translation>Netzwerkverbindungsabbruch nach (in Millisekunden)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="16"/>
+        <source>Connect through socks4 proxy
+</source>
+        <translation>Durch SOCKS4-Proxy verbinden</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="17"/>
+        <source>Allow DNS lookups for addnode and connect
+</source>
+        <translation>Erlaube DNS Namensauflösung für addnode und connect</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="18"/>
+        <source>Add a node to connect to
+</source>
+        <translation>Bitcoin Server registrieren</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="19"/>
+        <source>Connect only to the specified node
+</source>
+        <translation>Nur zu den angegebenen Servern verbinden</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="20"/>
+        <source>Don&apos;t accept connections from outside
+</source>
+        <translation>Keine externen Transatkionen akzeptieren</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="21"/>
+        <source>Don&apos;t attempt to use UPnP to map the listening port
+</source>
+        <translation>UPnP nicht verwenden</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="22"/>
+        <source>Attempt to use UPnP to map the listening port
+</source>
+        <translation>Versuche eine Verbindung mittels UPnP herzustellen</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="23"/>
+        <source>Fee per KB to add to transactions you send
+</source>
+        <translation>Gebühr pro KB (je von Ihnen verschickte Transatkion)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="24"/>
+        <source>Accept command line and JSON-RPC commands
+</source>
+        <translation>Erlaube Kommandozeilen und RPC Befehle</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="25"/>
+        <source>Run in the background as a daemon and accept commands
+</source>
+        <translation>Als Hintergrunddienst starten</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="26"/>
+        <source>Use the test network
+</source>
+        <translation>Im Testnetz starten</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="27"/>
+        <source>Username for JSON-RPC connections
+</source>
+        <translation>Benutzername für RPC Befehle</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="28"/>
+        <source>Password for JSON-RPC connections
+</source>
+        <translation>Passwort für RPC Befehle</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="29"/>
+        <source>Listen for JSON-RPC connections on &lt;port&gt; (default: 8332)
+</source>
+        <translation>Port für RPC Befehle</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="30"/>
+        <source>Allow JSON-RPC connections from specified IP address
+</source>
+        <translation>RPC Befehle nur von dieser IP-Adresse erlauben</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="31"/>
+        <source>Send commands to node running on &lt;ip&gt; (default: 127.0.0.1)
+</source>
+        <translation>Befehl an einen anderen BitCoin Server senden</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="32"/>
+        <source>Set key pool size to &lt;n&gt; (default: 100)
+</source>
+        <translation>Menge der vorgenerierten Adressen</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="33"/>
+        <source>Rescan the block chain for missing wallet transactions
+</source>
+        <translation>Block-Chain nach verlorenen Transaktionen durchsuchen (rescan)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="34"/>
+        <source>
+SSL options: (see the Bitcoin Wiki for SSL setup instructions)
+</source>
+        <translation>SSL Einstellungen (Bitte sehen Sie für eine detallierte Beschreibung im BitCoin-Wiki nach</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="37"/>
+        <source>Use OpenSSL (https) for JSON-RPC connections
+</source>
+        <translation>RPC Befehle über HTTPS</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="38"/>
+        <source>Server certificate file (default: server.cert)
+</source>
+        <translation>SSL Server Zertifikat</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="39"/>
+        <source>Server private key (default: server.pem)
+</source>
+        <translation>Privater SSL Schlüssel (Standard: server.pem)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="40"/>
+        <source>Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)
+</source>
+        <translation>Erlaubte Kryptographiealgorithmen (Standard: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="43"/>
+        <source>This help message
+</source>
+        <translation>Dieser Hilfetext</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="44"/>
+        <source>Cannot obtain a lock on data directory %s.  Bitcoin is probably already running.</source>
+        <translation>Konnte das Datenverzeichnis %s nicht sperren. Evtl. wurde das Programm mehrfach gestartet.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="47"/>
+        <source>Error loading addr.dat      
+</source>
+        <translation>Fehler beim laden der addr.dat</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="48"/>
+        <source>Error loading blkindex.dat      
+</source>
+        <translation>Fehler beim laden der blkindex.dat</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="49"/>
+        <source>Error loading wallet.dat      
+</source>
+        <translation>Fehler beim laden von wallet.dat</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="50"/>
+        <source>Invalid -proxy address</source>
+        <translation>Fehlerhafte Proxy Adresse</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="51"/>
+        <source>Invalid amount for -paytxfee=&lt;amount&gt;</source>
+        <translation>Ungültige Angabe für -paytxfee=&lt;Betrag&gt;</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="52"/>
+        <source>Warning: -paytxfee is set very high.  This is the transaction fee you will pay if you send a transaction.</source>
+        <translation>Warnung: -paytxfee ist auf einen sehr hohen Wert gesetzt. Dies ist die Gebühr die beim senden einer Transaktion fällig wird.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="55"/>
+        <source>Warning: Disk space is low  </source>
+        <translation>Warnung: Festplattenplatz wird knapp.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="56"/>
+        <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds  </source>
+        <translation>Fehler: Diese Transaktion erfordert eine Gebühr von mindestens %s. Die Gebühr wird fällig aufgrund der Größe, der Komplexität oder der Verwendung erst kürzlich erhaltener BitCoins</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="59"/>
+        <source>Error: Transaction creation failed  </source>
+        <translation>Fehler: Die Transaktion konnte nicht erstellt werden.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="60"/>
+        <source>Sending...</source>
+        <translation>Senden...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="61"/>
+        <source>Error: The transaction was rejected.  This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
+        <translation>Fehler: Die Transaktion wurde zurückgewiesen. Dies kann passieren wenn einige Ihrer BitCoins bereits ausgegeben wurde (zB aus einer Sicherungskopie Ihrer wallet.dat)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="65"/>
+        <source>Invalid amount</source>
+        <translation>Fehlerhafter Betrag</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="66"/>
+        <source>Insufficient funds</source>
+        <translation>Unzureichender Kontostand</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="67"/>
+        <source>Invalid bitcoin address</source>
+        <translation>Fehlerhafte Bitcoin Adresse</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="68"/>
+        <source>Unable to bind to port %d on this computer.  Bitcoin is probably already running.</source>
+        <translation>Fehler beim registrieren des Ports %d auf diesem Computer. Evtl. läuft BitCoin bereits</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="71"/>
+        <source>To use the %s option</source>
+        <translation>Um die Option %s zuu verwenden</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="72"/>
+        <source>Warning: %s, you must set rpcpassword=&lt;password&gt;
+in the configuration file: %s
+If the file does not exist, create it with owner-readable-only file permissions.
+</source>
+        <translation>Warnung: Sie müssen rpcpassword=password in der Konfigurationsdatei angeben.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="77"/>
+        <source>You must set rpcpassword=&lt;password&gt; in the configuration file:
+%s
+If the file does not exist, create it with owner-readable-only file permissions.</source>
+        <translation>Sie müssen rpcpassword=password in der Konfigurationsdatei angeben.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="82"/>
+        <source>Warning: Please check that your computer&apos;s date and time are correct.  If your clock is wrong Bitcoin will not work properly.</source>
+        <translation>Bitte prüfen Sie Ihre Datums- und Uhrzeiteinstellungen, ansonsten kann es sein das BitCoin nicht ordnungsgemäss funktioniert.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="85"/>
+        <source>-beta</source>
+        <translation>-beta</translation>
+    </message>
+</context>
+</TS>
new file mode 100644
--- /dev/null
+++ b/src/qt/locale/bitcoin_nl.ts
@@ -0,0 +1,1441 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="nl_NL">
+<defaultcodec>UTF-8</defaultcodec>
+<context>
+    <name>AboutDialog</name>
+    <message>
+        <location filename="../forms/aboutdialog.ui" line="14"/>
+        <source>About Bitcoin</source>
+        <translation>Over Bitcoin
+</translation>
+    </message>
+    <message>
+        <location filename="../forms/aboutdialog.ui" line="53"/>
+        <source>&lt;b&gt;Bitcoin&lt;/b&gt; version</source>
+        <translation>&lt;b&gt;Bitcoin&lt;/b&gt; versie</translation>
+    </message>
+    <message>
+        <location filename="../forms/aboutdialog.ui" line="85"/>
+        <source>Copyright © 2009-2011 Bitcoin Developers
+
+This is experimental software.
+
+Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php.
+
+This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard.</source>
+        <translation>Copyright © 2009-2011 Bitcoin-ontwikkelaars
+
+Dit is experimentele software.
+
+Gedistributeerd onder de MIT/X11 software licentie, zie het bijgevoegde bestand 
+license.txt of kijk op http://www.opensource.org/licenses/mit-license.php.
+
+Dit product bevat software ontwikkeld door het OpenSSL project for gebruik 
+in de OpenSSL Toolkit (http://www.openssl.org/), en cryptografische 
+software geschreven door Eric Young (eay@cryptsoft.com)) en UPnP software geschreven
+door Thomas Bernard.
+</translation>
+    </message>
+</context>
+<context>
+    <name>AddressBookDialog</name>
+    <message>
+        <source>Address Book</source>
+        <translation type="obsolete">Adresboek</translation>
+    </message>
+    <message>
+        <source>Sending</source>
+        <translation type="obsolete">Versturen</translation>
+    </message>
+    <message>
+        <source>Receiving</source>
+        <translation type="obsolete">Ontvangen</translation>
+    </message>
+    <message>
+        <source>These are your Bitcoin addresses for receiving payments.  You may want to give a different one to each sender so you can keep track of who is paying you.  The highlighted address is displayed in the main window.</source>
+        <translation type="obsolete">Dit zijn je bitcoin-adressen voor het ontvangen van betalingen.  Het is een goed idee iedere afzender een ander adres te geven zodat je bij kunt houden wie je een betaling stuurt. Het geselecteerde adres is zichtbaar in het hoofdscherm.</translation>
+    </message>
+    <message>
+        <source>Create a new address</source>
+        <translation type="obsolete">Voeg een nieuw adres toe</translation>
+    </message>
+    <message>
+        <source>&amp;New Address...</source>
+        <translation type="obsolete">&amp;Nieuw adres...</translation>
+    </message>
+    <message>
+        <source>Copy the currently selected address to the system clipboard</source>
+        <translation type="obsolete">Kopieer het geselecteerde adres naar het plakbord</translation>
+    </message>
+    <message>
+        <source>&amp;Copy to Clipboard</source>
+        <translation type="obsolete">&amp;Kopieer naar plakbord</translation>
+    </message>
+    <message>
+        <source>Edit the currently selected address</source>
+        <translation type="obsolete">Bewerk het geselecteerde adres</translation>
+    </message>
+    <message>
+        <source>&amp;Edit...</source>
+        <translation type="obsolete">&amp;Bewerken...</translation>
+    </message>
+    <message>
+        <source>Delete the currently selected address from the list. Only sending addresses can be deleted.</source>
+        <translation type="obsolete">Verwijder het geselecteerde adres. Alleen verstuur-adressen kunnen worden verwijderd.</translation>
+    </message>
+    <message>
+        <source>&amp;Delete</source>
+        <translation type="obsolete">&amp;Verwijderen</translation>
+    </message>
+</context>
+<context>
+    <name>AddressBookPage</name>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="14"/>
+        <source>Address Book</source>
+        <translation type="unfinished">Adresboek</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="20"/>
+        <source>These are your Bitcoin addresses for receiving payments.  You may want to give a different one to each sender so you can keep track of who is paying you.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="33"/>
+        <source>Double-click to edit address or label</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="57"/>
+        <source>Create a new address</source>
+        <translation type="unfinished">Voeg een nieuw adres toe</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="60"/>
+        <source>&amp;New Address...</source>
+        <translation type="unfinished">&amp;Nieuw adres...</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="71"/>
+        <source>Copy the currently selected address to the system clipboard</source>
+        <translation type="unfinished">Kopieer het geselecteerde adres naar het plakbord</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="74"/>
+        <source>&amp;Copy to Clipboard</source>
+        <translation type="unfinished">&amp;Kopieer naar plakbord</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="85"/>
+        <source>Delete the currently selected address from the list. Only sending addresses can be deleted.</source>
+        <translation type="unfinished">Verwijder het geselecteerde adres. Alleen verstuur-adressen kunnen worden verwijderd.</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="88"/>
+        <source>&amp;Delete</source>
+        <translation type="unfinished">&amp;Verwijderen</translation>
+    </message>
+</context>
+<context>
+    <name>AddressTableModel</name>
+    <message>
+        <location filename="../addresstablemodel.cpp" line="78"/>
+        <source>Label</source>
+        <translation>Label</translation>
+    </message>
+    <message>
+        <location filename="../addresstablemodel.cpp" line="78"/>
+        <source>Address</source>
+        <translation>Adres</translation>
+    </message>
+    <message>
+        <location filename="../addresstablemodel.cpp" line="114"/>
+        <source>(no label)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default receiving address</source>
+        <translation type="obsolete">Standaard ontvangst-adres</translation>
+    </message>
+</context>
+<context>
+    <name>BitcoinGUI</name>
+    <message>
+        <source>Bitcoin</source>
+        <translation type="obsolete">Bitcoin</translation>
+    </message>
+    <message>
+        <source>Your Bitcoin address:</source>
+        <translation type="obsolete">Uw bitcoin-adres:</translation>
+    </message>
+    <message>
+        <source>Your current default receiving address</source>
+        <translation type="obsolete">Uw huidig standaard ontvangst-adres</translation>
+    </message>
+    <message>
+        <source>&amp;New...</source>
+        <translation type="obsolete">&amp;Nieuw...</translation>
+    </message>
+    <message>
+        <source>Create new receiving address</source>
+        <translation type="obsolete">Maak nieuw ontvangst-adres</translation>
+    </message>
+    <message>
+        <source>&amp;Copy to clipboard</source>
+        <translation type="obsolete">&amp;Kopieer naar plakbord</translation>
+    </message>
+    <message>
+        <source>Copy current receiving address to the system clipboard</source>
+        <translation type="obsolete">Kopieer huidig ontvangst-adres naar plakbord</translation>
+    </message>
+    <message>
+        <source>Balance:</source>
+        <translation type="obsolete">Saldo:</translation>
+    </message>
+    <message>
+        <source>Your current balance</source>
+        <translation type="obsolete">Uw huidige saldo</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="112"/>
+        <source>Number of connections to other clients</source>
+        <translation>Aantal verbindingen met andere clients</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="117"/>
+        <source>Number of blocks in the block chain</source>
+        <translation>Aantal blokken in de block-chain</translation>
+    </message>
+    <message>
+        <source>Number of transactions in your wallet</source>
+        <translation type="obsolete">Aantal transacties in je portefeuille</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="120"/>
+        <source>Synchronizing with network...</source>
+        <translation>Synchroniseren met netwerk...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="123"/>
+        <source>Block chain synchronization in progress</source>
+        <translation>Bezig met blokken-database-synchronisatie</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="169"/>
+        <source>&amp;Exit</source>
+        <translation>A&amp;fsluiten</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="170"/>
+        <source>Quit application</source>
+        <translation>De applicatie afsluiten</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="158"/>
+        <source>&amp;Send coins</source>
+        <translation>&amp;Verstuur coins</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="159"/>
+        <source>Send coins to a bitcoin address</source>
+        <translation>Coins versturen naar een bitcoin-adres</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="148"/>
+        <source>&amp;Address Book</source>
+        <translation>&amp;Adresboek</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="50"/>
+        <source>Bitcoin Wallet</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="140"/>
+        <source>&amp;Overview</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="144"/>
+        <source>&amp;Transactions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="149"/>
+        <source>Edit the list of stored addresses and labels</source>
+        <translation>Bewerk de lijst van adressen en labels</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="153"/>
+        <source>&amp;Receive coins</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="154"/>
+        <source>Show the list of addresses for receiving payments</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="171"/>
+        <source>&amp;About</source>
+        <translation>&amp;Over Bitcoin</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="172"/>
+        <source>Show information about Bitcoin</source>
+        <translation>Laat informatie zien over Bitcoin</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="177"/>
+        <source>&amp;Export...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="178"/>
+        <source>Export data in current view to a file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="193"/>
+        <source>[testnet]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="408"/>
+        <source>Date: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="409"/>
+        <source>Amount: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="410"/>
+        <source>Type: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="411"/>
+        <source>Address: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Your &amp;Receiving Addresses...</source>
+        <translation type="obsolete">&amp;Uw ontvangstadressen...</translation>
+    </message>
+    <message>
+        <source>Show the list of receiving addresses and edit their labels</source>
+        <translation type="obsolete">Laat de lijst zien van ontvangst-adressen en bewerk de labels</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="173"/>
+        <source>&amp;Options...</source>
+        <translation>&amp;Opties...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="174"/>
+        <source>Modify configuration options for bitcoin</source>
+        <translation>Verander instellingen van Bitcoin</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="175"/>
+        <source>Open &amp;Bitcoin</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="176"/>
+        <source>Show the Bitcoin window</source>
+        <translation>Laat het Bitcoin-venster zien</translation>
+    </message>
+    <message>
+        <source>All transactions</source>
+        <translation type="obsolete">Alle transacties</translation>
+    </message>
+    <message>
+        <source>Sent/Received</source>
+        <translation type="obsolete">Verzonden/Ontvangen</translation>
+    </message>
+    <message>
+        <source>Sent</source>
+        <translation type="obsolete">Verzonden</translation>
+    </message>
+    <message>
+        <source>Received</source>
+        <translation type="obsolete">Ontvangen</translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../bitcoingui.cpp" line="298"/>
+        <source>%n connection(s)</source>
+        <translation>
+            <numerusform>%n verbinding</numerusform>
+            <numerusform>%n verbindingen</numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../bitcoingui.cpp" line="317"/>
+        <source>%n block(s)</source>
+        <translation>
+            <numerusform>%n blok</numerusform>
+            <numerusform>%n blokken</numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>%n transaction(s)</source>
+        <translation type="obsolete">
+            <numerusform>%n transactie</numerusform>
+            <numerusform>%n transacties</numerusform>
+        </translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="375"/>
+        <source>This transaction is over the size limit.  You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network.  Do you want to pay the fee?</source>
+        <translation>Deze transactie overschrijdt de limiet.  Om de transactie alsnog te verwerken kun je een fooi betalen van %1. Deze zal betaald worden aan de node die uw transactie verwerkt. Wil je doorgaan en deze fooi betalen?</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="379"/>
+        <source>Sending...</source>
+        <translation>Versturen...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="407"/>
+        <source>Incoming transaction</source>
+        <translation>Binnenkomende transactie</translation>
+    </message>
+</context>
+<context>
+    <name>ClientModel</name>
+    <message>
+        <source>Sending...</source>
+        <translation type="obsolete">Versturen...</translation>
+    </message>
+</context>
+<context>
+    <name>EditAddressDialog</name>
+    <message>
+        <location filename="../forms/editaddressdialog.ui" line="14"/>
+        <source>Edit Address</source>
+        <translation>Bewerk Adres</translation>
+    </message>
+    <message>
+        <location filename="../forms/editaddressdialog.ui" line="25"/>
+        <source>&amp;Label</source>
+        <translation>&amp;Label</translation>
+    </message>
+    <message>
+        <location filename="../forms/editaddressdialog.ui" line="42"/>
+        <source>&amp;Address</source>
+        <translation>&amp;Adres</translation>
+    </message>
+    <message>
+        <location filename="../forms/editaddressdialog.ui" line="35"/>
+        <source>The label associated with this address book entry</source>
+        <translation>Het label dat is geassocieerd met dit adres</translation>
+    </message>
+    <message>
+        <location filename="../forms/editaddressdialog.ui" line="52"/>
+        <source>The address associated with this address book entry. This can only be modified for sending addresses.</source>
+        <translation>Het adres dat is geassocieerd met de label. Dit kan alleen worden veranderd voor verzend-adressen.</translation>
+    </message>
+    <message>
+        <source>Set as default receiving address</source>
+        <translation type="obsolete">Stel in as standaard ontvangst-adres</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="20"/>
+        <source>New receiving address</source>
+        <translation>Nieuw ontvangst-adres</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="24"/>
+        <source>New sending address</source>
+        <translation>Nieuw verzend-adres</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="27"/>
+        <source>Edit receiving address</source>
+        <translation>Bewerk ontvangst-adres</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="31"/>
+        <source>Edit sending address</source>
+        <translation>Bewerk ontvangst-adres</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="89"/>
+        <source>The entered address &quot;%1&quot; is not a valid bitcoin address.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="97"/>
+        <source>The entered address &quot;%1&quot; is already in the address book.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The address %1 is already in the address book.</source>
+        <translation type="obsolete">Het adres %1 staat al in het adresboek.</translation>
+    </message>
+</context>
+<context>
+    <name>MainOptionsPage</name>
+    <message>
+        <location filename="../optionsdialog.cpp" line="142"/>
+        <source>&amp;Start Bitcoin on window system startup</source>
+        <translation>&amp;Start Bitcoin wanneer het systeem opstart</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="143"/>
+        <source>Automatically start Bitcoin after the computer is turned on</source>
+        <translation>Start Bitcoin automatisch wanneer het systeem start</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="146"/>
+        <source>&amp;Minimize to the tray instead of the taskbar</source>
+        <translation>&amp;Minimaliseer tot systeemvak in plaats van de taakbalk</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="147"/>
+        <source>Show only a tray icon after minimizing the window</source>
+        <translation>Laat alleen een systeemvak-icoon zien wanneer het venster geminimaliseerd is</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="150"/>
+        <source>Map port using &amp;UPnP</source>
+        <translation>Portmapping via &amp;UPnP</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="151"/>
+        <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+        <translation>Open de Bitcoin-poort automatisch op de router. Dit werkt alleen als de router UPnP ondersteunt.</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="154"/>
+        <source>M&amp;inimize on close</source>
+        <translation>&amp;Minimaliseer bij sluiten van het venster</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="155"/>
+        <source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu.</source>
+        <translation>Minimiliseer het venster in de plaats van de applicatie af te sluiten als het venster gesloten wordt. Wanneer deze optie aan staan, kan de applicatie alleen worden afgesloten door Afsluiten te kiezen in het menu.</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="158"/>
+        <source>&amp;Connect through SOCKS4 proxy:</source>
+        <translation>&amp;Verbind via socks4 proxy: </translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="159"/>
+        <source>Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor)</source>
+        <translation>Verbind met het Bitcoin-netwerk door een SOCKS4 proxy (bijvoorbeeld Tor)</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="164"/>
+        <source>Proxy &amp;IP: </source>
+        <translation>Proxy &amp;IP:</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="170"/>
+        <source>IP address of the proxy (e.g. 127.0.0.1)</source>
+        <translation>IP adres van de proxy (bijv. 127.0.0.1)</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="173"/>
+        <source>&amp;Port: </source>
+        <translation>&amp;Poort:</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="179"/>
+        <source>Port of the proxy (e.g. 1234)</source>
+        <translation>Poort waarop de proxy luistert (bijv. 1234)</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="185"/>
+        <source>Optional transaction fee per KB that helps make sure your transactions are processed quickly.  Most transactions are 1KB.  Fee 0.01 recommended.</source>
+        <translation>Optionele transactiefooi per KB die helpt ervoor zorgen dat uw transacties snel verwerkt worden. De meeste transacties zijn 1KB. Fooi 0.01 is aangeraden.</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="191"/>
+        <source>Pay transaction &amp;fee</source>
+        <translation>Transactie&amp;fooi</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="194"/>
+        <source>Optional transaction fee per KB that helps make sure your transactions are processed quickly. Most transactions are 1KB. Fee 0.01 recommended.</source>
+        <translation>Optionele transactiefooi per KB die helpt ervoor zorgen dat uw transacties snel verwerkt worden. De meeste transacties zijn 1KB. Fooi 0.01 is aangeraden.</translation>
+    </message>
+</context>
+<context>
+    <name>OptionsDialog</name>
+    <message>
+        <location filename="../optionsdialog.cpp" line="54"/>
+        <source>Main</source>
+        <translation>Algemeen</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="74"/>
+        <source>Options</source>
+        <translation>Opties</translation>
+    </message>
+</context>
+<context>
+    <name>OverviewPage</name>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="38"/>
+        <source>Balance:</source>
+        <translation type="unfinished">Saldo:</translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="45"/>
+        <source>123.456 BTC</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="52"/>
+        <source>Number of transactions:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="59"/>
+        <source>0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../overviewpage.cpp" line="14"/>
+        <source>Your current balance</source>
+        <translation type="unfinished">Uw huidige saldo</translation>
+    </message>
+</context>
+<context>
+    <name>SendCoinsDialog</name>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="14"/>
+        <location filename="../sendcoinsdialog.cpp" line="56"/>
+        <location filename="../sendcoinsdialog.cpp" line="78"/>
+        <location filename="../sendcoinsdialog.cpp" line="84"/>
+        <location filename="../sendcoinsdialog.cpp" line="90"/>
+        <location filename="../sendcoinsdialog.cpp" line="96"/>
+        <source>Send Coins</source>
+        <translation>Verstuur coins</translation>
+    </message>
+    <message>
+        <source>&amp;Amount:</source>
+        <translation type="obsolete">&amp;Hoeveelheid:</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="95"/>
+        <source>Pay &amp;To:</source>
+        <translation>Betaal &amp;aan:</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="27"/>
+        <source>The address to send the payment to  (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
+        <translation>Voer een bitcoin-adres (bijvoorbeeld: 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="47"/>
+        <source>Alt+A</source>
+        <translation>Alt+A</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="60"/>
+        <source>Paste address from system clipboard</source>
+        <translation>Plak adres uit systeemplakbord</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="131"/>
+        <location filename="../sendcoinsdialog.cpp" line="23"/>
+        <source>Enter a label for this address to add it to your address book</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="140"/>
+        <source>&amp;Label:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Paste</source>
+        <translation type="obsolete">&amp;Plakken</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="37"/>
+        <source>Look up adress in address book</source>
+        <translation>Opzoeken in adresboek</translation>
+    </message>
+    <message>
+        <source>Address &amp;Book...</source>
+        <translation type="obsolete">Adres&amp;boek....</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="70"/>
+        <source>Alt+P</source>
+        <translation>Alt+P</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="82"/>
+        <source>A&amp;mount:</source>
+        <translation>&amp;Hoeveelheid:</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="113"/>
+        <source>Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
+        <translation>Voer een bitcoin-adres in (bijvoorbeeld: 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</translation>
+    </message>
+    <message>
+        <source>Add specified destination address to address book</source>
+        <translation type="obsolete">Voeg het ingevoerde doel-adres toe aan het adresboek</translation>
+    </message>
+    <message>
+        <source>A&amp;dd to address book as</source>
+        <translation type="obsolete">&amp;Voeg toe aan adresboek als</translation>
+    </message>
+    <message>
+        <source>Label to add address as</source>
+        <translation type="obsolete">Label om toe te kennen aan adres in adresboek</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="183"/>
+        <source>Confirm the send action</source>
+        <translation>Bevestig de zend-transactie</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="186"/>
+        <source>&amp;Send</source>
+        <translation>&amp;Versturen</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="206"/>
+        <source>Abort the send action</source>
+        <translation>De transactie annuleren</translation>
+    </message>
+    <message>
+        <source>The amount to pay must be a valid number.</source>
+        <translation type="obsolete">Het ingevoerde bedrag is geen geldig getal.</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="57"/>
+        <source>Must fill in an amount to pay.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="65"/>
+        <source>Confirm send coins</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="66"/>
+        <source>Are you sure you want to send %1 BTC to %2 (%3)?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="79"/>
+        <source>The recepient address is not valid, please recheck.</source>
+        <translation>Het verzendadres is niet geld.</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="85"/>
+        <source>The amount to pay must be larger than 0.</source>
+        <translation>Het ingevoerde gedrag moet groter zijn dan 0.</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="91"/>
+        <source>Amount exceeds your balance</source>
+        <translation>Hoeveelheid overschrijdt uw huidige balans</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="97"/>
+        <source>Total exceeds your balance when the %1 transaction fee is included</source>
+        <translation>Totaal overschrijdt uw huidige balans wanneer de %1 transactiefooi is meegerekend</translation>
+    </message>
+</context>
+<context>
+    <name>TransactionDescDialog</name>
+    <message>
+        <location filename="../forms/transactiondescdialog.ui" line="14"/>
+        <source>Transaction details</source>
+        <translation>Transactiedetails</translation>
+    </message>
+    <message>
+        <location filename="../forms/transactiondescdialog.ui" line="20"/>
+        <source>This pane shows a detailed description of the transaction</source>
+        <translation>Dit venster laat een uitgebreide beschrijving van de transactie zien</translation>
+    </message>
+</context>
+<context>
+    <name>TransactionTableModel</name>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="211"/>
+        <source>Status</source>
+        <translation>Status</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="211"/>
+        <source>Date</source>
+        <translation>Datum</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="211"/>
+        <source>Type</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="211"/>
+        <source>Address</source>
+        <translation type="unfinished">Adres</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="211"/>
+        <source>Amount</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="278"/>
+        <source>Offline (%1 confirmations)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="281"/>
+        <source>Unconfirmed (%1/%2 confirmations)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="284"/>
+        <source>Confirmed (%1 confirmations)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../transactiontablemodel.cpp" line="293"/>
+        <source>Mined balance will be available in %n more blocks</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="299"/>
+        <source>This block was not received by any other nodes and will probably not be accepted!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="302"/>
+        <source>Generated but not accepted</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="348"/>
+        <source>Received with</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="351"/>
+        <source>Received from IP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="354"/>
+        <source>Sent to</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="357"/>
+        <source>Sent to IP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="363"/>
+        <source>Mined</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="582"/>
+        <source>Type of transaction.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="584"/>
+        <source>Destination address of transaction.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="586"/>
+        <source>Amount removed from or added to balance.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Description</source>
+        <translation type="obsolete">Beschrijving</translation>
+    </message>
+    <message>
+        <source>Debit</source>
+        <translation type="obsolete">Debet</translation>
+    </message>
+    <message>
+        <source>Credit</source>
+        <translation type="obsolete">Credit</translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../transactiontablemodel.cpp" line="272"/>
+        <source>Open for %n block(s)</source>
+        <translation>
+            <numerusform>Open gedurende %n blok</numerusform>
+            <numerusform>Open gedurende %n blokken</numerusform>
+        </translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="275"/>
+        <source>Open until %1</source>
+        <translation>Open tot %1</translation>
+    </message>
+    <message>
+        <source>Offline (%1)</source>
+        <translation type="obsolete">Offline (%1)</translation>
+    </message>
+    <message>
+        <source>Unconfirmed (%1/%2)</source>
+        <translation type="obsolete">Niet bevestigd (%1/%2)</translation>
+    </message>
+    <message>
+        <source>Confirmed (%1)</source>
+        <translation type="obsolete">Bevestigd (%1)</translation>
+    </message>
+    <message>
+        <source>Received with: </source>
+        <translation type="obsolete">Ontvangen met:</translation>
+    </message>
+    <message>
+        <source>Received from IP: </source>
+        <translation type="obsolete">Ontvangen van IP:</translation>
+    </message>
+    <message>
+        <source>Sent to: </source>
+        <translation type="obsolete">Verzonden aan:</translation>
+    </message>
+    <message>
+        <source>Sent to IP: </source>
+        <translation type="obsolete">Verzonden aan IP:</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="360"/>
+        <source>Payment to yourself</source>
+        <translation>Betaling aan uzelf</translation>
+    </message>
+    <message numerus="yes">
+        <source>Generated (matures in %n more blocks)</source>
+        <translation type="obsolete">
+            <numerusform>Gegenereerd (wordt volwassen na %n blok)</numerusform>
+            <numerusform>Gegenereerd (wordt volwassen na %n blokken)</numerusform>
+        </translation>
+    </message>
+    <message>
+        <source>Generated</source>
+        <translation type="obsolete">Gegenereerd</translation>
+    </message>
+    <message>
+        <source>Generated - Warning: This block was not received by any other nodes and will probably not be accepted!</source>
+        <translation type="obsolete">Gegenereerd - Waarschuwing: Dit blok is niet ontvangen door andere nodes en zal waarschijnlijk niet geaccepteerd worden!</translation>
+    </message>
+    <message>
+        <source>Generated (not accepted)</source>
+        <translation type="obsolete">Gegenereerd (niet geaccepteerd)</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="578"/>
+        <source>Transaction status. Hover over this field to show number of confirmations.</source>
+        <translation>Transactiestatus. Hou de muiscursor boven dit veld om het aantal bevestigingen te laten zien.</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="580"/>
+        <source>Date and time that the transaction was received.</source>
+        <translation>Datum en tijd waarop deze transactie is ontvangen.</translation>
+    </message>
+    <message>
+        <source>Short description of the transaction.</source>
+        <translation type="obsolete">Korte beschrijving van de transactie.</translation>
+    </message>
+    <message>
+        <source>Amount removed from balance.</source>
+        <translation type="obsolete">Bedrag afgeschreven van saldo.</translation>
+    </message>
+    <message>
+        <source>Amount added to balance.</source>
+        <translation type="obsolete">Bedrag bijgeschreven bij saldo.</translation>
+    </message>
+</context>
+<context>
+    <name>TransactionView</name>
+    <message>
+        <location filename="../transactionview.cpp" line="39"/>
+        <location filename="../transactionview.cpp" line="52"/>
+        <source>All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="40"/>
+        <source>Today</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="41"/>
+        <source>This week</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="42"/>
+        <source>This month</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="43"/>
+        <source>Last month</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="44"/>
+        <source>This year</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="45"/>
+        <source>Range...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="53"/>
+        <source>Received with</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="55"/>
+        <source>Sent to</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="57"/>
+        <source>To yourself</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="58"/>
+        <source>Mined</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="59"/>
+        <source>Other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="209"/>
+        <source>Export Transaction Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="211"/>
+        <source>Comma separated file (*.csv)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="231"/>
+        <source>Error exporting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="231"/>
+        <source>Could not write to file %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>WalletModel</name>
+    <message>
+        <location filename="../walletmodel.cpp" line="95"/>
+        <source>Sending...</source>
+        <translation type="unfinished">Versturen...</translation>
+    </message>
+</context>
+<context>
+    <name>bitcoin-core</name>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="3"/>
+        <source>Bitcoin version</source>
+        <translation>Bitcoin</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="4"/>
+        <source>Usage:</source>
+        <translation>Gebruik:</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="5"/>
+        <source>Send command to -server or bitcoind
+</source>
+        <translation>Zend commando naar -server of bitcoind
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="6"/>
+        <source>List commands
+</source>
+        <translation>List van commando&apos;s
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="7"/>
+        <source>Get help for a command
+</source>
+        <translation>Toon hulp voor een commando
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="8"/>
+        <source>Options:
+</source>
+        <translation>Opties:
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="9"/>
+        <source>Specify configuration file (default: bitcoin.conf)
+</source>
+        <translation>Specifieer configuratiebestand (standaard: bitcoin.conf)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="10"/>
+        <source>Specify pid file (default: bitcoind.pid)
+</source>
+        <translation>Specifieer pid-bestand (standaard: bitcoind.pid)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="11"/>
+        <source>Generate coins
+</source>
+        <translation>Genereer coins
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="12"/>
+        <source>Don&apos;t generate coins
+</source>
+        <translation>Genereer geen coins
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="13"/>
+        <source>Start minimized
+</source>
+        <translation>Geminimaliseerd starten
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="14"/>
+        <source>Specify data directory
+</source>
+        <translation>Stel datamap in
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="15"/>
+        <source>Specify connection timeout (in milliseconds)
+</source>
+        <translation>Gelieve de time-out tijd te specifieren (in milliseconden)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="16"/>
+        <source>Connect through socks4 proxy
+</source>
+        <translation>Verbind via socks4 proxy
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="17"/>
+        <source>Allow DNS lookups for addnode and connect
+</source>
+        <translation>Sta DNS-opzoeking toe voor addnode en connect
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="18"/>
+        <source>Add a node to connect to
+</source>
+        <translation>Voeg een node toe om mee te verbinden
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="19"/>
+        <source>Connect only to the specified node
+</source>
+        <translation>Verbind alleen met deze node
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="20"/>
+        <source>Don&apos;t accept connections from outside
+</source>
+        <translation>Sta geen verbindingen van buitenaf toe
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="21"/>
+        <source>Don&apos;t attempt to use UPnP to map the listening port
+</source>
+        <translation>Probeer geen UPnP te gebruiken om de poort waarop geluisterd wordt te mappen
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="22"/>
+        <source>Attempt to use UPnP to map the listening port
+</source>
+        <translation>Probeer UPnP te gebruiken om de poort waarop geluisterd wordt te mappen
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="23"/>
+        <source>Fee per KB to add to transactions you send
+</source>
+        <translation>Fooi per KB om aan transacties die gezonden worden toe te voegen
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="24"/>
+        <source>Accept command line and JSON-RPC commands
+</source>
+        <translation>Aanvaard commandolijn en JSON-RPC commando&apos;s
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="25"/>
+        <source>Run in the background as a daemon and accept commands
+</source>
+        <translation>Draai in de achtergrond als daemon en aanvaard commando&apos;s
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="26"/>
+        <source>Use the test network
+</source>
+        <translation>Gebruik het test-netwerk
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="27"/>
+        <source>Username for JSON-RPC connections
+</source>
+        <translation>Gebruikersnaam voor JSON-RPC verbindingen
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="28"/>
+        <source>Password for JSON-RPC connections
+</source>
+        <translation>Wachtwoord voor JSON-RPC verbindingen
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="29"/>
+        <source>Listen for JSON-RPC connections on &lt;port&gt; (default: 8332)
+</source>
+        <translation>Luister voor JSON-RPC verbindingen op &lt;poort&gt; (standaard: 8332)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="30"/>
+        <source>Allow JSON-RPC connections from specified IP address
+</source>
+        <translation>Enkel JSON-RPC verbindingen van opgegeven IP adres toestaan
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="31"/>
+        <source>Send commands to node running on &lt;ip&gt; (default: 127.0.0.1)
+</source>
+        <translation>Zend commando&apos;s naar proces dat op &lt;ip&gt; draait (standaard: 127.0.0.1)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="32"/>
+        <source>Set key pool size to &lt;n&gt; (default: 100)
+</source>
+        <translation>Stel sleutelpoelgrootte in op &lt;n&gt; (standaard: 100)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="33"/>
+        <source>Rescan the block chain for missing wallet transactions
+</source>
+        <translation>Doorzoek de blokken database op ontbrekende portefeuille-transacties
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="34"/>
+        <source>
+SSL options: (see the Bitcoin Wiki for SSL setup instructions)
+</source>
+        <translation>
+SSL opties: (zie de Bitcoin wiki voor SSL instructies)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="37"/>
+        <source>Use OpenSSL (https) for JSON-RPC connections
+</source>
+        <translation>Gebruik OpenSSL (https) voor JSON-RPC verbindingen
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="38"/>
+        <source>Server certificate file (default: server.cert)
+</source>
+        <translation>Certificaat-bestand voor server (standaard: server.cert)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="39"/>
+        <source>Server private key (default: server.pem)
+</source>
+        <translation>Geheime sleutel voor server (standaard: server.pem)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="40"/>
+        <source>Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)
+</source>
+        <translation>Aanvaardbare ciphers (standaard: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="43"/>
+        <source>This help message
+</source>
+        <translation>Dit helpbericht
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="44"/>
+        <source>Cannot obtain a lock on data directory %s.  Bitcoin is probably already running.</source>
+        <translation>Kan geen lock op de gegevensdirectory %s verkrijgen. Bitcoin draait vermoedelijk reeds.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="47"/>
+        <source>Error loading addr.dat      
+</source>
+        <translation>Fout bij laden van bestand addr.dat      
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="48"/>
+        <source>Error loading blkindex.dat      
+</source>
+        <translation>Fout bij laden van bestand addr.dat      
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="49"/>
+        <source>Error loading wallet.dat      
+</source>
+        <translation>Fout bij laden van bestand wallet.dat      
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="50"/>
+        <source>Invalid -proxy address</source>
+        <translation>Foutief -proxy adres</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="51"/>
+        <source>Invalid amount for -paytxfee=&lt;amount&gt;</source>
+        <translation>Ongeldig bedrag voor -paytxfee=&lt;bedrag&gt;</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="52"/>
+        <source>Warning: -paytxfee is set very high.  This is the transaction fee you will pay if you send a transaction.</source>
+        <translation>Waarschuwing: -paytxfee is zeer hoog ingesteld.  Dit is de fooi die betaald wordt bij het zenden van een transactie.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="55"/>
+        <source>Warning: Disk space is low  </source>
+        <translation>Waarschuwing: Weinig schijfruimte over  </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="56"/>
+        <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds  </source>
+        <translation>Fout: Deze transactie vergt een fooi van ten minste %s omwille van zijn bedrag, complexiteit, of gebruik van recent ontvangen coins  </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="59"/>
+        <source>Error: Transaction creation failed  </source>
+        <translation>Fout: Aanmaken van transactie mislukt  </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="60"/>
+        <source>Sending...</source>
+        <translation>Versturen...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="61"/>
+        <source>Error: The transaction was rejected.  This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
+        <translation>Fout: De transactie is afgekeurd.  Dit kan gebeuren als bepaalde coins in je Portefeuille al zijn uitgegeven. Dit kan veroorzaakt worden doordat je een kopie van wallet.dat gebruikt hebt en enkel daar je uitgave geregistreerd is.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="65"/>
+        <source>Invalid amount</source>
+        <translation>Foutieve hoeveelheid</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="66"/>
+        <source>Insufficient funds</source>
+        <translation>Onvoldoende saldo</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="67"/>
+        <source>Invalid bitcoin address</source>
+        <translation>Foutief bitcoin-adres</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="68"/>
+        <source>Unable to bind to port %d on this computer.  Bitcoin is probably already running.</source>
+        <translation>Kan niet binden met poort %d op deze computer. Bitcoin draait vermoedelijk reeds.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="71"/>
+        <source>To use the %s option</source>
+        <translation>Om de %s optie te gebruiken</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="72"/>
+        <source>Warning: %s, you must set rpcpassword=&lt;password&gt;
+in the configuration file: %s
+If the file does not exist, create it with owner-readable-only file permissions.
+</source>
+        <translation>Waarschuwing: %s, rpcpassword=&lt;password&gt; moet ingesteld zijn
+in het configuratie bestand: %s
+Als het bestand nog niet bestaat, maak het dan aan met enkel-leesbaar-door-eigenaar rechten.
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="77"/>
+        <source>You must set rpcpassword=&lt;password&gt; in the configuration file:
+%s
+If the file does not exist, create it with owner-readable-only file permissions.</source>
+        <translation>rpcpassword=&lt;password&gt; moet ingesteld in het configuratie bestand:
+%s
+Als het bestand nog niet bestaat, maak het dan aan met enkel-leesbaar-door-eigenaar rechten.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="82"/>
+        <source>Warning: Please check that your computer&apos;s date and time are correct.  If your clock is wrong Bitcoin will not work properly.</source>
+        <translation>Waarschuwing: Controleer of uw computers datum en tijd correct ingesteld zijn. Als uw klok fout staat zal Bitcoin niet correct werken.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="85"/>
+        <source>-beta</source>
+        <translation>-beta</translation>
+    </message>
+</context>
+</TS>
new file mode 100644
--- /dev/null
+++ b/src/qt/locale/bitcoin_ru.ts
@@ -0,0 +1,2173 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ru_RU">
+<context>
+    <name>AboutDialog</name>
+    <message>
+        <location filename="../forms/aboutdialog.ui" line="14"/>
+        <source>About Bitcoin</source>
+        <translation>О Bitcoin&apos;е</translation>
+    </message>
+    <message>
+        <location filename="../forms/aboutdialog.ui" line="53"/>
+        <source>&lt;b&gt;Bitcoin&lt;/b&gt; version</source>
+        <translation>Версия Bitcoin&apos;а</translation>
+    </message>
+    <message utf8="true">
+        <location filename="../forms/aboutdialog.ui" line="85"/>
+        <source>Copyright © 2009-2011 Bitcoin Developers
+
+This is experimental software.
+
+Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php.
+
+This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard.</source>
+        <translation>Copyright © 2009-2011 Разработчики сети Bitcoin
+
+ВНИМАНИЕ: этот софт является экспериментальным!
+
+Распространяется под лицензией MIT/X11, за дополнительной информацией обращайтесь к прилагающемуся файлу license.txt или документу по данной ссылке: http://www.opensource.org/licenses/mit-license.php.
+
+Данный продукт включает в себя разработки проекта OpenSSL (http://www.openssl.org/), криптографические функции и алгоритмы, написанные Эриком Янгом (eay@cryptsoft.com) и функции для работы с UPnP за авторством Томаса Бернарда.</translation>
+    </message>
+</context>
+<context>
+    <name>AddressBookPage</name>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="14"/>
+        <source>Address Book</source>
+        <translation>Адресная книга</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="20"/>
+        <source>These are your Bitcoin addresses for receiving payments.  You may want to give a different one to each sender so you can keep track of who is paying you.</source>
+        <translation>Здесь перечислены Ваши адреса для получения платежей.  Вы можете использовать их для того, чтобы давать разным людям разные адреса и таким образом иметь возможность отслеживать кто и сколько Вам платил, а так же поддерживать бо́льшую анонимность..</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="33"/>
+        <source>Double-click to edit address or label</source>
+        <translation>Для того, чтобы изменить адрес или метку давжды кликните по изменяемому объекту</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="57"/>
+        <source>Create a new address</source>
+        <translation>Создать новый адрес</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="60"/>
+        <source>&amp;New Address...</source>
+        <translation>&amp;Создать адрес...</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="71"/>
+        <source>Copy the currently selected address to the system clipboard</source>
+        <translation>Копировать текущий выделенный адрес в буфер обмена</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="74"/>
+        <source>&amp;Copy to Clipboard</source>
+        <translation>&amp;Kопировать</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="85"/>
+        <source>Delete the currently selected address from the list. Only sending addresses can be deleted.</source>
+        <translation>Удалить выделенный адрес из списка (могут быть удалены только записи из адресной книги).</translation>
+    </message>
+    <message>
+        <location filename="../forms/addressbookpage.ui" line="88"/>
+        <source>&amp;Delete</source>
+        <translation>&amp;Удалить</translation>
+    </message>
+    <message>
+        <location filename="../addressbookpage.cpp" line="197"/>
+        <source>Export Address Book Data</source>
+        <translation>Экспортировать адресную книгу</translation>
+    </message>
+    <message>
+        <location filename="../addressbookpage.cpp" line="199"/>
+        <source>Comma separated file (*.csv)</source>
+        <translation>Текст, разделённый запятыми (*.csv)</translation>
+    </message>
+    <message>
+        <location filename="../addressbookpage.cpp" line="212"/>
+        <source>Error exporting</source>
+        <translation>Ошибка экспорта</translation>
+    </message>
+    <message>
+        <location filename="../addressbookpage.cpp" line="212"/>
+        <source>Could not write to file %1.</source>
+        <translation>Невозможно записать в файл %1.</translation>
+    </message>
+</context>
+<context>
+    <name>AddressTableModel</name>
+    <message>
+        <location filename="../addresstablemodel.cpp" line="78"/>
+        <source>Label</source>
+        <translation>Метка</translation>
+    </message>
+    <message>
+        <location filename="../addresstablemodel.cpp" line="78"/>
+        <source>Address</source>
+        <translation>Адрес</translation>
+    </message>
+    <message>
+        <location filename="../addresstablemodel.cpp" line="114"/>
+        <source>(no label)</source>
+        <translation>[нет метки]</translation>
+    </message>
+</context>
+<context>
+    <name>BitcoinGUI</name>
+    <message>
+        <location filename="../bitcoingui.cpp" line="53"/>
+        <source>Bitcoin Wallet</source>
+        <translation>Bitcoin-бумажник</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="61"/>
+        <source>&amp;File</source>
+        <translation>&amp;Файл</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="67"/>
+        <source>&amp;Settings</source>
+        <translation>&amp;Настройки</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="70"/>
+        <source>&amp;Help</source>
+        <translation>&amp;Помощь</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="74"/>
+        <source>Tabs toolbar</source>
+        <translation>Панель вкладок</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="82"/>
+        <source>Actions toolbar</source>
+        <translation>Панель действий</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="130"/>
+        <source>Synchronizing with network...</source>
+        <translation>Синхронизация с сетью...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="133"/>
+        <source>Block chain synchronization in progress</source>
+        <translation>Идёт синхронизация цепочки блоков</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="157"/>
+        <source>&amp;Overview</source>
+        <translation>О&amp;бзор</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="158"/>
+        <source>Show general overview of wallet</source>
+        <translation>Показать общий обзор действий с бумажником</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="162"/>
+        <source>&amp;Transactions</source>
+        <translation>&amp;Транзакции</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="163"/>
+        <source>Browse transaction history</source>
+        <translation>Показать историю транзакций</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="167"/>
+        <source>&amp;Address Book</source>
+        <translation>&amp;Адресная книга</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="168"/>
+        <source>Edit the list of stored addresses and labels</source>
+        <translation>Изменить список сохранённых адресов и меток к ним</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="172"/>
+        <source>&amp;Receive coins</source>
+        <translation>&amp;Получение</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="173"/>
+        <source>Show the list of addresses for receiving payments</source>
+        <translation>Показать список адресов для получения платежей</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="177"/>
+        <source>&amp;Send coins</source>
+        <translation>Отп&amp;равка</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="178"/>
+        <source>Send coins to a bitcoin address</source>
+        <translation>Отправить монеты на указанный адрес</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="188"/>
+        <source>&amp;Exit</source>
+        <translation>Вы&amp;ход</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="189"/>
+        <source>Quit application</source>
+        <translation>Закрыть приложение</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="190"/>
+        <source>&amp;About</source>
+        <translation>&amp;Информация</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="191"/>
+        <source>Show information about Bitcoin</source>
+        <translation>Показать информацию о Bitcoin&apos;е</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="192"/>
+        <source>&amp;Options...</source>
+        <translation>Оп&amp;ции...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="193"/>
+        <source>Modify configuration options for bitcoin</source>
+        <translation>Изменить настройки</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="194"/>
+        <source>Open &amp;Bitcoin</source>
+        <translation>&amp;Показать бумажник</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="195"/>
+        <source>Show the Bitcoin window</source>
+        <translation>Показать окно бумажника</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="196"/>
+        <source>&amp;Export...</source>
+        <translation>&amp;Экспорт...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="197"/>
+        <source>Export the current view to a file</source>
+        <translation>Экспортировать в файл</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="211"/>
+        <source>[testnet]</source>
+        <translation>[тестовая сеть]</translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../bitcoingui.cpp" line="304"/>
+        <source>%n active connection(s) to Bitcoin network</source>
+        <translation>
+            <numerusform>%n активное соединение с сетью</numerusform>
+            <numerusform>%n активных соединений с сетью</numerusform>
+            <numerusform>%n активных соединений с сетью</numerusform>
+        </translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="318"/>
+        <source>Downloaded %1 of %2 blocks of transaction history.</source>
+        <translation>Загружено %1 из %2 блоков истории транзакций.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="324"/>
+        <source>Downloaded %1 blocks of transaction history.</source>
+        <translation>Загружено %1 блоков истории транзакций.</translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../bitcoingui.cpp" line="335"/>
+        <source>%n second(s) ago</source>
+        <translation>
+            <numerusform>%n секунду назад</numerusform>
+            <numerusform>%n секунды назад</numerusform>
+            <numerusform>%n секунд назад</numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../bitcoingui.cpp" line="339"/>
+        <source>%n minute(s) ago</source>
+        <translation>
+            <numerusform>%n минуту назад</numerusform>
+            <numerusform>%n минуты назад</numerusform>
+            <numerusform>%n минут назад</numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../bitcoingui.cpp" line="343"/>
+        <source>%n hour(s) ago</source>
+        <translation>
+            <numerusform>%n час назад</numerusform>
+            <numerusform>%n часа назад</numerusform>
+            <numerusform>%n часов назад</numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../bitcoingui.cpp" line="347"/>
+        <source>%n day(s) ago</source>
+        <translation>
+            <numerusform>%n день назад</numerusform>
+            <numerusform>%n дня назад</numerusform>
+            <numerusform>%n дней назад</numerusform>
+        </translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="353"/>
+        <source>Up to date</source>
+        <translation>Синхронизированно</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="358"/>
+        <source>Catching up...</source>
+        <translation>Синхронизируется...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="364"/>
+        <source>Last received block was generated %1.</source>
+        <translation>Последний полученный блок был сгенерирован %1.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="421"/>
+        <source>This transaction is over the size limit.  You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network.  Do you want to pay the fee?</source>
+        <translation>Данная транзакция превышает предельно допустимый размер.  Но Вы можете всё равно совершить ей, добавив комиссию в %1, которая отправится тем узлам, которые обработают Вашу транзакцию и поможет поддержать сеть.  Вы хотите добавить комиссию?</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="426"/>
+        <source>Sending...</source>
+        <translation>Отправка...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="449"/>
+        <source>Sent transaction</source>
+        <translation>Исходящая транзакция</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="450"/>
+        <source>Incoming transaction</source>
+        <translation>Входящая транзакция</translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="451"/>
+        <source>Date: </source>
+        <translation>Дата: </translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="452"/>
+        <source>Amount: </source>
+        <translation>Количество: </translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="453"/>
+        <source>Type: </source>
+        <translation>Тип: </translation>
+    </message>
+    <message>
+        <location filename="../bitcoingui.cpp" line="454"/>
+        <source>Address: </source>
+        <translation>Адрес: </translation>
+    </message>
+</context>
+<context>
+    <name>DisplayOptionsPage</name>
+    <message>
+        <location filename="../optionsdialog.cpp" line="254"/>
+        <source>&amp;Unit to show amounts in: </source>
+        <translation>&amp;Измерять монеты в: </translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="258"/>
+        <source>Choose the default subdivision unit to show in the interface, and when sending coins</source>
+        <translation>Единица измерения количества монет при отображении и при отправке</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="265"/>
+        <source>Display addresses in transaction list</source>
+        <translation>Показывать адреса в списке транзакций</translation>
+    </message>
+</context>
+<context>
+    <name>EditAddressDialog</name>
+    <message>
+        <location filename="../forms/editaddressdialog.ui" line="14"/>
+        <source>Edit Address</source>
+        <translation>Изменить адрес</translation>
+    </message>
+    <message>
+        <location filename="../forms/editaddressdialog.ui" line="25"/>
+        <source>&amp;Label</source>
+        <translation>&amp;Метка</translation>
+    </message>
+    <message>
+        <location filename="../forms/editaddressdialog.ui" line="35"/>
+        <source>The label associated with this address book entry</source>
+        <translation>Метка, связанная с данной записью</translation>
+    </message>
+    <message>
+        <location filename="../forms/editaddressdialog.ui" line="42"/>
+        <source>&amp;Address</source>
+        <translation>&amp;Адрес</translation>
+    </message>
+    <message>
+        <location filename="../forms/editaddressdialog.ui" line="52"/>
+        <source>The address associated with this address book entry. This can only be modified for sending addresses.</source>
+        <translation>Адрес, связанный с данной записью.</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="20"/>
+        <source>New receiving address</source>
+        <translation>Новый адрес для получения</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="24"/>
+        <source>New sending address</source>
+        <translation>Новый адрес для отправки</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="27"/>
+        <source>Edit receiving address</source>
+        <translation>Изменение адреса для получения</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="31"/>
+        <source>Edit sending address</source>
+        <translation>Изменение адреса для отправки</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="87"/>
+        <source>The entered address &quot;%1&quot; is already in the address book.</source>
+        <translation>Введённый адрес «%1» уже находится в адресной книге.</translation>
+    </message>
+    <message>
+        <location filename="../editaddressdialog.cpp" line="92"/>
+        <source>The entered address &quot;%1&quot; is not a valid bitcoin address.</source>
+        <translation>Введённый адрес «%1» не является правильным Bitcoin-адресом.</translation>
+    </message>
+</context>
+<context>
+    <name>MainOptionsPage</name>
+    <message>
+        <location filename="../optionsdialog.cpp" line="162"/>
+        <source>&amp;Start Bitcoin on window system startup</source>
+        <translation>&amp;Запускать бумажник при входе в систему</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="163"/>
+        <source>Automatically start Bitcoin after the computer is turned on</source>
+        <translation>Автоматически запускать бумажник, когда включается компьютер</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="166"/>
+        <source>&amp;Minimize to the tray instead of the taskbar</source>
+        <translation>&amp;Cворачивать в системный лоток вместо панели задач</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="167"/>
+        <source>Show only a tray icon after minimizing the window</source>
+        <translation>Показывать только иконку в системном лотке при сворачивании окна</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="170"/>
+        <source>Map port using &amp;UPnP</source>
+        <translation>Пробросить порт через &amp;UPnP</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="171"/>
+        <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+        <translation>Автоматически открыть порт для Bitcoin-клиента на роутере. Работает ТОЛЬКО если Ваш роутер поддерживает UPnP и данная функция включена.</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="174"/>
+        <source>M&amp;inimize on close</source>
+        <translation>С&amp;ворачивать вместо закрытия</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="175"/>
+        <source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu.</source>
+        <translation>Сворачивать вместо закрытия. Если данная опция будет выбрана — приложение закроется только после выбора соответствующего пункта в меню.</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="178"/>
+        <source>&amp;Connect through SOCKS4 proxy:</source>
+        <translation>&amp;Подключаться через SOCKS4 прокси:</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="179"/>
+        <source>Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor)</source>
+        <translation>Подключаться к сети Bitcoin через SOCKS4 прокси (например, при использовании Tor)</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="184"/>
+        <source>Proxy &amp;IP: </source>
+        <translation>&amp;IP Прокси: </translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="190"/>
+        <source>IP address of the proxy (e.g. 127.0.0.1)</source>
+        <translation>IP-адрес прокси (например 127.0.0.1)</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="193"/>
+        <source>&amp;Port: </source>
+        <translation>По&amp;рт: </translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="199"/>
+        <source>Port of the proxy (e.g. 1234)</source>
+        <translation>Порт прокси-сервера (например 1234)</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="205"/>
+        <source>Optional transaction fee per KB that helps make sure your transactions are processed quickly.  Most transactions are 1KB.  Fee 0.01 recommended.</source>
+        <translation>Опциональная комиссия за кадый KB транзакции, которое позволяет быть уверенным, что Ваша транзакция будет обработана быстро.  Большинство транщакций занимают 1 KB.  Рекомендованная комиссия: 0.01 BTC.</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="211"/>
+        <source>Pay transaction &amp;fee</source>
+        <translation>Добавлять ко&amp;миссию</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="214"/>
+        <source>Optional transaction fee per KB that helps make sure your transactions are processed quickly. Most transactions are 1KB. Fee 0.01 recommended.</source>
+        <translation>Опциональная комиссия за кадый KB транзакции, которая позволяет быть уверенным, что Ваша транзакция будет обработана быстро.  Большинство транзакций занимают 1 KB.  Рекомендованная комиссия: 0.01 BTC.</translation>
+    </message>
+</context>
+<context>
+    <name>OptionsDialog</name>
+    <message>
+        <location filename="../optionsdialog.cpp" line="71"/>
+        <source>Main</source>
+        <translation>Основное</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="76"/>
+        <source>Display</source>
+        <translation>Отображение</translation>
+    </message>
+    <message>
+        <location filename="../optionsdialog.cpp" line="96"/>
+        <source>Options</source>
+        <translation>Опции</translation>
+    </message>
+</context>
+<context>
+    <name>OverviewPage</name>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="14"/>
+        <source>Form</source>
+        <translation>Форма</translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="40"/>
+        <source>Balance:</source>
+        <translation>Баланс:</translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="47"/>
+        <source>123.456 BTC</source>
+        <translation>123.456 BTC</translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="54"/>
+        <source>Number of transactions:</source>
+        <translation>Количество транзакций:</translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="61"/>
+        <source>0</source>
+        <translation>0</translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="68"/>
+        <source>Unconfirmed:</source>
+        <translation>Не подтверждено:</translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="75"/>
+        <source>0 BTC</source>
+        <translation>0 BTC</translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="82"/>
+        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Wallet&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Бумажник&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+    </message>
+    <message>
+        <location filename="../forms/overviewpage.ui" line="122"/>
+        <source>&lt;b&gt;Recent transactions&lt;/b&gt;</source>
+        <translation>&lt;b&gt;Последние транзакции&lt;/b&gt;</translation>
+    </message>
+    <message>
+        <location filename="../overviewpage.cpp" line="102"/>
+        <source>Your current balance</source>
+        <translation>Ваш текущий баланс</translation>
+    </message>
+    <message>
+        <location filename="../overviewpage.cpp" line="107"/>
+        <source>Total of transactions that have yet to be confirmed, and do not yet count toward the current balance</source>
+        <translation>Общая сумма всех транзакций, которые до сих пор не подтверждены, и до сих пор не учитываются в текущем балансе</translation>
+    </message>
+    <message>
+        <location filename="../overviewpage.cpp" line="110"/>
+        <source>Total number of transactions in wallet</source>
+        <translation>Общая количество транзакций в Вашем бумажнике</translation>
+    </message>
+</context>
+<context>
+    <name>SendCoinsDialog</name>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="14"/>
+        <location filename="../sendcoinsdialog.cpp" line="91"/>
+        <location filename="../sendcoinsdialog.cpp" line="96"/>
+        <location filename="../sendcoinsdialog.cpp" line="101"/>
+        <location filename="../sendcoinsdialog.cpp" line="106"/>
+        <location filename="../sendcoinsdialog.cpp" line="112"/>
+        <location filename="../sendcoinsdialog.cpp" line="117"/>
+        <location filename="../sendcoinsdialog.cpp" line="123"/>
+        <source>Send Coins</source>
+        <translation>Отправка</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="67"/>
+        <source>Send to multiple recipients at once</source>
+        <translation>Отправить нескольким получателям одновременно</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="70"/>
+        <source>&amp;Add recipient...</source>
+        <translation>&amp;Добавить получателя...</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="100"/>
+        <source>Confirm the send action</source>
+        <translation>Подтвердить отправку</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsdialog.ui" line="103"/>
+        <source>&amp;Send</source>
+        <translation>&amp;Отправить</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="74"/>
+        <source>&lt;b&gt;%1&lt;/b&gt; to %2 (%3)</source>
+        <translation>&lt;b&gt;%1&lt;/b&gt; адресату %2 (%3)</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="77"/>
+        <source>Confirm send coins</source>
+        <translation>Подтвердите отправку монет</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="78"/>
+        <source>Are you sure you want to send %1?</source>
+        <translation>Вы уверены, что хотите отправить %1?</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="78"/>
+        <source> and </source>
+        <translation> и </translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="92"/>
+        <source>The recepient address is not valid, please recheck.</source>
+        <translation>Адрес получателя неверный, пожалуйста, перепроверьте.</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="97"/>
+        <source>The amount to pay must be larger than 0.</source>
+        <translation>Количество монет для отправки должно быть больше 0.</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="102"/>
+        <source>Amount exceeds your balance</source>
+        <translation>Количество отправляемых монет превышает Ваш баланс</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="107"/>
+        <source>Total exceeds your balance when the %1 transaction fee is included</source>
+        <translation>Сумма превысит Ваш баланс, если комиссия в %1 будет добавлена к транзакции</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="113"/>
+        <source>Duplicate address found, can only send to each address once in one send operation</source>
+        <translation>Обнаружен дублирующийся адрес. Отправка на один и тот же адрес возможна только один раз за одну операцию отправки</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="118"/>
+        <source>Error: Transaction creation failed  </source>
+        <translation>Ошибка: Создание транзакции не удалось  </translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsdialog.cpp" line="124"/>
+        <source>Error: The transaction was rejected.  This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
+        <translation>Ошибка: В транзакции отказано.  Такое может произойти, если некоторые монеты уже были потрачены, например, если Вы используете одну копию бумажника (wallet.dat), а монеты были потрачены из другой копии, но не были отмечены как потраченные в этой.  Или в случае кражи (компрометации) Вашего бумажника.</translation>
+    </message>
+</context>
+<context>
+    <name>SendCoinsEntry</name>
+    <message>
+        <location filename="../forms/sendcoinsentry.ui" line="14"/>
+        <source>Form</source>
+        <translation>Форма</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsentry.ui" line="29"/>
+        <source>A&amp;mount:</source>
+        <translation>Ко&amp;личество:</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsentry.ui" line="42"/>
+        <source>Pay &amp;To:</source>
+        <translation>Полу&amp;чатель:</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsentry.ui" line="66"/>
+        <location filename="../sendcoinsentry.cpp" line="22"/>
+        <source>Enter a label for this address to add it to your address book</source>
+        <translation>Введите метку для данного адреса (для добавления в адресную книгу)</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsentry.ui" line="75"/>
+        <source>&amp;Label:</source>
+        <translation>&amp;Метка:</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsentry.ui" line="93"/>
+        <source>The address to send the payment to  (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
+        <translation>Адрес получателя платежа (например 1LA5FtQhnnWnkK6zjFfutR7Stiit4wKd63)</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsentry.ui" line="103"/>
+        <source>Choose adress from address book</source>
+        <translation>Выбрать адрес из адресной книги</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsentry.ui" line="113"/>
+        <source>Alt+A</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsentry.ui" line="126"/>
+        <source>Paste address from clipboard</source>
+        <translation>Вставить адрес из буфера обмена</translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsentry.ui" line="136"/>
+        <source>Alt+P</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../forms/sendcoinsentry.ui" line="146"/>
+        <source>Remove this recipient</source>
+        <translation>Удалить этого получателя</translation>
+    </message>
+    <message>
+        <location filename="../sendcoinsentry.cpp" line="21"/>
+        <source>Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
+        <translation>Введите Bitcoin-адрес (например 1LA5FtQhnnWnkK6zjFfutR7Stiit4wKd63)</translation>
+    </message>
+</context>
+<context>
+    <name>TransactionDesc</name>
+    <message>
+        <location filename="../transactiondesc.cpp" line="34"/>
+        <source>Open for %1 blocks</source>
+        <translation type="unfinished">Открыто до получения %1 блоков</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="36"/>
+        <source>Open until %1</source>
+        <translation type="unfinished">Открыто до %1</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="42"/>
+        <source>%1/offline?</source>
+        <translation>%1/оффлайн?</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="44"/>
+        <source>%1/unconfirmed</source>
+        <translation>%1/не подтверждено</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="46"/>
+        <source>%1 confirmations</source>
+        <translation>%1 подтверждений</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="63"/>
+        <source>&lt;b&gt;Status:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Статус:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="68"/>
+        <source>, has not been successfully broadcast yet</source>
+        <translation>, ещё не было успешно разослано</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="70"/>
+        <source>, broadcast through %1 node</source>
+        <translation>, разослано через %1 узел</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="72"/>
+        <source>, broadcast through %1 nodes</source>
+        <translation>, разослано через %1 узлов</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="76"/>
+        <source>&lt;b&gt;Date:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Дата:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="83"/>
+        <source>&lt;b&gt;Source:&lt;/b&gt; Generated&lt;br&gt;</source>
+        <translation>&lt;b&gt;Источник:&lt;/b&gt; [сгенерированно]&lt;br&gt;</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="89"/>
+        <location filename="../transactiondesc.cpp" line="106"/>
+        <source>&lt;b&gt;From:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Отправитель:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="106"/>
+        <source>unknown</source>
+        <translation>неизвестно</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="107"/>
+        <location filename="../transactiondesc.cpp" line="130"/>
+        <location filename="../transactiondesc.cpp" line="189"/>
+        <source>&lt;b&gt;To:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Получатель:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="110"/>
+        <source> (yours, label: </source>
+        <translation> (Ваш, метка:</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="112"/>
+        <source> (yours)</source>
+        <translation> (ваш)</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="147"/>
+        <location filename="../transactiondesc.cpp" line="161"/>
+        <location filename="../transactiondesc.cpp" line="206"/>
+        <location filename="../transactiondesc.cpp" line="223"/>
+        <source>&lt;b&gt;Credit:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Кредит:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="149"/>
+        <source>(%1 matures in %2 more blocks)</source>
+        <translation type="unfinished">(%1 «созреет» через %2 блоков)</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="153"/>
+        <source>(not accepted)</source>
+        <translation>(не принято)</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="197"/>
+        <location filename="../transactiondesc.cpp" line="205"/>
+        <location filename="../transactiondesc.cpp" line="220"/>
+        <source>&lt;b&gt;Debit:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Дебет:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="211"/>
+        <source>&lt;b&gt;Transaction fee:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Комиссия:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="227"/>
+        <source>&lt;b&gt;Net amount:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Общая сумма:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="233"/>
+        <source>Message:</source>
+        <translation>Сообщение:</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="235"/>
+        <source>Comment:</source>
+        <translation>Комментарий:</translation>
+    </message>
+    <message>
+        <location filename="../transactiondesc.cpp" line="238"/>
+        <source>Generated coins must wait 120 blocks before they can be spent.  When you generated this block, it was broadcast to the network to be added to the block chain.  If it fails to get into the chain, it will change to &quot;not accepted&quot; and not be spendable.  This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>TransactionDescDialog</name>
+    <message>
+        <location filename="../forms/transactiondescdialog.ui" line="14"/>
+        <source>Transaction details</source>
+        <translation>Детали транзакции</translation>
+    </message>
+    <message>
+        <location filename="../forms/transactiondescdialog.ui" line="20"/>
+        <source>This pane shows a detailed description of the transaction</source>
+        <translation>Данный диалог показывает детализированную статистику по выбранной транзакции</translation>
+    </message>
+</context>
+<context>
+    <name>TransactionTableModel</name>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="213"/>
+        <source>Date</source>
+        <translation>Дата</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="213"/>
+        <source>Type</source>
+        <translation>Тип</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="213"/>
+        <source>Address</source>
+        <translation>Адрес</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="213"/>
+        <source>Amount</source>
+        <translation>Количество</translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../transactiontablemodel.cpp" line="274"/>
+        <source>Open for %n block(s)</source>
+        <translation type="unfinished">
+            <numerusform>Открыто до получения %n блока</numerusform>
+            <numerusform>Открыто до получения %n блоков</numerusform>
+            <numerusform>Открыто до получения %n блоков</numerusform>
+        </translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="277"/>
+        <source>Open until %1</source>
+        <translation type="unfinished">Открыто до %1</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="280"/>
+        <source>Offline (%1 confirmations)</source>
+        <translation>Оффлайн (%1 подтверждений)</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="283"/>
+        <source>Unconfirmed (%1 of %2 confirmations)</source>
+        <translation>Не подтверждено (%1 из %2 подтверждений)</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="286"/>
+        <source>Confirmed (%1 confirmations)</source>
+        <translation>Подтверждено (%1 подтверждений)</translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../transactiontablemodel.cpp" line="295"/>
+        <source>Mined balance will be available in %n more blocks</source>
+        <translation>
+            <numerusform>Добытыми монетами можно будет воспользоваться через %n блок</numerusform>
+            <numerusform>Добытыми монетами можно будет воспользоваться через %n блока</numerusform>
+            <numerusform>Добытыми монетами можно будет воспользоваться через %n блоков</numerusform>
+        </translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="301"/>
+        <source>This block was not received by any other nodes and will probably not be accepted!</source>
+        <translation>Этот блок не был получен другими узлами и, возможно, не будет принят!</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="304"/>
+        <source>Generated but not accepted</source>
+        <translation>Сгенерированно, но не подтверждено</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="347"/>
+        <source>Received with</source>
+        <translation>Получено</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="349"/>
+        <source>Received from IP</source>
+        <translation>Получено с IP-адреса </translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="351"/>
+        <source>Sent to</source>
+        <translation>Отправлено</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="353"/>
+        <source>Sent to IP</source>
+        <translation>Отправлено на IP-адрес </translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="355"/>
+        <source>Payment to yourself</source>
+        <translation>Отправлено себе</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="357"/>
+        <source>Mined</source>
+        <translation>Добыто</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="395"/>
+        <source>(n/a)</source>
+        <translation>[не доступно]</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="594"/>
+        <source>Transaction status. Hover over this field to show number of confirmations.</source>
+        <translation>Статус транзакции. Подведите курсор к нужному полю для того, чтобы увидеть количество подтверждений.</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="596"/>
+        <source>Date and time that the transaction was received.</source>
+        <translation>Дата и время, когда транзакция была получена.</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="598"/>
+        <source>Type of transaction.</source>
+        <translation>Тип транзакции.</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="600"/>
+        <source>Destination address of transaction.</source>
+        <translation>Адрес назначения транзакции.</translation>
+    </message>
+    <message>
+        <location filename="../transactiontablemodel.cpp" line="602"/>
+        <source>Amount removed from or added to balance.</source>
+        <translation>Сумма, добавленная, или снятая с баланса.</translation>
+    </message>
+</context>
+<context>
+    <name>TransactionView</name>
+    <message>
+        <location filename="../transactionview.cpp" line="48"/>
+        <location filename="../transactionview.cpp" line="61"/>
+        <source>All</source>
+        <translation>Все</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="49"/>
+        <source>Today</source>
+        <translation>Сегодня</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="50"/>
+        <source>This week</source>
+        <translation>На этой неделе</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="51"/>
+        <source>This month</source>
+        <translation>В этом месяце</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="52"/>
+        <source>Last month</source>
+        <translation>За последний месяц</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="53"/>
+        <source>This year</source>
+        <translation>В этом году</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="54"/>
+        <source>Range...</source>
+        <translation>Промежуток...</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="62"/>
+        <source>Received with</source>
+        <translation>Получено на</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="64"/>
+        <source>Sent to</source>
+        <translation>Отправлено на</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="66"/>
+        <source>To yourself</source>
+        <translation>Отправленные себе</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="67"/>
+        <source>Mined</source>
+        <translation>Добытые</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="68"/>
+        <source>Other</source>
+        <translation>Другое</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="74"/>
+        <source>Enter address or label to search</source>
+        <translation>Введите адрес или метку для поиска</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="80"/>
+        <source>Min amount</source>
+        <translation>Мин. сумма</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="108"/>
+        <source>Copy address</source>
+        <translation>Копировать адрес</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="109"/>
+        <source>Copy label</source>
+        <translation>Копировать метку</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="110"/>
+        <source>Edit label</source>
+        <translation>Изменить метку</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="111"/>
+        <source>Show details...</source>
+        <translation>Показать детали...</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="244"/>
+        <source>Export Transaction Data</source>
+        <translation>Экспортировать данные транзакций</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="246"/>
+        <source>Comma separated file (*.csv)</source>
+        <translation>Текс, разделённый запятыми (*.csv)</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="254"/>
+        <source>Confirmed</source>
+        <translation>Подтверждено</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="255"/>
+        <source>Date</source>
+        <translation>Дата</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="256"/>
+        <source>Type</source>
+        <translation>Тип</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="257"/>
+        <source>Label</source>
+        <translation>Метка</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="258"/>
+        <source>Address</source>
+        <translation>Адрес</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="259"/>
+        <source>Amount</source>
+        <translation>Количество</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="260"/>
+        <source>ID</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="264"/>
+        <source>Error exporting</source>
+        <translation>Ошибка экспорта</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="264"/>
+        <source>Could not write to file %1.</source>
+        <translation>Невозможно записать в файл %1.</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="352"/>
+        <source>Range:</source>
+        <translation>Промежуток от:</translation>
+    </message>
+    <message>
+        <location filename="../transactionview.cpp" line="360"/>
+        <source>to</source>
+        <translation>до</translation>
+    </message>
+</context>
+<context>
+    <name>WalletModel</name>
+    <message>
+        <location filename="../walletmodel.cpp" line="139"/>
+        <source>Sending...</source>
+        <translation>Отправка....</translation>
+    </message>
+</context>
+<context>
+    <name>bitcoin-core</name>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="3"/>
+        <source>Bitcoin version</source>
+        <translation>Версия</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="4"/>
+        <source>Usage:</source>
+        <translation>Использование:</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="5"/>
+        <source>Send command to -server or bitcoind
+</source>
+        <translation>Отправить команду на сервер ( -server ) или демону
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="6"/>
+        <source>List commands
+</source>
+        <translation>Список команд
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="7"/>
+        <source>Get help for a command
+</source>
+        <translation>Получить помощь по команде</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="8"/>
+        <source>Options:
+</source>
+        <translation>Опции:
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="9"/>
+        <source>Specify configuration file (default: bitcoin.conf)
+</source>
+        <translation>Указать конфигурационный файл вместо используемого по умолчанию (bitcoin.conf)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="10"/>
+        <source>Specify pid file (default: bitcoind.pid)
+</source>
+        <translation>Указать pid-файл вместо используемого по умолчанию (bitcoin.pid)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="11"/>
+        <source>Generate coins
+</source>
+        <translation>Включить добычу монет
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="12"/>
+        <source>Don&apos;t generate coins
+</source>
+        <translation>Выключить добычу монет
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="13"/>
+        <source>Start minimized
+</source>
+        <translation>Запускать минимизированным
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="14"/>
+        <source>Specify data directory
+</source>
+        <translation>Указать рабочую директорию
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="15"/>
+        <source>Specify connection timeout (in milliseconds)
+</source>
+        <translation>Указать таймаут соединения (в миллисекундах)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="16"/>
+        <source>Connect through socks4 proxy
+</source>
+        <translation>Соединяться через socks4-прокси
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="17"/>
+        <source>Allow DNS lookups for addnode and connect
+</source>
+        <translation>Разрешить поиск в DNS для комманд &quot;addnode&quot; и &quot;connect&quot;
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="18"/>
+        <source>Add a node to connect to
+</source>
+        <translation>Добавить узел для соединения
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="19"/>
+        <source>Connect only to the specified node
+</source>
+        <translation>Соединяться только с указанным узлом
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="20"/>
+        <source>Don&apos;t accept connections from outside
+</source>
+        <translation>Не принимать внешние соединения
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="21"/>
+        <source>Don&apos;t attempt to use UPnP to map the listening port
+</source>
+        <translation>Не пытаться использовать UPnP
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="22"/>
+        <source>Attempt to use UPnP to map the listening port
+</source>
+        <translation>Попытаться использовать UPnP для проброса прослушиваемого порта на роутере
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="23"/>
+        <source>Fee per KB to add to transactions you send
+</source>
+        <translation>Комиссия (за каждый KB транзакции)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="24"/>
+        <source>Accept command line and JSON-RPC commands
+</source>
+        <translation>Принимать команды из командной строки и через JSON-RPC
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="25"/>
+        <source>Run in the background as a daemon and accept commands
+</source>
+        <translation>Запустить в бекграунде (как демон) и принимать команды
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="26"/>
+        <source>Use the test network
+</source>
+        <translation>Использовать тестовую сеть
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="27"/>
+        <source>Username for JSON-RPC connections
+</source>
+        <translation>Имя пользователя для JSON-RPC соединений
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="28"/>
+        <source>Password for JSON-RPC connections
+</source>
+        <translation>Пароль для JSON-RPC соединений
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="29"/>
+        <source>Listen for JSON-RPC connections on &lt;port&gt; (default: 8332)
+</source>
+        <translation>Слушать &lt;порт&gt; для JSON-RPC соединений (по умолчанию: 8332)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="30"/>
+        <source>Allow JSON-RPC connections from specified IP address
+</source>
+        <translation>Разрешить JSON-RPC соединения с указанного адреса
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="31"/>
+        <source>Send commands to node running on &lt;ip&gt; (default: 127.0.0.1)
+</source>
+        <translation>Отправлять команды на узел,запущенный на &lt;IP&gt; (по умолчанию: 127.0.0.1)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="32"/>
+        <source>Set key pool size to &lt;n&gt; (default: 100)
+</source>
+        <translation>Установить размер key pool&apos;а в &lt;n&gt; (по умолчанию: 100)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="33"/>
+        <source>Rescan the block chain for missing wallet transactions
+</source>
+        <translation>Просканировать цепочку блоков в поисках пропущенных транзакций для бумажника
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="34"/>
+        <source>
+SSL options: (see the Bitcoin Wiki for SSL setup instructions)
+</source>
+        <translation>Опции SSL: (см. Bitcoin Wiki для инструкций)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="37"/>
+        <source>Use OpenSSL (https) for JSON-RPC connections
+</source>
+        <translation>Использовать OpenSSL (https) для JSON-RPC соединений
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="38"/>
+        <source>Server certificate file (default: server.cert)
+</source>
+        <translation>Сертификат (публичный ключ) сервера (по умолчанию: server.cert)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="39"/>
+        <source>Server private key (default: server.pem)
+</source>
+        <translation>Закрытый ключ сервера (по умолчанию: server.pem)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="40"/>
+        <source>Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)
+</source>
+        <translation>Допустимые Cipher&apos;ы для сервера (по умолчанию: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="43"/>
+        <source>This help message
+</source>
+        <translation>Данная справка
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="44"/>
+        <source>Cannot obtain a lock on data directory %s.  Bitcoin is probably already running.</source>
+        <translation>Невозможно установить блокировку на рабочую директорию %s.  Возможно, бумажник уже запущен.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="47"/>
+        <source>Loading addresses...</source>
+        <translation>Загрузка адресов...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="48"/>
+        <source>Error loading addr.dat      
+</source>
+        <translation>Ошибка при загрузке addr.dat      
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="49"/>
+        <source>Loading block index...</source>
+        <translation>Загрузка индекса блоков...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="50"/>
+        <source>Error loading blkindex.dat      
+</source>
+        <translation>Ошибка при загрузке blkindex.dat      
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="51"/>
+        <source>Loading wallet...</source>
+        <translation>Загрузка бумажника...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="52"/>
+        <source>Error loading wallet.dat: Wallet corrupted      
+</source>
+        <translation>Ошибка загрузки wallet.dat: Бумажник повреждён</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="53"/>
+        <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin      
+</source>
+        <translation>Ошибка загрузки wallet.dat: Для данного бумажника требуется более новая версия Bitcoin      
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="55"/>
+        <source>Error loading wallet.dat      
+</source>
+        <translation>Ошибка при загрузке wallet.dat      
+</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="56"/>
+        <source>Rescanning...</source>
+        <translation>Сканирование...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="57"/>
+        <source>Done loading</source>
+        <translation>Загрузка завершена</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="58"/>
+        <source>Invalid -proxy address</source>
+        <translation>Ошибка в адресе прокси</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="59"/>
+        <source>Invalid amount for -paytxfee=&lt;amount&gt;</source>
+        <translation>Ошибка в сумме комиссии</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="60"/>
+        <source>Warning: -paytxfee is set very high.  This is the transaction fee you will pay if you send a transaction.</source>
+        <translation>ВНИМАНИЕ: Установлена слишком большая комиссия (-paytxfee=).  Данный параметр отвечает за комиссию, которую Вы будете добавлять к сумме при осуществлении транзакций.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="63"/>
+        <source>Error: CreateThread(StartNode) failed</source>
+        <translation>Ошибка: Созданиние потока (запуск узла) не удался</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="64"/>
+        <source>Warning: Disk space is low  </source>
+        <translation>ВНИМАНИЕ: На диске заканчивается свободное пространство  </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="68"/>
+        <source>This transaction is over the size limit.  You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network.  Do you want to pay the fee?</source>
+        <translation>Данная транзакция превышает предельно допустимый размер.  Но Вы можете всё равно совершить ей, добавив комиссию в %s, которая отправится тем узлам, которые обработают Вашу транзакцию и поможет поддержать сеть.  Вы хотите добавить комиссию?</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="72"/>
+        <source>Enter the current passphrase to the wallet.</source>
+        <translation>Введите текущий пароль от бумажника.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="73"/>
+        <source>Passphrase</source>
+        <translation>Пароль</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="74"/>
+        <source>Please supply the current wallet decryption passphrase.</source>
+        <translation>Пожалуйста, укажите текущий пароль для расшифровки бумажника.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="75"/>
+        <source>The passphrase entered for the wallet decryption was incorrect.</source>
+        <translation>Указанный пароль не подходит.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="76"/>
+        <source>Status</source>
+        <translation>Статус</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="77"/>
+        <source>Date</source>
+        <translation>Дата</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="78"/>
+        <source>Description</source>
+        <translation>Описание</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="79"/>
+        <source>Debit</source>
+        <translation>Дебет</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="80"/>
+        <source>Credit</source>
+        <translation>Кредит</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="81"/>
+        <source>Open for %d blocks</source>
+        <translation>Открыто до получения %d блоков</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="82"/>
+        <source>Open until %s</source>
+        <translation>Открыто до %s</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="83"/>
+        <source>%d/offline?</source>
+        <translation>%d/оффлайн?</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="84"/>
+        <source>%d/unconfirmed</source>
+        <translation>%d/не подтверждено</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="85"/>
+        <source>%d confirmations</source>
+        <translation>%d подтверждений</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="86"/>
+        <source>Generated</source>
+        <translation>Сгенерированно</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="87"/>
+        <source>Generated (%s matures in %d more blocks)</source>
+        <translation>Сгенерированно (%s «созреет» через %d блоков)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="88"/>
+        <source>Generated - Warning: This block was not received by any other nodes and will probably not be accepted!</source>
+        <translation>Сгенерированно - ВНИМАНИЕ: Данный блок не был получен ни одним другим узлом и, возможно, не будет подтверждён!</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="91"/>
+        <source>Generated (not accepted)</source>
+        <translation>Сгенерированно (не подтверждено)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="92"/>
+        <source>From: </source>
+        <translation>Отправитель: </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="93"/>
+        <source>Received with: </source>
+        <translation>Получатель: </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="94"/>
+        <source>Payment to yourself</source>
+        <translation>Отправлено себе</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="95"/>
+        <source>To: </source>
+        <translation>Получатель: </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="96"/>
+        <source>    Generating</source>
+        <translation>    Генерация</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="97"/>
+        <source>(not connected)</source>
+        <translation>(не подключено)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="98"/>
+        <source>     %d connections     %d blocks     %d transactions</source>
+        <translation>     %d подключений     %d блоков     %d транзакций</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="99"/>
+        <source>Wallet already encrypted.</source>
+        <translation>Бумажник уже зашифрован.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="100"/>
+        <source>Enter the new passphrase to the wallet.
+Please use a passphrase of 10 or more random characters, or eight or more words.</source>
+        <translation>Введите новый пароль для бумажника.
+Пожалуйста, используейте пароль из 10 и более случайных символов или из 8 и более слов.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="104"/>
+        <source>Error: The supplied passphrase was too short.</source>
+        <translation>ОШИБКА: Указанный пароль слишком короткий.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="105"/>
+        <source>WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS!
+Are you sure you wish to encrypt your wallet?</source>
+        <translation>ВНИМАНИЕ: Если Вы зашифруете Ваш бумажник и потеряете Ваш пароль — Вы ПОТЕРЯЕТЕ ВСЕ ВАШИ БИТКОИНЫ!!!
+Вы уверены, что хотите зашифровать бумажник?</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="109"/>
+        <source>Please re-enter your new wallet passphrase.</source>
+        <translation>Пожалуйста, повторите ввод нового пароля.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="110"/>
+        <source>Error: the supplied passphrases didn&apos;t match.</source>
+        <translation>ОШИБКА: указанные пароли не совпадают.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="111"/>
+        <source>Wallet encryption failed.</source>
+        <translation>Шифрование бумажника не удалось.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="112"/>
+        <source>Wallet Encrypted.
+Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+        <translation>Бумажник зашифрован.
+Запомните, что шифрование Вашего бумажника не может ПОЛНОСТЬЮ гарантировать защиту Ваших биткоинов от того, чтобы быть украденными с помощью шпионского ПО на Вашем компьютере. Пожалуйста, следите за безопасностью Вашего компьютера самостоятельно.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="116"/>
+        <source>Wallet is unencrypted, please encrypt it first.</source>
+        <translation>Бумажник не зашифрован. Сначала зашифруйте его.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="117"/>
+        <source>Enter the new passphrase for the wallet.</source>
+        <translation>Введите новый пароль для бумажника.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="118"/>
+        <source>Re-enter the new passphrase for the wallet.</source>
+        <translation>Пожалуйста, повторите ввод нового пароля.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="119"/>
+        <source>Wallet Passphrase Changed.</source>
+        <translation>Пароль от бумажника изменён.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="120"/>
+        <source>New Receiving Address</source>
+        <translation>Новый адрес для получения</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="121"/>
+        <source>You should use a new address for each payment you receive.
+
+Label</source>
+        <translation>Вы должны использовать новый адрес для каждого платежа, который Вы получаете.
+
+Метка</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="125"/>
+        <source>&lt;b&gt;Status:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Статус:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="126"/>
+        <source>, has not been successfully broadcast yet</source>
+        <translation>, ещё не было успешно разослано</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="127"/>
+        <source>, broadcast through %d node</source>
+        <translation>, разослано через %d узел</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="128"/>
+        <source>, broadcast through %d nodes</source>
+        <translation>, разослано через %d узлов</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="129"/>
+        <source>&lt;b&gt;Date:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Дата:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="130"/>
+        <source>&lt;b&gt;Source:&lt;/b&gt; Generated&lt;br&gt;</source>
+        <translation>&lt;b&gt;Источник:&lt;/b&gt; [сгенерированно]&lt;br&gt;</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="131"/>
+        <source>&lt;b&gt;From:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Отправитель:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="132"/>
+        <source>unknown</source>
+        <translation>неизвестно</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="133"/>
+        <source>&lt;b&gt;To:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Получатель:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="134"/>
+        <source> (yours, label: </source>
+        <translation> (Ваш, метка: </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="135"/>
+        <source> (yours)</source>
+        <translation> (ваш)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="136"/>
+        <source>&lt;b&gt;Credit:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Кредит:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="137"/>
+        <source>(%s matures in %d more blocks)</source>
+        <translation>(%s «созреет» через %d блоков)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="138"/>
+        <source>(not accepted)</source>
+        <translation>(не принято)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="139"/>
+        <source>&lt;b&gt;Debit:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Дебет:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="140"/>
+        <source>&lt;b&gt;Transaction fee:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Комиссия:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="141"/>
+        <source>&lt;b&gt;Net amount:&lt;/b&gt; </source>
+        <translation>&lt;b&gt;Общая сумма:&lt;/b&gt; </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="142"/>
+        <source>Message:</source>
+        <translation>Сообщение:</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="143"/>
+        <source>Comment:</source>
+        <translation>Комментарий:</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="144"/>
+        <source>Generated coins must wait 120 blocks before they can be spent.  When you generated this block, it was broadcast to the network to be added to the block chain.  If it fails to get into the chain, it will change to &quot;not accepted&quot; and not be spendable.  This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+        <translation>Сгенерированные монеты должны подождать 120 блоков прежде, чем они смогут быть отправлены.  Когда Вы сгенерировали этот блок он был отправлен в сеть, чтобы он был добавлен к цепочке блоков.  Если данная процедура не удастся, статус изменится на «не подтверждено» и монеты будут непередаваемыми.  Такое может случайно происходить в случае, если другой узел сгенерирует блок на несколько секунд раньше.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="150"/>
+        <source>Cannot write autostart/bitcoin.desktop file</source>
+        <translation>Не возможно записать файл autostart/bitcoin.desktop</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="151"/>
+        <source>Main</source>
+        <translation>Основное</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="152"/>
+        <source>&amp;Start Bitcoin on window system startup</source>
+        <translation>&amp;Запускать бумажник при входе в систему</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="153"/>
+        <source>&amp;Minimize on close</source>
+        <translation>С&amp;ворачивать вместо закрытия</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="154"/>
+        <source>version %s</source>
+        <translation>версия %s</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="155"/>
+        <source>Error in amount  </source>
+        <translation>Ошибка в количестве  </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="156"/>
+        <source>Send Coins</source>
+        <translation>Отправка</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="157"/>
+        <source>Amount exceeds your balance  </source>
+        <translation>Сумма превышает Ваш баланс  </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="158"/>
+        <source>Total exceeds your balance when the </source>
+        <translation>Общая сумма превысит Ваш баланс, если к транзакции будет добавлено ещё</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="159"/>
+        <source> transaction fee is included  </source>
+        <translation>в качестве комиссии  </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="160"/>
+        <source>Payment sent  </source>
+        <translation>Платёж отправлен</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="162"/>
+        <source>Invalid address  </source>
+        <translation>Ошибочный адрес  </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="163"/>
+        <source>Sending %s to %s</source>
+        <translation>Отправка %s адресату %s</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="164"/>
+        <source>CANCELLED</source>
+        <translation>ОТМЕНЕНО</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="165"/>
+        <source>Cancelled</source>
+        <translation>Отменено</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="166"/>
+        <source>Transfer cancelled  </source>
+        <translation>Транзакция отменена  </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="167"/>
+        <source>Error: </source>
+        <translation>ОШИБКА: </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="169"/>
+        <source>Connecting...</source>
+        <translation>Подключение...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="170"/>
+        <source>Unable to connect</source>
+        <translation>Невозможно подключиться</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="171"/>
+        <source>Requesting public key...</source>
+        <translation>Запрашивается открытый ключ...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="172"/>
+        <source>Received public key...</source>
+        <translation>Получается публичный ключ...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="173"/>
+        <source>Recipient is not accepting transactions sent by IP address</source>
+        <translation>Получатель не принимает транзакции, отправленные на IP адрес</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="174"/>
+        <source>Transfer was not accepted</source>
+        <translation>Передача была отвергнута</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="175"/>
+        <source>Invalid response received</source>
+        <translation>Получен неверный ответ</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="176"/>
+        <source>Creating transaction...</source>
+        <translation>Создание транзакции...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="177"/>
+        <source>This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds</source>
+        <translation>Данная транзакция требует добавления комиссии (по крайней мере в %s) из-за её размера, сложности, или из-за использования недавно полученных монет</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="180"/>
+        <source>Transaction creation failed</source>
+        <translation>Создание транзакции провалилось</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="181"/>
+        <source>Transaction aborted</source>
+        <translation>Транзакция отменена</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="182"/>
+        <source>Lost connection, transaction cancelled</source>
+        <translation>Потеряно соединение, транзакция отменена</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="183"/>
+        <source>Sending payment...</source>
+        <translation>Отправка платежа...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="184"/>
+        <source>The transaction was rejected.  This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
+        <translation>В транзакции отказано.  Такое может произойти, если некоторые монеты уже были потрачены, например, если Вы используете одну копию бумажника (wallet.dat), а монеты были потрачены из другой копии, но не были отмечены как потраченные в этой.  Или в случае кражи (компрометации) Вашего бумажника.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="188"/>
+        <source>Waiting for confirmation...</source>
+        <translation>Ожидание подтверждения...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="189"/>
+        <source>The payment was sent, but the recipient was unable to verify it.
+The transaction is recorded and will credit to the recipient,
+but the comment information will be blank.</source>
+        <translation>Платёж был отправлен, но получатель не смог подтвердить его.
+Транзакция записана и будет зачислена получателю,
+но комментарий к платежу будет пустым.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="193"/>
+        <source>Payment was sent, but an invalid response was received</source>
+        <translation>Платёж был отправлен, но был получен неверный ответ</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="194"/>
+        <source>Payment completed</source>
+        <translation>Платёж завершён</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="195"/>
+        <source>Name</source>
+        <translation>Имя</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="196"/>
+        <source>Address</source>
+        <translation>Адрес</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="197"/>
+        <source>Label</source>
+        <translation>Метка</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="198"/>
+        <source>Bitcoin Address</source>
+        <translation>Bitcoin-адрес</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="199"/>
+        <source>This is one of your own addresses for receiving payments and cannot be entered in the address book.  </source>
+        <translation>Это один из Ваших личных адресов для получения платежей. Он не может быть добавлен в адресную книгу.  </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="202"/>
+        <source>Edit Address</source>
+        <translation>Изменить адрес</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="203"/>
+        <source>Edit Address Label</source>
+        <translation>Изменить метку</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="204"/>
+        <source>Add Address</source>
+        <translation>Добавить адрес</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="205"/>
+        <source>Bitcoin</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="206"/>
+        <source>Bitcoin - Generating</source>
+        <translation>Bitcoin - Генерация</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="207"/>
+        <source>Bitcoin - (not connected)</source>
+        <translation>Bitcoin - (нет связи)</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="208"/>
+        <source>&amp;Open Bitcoin</source>
+        <translation>&amp;Показать бумажник</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="209"/>
+        <source>&amp;Send Bitcoins</source>
+        <translation>Отп&amp;равка</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="210"/>
+        <source>O&amp;ptions...</source>
+        <translation>Оп&amp;ции...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="211"/>
+        <source>E&amp;xit</source>
+        <translation>Вы&amp;ход</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="212"/>
+        <source>Program has crashed and will terminate.  </source>
+        <translation>Программа экстренно завершилась и будет уничтожена.  </translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="216"/>
+        <source>beta</source>
+        <translation>бета</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="161"/>
+        <source>Sending...</source>
+        <translation>Отправка...</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="168"/>
+        <source>Insufficient funds</source>
+        <translation>Недостаточно монет</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="65"/>
+        <source>Unable to bind to port %d on this computer.  Bitcoin is probably already running.</source>
+        <translation>Невозможно забиндить порт %d на данном компьютере.  Возможно, бумажник ужк запущен.</translation>
+    </message>
+    <message>
+        <location filename="../bitcoinstrings.cpp" line="213"/>
+        <source>Warning: Please check that your computer&apos;s date and time are correct.  If your clock is wrong Bitcoin will not work properly.</source>
+        <translation>ВНИМАНИЕ: Проверьте дату и время, установленные на Вашем компьютере. Если Ваши часы идут не правильно Bitcoin может наботать не корректно.</translation>
+    </message>
+</context>
+</TS>
new file mode 100644
--- /dev/null
+++ b/src/qt/monitoreddatamapper.cpp
@@ -0,0 +1,36 @@
+#include "monitoreddatamapper.h"
+
+#include <QWidget>
+#include <QMetaObject>
+#include <QMetaProperty>
+
+MonitoredDataMapper::MonitoredDataMapper(QObject *parent) :
+    QDataWidgetMapper(parent)
+{
+}
+
+
+void MonitoredDataMapper::addMapping(QWidget *widget, int section)
+{
+    QDataWidgetMapper::addMapping(widget, section);
+    addChangeMonitor(widget);
+}
+
+void MonitoredDataMapper::addMapping(QWidget *widget, int section, const QByteArray &propertyName)
+{
+    QDataWidgetMapper::addMapping(widget, section, propertyName);
+    addChangeMonitor(widget);
+}
+
+void MonitoredDataMapper::addChangeMonitor(QWidget *widget)
+{
+    // Watch user property of widget for changes, and connect
+    //  the signal to our viewModified signal.
+    QMetaProperty prop = widget->metaObject()->userProperty();
+    int signal = prop.notifySignalIndex();
+    int method = this->metaObject()->indexOfMethod("viewModified()");
+    if(signal != -1 && method != -1)
+    {
+        QMetaObject::connect(widget, signal, this, method);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/monitoreddatamapper.h
@@ -0,0 +1,32 @@
+#ifndef MONITOREDDATAMAPPER_H
+#define MONITOREDDATAMAPPER_H
+
+#include <QDataWidgetMapper>
+
+QT_BEGIN_NAMESPACE
+class QWidget;
+QT_END_NAMESPACE
+
+/* Data <-> Widget mapper that watches for changes,
+   to be able to notify when 'dirty' (for example, to
+   enable a commit/apply button).
+ */
+class MonitoredDataMapper : public QDataWidgetMapper
+{
+    Q_OBJECT
+public:
+    explicit MonitoredDataMapper(QObject *parent=0);
+
+    void addMapping(QWidget *widget, int section);
+    void addMapping(QWidget *widget, int section, const QByteArray &propertyName);
+private:
+    void addChangeMonitor(QWidget *widget);
+
+signals:
+    void viewModified();
+
+};
+
+
+
+#endif // MONITOREDDATAMAPPER_H
new file mode 100644
--- /dev/null
+++ b/src/qt/notificator.cpp
@@ -0,0 +1,224 @@
+#include "notificator.h"
+
+#include <QMetaType>
+#include <QVariant>
+#include <QIcon>
+#include <QApplication>
+#include <QStyle>
+#include <QByteArray>
+#include <QSystemTrayIcon>
+#include <QMessageBox>
+
+#ifdef QT_DBUS
+#include <QtDBus/QtDBus>
+#include <stdint.h>
+#endif
+
+// https://wiki.ubuntu.com/NotificationDevelopmentGuidelines recommends at least 128
+const int FREEDESKTOP_NOTIFICATION_ICON_SIZE = 128;
+
+Notificator::Notificator(const QString &programName, QSystemTrayIcon *trayicon, QWidget *parent):
+    QObject(parent),
+    parent(parent),
+    programName(programName),
+    mode(None),
+    trayIcon(trayicon)
+#ifdef QT_DBUS
+    ,interface(0)
+#endif
+{
+    if(trayicon && trayicon->supportsMessages())
+    {
+        mode = QSystemTray;
+    }
+#ifdef QT_DBUS
+    interface = new QDBusInterface("org.freedesktop.Notifications",
+          "/org/freedesktop/Notifications", "org.freedesktop.Notifications");
+    if(interface->isValid())
+    {
+        mode = Freedesktop;
+    }
+#endif
+}
+
+Notificator::~Notificator()
+{
+#ifdef QT_DBUS
+    delete interface;
+#endif
+}
+
+#ifdef QT_DBUS
+
+// Loosely based on http://www.qtcentre.org/archive/index.php/t-25879.html
+class FreedesktopImage
+{
+public:
+    FreedesktopImage() {}
+    FreedesktopImage(const QImage &img);
+
+    static int metaType();
+
+    // Image to variant that can be marshaled over DBus
+    static QVariant toVariant(const QImage &img);
+
+private:
+    int width, height, stride;
+    bool hasAlpha;
+    int channels;
+    int bitsPerSample;
+    QByteArray image;
+
+    friend QDBusArgument &operator<<(QDBusArgument &a, const FreedesktopImage &i);
+    friend const QDBusArgument &operator>>(const QDBusArgument &a, FreedesktopImage &i);
+};
+
+Q_DECLARE_METATYPE(FreedesktopImage);
+
+// Image configuration settings
+const int CHANNELS = 4;
+const int BYTES_PER_PIXEL = 4;
+const int BITS_PER_SAMPLE = 8;
+
+FreedesktopImage::FreedesktopImage(const QImage &img):
+    width(img.width()),
+    height(img.height()),
+    stride(img.width() * BYTES_PER_PIXEL),
+    hasAlpha(true),
+    channels(CHANNELS),
+    bitsPerSample(BITS_PER_SAMPLE)
+{
+    // Convert 00xAARRGGBB to RGBA bytewise (endian-independent) format
+    QImage tmp = img.convertToFormat(QImage::Format_ARGB32);
+    const uint32_t *data = reinterpret_cast<const uint32_t*>(tmp.constBits());
+
+    unsigned int num_pixels = width * height;
+    image.resize(num_pixels * BYTES_PER_PIXEL);
+
+    for(unsigned int ptr = 0; ptr < num_pixels; ++ptr)
+    {
+        image[ptr*BYTES_PER_PIXEL+0] = data[ptr] >> 16; // R
+        image[ptr*BYTES_PER_PIXEL+1] = data[ptr] >> 8;  // G
+        image[ptr*BYTES_PER_PIXEL+2] = data[ptr];       // B
+        image[ptr*BYTES_PER_PIXEL+3] = data[ptr] >> 24; // A
+    }
+}
+
+QDBusArgument &operator<<(QDBusArgument &a, const FreedesktopImage &i)
+{
+    a.beginStructure();
+    a << i.width << i.height << i.stride << i.hasAlpha << i.bitsPerSample << i.channels << i.image;
+    a.endStructure();
+    return a;
+}
+
+const QDBusArgument &operator>>(const QDBusArgument &a, FreedesktopImage &i)
+{
+    a.beginStructure();
+    a >> i.width >> i.height >> i.stride >> i.hasAlpha >> i.bitsPerSample >> i.channels >> i.image;
+    a.endStructure();
+    return a;
+}
+
+int FreedesktopImage::metaType()
+{
+    return qDBusRegisterMetaType<FreedesktopImage>();
+}
+
+QVariant FreedesktopImage::toVariant(const QImage &img)
+{
+    FreedesktopImage fimg(img);
+    return QVariant(FreedesktopImage::metaType(), &fimg);
+}
+
+void Notificator::notifyDBus(Class cls, const QString &title, const QString &text, const QIcon &icon, int millisTimeout)
+{
+    Q_UNUSED(cls);
+    // Arguments for DBus call:
+    QList<QVariant> args;
+
+    // Program Name:
+    args.append(programName);
+
+    // Unique ID of this notification type:
+    args.append(0U);
+
+    // Application Icon, empty string
+    args.append(QString());
+
+    // Summary
+    args.append(title);
+
+    // Body
+    args.append(text);
+
+    // Actions (none, actions are deprecated)
+    QStringList actions;
+    args.append(actions);
+
+    // Hints
+    QVariantMap hints;
+
+    // If no icon specified, set icon based on class
+    QIcon tmpicon;
+    if(icon.isNull())
+    {
+        QStyle::StandardPixmap sicon = QStyle::SP_MessageBoxQuestion;
+        switch(cls)
+        {
+        case Information: sicon = QStyle::SP_MessageBoxInformation; break;
+        case Warning: sicon = QStyle::SP_MessageBoxWarning; break;
+        case Critical: sicon = QStyle::SP_MessageBoxCritical; break;
+        default: break;
+        }
+        tmpicon = QApplication::style()->standardIcon(sicon);
+    }
+    else
+    {
+        tmpicon = icon;
+    }
+    hints["icon_data"] = FreedesktopImage::toVariant(tmpicon.pixmap(FREEDESKTOP_NOTIFICATION_ICON_SIZE).toImage());
+    args.append(hints);
+
+    // Timeout (in msec)
+    args.append(millisTimeout);
+
+    // "Fire and forget"
+    interface->callWithArgumentList(QDBus::NoBlock, "Notify", args);
+}
+#endif
+
+void Notificator::notifySystray(Class cls, const QString &title, const QString &text, const QIcon &icon, int millisTimeout)
+{
+    Q_UNUSED(icon);
+    QSystemTrayIcon::MessageIcon sicon = QSystemTrayIcon::NoIcon;
+    switch(cls) // Set icon based on class
+    {
+    case Information: sicon = QSystemTrayIcon::Information; break;
+    case Warning: sicon = QSystemTrayIcon::Warning; break;
+    case Critical: sicon = QSystemTrayIcon::Critical; break;
+    }
+    trayIcon->showMessage(title, text, sicon, millisTimeout);
+}
+
+void Notificator::notify(Class cls, const QString &title, const QString &text, const QIcon &icon, int millisTimeout)
+{
+    switch(mode)
+    {
+#ifdef QT_DBUS
+    case Freedesktop:
+        notifyDBus(cls, title, text, icon, millisTimeout);
+        break;
+#endif
+    case QSystemTray:
+        notifySystray(cls, title, text, icon, millisTimeout);
+        break;
+    default:
+        if(cls == Critical)
+        {
+            // Fall back to old fashioned popup dialog if critical and no other notification available
+            QMessageBox::critical(parent, title, text, QMessageBox::Ok, QMessageBox::Ok);
+        }
+        break;
+    }
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/notificator.h
@@ -0,0 +1,63 @@
+#ifndef NOTIFICATOR_H
+#define NOTIFICATOR_H
+
+#include <QObject>
+#include <QIcon>
+
+QT_BEGIN_NAMESPACE
+class QSystemTrayIcon;
+#ifdef QT_DBUS
+class QDBusInterface;
+#endif
+QT_END_NAMESPACE
+
+// Cross-platform desktop notification client
+class Notificator: public QObject
+{
+    Q_OBJECT
+public:
+    // Create a new notificator
+    // Ownership of trayIcon is not transferred to this object
+    Notificator(const QString &programName=QString(), QSystemTrayIcon *trayIcon=0, QWidget *parent=0);
+    ~Notificator();
+
+    // Message class
+    enum Class
+    {
+        Information,
+        Warning,
+        Critical,
+    };
+
+public slots:
+
+    /* Show notification message.
+     *
+     *  cls: general message class
+     *  title: title shown with message
+     *  text: message content
+     *  icon: optional icon to show with message
+     *  millisTimeout: notification timeout in milliseconds (default 10 seconds)
+     */
+    void notify(Class cls, const QString &title, const QString &text,
+                const QIcon &icon = QIcon(), int millisTimeout = 10000);
+
+private:
+    QWidget *parent;
+    enum Mode {
+        None,
+        Freedesktop, // Use DBus org.freedesktop.Notifications
+        QSystemTray, // Use QSystemTray::showMessage
+    };
+    QString programName;
+    Mode mode;
+    QSystemTrayIcon *trayIcon;
+#ifdef QT_DBUS
+    QDBusInterface *interface;
+
+    void notifyDBus(Class cls, const QString &title, const QString &text, const QIcon &icon, int millisTimeout);
+#endif
+    void notifySystray(Class cls, const QString &title, const QString &text, const QIcon &icon, int millisTimeout);
+};
+
+#endif // NOTIFICATOR_H
new file mode 100644
--- /dev/null
+++ b/src/qt/optionsdialog.cpp
@@ -0,0 +1,277 @@
+#include "optionsdialog.h"
+#include "optionsmodel.h"
+#include "bitcoinamountfield.h"
+#include "monitoreddatamapper.h"
+#include "guiutil.h"
+#include "bitcoinunits.h"
+#include "qvaluecombobox.h"
+
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QPushButton>
+#include <QListWidget>
+#include <QStackedWidget>
+
+#include <QCheckBox>
+#include <QLabel>
+#include <QLineEdit>
+#include <QIntValidator>
+#include <QDoubleValidator>
+#include <QRegExpValidator>
+#include <QDialogButtonBox>
+
+/* First page of options */
+class MainOptionsPage : public QWidget
+{
+public:
+    explicit MainOptionsPage(QWidget *parent=0);
+
+    void setMapper(MonitoredDataMapper *mapper);
+private:
+    QCheckBox *bitcoin_at_startup;
+    QCheckBox *minimize_to_tray;
+    QCheckBox *map_port_upnp;
+    QCheckBox *minimize_on_close;
+    QCheckBox *connect_socks4;
+    QLineEdit *proxy_ip;
+    QLineEdit *proxy_port;
+    BitcoinAmountField *fee_edit;
+
+signals:
+
+public slots:
+
+};
+
+class DisplayOptionsPage : public QWidget
+{
+public:
+    explicit DisplayOptionsPage(QWidget *parent=0);
+
+    void setMapper(MonitoredDataMapper *mapper);
+private:
+    QValueComboBox *unit;
+    QCheckBox *display_addresses;
+signals:
+
+public slots:
+
+};
+
+OptionsDialog::OptionsDialog(QWidget *parent):
+    QDialog(parent), contents_widget(0), pages_widget(0),
+    model(0), main_page(0), display_page(0)
+{
+    contents_widget = new QListWidget();
+    contents_widget->setMaximumWidth(128);
+
+    pages_widget = new QStackedWidget();
+    pages_widget->setMinimumWidth(300);
+
+    QListWidgetItem *item_main = new QListWidgetItem(tr("Main"));
+    contents_widget->addItem(item_main);
+    main_page = new MainOptionsPage(this);
+    pages_widget->addWidget(main_page);
+
+    QListWidgetItem *item_display = new QListWidgetItem(tr("Display"));
+    contents_widget->addItem(item_display);
+    display_page = new DisplayOptionsPage(this);
+    pages_widget->addWidget(display_page);
+
+    contents_widget->setCurrentRow(0);
+
+    QHBoxLayout *main_layout = new QHBoxLayout();
+    main_layout->addWidget(contents_widget);
+    main_layout->addWidget(pages_widget, 1);
+
+    QVBoxLayout *layout = new QVBoxLayout();
+    layout->addLayout(main_layout);
+
+    QDialogButtonBox *buttonbox = new QDialogButtonBox();
+    buttonbox->setStandardButtons(QDialogButtonBox::Apply|QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
+    apply_button = buttonbox->button(QDialogButtonBox::Apply);
+    layout->addWidget(buttonbox);
+
+    setLayout(layout);
+    setWindowTitle(tr("Options"));
+
+    /* Widget-to-option mapper */
+    mapper = new MonitoredDataMapper(this);
+    mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
+    mapper->setOrientation(Qt::Vertical);
+    /* enable apply button when data modified */
+    connect(mapper, SIGNAL(viewModified()), this, SLOT(enableApply()));
+    /* disable apply button when new data loaded */
+    connect(mapper, SIGNAL(currentIndexChanged(int)), this, SLOT(disableApply()));
+
+    /* Event bindings */
+    connect(contents_widget, SIGNAL(currentRowChanged(int)), this, SLOT(changePage(int)));
+    connect(buttonbox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), this, SLOT(okClicked()));
+    connect(buttonbox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(cancelClicked()));
+    connect(buttonbox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(applyClicked()));
+}
+
+void OptionsDialog::setModel(OptionsModel *model)
+{
+    this->model = model;
+
+    mapper->setModel(model);
+    main_page->setMapper(mapper);
+    display_page->setMapper(mapper);
+
+    mapper->toFirst();
+}
+
+void OptionsDialog::changePage(int index)
+{
+    pages_widget->setCurrentIndex(index);
+}
+
+void OptionsDialog::okClicked()
+{
+    mapper->submit();
+    accept();
+}
+
+void OptionsDialog::cancelClicked()
+{
+    reject();
+}
+
+void OptionsDialog::applyClicked()
+{
+    mapper->submit();
+    apply_button->setEnabled(false);
+}
+
+void OptionsDialog::enableApply()
+{
+    apply_button->setEnabled(true);
+}
+
+void OptionsDialog::disableApply()
+{
+    apply_button->setEnabled(false);
+}
+
+MainOptionsPage::MainOptionsPage(QWidget *parent):
+        QWidget(parent)
+{
+    QVBoxLayout *layout = new QVBoxLayout();
+
+    bitcoin_at_startup = new QCheckBox(tr("&Start Bitcoin on window system startup"));
+    bitcoin_at_startup->setToolTip(tr("Automatically start Bitcoin after the computer is turned on"));
+    layout->addWidget(bitcoin_at_startup);
+
+    minimize_to_tray = new QCheckBox(tr("&Minimize to the tray instead of the taskbar"));
+    minimize_to_tray->setToolTip(tr("Show only a tray icon after minimizing the window"));
+    layout->addWidget(minimize_to_tray);
+
+    map_port_upnp = new QCheckBox(tr("Map port using &UPnP"));
+    map_port_upnp->setToolTip(tr("Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled."));
+    layout->addWidget(map_port_upnp);
+
+    minimize_on_close = new QCheckBox(tr("M&inimize on close"));
+    minimize_on_close->setToolTip(tr("Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu."));
+    layout->addWidget(minimize_on_close);
+
+    connect_socks4 = new QCheckBox(tr("&Connect through SOCKS4 proxy:"));
+    connect_socks4->setToolTip(tr("Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor)"));
+    layout->addWidget(connect_socks4);
+
+    QHBoxLayout *proxy_hbox = new QHBoxLayout();
+    proxy_hbox->addSpacing(18);
+    QLabel *proxy_ip_label = new QLabel(tr("Proxy &IP: "));
+    proxy_hbox->addWidget(proxy_ip_label);
+    proxy_ip = new QLineEdit();
+    proxy_ip->setMaximumWidth(140);
+    proxy_ip->setEnabled(false);
+    proxy_ip->setValidator(new QRegExpValidator(QRegExp("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}"), this));
+    proxy_ip->setToolTip(tr("IP address of the proxy (e.g. 127.0.0.1)"));
+    proxy_ip_label->setBuddy(proxy_ip);
+    proxy_hbox->addWidget(proxy_ip);
+    QLabel *proxy_port_label = new QLabel(tr("&Port: "));
+    proxy_hbox->addWidget(proxy_port_label);
+    proxy_port = new QLineEdit();
+    proxy_port->setMaximumWidth(55);
+    proxy_port->setValidator(new QIntValidator(0, 65535, this));
+    proxy_port->setEnabled(false);
+    proxy_port->setToolTip(tr("Port of the proxy (e.g. 1234)"));
+    proxy_port_label->setBuddy(proxy_port);
+    proxy_hbox->addWidget(proxy_port);
+    proxy_hbox->addStretch(1);
+
+    layout->addLayout(proxy_hbox);
+    QLabel *fee_help = new QLabel(tr("Optional transaction fee per KB that helps make sure your transactions are processed quickly.  Most transactions are 1KB.  Fee 0.01 recommended."));
+    fee_help->setWordWrap(true);
+    layout->addWidget(fee_help);
+
+    QHBoxLayout *fee_hbox = new QHBoxLayout();
+    fee_hbox->addSpacing(18);
+    QLabel *fee_label = new QLabel(tr("Pay transaction &fee"));
+    fee_hbox->addWidget(fee_label);
+    fee_edit = new BitcoinAmountField();
+    fee_edit->setToolTip(tr("Optional transaction fee per KB that helps make sure your transactions are processed quickly. Most transactions are 1KB. Fee 0.01 recommended."));
+
+    fee_label->setBuddy(fee_edit);
+    fee_hbox->addWidget(fee_edit);
+    fee_hbox->addStretch(1);
+
+    layout->addLayout(fee_hbox);
+
+    layout->addStretch(1); // Extra space at bottom
+
+    setLayout(layout);
+
+    connect(connect_socks4, SIGNAL(toggled(bool)), proxy_ip, SLOT(setEnabled(bool)));
+    connect(connect_socks4, SIGNAL(toggled(bool)), proxy_port, SLOT(setEnabled(bool)));
+
+#ifndef USE_UPNP
+    map_port_upnp->setDisabled(true);
+#endif
+}
+
+void MainOptionsPage::setMapper(MonitoredDataMapper *mapper)
+{
+    // Map model to widgets
+    mapper->addMapping(bitcoin_at_startup, OptionsModel::StartAtStartup);
+    mapper->addMapping(minimize_to_tray, OptionsModel::MinimizeToTray);
+    mapper->addMapping(map_port_upnp, OptionsModel::MapPortUPnP);
+    mapper->addMapping(minimize_on_close, OptionsModel::MinimizeOnClose);
+    mapper->addMapping(connect_socks4, OptionsModel::ConnectSOCKS4);
+    mapper->addMapping(proxy_ip, OptionsModel::ProxyIP);
+    mapper->addMapping(proxy_port, OptionsModel::ProxyPort);
+    mapper->addMapping(fee_edit, OptionsModel::Fee);
+}
+
+DisplayOptionsPage::DisplayOptionsPage(QWidget *parent):
+        QWidget(parent)
+{
+    QVBoxLayout *layout = new QVBoxLayout();
+
+    QHBoxLayout *unit_hbox = new QHBoxLayout();
+    unit_hbox->addSpacing(18);
+    QLabel *unit_label = new QLabel(tr("&Unit to show amounts in: "));
+    unit_hbox->addWidget(unit_label);
+    unit = new QValueComboBox(this);
+    unit->setModel(new BitcoinUnits(this));
+    unit->setToolTip(tr("Choose the default subdivision unit to show in the interface, and when sending coins"));
+
+    unit_label->setBuddy(unit);
+    unit_hbox->addWidget(unit);
+
+    layout->addLayout(unit_hbox);
+
+    display_addresses = new QCheckBox(tr("Display addresses in transaction list"), this);
+    layout->addWidget(display_addresses);
+
+    layout->addStretch();
+
+    setLayout(layout);
+}
+
+void DisplayOptionsPage::setMapper(MonitoredDataMapper *mapper)
+{
+    mapper->addMapping(unit, OptionsModel::DisplayUnit);
+    mapper->addMapping(display_addresses, OptionsModel::DisplayAddresses);
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/optionsdialog.h
@@ -0,0 +1,50 @@
+#ifndef OPTIONSDIALOG_H
+#define OPTIONSDIALOG_H
+
+#include <QDialog>
+
+QT_BEGIN_NAMESPACE
+class QStackedWidget;
+class QListWidget;
+class QListWidgetItem;
+class QPushButton;
+QT_END_NAMESPACE
+class OptionsModel;
+class MainOptionsPage;
+class DisplayOptionsPage;
+class MonitoredDataMapper;
+
+class OptionsDialog : public QDialog
+{
+    Q_OBJECT
+public:
+    explicit OptionsDialog(QWidget *parent=0);
+
+    void setModel(OptionsModel *model);
+
+signals:
+
+public slots:
+    void changePage(int index);
+
+private slots:
+    void okClicked();
+    void cancelClicked();
+    void applyClicked();
+    void enableApply();
+    void disableApply();
+private:
+    QListWidget *contents_widget;
+    QStackedWidget *pages_widget;
+    OptionsModel *model;
+    MonitoredDataMapper *mapper;
+    QPushButton *apply_button;
+
+    // Pages
+    MainOptionsPage *main_page;
+    DisplayOptionsPage *display_page;
+
+    void setupMainPage();
+};
+
+#endif // OPTIONSDIALOG_H
new file mode 100644
--- /dev/null
+++ b/src/qt/optionsmodel.cpp
@@ -0,0 +1,162 @@
+#include "optionsmodel.h"
+#include "bitcoinunits.h"
+
+#include "headers.h"
+
+OptionsModel::OptionsModel(CWallet *wallet, QObject *parent) :
+    QAbstractListModel(parent),
+    wallet(wallet),
+    nDisplayUnit(BitcoinUnits::BTC),
+    bDisplayAddresses(false)
+{
+    // Read our specific settings from the wallet db
+    CWalletDB walletdb(wallet->strWalletFile);
+    walletdb.ReadSetting("nDisplayUnit", nDisplayUnit);
+    walletdb.ReadSetting("bDisplayAddresses", bDisplayAddresses);
+}
+
+int OptionsModel::rowCount(const QModelIndex & parent) const
+{
+    return OptionIDRowCount;
+}
+
+QVariant OptionsModel::data(const QModelIndex & index, int role) const
+{
+    if(role == Qt::EditRole)
+    {
+        switch(index.row())
+        {
+        case StartAtStartup:
+            return QVariant();
+        case MinimizeToTray:
+            return QVariant(fMinimizeToTray);
+        case MapPortUPnP:
+            return QVariant(fUseUPnP);
+        case MinimizeOnClose:
+            return QVariant(fMinimizeOnClose);
+        case ConnectSOCKS4:
+            return QVariant(fUseProxy);
+        case ProxyIP:
+            return QVariant(QString::fromStdString(addrProxy.ToStringIP()));
+        case ProxyPort:
+            return QVariant(QString::fromStdString(addrProxy.ToStringPort()));
+        case Fee:
+            return QVariant(nTransactionFee);
+        case DisplayUnit:
+            return QVariant(nDisplayUnit);
+        case DisplayAddresses:
+            return QVariant(bDisplayAddresses);
+        default:
+            return QVariant();
+        }
+    }
+    return QVariant();
+}
+
+bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, int role)
+{
+    bool successful = true; /* set to false on parse error */
+    if(role == Qt::EditRole)
+    {
+        CWalletDB walletdb(wallet->strWalletFile);
+        switch(index.row())
+        {
+        case StartAtStartup:
+            successful = false; /*TODO*/
+            break;
+        case MinimizeToTray:
+            fMinimizeToTray = value.toBool();
+            walletdb.WriteSetting("fMinimizeToTray", fMinimizeToTray);
+            break;
+        case MapPortUPnP:
+            fUseUPnP = value.toBool();
+            walletdb.WriteSetting("fUseUPnP", fUseUPnP);
+#ifdef USE_UPNP
+            MapPort(fUseUPnP);
+#endif
+            break;
+        case MinimizeOnClose:
+            fMinimizeOnClose = value.toBool();
+            walletdb.WriteSetting("fMinimizeOnClose", fMinimizeOnClose);
+            break;
+        case ConnectSOCKS4:
+            fUseProxy = value.toBool();
+            walletdb.WriteSetting("fUseProxy", fUseProxy);
+            break;
+        case ProxyIP:
+            {
+                // Use CAddress to parse and check IP
+                CAddress addr(value.toString().toStdString() + ":1");
+                if (addr.ip != INADDR_NONE)
+                {
+                    addrProxy.ip = addr.ip;
+                    walletdb.WriteSetting("addrProxy", addrProxy);
+                }
+                else
+                {
+                    successful = false;
+                }
+            }
+            break;
+        case ProxyPort:
+            {
+                int nPort = atoi(value.toString().toAscii().data());
+                if (nPort > 0 && nPort < USHRT_MAX)
+                {
+                    addrProxy.port = htons(nPort);
+                    walletdb.WriteSetting("addrProxy", addrProxy);
+                }
+                else
+                {
+                    successful = false;
+                }
+            }
+            break;
+        case Fee: {
+            nTransactionFee = value.toLongLong();
+            walletdb.WriteSetting("nTransactionFee", nTransactionFee);
+            }
+            break;
+        case DisplayUnit: {
+            int unit = value.toInt();
+            nDisplayUnit = unit;
+            walletdb.WriteSetting("nDisplayUnit", nDisplayUnit);
+            emit displayUnitChanged(unit);
+            }
+        case DisplayAddresses: {
+            bDisplayAddresses = value.toBool();
+            walletdb.WriteSetting("bDisplayAddresses", bDisplayAddresses);
+            }
+        default:
+            break;
+        }
+    }
+    emit dataChanged(index, index);
+
+    return successful;
+}
+
+qint64 OptionsModel::getTransactionFee()
+{
+    return nTransactionFee;
+}
+
+bool OptionsModel::getMinimizeToTray()
+{
+    return fMinimizeToTray;
+}
+
+bool OptionsModel::getMinimizeOnClose()
+{
+    return fMinimizeOnClose;
+}
+
+int OptionsModel::getDisplayUnit()
+{
+    return nDisplayUnit;
+}
+
+bool OptionsModel::getDisplayAddresses()
+{
+    return bDisplayAddresses;
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/optionsmodel.h
@@ -0,0 +1,56 @@
+#ifndef OPTIONSMODEL_H
+#define OPTIONSMODEL_H
+
+#include <QAbstractListModel>
+
+class CWallet;
+
+/* Interface from QT to configuration data structure for bitcoin client.
+   To QT, the options are presented as a list with the different options
+   laid out vertically.
+   This can be changed to a tree once the settings become sufficiently
+   complex.
+ */
+class OptionsModel : public QAbstractListModel
+{
+    Q_OBJECT
+public:
+    explicit OptionsModel(CWallet *wallet, QObject *parent = 0);
+
+    enum OptionID {
+        StartAtStartup, // bool
+        MinimizeToTray, // bool
+        MapPortUPnP, // bool
+        MinimizeOnClose, // bool
+        ConnectSOCKS4, // bool
+        ProxyIP, // QString
+        ProxyPort, // QString
+        Fee, // qint64
+        DisplayUnit, // BitcoinUnits::Unit
+        DisplayAddresses, // bool
+        OptionIDRowCount
+    };
+
+    int rowCount(const QModelIndex & parent = QModelIndex()) const;
+    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
+    bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
+
+    /* Explicit getters */
+    qint64 getTransactionFee();
+    bool getMinimizeToTray();
+    bool getMinimizeOnClose();
+    int getDisplayUnit();
+    bool getDisplayAddresses();
+private:
+    // Wallet stores persistent options
+    CWallet *wallet;
+    int nDisplayUnit;
+    bool bDisplayAddresses;
+signals:
+    void displayUnitChanged(int unit);
+
+public slots:
+
+};
+
+#endif // OPTIONSMODEL_H
new file mode 100644
--- /dev/null
+++ b/src/qt/overviewpage.cpp
@@ -0,0 +1,173 @@
+#include "overviewpage.h"
+#include "ui_overviewpage.h"
+
+#include "walletmodel.h"
+#include "bitcoinunits.h"
+#include "optionsmodel.h"
+#include "transactiontablemodel.h"
+#include "transactionfilterproxy.h"
+#include "guiutil.h"
+#include "guiconstants.h"
+
+#include <QAbstractItemDelegate>
+#include <QPainter>
+
+#define DECORATION_SIZE 64
+#define NUM_ITEMS 3
+
+class TxViewDelegate : public QAbstractItemDelegate
+{
+    //Q_OBJECT
+public:
+    TxViewDelegate(): QAbstractItemDelegate(), unit(BitcoinUnits::BTC)
+    {
+
+    }
+
+    inline void paint(QPainter *painter, const QStyleOptionViewItem &option,
+                      const QModelIndex &index ) const
+    {
+        painter->save();
+
+        QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
+        QRect mainRect = option.rect;
+        QRect decorationRect(mainRect.topLeft(), QSize(DECORATION_SIZE, DECORATION_SIZE));
+        int xspace = DECORATION_SIZE + 8;
+        int ypad = 6;
+        int halfheight = (mainRect.height() - 2*ypad)/2;
+        QRect amountRect(mainRect.left() + xspace, mainRect.top()+ypad, mainRect.width() - xspace, halfheight);
+        QRect addressRect(mainRect.left() + xspace, mainRect.top()+ypad+halfheight, mainRect.width() - xspace, halfheight);
+        icon.paint(painter, decorationRect);
+
+        QDateTime date = index.data(TransactionTableModel::DateRole).toDateTime();
+        QString address = index.data(Qt::DisplayRole).toString();
+        qint64 amount = index.data(TransactionTableModel::AmountRole).toLongLong();
+        bool confirmed = index.data(TransactionTableModel::ConfirmedRole).toBool();
+        QVariant value = index.data(Qt::ForegroundRole);
+        QColor foreground = option.palette.color(QPalette::Text);
+        if(qVariantCanConvert<QColor>(value))
+        {
+            foreground = qvariant_cast<QColor>(value);
+        }
+
+        painter->setPen(foreground);
+        painter->drawText(addressRect, Qt::AlignLeft|Qt::AlignVCenter, address);
+
+        if(amount < 0)
+        {
+            foreground = COLOR_NEGATIVE;
+        }
+        else if(!confirmed)
+        {
+            foreground = COLOR_UNCONFIRMED;
+        }
+        else
+        {
+            foreground = option.palette.color(QPalette::Text);
+        }
+        painter->setPen(foreground);
+        QString amountText = BitcoinUnits::formatWithUnit(unit, amount, true);
+        if(!confirmed)
+        {
+            amountText = QString("[") + amountText + QString("]");
+        }
+        painter->drawText(amountRect, Qt::AlignRight|Qt::AlignVCenter, amountText);
+
+        painter->setPen(option.palette.color(QPalette::Text));
+        painter->drawText(amountRect, Qt::AlignLeft|Qt::AlignVCenter, GUIUtil::dateTimeStr(date));
+
+        painter->restore();
+    }
+
+    inline QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
+    {
+        return QSize(DECORATION_SIZE, DECORATION_SIZE);
+    }
+
+    int unit;
+
+};
+
+OverviewPage::OverviewPage(QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::OverviewPage),
+    currentBalance(-1),
+    currentUnconfirmedBalance(-1),
+    txdelegate(new TxViewDelegate())
+{
+    ui->setupUi(this);
+
+    // Balance: <balance>
+    ui->labelBalance->setFont(QFont("Monospace", -1, QFont::Bold));
+    ui->labelBalance->setToolTip(tr("Your current balance"));
+    ui->labelBalance->setTextInteractionFlags(Qt::TextSelectableByMouse|Qt::TextSelectableByKeyboard);
+
+    // Unconfirmed balance: <balance>
+    ui->labelUnconfirmed->setFont(QFont("Monospace", -1, QFont::Bold));
+    ui->labelUnconfirmed->setToolTip(tr("Total of transactions that have yet to be confirmed, and do not yet count toward the current balance"));
+    ui->labelUnconfirmed->setTextInteractionFlags(Qt::TextSelectableByMouse|Qt::TextSelectableByKeyboard);
+
+    ui->labelNumTransactions->setToolTip(tr("Total number of transactions in wallet"));
+
+    // Recent transactions
+    ui->listTransactions->setStyleSheet("background:transparent");
+    ui->listTransactions->setItemDelegate(txdelegate);
+    ui->listTransactions->setIconSize(QSize(DECORATION_SIZE, DECORATION_SIZE));
+    ui->listTransactions->setSelectionMode(QAbstractItemView::NoSelection);
+    ui->listTransactions->setMinimumHeight(NUM_ITEMS * (DECORATION_SIZE + 2));
+
+    connect(ui->listTransactions, SIGNAL(clicked(QModelIndex)), this, SIGNAL(transactionClicked(QModelIndex)));
+}
+
+OverviewPage::~OverviewPage()
+{
+    delete ui;
+}
+
+void OverviewPage::setBalance(qint64 balance, qint64 unconfirmedBalance)
+{
+    int unit = model->getOptionsModel()->getDisplayUnit();
+    currentBalance = balance;
+    currentUnconfirmedBalance = unconfirmedBalance;
+    ui->labelBalance->setText(BitcoinUnits::formatWithUnit(unit, balance));
+    ui->labelUnconfirmed->setText(BitcoinUnits::formatWithUnit(unit, unconfirmedBalance));
+}
+
+void OverviewPage::setNumTransactions(int count)
+{
+    ui->labelNumTransactions->setText(QLocale::system().toString(count));
+}
+
+void OverviewPage::setModel(WalletModel *model)
+{
+    this->model = model;
+
+    // Set up transaction list
+    TransactionFilterProxy *filter = new TransactionFilterProxy();
+    filter->setSourceModel(model->getTransactionTableModel());
+    filter->setLimit(NUM_ITEMS);
+    filter->setDynamicSortFilter(true);
+    filter->setSortRole(Qt::EditRole);
+    filter->sort(TransactionTableModel::Status, Qt::DescendingOrder);
+
+    ui->listTransactions->setModel(filter);
+    ui->listTransactions->setModelColumn(TransactionTableModel::ToAddress);
+
+    // Keep up to date with wallet
+    setBalance(model->getBalance(), model->getUnconfirmedBalance());
+    connect(model, SIGNAL(balanceChanged(qint64, qint64)), this, SLOT(setBalance(qint64, qint64)));
+
+    setNumTransactions(model->getNumTransactions());
+    connect(model, SIGNAL(numTransactionsChanged(int)), this, SLOT(setNumTransactions(int)));
+
+    connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(displayUnitChanged()));
+}
+
+void OverviewPage::displayUnitChanged()
+{
+    if(currentBalance != -1)
+        setBalance(currentBalance, currentUnconfirmedBalance);
+
+    txdelegate->unit = model->getOptionsModel()->getDisplayUnit();
+    ui->listTransactions->update();
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/overviewpage.h
@@ -0,0 +1,45 @@
+#ifndef OVERVIEWPAGE_H
+#define OVERVIEWPAGE_H
+
+#include <QWidget>
+
+QT_BEGIN_NAMESPACE
+class QModelIndex;
+QT_END_NAMESPACE
+
+namespace Ui {
+    class OverviewPage;
+}
+class WalletModel;
+class TxViewDelegate;
+
+class OverviewPage : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit OverviewPage(QWidget *parent = 0);
+    ~OverviewPage();
+
+    void setModel(WalletModel *model);
+
+public slots:
+    void setBalance(qint64 balance, qint64 unconfirmedBalance);
+    void setNumTransactions(int count);
+
+signals:
+    void transactionClicked(const QModelIndex &index);
+
+private:
+    Ui::OverviewPage *ui;
+    WalletModel *model;
+    qint64 currentBalance;
+    qint64 currentUnconfirmedBalance;
+
+    TxViewDelegate *txdelegate;
+
+private slots:
+    void displayUnitChanged();
+};
+
+#endif // OVERVIEWPAGE_H
new file mode 100644
--- /dev/null
+++ b/src/qt/qvalidatedlineedit.cpp
@@ -0,0 +1,45 @@
+#include "qvalidatedlineedit.h"
+
+#include "guiconstants.h"
+
+QValidatedLineEdit::QValidatedLineEdit(QWidget *parent) :
+    QLineEdit(parent), valid(true)
+{
+    connect(this, SIGNAL(textChanged(QString)), this, SLOT(markValid()));
+}
+
+void QValidatedLineEdit::setValid(bool valid)
+{
+    if(valid == this->valid)
+    {
+        return;
+    }
+
+    if(valid)
+    {
+        setStyleSheet("");
+    }
+    else
+    {
+        setStyleSheet(STYLE_INVALID);
+    }
+    this->valid = valid;
+}
+
+void QValidatedLineEdit::focusInEvent(QFocusEvent *evt)
+{
+    // Clear invalid flag on focus
+    setValid(true);
+    QLineEdit::focusInEvent(evt);
+}
+
+void QValidatedLineEdit::markValid()
+{
+    setValid(true);
+}
+
+void QValidatedLineEdit::clear()
+{
+    setValid(true);
+    QLineEdit::clear();
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/qvalidatedlineedit.h
@@ -0,0 +1,28 @@
+#ifndef QVALIDATEDLINEEDIT_H
+#define QVALIDATEDLINEEDIT_H
+
+#include <QLineEdit>
+
+// Line edit that can be marked as "invalid". When marked as invalid,
+// it will get a red background until it is focused.
+class QValidatedLineEdit : public QLineEdit
+{
+    Q_OBJECT
+public:
+    explicit QValidatedLineEdit(QWidget *parent = 0);
+    void clear();
+
+protected:
+    void focusInEvent(QFocusEvent *evt);
+
+private:
+    bool valid;
+
+public slots:
+    void setValid(bool valid);
+
+private slots:
+    void markValid();
+};
+
+#endif // QVALIDATEDLINEEDIT_H
new file mode 100644
--- /dev/null
+++ b/src/qt/qvaluecombobox.cpp
@@ -0,0 +1,27 @@
+#include "qvaluecombobox.h"
+
+QValueComboBox::QValueComboBox(QWidget *parent) :
+        QComboBox(parent), role(Qt::UserRole)
+{
+    connect(this, SIGNAL(currentIndexChanged(int)), this, SLOT(handleSelectionChanged(int)));
+}
+
+int QValueComboBox::value() const
+{
+    return itemData(currentIndex(), role).toInt();
+}
+
+void QValueComboBox::setValue(int value)
+{
+    setCurrentIndex(findData(value, role));
+}
+
+void QValueComboBox::setRole(int role)
+{
+    this->role = role;
+}
+
+void QValueComboBox::handleSelectionChanged(int idx)
+{
+    emit valueChanged();
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/qvaluecombobox.h
@@ -0,0 +1,33 @@
+#ifndef QVALUECOMBOBOX_H
+#define QVALUECOMBOBOX_H
+
+#include <QComboBox>
+
+// QComboBox that can be used with QDataWidgetMapper to select
+// ordinal values from a model.
+class QValueComboBox : public QComboBox
+{
+    Q_OBJECT
+    Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged USER true);
+public:
+    explicit QValueComboBox(QWidget *parent = 0);
+
+    int value() const;
+    void setValue(int value);
+
+    // Model role to use as value
+    void setRole(int role);
+
+signals:
+    void valueChanged();
+
+public slots:
+
+private:
+    int role;
+
+private slots:
+    void handleSelectionChanged(int idx);
+};
+
+#endif // QVALUECOMBOBOX_H
new file mode 100644
--- /dev/null
+++ b/src/qt/res/bitcoin-qt.rc
@@ -0,0 +1,1 @@
+IDI_ICON1 ICON DISCARDABLE "icons/bitcoin.ico"
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f98e2a8ca7386c19292423b94c97818052a38674
GIT binary patch
literal 1279
zc$@+M1OWSqP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS0000PbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$Ukx4{BR9J<z
zm(7bDMHq*lx4OD}rf274H!KNwFc{REkw|Xw<6p=ze}IAq&k5o|LDUtZ2%Z!KJ&QT$
zLCn>-i5SR2M2sP1Q8DgD*PY4i$8=S_9=hi%Zn8a+)G%E|(Y(Ls{k>Jy-J+^gZRuz6
zDMVfr6%hp!3<e`HRxB}*Msla$`>OZK*1J_>+Nw9kpW4RBBPTyNef0EVViE#Mz~k^Z
z98Me_&xM=cKGS})@#W@g{hzADHB|u+7LOe`R<B8opaG{jx#r|LAP)mv$jQTi!wZLN
zz@t^eR(3#vpn*Xc;Ba^Xj(pTR^@SI~RnBQ900DgPxZoK6N=b4Y0bleXJRAVD02n*q
zaq95mr+~crhXo+`;5839PNy9R63EF5fZ&np8*7FV1PH;C`+Q1#)R#_p?<flPzySp3
zJwpeAc=DkWGKTQ#ixvCe0U&s<xgShqU+#e6jFh`z7J&MP>65Lr`O%3-o?TQ_l|Y~v
zDN4|w0p<BaFGLIJLXvw|9zVX6cH^sfy1oZ<`cCKlxz|O303b*J1hiZr;$+MGBQIN{
zX6fvS_nv!v{t0~WcrCK<8t}p4wG3YN(+*7R0P#3+EN@*f{<t31C_n@n0g<8+sMT^#
zQ3s84>5`4rb{=aV!G*jO_P7$nhjOcFQQIlO(YQPX#BsUz1D7@~A*RS$Q3S?U8O{k<
z1w-4S{3q*?=*W>Fz*NOYeLvjc{Q5Vn^jFYGArb_gf&f9K5FbGRR-Nj=4+`<Svo24*
zVmvIvSbS~wPcHtw%u06!XL5)r0}mzcf|zhXQBbg`l81a`vkQ(eDuW+85`1yqtK*mM
zH7>3%bG?6kRMTPBD))hq$<jy(;9<w_0PLA{;YQ&0_Bz)#e&+jI7rDKAyT~@83_l?#
zTFw=13PL8zQSMbM3d?_d$MJ*5ai#rR`4%_3H(2f7WVN@-Z@pjXyZ-bB_LIUBV-faP
zetWJ76s&mRlOI3k-1W~%qZ&ayYuju4pCEb<2-&;-qdA#`0E-sGjopp?MXNx_y%*uI
zM5DO?RvhQUW_U^xY2NPy6@VBkR;HgccS8h_zT_AMBZyJd2x=(Khe%MPn4am8%Xv{%
z4!qiWT15|ymG;OK4$7P?nFTqx7hq~r;yA%<OWwWKeFM0>kAJt;&u(6^0DryJy|T~E
z95~ZDyw`I+vl*GqsN0Oh#%K`f(!IQXcJu4~V#17%<4FKPXeDi0NsC6@Ad557D8&WG
zjjBOs0`QbiwxV^?4xMzKR@$Z+H_76RdQ@k}Z_gk<%PZMLYbGt)B|s<b&`#SlY=e57
z(R1DEuS5R_ATbHexJfH%(N5cACz2LfoDmJ8nc~e1P`4RboY9CI1;_+MGil;?9@blN
z*=jbW9@R%6bMYLlq*X$6=qGn(Dna#6Gr)+!nwU6>NlZc-)u>1H!i}U!C!HsYvzZc_
z1z??=U4tQ#2y5)<A4dgDBhFasuI&J;RfEbbpXZBb+NVrpUP^6h;wY9RN+h*4liE~j
pam_>~lB>U8{bKFyjistF{{@~KDQfpwvA_TT002ovPDHLkV1nEmR^I>s
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1086fbeb6336b6474f48a5510a0582e3d790348a
GIT binary patch
literal 1211
zc$@*d1VsCZP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$T}ebiRCwCVS50UgRTTd2%$<3E=H(@M
z2{EC;pQ4zGl}bRmXqPTrx^km#1Q)KPAPQ~;p$dxV(xMwh47ezWU0BmvuqYCfCbnv<
zZDNzY{58q@o1c3;b7x*=(!8d5F?~32m^*jop6|QgIrrQ<f{5^cz3j<zqvR}Ju3eiR
z`|jemr(Wbfqn!l0CeD3DRGB5JFA=#Lv^qaSKc6}E<;U-w=xhgpzR7?<`8tzWAo9u-
zUW(?Xf1tCYAH1|5itOw_i15yNLP~K%>BoUbkKpjg@lVct@!o$9i@X!`8?U``aBEkT
zti&Wd4~6~%7=Gf&yQ80dG*s*<yq>mYM)5b*ngiwe<F4zTc75+Wb6-l?QatnA%NJuO
z383h1O@IISoCB-Z<C#)4<Fswz@ux<Dd<0op2rI`T@O!TUK@Q+n@yq$IQS8aX&U8U$
z3P|M&sMZPV<toY>>+oGSBu#;S3Q`bks+1l(_WU3_b^`_EBPULuEq0@~c<?aDaT&wY
zgDy=>+*!L|`AQ2}vkFCd_=+HWpT+Tz@9IZ!umB-5i2+PRu?ZiGQx|#z%qu6KJsuFq
z3TYqpy(&A*qE?z_?2v>m5tPuW8IOod%!}aGE1VgURgn;;$swz0BUOdSc0n;wVOmE6
z>>z<so34}}wZzV-ySyktYLh63P$|{;BxN*^l#UZcPvYJ#@Bk|UGPcAN?I_CxO5hkV
zDefe{4YQ|&(#ayyc+n08sF?zK_Uayki?FJae>(vYvTBn8Xr_SfRDOFxpqhmMyQn(*
znS|RFP|ZUS?1)0_BQY*S2^^U$p<#hYVl$}09EHghBdS?K>_ZO3%YDZ}l(K-oFHhj+
z><m1o9uY{8*>etVQ$QpNQC!FK_gQf2Ygn3Fz}(EQFzqY`9(ocz{X^j<qxMp`s0jgq
zFfK%!?t;f`%4QV|<T4g~&w;}#l>WGY*(*Qd;X_ZOqo>#sypG;&N+&|Fy%5osq!o}n
z>yDg>LfXO1<QO)VN*oST=Ssuk91%Mxpqd=XB2qzog%Vqw8b(mTjL?__Q$Z)yusr`e
z41PAX88D@UWHU|4{YE&Bzt%a^7%v)ofrtr&Al%?Vwk6>U1<xQTz8ie6Y*etgxQvyR
zHPmW#T{HNYhrT|3&#KM*IfuG;js37X-MuLE4PxMdVOW{&a8_oTP4D>(=CMy>Qz%Wq
z;HRtqtYYHoH}EO0+ad~FtVWt=6CSf1R&o7?K2B;yv_l4%FRkIm!V0Fw$8}=ITW=U1
zlU2#v0p?IlK=SN=yOly+nRh)Ah(>O3YdE*6`=-i;U>$9~yW99w&DWSQ0XXY#{nXvj
z>XLqcWEt0;PMjRiw_FYm-0!Y82o=~K41UF0Sk&^+tDnAkvnG$}U#PS<cIm?x-sYy)
z!f|nh?JuE&2;}tPfA?2#knLe>{3G6CTVkuX;DdiGP~K}{4{|yipQtr3pT*Jge*Uij
Z0{~;&23{aS+7bW&002ovPDHLkV1ng#K&=1(
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..3c757080aac278e995327449488b4b4e6c760d8d
GIT binary patch
literal 99044
zc$}<V2Vhgz)jm&K-g{5k^4@z7Y-9Egd#^wsB!LVFfjr3*FTe&{ww8xH*n1>tnvS#?
zO`0ZY+O%m_v(roxVhv;c=e{S&GT7k$|1U6>-o5ub``mNxHL!itu024>Ki$43Jq>{K
zc@+p=`P<vS1_+XaquKq_VZC9*p#Ph50u55L;%B{4|Mr2;-qqh&5e$%ibJ)~*rS;YB
z>jwP|4-tH>*PC7}qXB+T>plJix%y#)VPre}@G@lnVler<A=5`0K|3<q2A>&>$N#0*
z8w_v4lKx(Rn+C)Af8uPT7CwJ18$P8CF=t=a8;n29fnn1yfWcroywIqB7GS~OK7Jm+
zXc!HL4~B1jdrIp<gXBGf{$<E7|3!am@z-m={Q3u@{uc=sM0<bHe`r{1G#K>53uNFx
z6}>xR7||O?UyG^&u{%@_Uc0PG2QCdL^nSVgQ2=)$v_qq!Q>p3dtP%yH&_k=+J5}ns
z1+Dd}<5?a6VeOrojgPIZ*}hk+Zg=EEbEm3@PNd;MSzovM07NL1+P<Mm7-)cq9<9dt
zV5hpL{{%dI@zVXE=+&;N?b7rO9)|oUklH|>c2|v3qZ@h<2HRsneL~m0Yk!wk*P8(s
zu3i8b(si#)?NaXr$m!^=1sLq@^@4h3uWI*BF-qO0>plpPaSBy$wz^oY>DG0tyg9&|
z*{MF<ThQOv+pS6?Qb*NjH9gwyUfK_(c7TL!dmh;o1{_A};Ly+@03J$R&k2`C$Hv7*
zhk*d4j`4|%PDqLKPl`>9cIE*HBV&?7W5QFT;xdzCI21^tle1DhQ0lb8tmJSIOA|5*
z%0pmI3AhwwCUQffQ*ujZLe9$NsZf}k>K_)HmS0f<A;kp%<%Q{?VX^52m8r05sV~f^
zEXoKCj!i2l^My5=)&fi~%<y-LPKg5un7yzJpe!$q58;Vfxd};VDoK7}mK4O|=;Um#
z;(*f9lEUm1J^<w&lboFAU09fxmEs}?u_z)jH6tTEElN-YLJl|tg@px*<gh2_!5uhR
z1mxws{K*5W{kXusoONdAbwR=*A7gIf`~RH$<!iH{0_Arb9yP!GoU-%0&OB;Nqu>mV
zzLD?d5!YZIHUGiQi&?sddb8GV&MmWf+D7JcMVi^XkN+35xv>F1jeaT(XdlRRGMLS0
zTgdPgx3<nS{%L%7@geg0VV=o68s>xVx?;@c56XSLUjO#>Xea!<p7+wI`Kz6=5g`Gb
zR`ckG(U68@<!`LN@Yk>K%>yFft~8rJGglKb<^~_+Ur_#c=7ag)JAE1XI9^LM*Pj{O
z9w){R+jo*^7sn2Pxbtsce0$@@x1ao}`Y`ZB@cIoyjh<)x@j6hAz&-u5epsgG7)-;o
zo;$4nv8En)9QdaJA36=|fAhdw`dg-9{jlkG^#Gq$>zxgzN8!1V$98_I$Gq_-y6nGX
zdXM2RULC$=c7v}+0e&!$k>6AShjYz9>%E2z#{f!k^{w|I6%&m?uOE3DP4>&M9w(aG
zs(|lS0@qD?+Q88d|0D<aJFN%ghHtuc3V<sIPSfW`GN?Z*1NcR*ml@zX4IZDq6p4n0
zUz<qu|BP?1B00H%8re+)*JvF1Cx*s{gq-n7fcFtlW)SGjsGCj`ZREXx3!ar3gu|F|
zzCli^47^Y9(HpdpGQ5Nd?p2wAr~e4^7Foy98!ynnzx=^B-+vU0gCCQ@o0y~+g12_n
z0FMHwHj>Aqmd9YGfphB56>{KyVl*NM*9=4~9C@Dx$A6eczrzF|hA){h%z)o9WBoKZ
zd}TuR|AgEKO)>*t|1l~V7xE0hy!z!F8YqK-Hi8*-@srHppnm~4mkcBiAD4sR#3*XR
z_-`CTP|A1^nI`5ihgE^Ya`iL6(m5cX8xa*uIOlDdo@@T>6~!SWz$o~-44g8_0?gZ}
z(T|T*1N90@MUCKI;dPxMqyIg$7=Ht2K70GmfBW8uR-=r^s{uZu^<smOhChxx2=D7_
z43z$@YQQw|6|EN<-%@{h3*bf#()gIF0VfW8#CVBe`1SK9If`g7zQdtv!I6T?reQ)J
zf5~z7Ep-#{3f>qYJ}N*{8gBhI`Y>>#`raL;M|tMqzqWa|1Lfw@1nB2$tD0Mn9Xs0i
z)Plnx<io*ZiVlTB*2!0Nwmm|8o!Wk!R`5Ezx>Raf$?NLsJhreNyeX*d?C9)NDpl$y
z%WBl!8l|#R`2-F$DHNSJRio*d1$%pDl^;>7lwEW!_|`E4Z8EKH&;b<v09_i5TG{n@
z6$DTZlQFdhlU&>iOy{i-rt9w3sFbRC=<@9yWUOah6*xM?!IJ~Mz1>=svRw|&RSc=_
z9^K$>jAJ>7)^zG{P_5jFPTa2OQfah3z5N6GX>eB8`w_Q4(BG@os1)c)4=EH%wYH~E
zH*j(udj6R+=h|i9cdV~Rt5(kesO!M3uDe$^FmzS`u=6~9&KJ!^?MHl#3b&{u1ih!P
zfAEA7y`}Bq#S7;fY4EJ?M*vkL08%ID14AdD#Bo{o$<tbI99Ik=fVvX^cT%;Mz@M32
z13u_pD^Cs*Y%K;F4iU;H&S5A#c|09`NPYUmU_Xv_19VtNJ7@?}U3(TMfdI7ZxC-E?
z75HHsAG&<?+O<~Xo6n**qhO5Ky>;qzjEM`E=*w_b2Ch1Wuf0I+>LhY)kOTGjCD}#j
zmVsc9$fTW*VkkOQ8l4xWp2A&KHG70K2&N77_jPMDG7!m-uBQKZ^_D{*Xd^4sdoV1*
z83Xn9VJV~7Pz}P`L0u0DiRFa<BV<8$4-M;v<nWmCaN`jzGJ&PRnriSp)TvZydlp00
z;7m9+I5^O+>+9*!sH<^^g2P=nShuBP0HC{Hr|awOL7O+%f`EcUT}ri@?&j3&*3rEJ
ze6G>dQgtAv;2|XrX*60{H(#sOsI?oLKp>^n=)Y>2hNo6{@AJbD@!eY6MQeH8T{Wwn
zF+{{7CPaM0BoUF35#b?TIE8|cNLnh2ii(boijqbKHiNr=q*NLe6C0n95T6hq7ZV-n
z*#Mql<XL<|QnJ)5CM6{~F+Mgr2;)N{l}5)UCa0!l_(4pjpLZgT#Drpe;QW~Qq{P_F
zoIEaM<pX47q$VZA23LcBAQ?(d3k7fu2Pn=4r~I7E^yGwCPYjPpX*7;yg=2W|+#$KR
zAU7*LB_SHaBTO0<mz0{BQ&5tKE`Z@7&BHPvEjd02!y{4}lSsyj%hJ%zDvKP@(y4{H
znW;&!7#)GqsQBdc?EK=g%5aR1g^Lze$RH@UASWXw!3!W<8k3NknOiiiVh$Ds8OxU5
zx3~zsJGB_$laS2_X>3wjc793uj0$v{S*up9Tvm?bIi(1Y91ReO=ovYMrPF6+<9OMU
zl`9uI;CM+{QEp~RJOENpLHM%DxsrPDjG0+poS&77LZGOrnR&%!GcaU1rHg_wG-l14
zSy7Uootk7FEh?XZrFPKb%@1s@#ElSUu;aKoA}S#T$IB{Hk?8V`o40J5i$pmrdJI;u
z3|9r2(|mAz<=XWd)~&(Ns3<GS%S@F31WMzQ(z7FQzsOy&a`oy}SUL+TN()gXWIj=6
zwh&_@B&&2<E*4~hK*Y^XOTyR)MGK|pW~aqsY!s9h<YuIVV{8bev1ozZ!eZR$<1jX|
zN{fhfu;}y;WK5cy4ASY@kT$I_FTVr_v(r-oF#y8R7t*tWA+0nR3M$IWN{b8gvNKYm
zYQZ}qHX%7ZQIb^%P*_}CRG3eEA+{dGlGym9)Qqg0<XAdikeid8k(LtO0K&l7_{5a7
z^h{Y6KNBA%2Q`7KI6N*sF*zkQEiE-AIXOab7##Tlk#Px$iAf1ke=bG^htmW*nSzlg
z0^5tj7dtq+y1Kc#IPf`e`->xTsBC}f-#^~??A5MifnMVAGbo|U!T*?TuOE-ZdJ8H0
z#S4EVC7YS8-0<t>!{N?02(GxpGCKOjbDuNgqvo^mZk7s`BfexqzPA0><`*yjK;FKT
z;>I9QA~iFl{}TV$SM;IzsTDVw2iKFF2@j$*?9w;(Z+xn4dc67HOXga@>Z4G6uD6k;
z{mRDd_~-z?tfd)Gu-uHA=J;|!eALEwQ@EqhAt2N@=-@Z(vr8!s92cXFx#!ayc?}1%
z0)3;(UtrhF^%1NcQ;RO!*#*D7knHQ9@g75>Em}M{HoiaJX(m&t$2j^anDsB`I{w2p
zd}Dp6BTb&ZmgVHy&OG|2(q+UtJo=Y;UgC{^|4IL!JxPwPFR(%__85a7DsUDC=FDF@
zH`B*)hUM96@3HZ{@eVQjDiULZT?8_#wKjO#hQD1K;#6Zce_j{iDhm0RWqggt7uNAV
z&hm76nON?6tg~kY`|QVM?!RJn`Q=a5sZMU})7jpl&|jFR@6L5T$UJ&u@1h(ZQ3a#s
zZ|C_6*uKMjzDStFywNO5^mE{QEFXB~jprZCbP?uRS?2m(V~q1j|5`r>m(bLLX+?3K
zLg&-W@ZXpDQ%=*Y`pNKZsPOaj_VadgtzjS4<v0N^P{j_vGjFwdFn-2qP3PbztoSc3
z4Z;q|A?96X!ZS<z%`LeXM{NrEaz~N_aZiu@ugJ$QhQ2WGF8N{1T>A^$83*P0lzzzY
zXdZp<f^GQgr%HWztb_A>axPk2&Kd{imme(j;adZQ=aIDiZL?hjz2Ce%*@I^nV2&ZV
z_h0;k9slBa*{b{y$8ix#@tuQGrY+pE>)~x{msF$#IrA*xx&2YnFfCp~-kUAI&VX?C
zQ_73K|MTmw)35RV^jt4J>kDvv_|n^-|7;|O4*KD0y~toRnr?pbYIoUtWZ#C99}XMZ
z^?ZZr$G262zXR{N&#=r@>iNS4)5k;9o50)uKGwcHdfu?X_(ARKz<usp<M1H%UdHdw
zy#m}<vDrFBI<evBeowaO=WkxpQ^VI^06qohZs>=v=&7Gtp9gOCSBBwhWYxdRuaoZM
zd0e393>z<818(luhT&ghPxoomW#A0zht+y6wxlC!9M@N01kM`<d?X%z6C9Vd|8>+j
z+=&CGXU_tc1D_di^6;?n!78kqzLV+c;bXY?eV|SPhga}}5_!Q^gkv!Cu!#J36?R<s
zpjFTL#+w=fE^p?|VFijx`UmU`;DZ`$dE^F>{->6gjH4*_VFdp%o*KZZl{bgm2}Al?
z1L&~Nh#AFJ%2-88v9>oxjQZhboO`pB(gBxSadY@MGq(=AtyMU=(TJ1HxQFoGBvxo5
zQ&Xs3oI3p`;TU@heZ2ujYk+!*bXA|%fZ!Jc=_-aBar8zQ)s4y({yf~q&TTNjJIL$T
zRR%bT@R_67l99;`NcDTS9-zKKA(@#?2I#_>Bc$(Jfm7RzRqWJ5sEJRptbMNyRf~P?
zvwyoaYDD3vThlEJg9+JrojfAI@QMbg=M6{E5pek*aSNW-^2Zxy6Jd84DZGjl^nb=T
zKh&`V>h+XSqeLS$7>17!B^wN;$7?_o{=}sZM{gPRuM+`?4x5o)_^k#)rVg1l&8E75
zVnj6<%#IDfy|3-cW}IvyI>f4sQWzTy4aoj?UDyb=5(YkOCz9ctuaM<G>zfUS^zdQ_
zw)CyYFkx)49faB+NIP%1f>7TaHXwT=J39!WBl;@r7&j<@Kl{>KUk!T^Qb!DRNZ^Nd
zBydz;jdb~Hj76l~YCMWd;rub6)*Fss<H#}fr0W3QXd^33X>CA#if&Vn?emYnegZA=
zfvL?<i&$?T#rATa@vy!Tn{Ly{E52$Herw-ED<2^fZp}Fg)K}<5)Uf`rfihL~0QbaA
zqrQdcr5d09<1hjoHa0Vkbr_q?kuAMIseWo9oiLd(vg$BUUk|tFTXD%NI^bNpg_@|r
zrEj$WwFFnf@G%3NZ9qv-@WtP^pyhDgt$6HC{>tLw(vdBV!1?6g&!I~HX>7EB!*!f<
zvqg{V%~-#a9P-`kYf;$Oj7>-a47i3mZD>Lg#|`iq_F-46jNFkQemC<dx<)e+s?t-2
zYHVu1KnB~8!DsRP$A%gs@7A}!1_~Mc4!xQ%`_~4bT#PIdWt1V*kB5xZPY*RCg_$Ew
zEYvNRL)b(a2t$-P4d<8+899bqeTefKi(_cT8Si8GusFXUxo%SfnRKohsD%uW9LfFp
z5WvqwXI#C}@FF6;)oi40?Ihwh63K?^f!b;$Fl}f!^x;~Z^B<gJ_zCBH)6Bw*RMY|d
zp&4QLILByCX@tW@%A{&yrl9^5b;L26P;}Y|KO-}{Mp_W#ckBd|X!tLP@FStqY5+Ys
z*7-dWdhUo3UdB29X<_8XDX5ua1}^Hq20`985Reye!VfJ3WHcQ8|1mT}t3hU@%t?sw
z1L30$XPB57rZwo^7g=#+$O$umTG8_mZmH=ol98eE8gSN|WY$q+Mn)LL;YFrqoN0cb
z38+q^W#;f%ocRe699cG@fjLb^QzMzygzEX-VIupVaLQLr=;ol8BUcH{;8y+8H>2iT
zCUW{?G#E!l8qje6L9edTliUa2k?__ZHOP(dQ!6;8?>eT^oxFIqU$w`ZxbnzRhB(~7
zsXsL^DkD6;a1P+3R(6P_B$Bm;kD#xS(UGTc!)P5L(Z)=;g%i-MR;B_@1D`WjZ!qE$
zxgN|I>i)K2`1%a+_u!!2s4I>#LK`lf2HsyyIM|9~)Tk@&G^R#m9*N%Cfx#wH0rj4~
z3KItzcC#Bc^BaL@82;+j1IID9nrfISU`Eai><sv*5kx~KlhHIX@{tb1?WDe%on*vG
zzgQ*>qM83$W#Su0Zhdkl1k(gp^bJc6zQ<`llWEB4=t`XTZLNuCG>v|xIs(*(CK)^H
z6Ot0yStPu{c*w*xj{I~K^T}UKG&|>Aob!QY&N~QH--JN7-s4ft!2J}3XC}RZlm29x
z)P<8?qm4}_&W&WM3Am!44eX==oOG@Ujm^^=jpjmhnJ*27W)sJF(+9DRnuwCovy4xm
zFVn_Dj14h3jW>`p0|RI@eAxn6Jg^gQ72?DglXarOaJ>=uPn(EiH6V`$qe+Fi;~m!W
zH0l?l=$Au`*HE{%BbP7Bj9i>$tTqYpPvVi^pzprX%1-~Xj^vSg;*i9bM$!AfK*w~z
z6=)aohk-bdH$MLh&ft^d$l;ff#-&Ew{~h$BKY#Rtd33~N`WxZD#>kw9;vdy$k$ILy
zB;=avNRn<O`>lDI40!3Q9+e9)>SU%igiprBZyaGfD6t-GO86%`^RvfM<Hs<Nk>huc
zvK)VlneQLSF*C!Qj=uGkq0I=VaLQ*#4Lri%Rh%-2n`kvT_{3e#(26YGXu)*BFk{+@
ze#;Jz>^Kgb118fEqN8}UHW-;HW)9}*_ZTYGNLB&7rkDRSI)b5Z`nD2-v>5kLhSbX_
z!*RsIT4hiPBA5NwJ~ofu8X2KYypdbxkGqZl{E8*I5oP?Pf$Z02NjHcWY<&3Xrq-%Q
z)=;gea`YFB+8;<#A*BmBZvE#$hvzYv4wD@c#nxh84>6MUe7({9>E&I|0Q~VVQJFay
z8TuQ;Yn_2-GJSmgfy)3v7G1o7ZoUjd@(>Q`KfJp9JQhXFve8lul6RS9O(d_IZocb(
z8mM-oMY30L$DVF#K+Zsa3JaY_4Y*qqa>>Z>Us;!FM&{nbkQej;r=0BUtbe@F1`yte
z(?M4Qe52vUC%=kS0q6KI>kOk|SYMpSB+!U1T2T$clSV9EjHX|80p~3fq6qZNsW+B2
zSn4r^8rd@JpUmlh8`eIazq`@K^7&OeZk-#DQBq^Qij#gM*A9+YV}AJFYu8jyV8JKY
zseAE5lY#6TNWEBrHfh2lhB6)|r7l)p@I4l<)bEYVVZNz)go|#En;A-L80;d2OTD$=
z9W6m|&yk|*4UEe#^?ep*hrjN^8aBsZnOV!$m;WN=o2CZ(aTb|m%EWA0%LH?s0p4T_
za%yA|vY|8Tm~h{Lh3GTrP>7(!#~V$SQuQ4qMe;@;scIXE@7}r(S-D17`5OX#-$$~~
zpRs8Ae3)@Zl4w81?;1q$9qA>DhrdEQalgTFigX0H;lETDA+yxavvHo%sAV=3l;J-v
zeJGIkk620*fn)|Dy4{Vxp4JhDFh5go=rv6FL^G57adOCaOx;b?M6OXNrU?FC%Q`S;
z_#4+jw3O3V4HnONAqv}?tXmq}xZ5e*Y+KM%#YpOh7xrT(`9~FQu^huc#b<!?s*#0n
zMlUmse)@??WnDRP?L2VQCM-bC;vUNxzEyJ(3)r6;8O~2KT%sv&&by4A&R>m8AEDO|
zFwbRJlizw#cnzqdSXl6w+YSxU47r8UQ$KHg7P#Jj9vQZdDQsih;nCj<u=m^YtpP^`
z!)%{*1TD?<qRfnu_vif<xJPanuq<SHH5u7)NzuXfYBi*1{9?-=fUEwQ^bv9_M&)du
z@ZEmwKkGgp86MJe%x`RZ9eC?sG8&jx)igX5@fPsp?~E9SReJ8o@UI?t7kCdp_uZ)R
zxSnS+e|vVx2OtdEed_Pu-5R|m$34!`G;-?}Ht65IqS+es1-Q86ue*Qyjt3ulWcSu3
zrAdBle|_Gr)8-}3S@+;x`XGIP_tc(E^Af)RUimIr^KrV9RzOFMLfF~a)!z8j#@G*l
zyRE*XvqQn_JSJPm#TI){lS0v<RPZ_!oef)&&Dr(%xrg~&zX&_*-A6k+niMqiRi)r|
zbhhq5NuTOabR1Gp9UZiys<RfqX!ZjapYQ$yP<z@NkT9(v49GfbyJVg0d+3ni#D`JK
zJB}$j>J*#~1wQ906rG)P7uDI-&`EXSJ8owudCoyr5cv2Cv|IRLGGB=EJFT-jWnB$Q
z8F@o@Igu6k8|im8#y$(2M-?5l3K5y!iNCvO1n!dI>{|SiDe(i{>Da}L;i8Vto!I(E
zAc-1<vxP(#j&^k^=`LE?qN4FTC<z&SY$4R-dl@)e2^n0%5a}Wdl(>M#1zdGcueMgj
zesCktyBJKI+R>p{co8^H6LKDwwd_)*Ql(Oo6>29;wAt%wdo(JQT8*D+l@~i`L1KZr
zcAq5|g-x{z&kjaX1_ytWnJQey!{yqFD&WlS(8$#kdE~{85hMnPQ9<2lY)~WHY8Ac=
zKP(JRBQudce$g7LkAo@fuuLt}__NO#Bs(BQ$5H1KxcMZuqgG^{uK1KiVI~s{o?5NZ
zG-IOC&{|sK-L>+dwnxK^Ar=eOiQd9dv;_<zP(pi0H8DENl1%B$K&c1_`I2d2TQzX}
z`?N9*)xDSor?@p$-CBZ2;ABdXg|GG)%y^u5g63yMLs~X80*3r>wc6f1Osp$=<lU6c
zy&8OL)EX-q%Nv6hLXJxaTrCq?43<pgz(OICmPpqPeJH0)*3HpskJW&P@XUbWObb@0
z;+R)2aQMg35d!VGvLPW>cej>+VHYIq=<e?6?&;Z84gQi|9JB!1F{fw~W1oKn@%Str
z@jq9bV?!f=vL4ukdxEZ4)<gB7z)oxNu?0`1CJrlL(VB4ks;$LrLE?c{`m?NQv}+ze
z)YFTMAwNCjt3Q!wtq<XPQE2ySGBO5;t7s*kL{8^^4ZxmSg&PBClU1WWC<9^qs;5=`
zy*)j2FV)k7s;iduae8}eYamdGR4j;AK-TFLUF(&&l`T;aH?d;UDvEK}?%Aky@41g2
z?br47Aq>^kC+ns9R#)Rw9nm9V%Fya$wn}6HR3<60L_|0b8;dN58m&&y0NkAQkC!5E
z{c;^O<cZ<1iSG4BETW4s_N?5sbpg~>li0i+OWT6g(uRJSj_T{I0mr(&-k#oGf}`!G
zwXWk~I`?4(MXl(pQn+?7X~qVGZbo(QXb0hT?Lfay*T1(0oRz(O1gysj=AyC3QkHeF
z;&~Fk9Rot%yL*ciz)yRkQK@sTflySM1&IM-t!V+mrEOTK*VZV!&;*@K+OolP4{+J@
zDgOHYKAo;l-b?q;-EMXOjH~X%sxl8{^6g;q-*||g-fiJJkR0kqF3@<rRzAANqjV}m
zu@7zPkShW$nqfoQih?);>Zj)QfaKVqj>WnIicLFRopP*`XLVL9d@PDlGFirk(@Xbp
z`v<CBwZJWE8bI^YeLlVRKx#`OR3&32-hwQJv4SxwMthDSArHt&|G=^y2z{j2#+D6?
z32GH%`C4+$whXxnvq*=MGww4UO4mPB)(au`_uPg>{L!MTE>#Y;7Kd>U4<IH}c3Bl=
z52d5~xdZ(Jbvg*zH^f}3+e0zBLgRPJv4ctPlq({b?UiMVg<?#{LLpNKHTW2N!WWdS
z8N(y)#Hx&uQXPPel)PFIWG^F=t9tCf=mE~)iE?bvmCC2vA>fD&u7}B8V}kBRw00YF
zR_+)%(egIl1_lQPPd9<!)X7t)dz(tyz`t&Qfn;LGCNQ(LVK2D7S|PE6V}vC+1Y=|j
zZ-|^T9H=_YJ=0&Cb`<<;2$RI&x_j(IMmJfAeP}aAVfby3jP}rkHo&2Sh}czqT5#(0
z*}f`rHtDD7XF{TvWpa$mD(rzpXqCv0J3tvV5=XJ3o?MQw1GQ)9)70SH7Vu9Q#8Hbj
z?NQa@LjXIgu@(!nLTWYLR!H3#;E6L5L_Aw_MsWJ{nKP%)K8)>q9j$X?AyImbmW9MR
zY8CeTbyx^`bTFPcj#0YTh0*5#0Y=!NLA3ZoXV1#dh|iumdlsS3oZHt7ep!R8YHwq>
zlSY1zW1ZT`>{mf7G_e$8d6wfr2KYn`BDW#(Ir^;d%ozfGZgw+xkd&n(Uchk8;L=zx
zcGd$`)X6vjiJft(wJKt8Xb^EvtwQ7K&Q+hK&k2xY1RiQ8R=a~?5=^T2I)J@$tW;4K
zU2M(fPoP<ji6;#74-)7TCr+LXN91$os?R%|J9qZ%IRbumXA`)p2Xy^5o)MZ>1H<#W
zI-nXc6EPKX2m!~qx|3-FeFF7N&AmXMqtDal#OKc=fpf@tT@(1J2gb9Gk;XWj3^{MB
zLe~&l6+&yh3HTV>L?0(loJ37SmFxoN{Dt%M1ulZ0mz|@|Ha3Biy5Gt=LepB2RV`hJ
z-6>=0ch*A~t)Lz6<ox7m)Hg?U{(SWXhx14Q(UJF>CUEN+u;ZNAl2-Ex>uPVT1!f>T
zuY+|H@t9)hUN?eoVIK8z>Rc#l=HvzXB8^|-3m1?CQaHD@3B*H#4Eu;r_Xw@3LB*?b
zu|jyTiq$)p=!Vv~5`4y_7Ut<89^rnl38+g1{SraH$l{;lHiApui9uEX#<2F<S&Hy9
z(L5hD&y>|d#$ix3w9bjZGm1ZX>J)08mv`ynrAzXQ4wo)nyodzOU$`{83HbM)7#QsD
zr*+Ur_i~A=(;5Ns^)BU3L~pEC@U4pHW5hF>aqJ^zwdkEbNfE{KHeb4o=$E;OjuLP#
zT;A9W;;NxR<ejL7?iCZ$ve8c~;b0BvAQS?NyVEK@t9iPIOWcO;hXHy}hzaV%sgvhJ
zn!#<|k&{=iUA=Po(&fuY;qv8;m{_#*AWrKSjyVpO)jS+V_@iTn<>OAGA=NV<HP38s
z4g;)RQ8$CF;3%E{z{8I}NgsIPp+zn&z|TE7I5dFBV&XMSflJCm@*|JXj>yMk*sv0t
z@~!?(^>ov{s6rhdJqGncpWvcHR-FTEeuub&=pU?xsqP+HE40{;+=1dgOge`y);ajB
zXVZOrR>AZT9~E%w%zbBp+H?v(vFgNe)|GJugQP(u%=p;cV%Mn>T5=tlijNV9Zh)#}
z{osNJxl+hHadPMcJ;*0+)u*F-g^X!5r2M72wB#Ov0pk*{qSX|3G2KGK7XhOOL{`Q1
zoB`o{e0So+;1E5)?`HxS4M@yPtGVby1WSyyoy~{1#D{2XHhO8D(Bhzs3++D*RO=b~
zq>z9SzGxjqz#O}6JBC(_Wj2Cw3D|88gBGO*2T(zTv$M0X*5IoE6!d8>VUHf71_sej
zbT&Vs)EZjFxgC;AAXz72Ah{U)#FVE_Ucf-)UAlClZPjt$)SM;z<;hbxGBiYh`D|>`
z-CPp-s6=IV4OHI)m2>JOsS@_mS9n*iU)Swz1Ht2`&zwFz9=C5iu8MV;dm*3NLsH?D
zEA&;t^=r>OH$?j!1_6iPcMtUAHSDH&5A-ud$oEP5io?~b*RDNt{h4Qeb!zt!;C9^|
zyoH41y}+qcXPZED`O0Mief>K94Db52>le0T^?Uf#-Sl0D;PsQbh86r|Ya@s^Ub%ev
z$`!=FPG1vVzlLu#TykHen%q$+B}rFL-RZ}CHjUE*0yZYLH-dMo1)d0S4gb7)^~%|B
z3bQ+Z00m(43Ribqq$ux40y}OGIzAh8biars1G4eQHUfX(5~e>iEnH*2cqq_$*Jj{v
zJjF($kcmXnKzCCFpH{&v-09}wPB%e@V3RpL$i)oNkIF~%OII#mxq3x@RfvD0EiMhT
z0B2|{WArf@Lu<_#nkWSKLvZ_T?#@g`oj8EnUwN6~9#tg2D!M|@F{3|>mHN?%vKx<N
zH!aox?c~T1D~v8%g~7M(bKL%Z68Y4r%0_T#xkxsLO9Ym_A|`|`k?mp-2{d6M9$*qN
zpX}5m5ewKve6$Wkby#6Ady(B{!6nW)mZz{u5cgfQ5V$NS@C^9HtFE|@Hl1KiYjb=N
zslZffrSbsszl)w|t8+r@4)z}FK8;E0<Pmg{^GpFiAv*bklmgV{Y<%84gc+R8*2Hi4
zY>gpP!LmBG1H0WZxxIaZc{1Qh3g<23HG<>Hi|296M_#c6pf58ez$H=yTn<NzHw_I9
zG8GKnCuEB|i&tuc>M<e6><bJoDKK!Wd-6Dl4r7TzP??&Az9eAFiZji?J8HLm_A<pN
zV@s9l7?%7s<SduCiV#aMtEzi?hQg17Sa<Fm1A6g7^+h51cK*TzEc2bam_nl8QX<mb
zKmdtycVnHul_uM<g6<MqN?S$+P~Q%svsj{$TJS>cMLzj<{$vY?dxwZ05Z+Lb9>!8k
zEvqhT07vFX*H&x_*``5PaU2|%l9H0ZA&~rn@H}~Q?p#O<cvzUTNz0U&M1K^vVztci
zx46sJEXcYQAllf}e~A>3SgrCA^uj<|3pmH07_e26Jv|l|A|8s71FPuU>QqvV?NoxB
z!%|wq)O6>G;x21;9s%(|8%K1nlcn%tL@aCqXN#*_Ixfbh{XX3w&MBY2V$=Pr=a*8g
z;HI=m)W??l77MmxC_O=3!iAAY#kN093kA;u76#*qS|UKTsTmwRh+^4>lvX)f+NR!t
zV~@>v2E1y>!rR*-OfB6WEf7@IVX;Wp_)b>We{A3M%i!-hNQhdS;juPQDLV{QW|zg;
zd~R!m`^a%g+rIqs;NOZ(rbX6qU1WF65s*}OC?;r6ZC&J`?x_1|@ZZeTEUdQ1@o?}c
zQ1M;F1N`lJaa-%fwBr4zAds5J>dq#`7#AU}5GH527(=i&-wcMX|0vcmygq<LdccQB
zVv&XEw^^Jg+5o)dih!|`D9e#gujS~X|G^r-@~N+j4pc$lX2O?l?AT&VBCXdk2;E_I
zA=U?MGO<`gN!1|S%{131pYDRd<{>MXO+6asL`tdJ)(*i($Dh!!!dZ`edTT(~iVZck
z0-HNP=v>vySc}$q*iL<{GAdg;Ah@8@%9+x3uw^@qszI<Ga-J}FQdk3mj$;i^ZC{X#
z%+B0Z-A=rh?)MoxIkO&5p%Jvv3V=Pd!q0lRsJ5IXY1uQgzBLFEFhtHk2H7L)6Llw@
z*u21qj%9YA+qg3{B0TEmaL2gAGrKdr0rJ-X9%Bwb1{x7lMGwhv9~BW$23OY4V=PVg
zx{Mw3F?vu!fJ8y=H@e2o9W~Z-$3CLbe&$f_ff}en&`7dF53o^i$Kj|2QxmQN??qh}
zOOaDU+p#FgwTMX$tNI6qva#mhHCQzu8<Y@87IUH#SK>=$8t{9h({e1Xv;##4*o@+r
zkkf3PZV)Ss7OYX^0~D#Y9NDJ~CQ9$xV|Or(rrFXBzO@R4^*C8+J5JX2A#=jLIwoYW
z9;LKsa1OFa4}_Bh&~FW$JCD1SDp@ahH+QgCbk;*^##;R~z-?nn5poGdxeivNchdb{
z44FRGm#k=7(y@_yi`G8yppJG}Z~Uxq*ui$w%Y0=ZWKQAw22(Mx@2^8Z7ZO<Hkp+#$
z;#6$C1vw_xfrHaA7LK|3@L+w3m`A5R^w5qzrWiw!5B14)GUS!+^X%<o!Nw$2Gy4|8
z4S>X>b?lNssTzYr%k=gzziZJc)ingISImSW110NrvRr_Wlkj8WArJ}=vlgb6zSesl
zi;<aYtlr+I{HlP8=&$XS^#w9OEK}p|QV`4G6nHdRZ|!VXMjDyc!*T=F(>tJgY5@m8
z*4r!Zlau=+x>wZ0-0?7%JPx*dqk2AeulqZ#mt&MlB~$ybe6e?9%&NZrW5@b>t9!`Z
zg$s+KWv|GPEK!wa_jzzz*QMwjcV{Qlh_y_-v2`BR-Q7U`Aom{v0zm%enMTM;rCodx
zLh_D}L$Kb{ja~c6dZ1g5UowR7W*=&_)_XM~PiM+y?Cj+vK<O?|I~>MI*}6lft;R1|
zx0roENXXQDoT%N;y9U0?JIAgb?N*cH4RXa=k83IN$%T1pp{wdFc@}t12bGFWS(m%r
zQrp#R1Ae))AJo=G+I`&T!Mmun%VJA*naX;>tX9i4)mk}oBd2k)+%c2dt|8^OK&?1V
zvscQtW#mkWS*NL0QyP3ns~s)(()jIY@gKl-eLHjQZo6EknY;7`HTzva9;uJdeFa>W
zv?wh%_)JP7_ogy6sH*Wx#$1W=iP2<*uLG68U)CjJFYNJ4rjjXZ@k^%S<GQZxK5v0&
zL6wTV?<dEwT{2|@j`O<IU5`zB7sM5N+SE$srwe4t#xA~6tv$9g;{y=7Pk*517#g<5
zRwo@hu(8Db3vdxh^Giynm6cDgEY64xa-HA@KpZ`M1B0tWxIuoNj$Z)JEg)19StW%?
zIrGJf3=i=Ye*k>{@JOjNvP~)=-$H$;zXLBwf^U^LMJf&Ve+zgX;rO{p+JwuQXI`%Z
zH!wmPc}Pk}%A^fZGW<?UxslR{fLDMU5-E+WM;f$L9>s}{j;f93L`6r-qiB34lTwj^
ze*h{7XK*7Ci;kkAqv&WVCb}VpijKi|QPFgi5a|(i0@1|&IF-Z9ltt4q)v@xp>R37k
z-$w~>2LASb9=Iaprba3xi^$)<#PL`vE>;#-8!wBaV&i1Eg2Km9e1a=+cosN8WC4$v
zPsrl}Zd_b^oGiXRK^D)&cescf6GIm92%UgyK#3x1r4AMnF)^{RG)|W%G$hJ#2^}Yl
zjV1FDPfAJnmx1F)NH|8?rXyrLm5?A$<RvAgq$JlT$rACSEZ#XT&bk!Y^SlV05NTxf
z_?0wSDNCf2M9E1pz;O$TNvTbyl2`~j-pLL^8h9Q+QZE(aYFtd#auX5~ajh(wo05|1
zT?HK9<kYGZSu&l(O-v-~9dJD^C#%EHprFXOGee#Mh>yoPxSmcH;QEx*bgCLSiD_xF
zR4#r@p%I5pbV*2vkGH`@a8ClqF*34N>Oy2d5eP_PViJN-DJk+)PFh-G4an2QX=$lJ
z(Wz++j(buP;RkV08WctvDHsBd1A%e1^1`AdC(|iZYAT&3OUJ?-M54@$jCA}RNQ1v~
za4dmKPPU*~n36`~UPi#Gq~0i-jVl%o1w%ApdOCs0B-i-CRhd*4zZ!hvQpeE7SQF|j
zV1DDktXOGj>FIQaEEBSEYfPxhg0vc-)4Xg@gf9ycuNOEJLGmR?L`s$`dmuWKo0XNF
zj93|T4xJ5A)!^@#nVyc?V-YR95kVt4J-CHh#bg*uU>IZI2pTstGb@YE=H%o=pbc_4
zIk{d~u7qaN8D0p<AX-@@fRb*2u<ASEQqzK^3CJ3aSiGE^+&ni#3Cpj_tAT*TtgK98
z6NW)68p1_Kg=heRs-+$*8nGymmGBlL1FlPGe5Ndi&ZY7Y1ybbsR9;FA1ZHJtj{y?)
zh`bD5w4VywnQE!$ZFodfKdi@ufiW4fd_WM$ttueS5-iNi$+6(E;@ZPGDglilmwMUZ
z5mOMnOilxEy&@8P(UwJYAyq6yw1~XiTnipykH8_G1y0(9s;iNDjE6#-W+b-*=HX(h
z2;~e(&Cj!<5T@9_Vrv5l!H&bbM(RnNV?0P^WIG6Bib_k0OG=Wkq{}U!^8;8U!p=A#
zw4_@HFplQMIP4e_arta-1@JwSvI<N1H4s`<SXfZNGG!CYiiAEPMdrh*q&^lMjRVTc
zq52_QT3kdh^79#p>^mT$1CIf?)JT1-0EuG&**Q{29Y``uiU|nI$2g2c3md{Vpva~c
z!1yKOmUbYyx%s(?!95_!n^r=g#@MkT5w|2N4sQi;uabt^%VQ6em!DryRGh}wg2X?&
zw3Ov*0x*Uv$D=G)q2sX9#;^(s3yX@2OC>!JnqcG1hLvWAB{_nYuaZh4ZBR*!Bi;su
zl|W!Ggv1t?jK^ZUF^R>BbvaDfl1U@(5ONHxs0gvJtjN+qP)aE)r5%`!ukaQCr)sI>
z4xp?tu8=9LPg43J$h**nlzlsruo)m!PPS#l8V`j`F;K-8sEVLQ;FOo=v_n7+5tIO0
z{oDo^jCiQ~J2|tUF%nKIL$t~!pyzVu%`6FO1OLpDA{*d%2Acr<E&NRYm~WAk08TG$
zBspdtcmC`GpQGTPVKv6>nBI-V5^`z8I414Qz(AHGWMw8|R@TnvESQyl1pEq%$63UN
zC?P*mQ_TQQD71~m${A8r;@kxb=!NnH-1+n8M6`gvXKC@o!gCG*1jw=ciHaIybR2Fm
zYZ=6y<wE`n)<XFrdLg}lGk-yP3;1Ogj{~;h`W^x*d`tn8@XNr?oPi3+s97vq#9O#<
z!NQzo@bjLKT~q>ci~fzp+MQ}0k6Jl%W*)*$uU$efrWPT`AZZ5Ql9GwJtp{*rlwg6i
zV|G01jG41z5O#j;ee@Fk;>C*=Eu4q!lI%=y?bv1Vv11*nF&J3f@GZ<{Or(NYb5XbT
zOGWqHw`2){O=|+b;!-<qF=<%2^+#06ZAutZ?RePPvyj^;dYODVy^LPUC+Lfc3HCGw
zJm1E$1zS=#Ucn?8G1&GjTcGC@Aa*IeT)slKT)1rMQsjN{v@vXk@iFV6mg|7kMXXI1
zHp7kMc}^@k@Vpf(s#j7gR?y4&%Lp`b?LV!IKo=H{Hy{>8xSx^aj^JdEK=4%7hja7t
zZfANvapI*bYgdU^u3WKV`7&fY6`?E2EL`J8#6qXC8gWJF09GT>_P&vw&1wXb=@{d4
znt)ohs&=(_)ha|^zI@qzR3ilVO)p1un=M(DBqbp@RvA<%woz7nTh)?zn<*LaxkTR~
z^lEC&8hS1HW3>RutXRH6+5`a!3=MnbSc4`Q1qhc($7?>FXx^%vG5+VF=BW&Xm#-7A
zUAtz@>eZ`Ou1al&fb8iN<u(P`!N<o-5MCl@eLQYV^*Q6U!|=brr5PO4=B(VXal`uc
z>(;GZORu3;r?o&p8KM*J84cy+*r`7X(Ic2FV$nV0>De}Prafl0Gq)8SJ>zl<ic8C<
z73IYXTOiPH=5$sqMMd_iC&3w8LuxZ=gvHHmIw5Ljys?}Go-=n|!8r&lol!Zx+@b-C
zf?2;tBN8Nf%t7otn~fN2_C&1t(PtqjeiniefyW{+!=}y}u$n5)J{PmWXN?ge?n2QS
z2=<*lYsL&#d8~Vl%WK%-aAml!*`uX1QDIYFMI~dJd9%(yNaXC<vu0LSGMurd$hDy*
zFlZctMm*I%>Da|DYl^vZb5BE9*}S<3N7Tmpr8OO-v8g73Qw>($*od`DGj;)sIt$00
zkE;Sn<%0S1=FVX-NwgLh+ozb@Fyn5=v`Yd+c^H<w_3KwJNIMP@#fuj)$g{1;XqVfO
zSsO>(2Aw?yU0zYaLQii5QSpY2o3?Dde@#UjNOBe~90M;O1JAaB$4>#=!god^I4x$u
zw>_|9<4otnAfdQ(?m-}SVggxr5}1eemk8r?)8?&Pw{4d_Ky4^F0-@9IgwL^qk0von
zvlZ;!^ge6Oye1H>Uyta7e|kG_+x_=%%sUJrrFT`nlq4_<{-nM_Qsf-0&cqq(*KgQ}
z1h(E!Zxh^q|JKc0mQpPcJbm`8F$%Xk4(70^kVtEawD;}Y+k872Da={7egh-JR{DP7
z)~#DMZ`!!ly%~ZzGjI3z>@j~2LLvOELW~c_ys=;;g@8vR2$!y9Y0z6>E4@X46gI41
zBWlLnLG)yoED4EpOT3eRHo}vZhD6$xToYsudS(-NuUWfp-3FwvY4heSn>TMl{0-~Z
zEyI*Kb7tja`NRS71++BWmgtgfdsTh`W9Tx*(6h2pNy%&05E(XX+$i59+Q`7KU7LqH
zNim!J7&}`lCN`5Mu(d~Mlzk1Bl{J=<S@clU&&*Y;i3IEE4fIBOgMe%%YgR8s^a7ig
zS~o&V{gHsx2NtBL9&3$Y*-9+=tJq?ISy;d<UbUKqU%!F*#lo*%BgB2SfK8Cr?32xe
z0r@xH5+drDLLua~jnLvlMR~>Oq?I#@nn1W>B|~5>y^dZ_uM@5%;Hy>zG3bnLthIt&
zA>xbZPBgaTV=l`24=O*u$VUb|Xa8_1rZrK*iWMu7z?wC(wXjaMR*1VemI<reSa{ne
z#;V@pJBh-2@Qbu{0g0^gEoDgJaS%;kwwys-UAsm=ih`9ZP}}~67FV=xika-Dn3x!Q
z2>ik#?P{j6kS%mN4#EY?5Dx+ARr1yJDn3(*6(C@#ZC|ucVW`|NEd2dt<d7xSJ_R6u
zsqNr+-+fD$EoT5%A*5*KDh6=*5^Q|RZ5-OXnTh#Cj|Pyjhc;tv1j?J|htkF^xo_!G
zWN|sYLcWq-!NWpsnJYFs_GOBFk(Jm8-b7qW4`nNwvvU-{NiJU?TP8y&*>di(WsCff
zDUa!POyyd82CN7pu)_0^N!_Ai#%0oMsS>!nxZ-*8<<zoe^m5LMxtT|>`?Sht-zgDx
z+?$w$?`D^42u_Z$8$^NOQ3<K(iP2$g;8$YL##pQ*#x;XakX<`uiIuFBAkOpPS7E=S
z+n7&G2*kdeCzE<b#l+flnoiCO@-pKBo&o>t+o;*J$8Uk4FmmV~eY^T{F*jx>1zrY!
z(H)B|aUFRW!kq5f5#}ZPo(KN|vff(Z+f#Qu0umebNgC^EdBW4+A6q_cVjd!nLb!vy
zz9z&t4FRE(AS5P=S^+|7X^_1`vIsfkWQu{vBmWF(9|U-m*--Mwo!lfy+8~U77e)vS
z)~kFh8mDDDsUR@c3Uwz({9~BUXlbCWCr(bi4XeZ*8A_%rxwvg*cR^ro`9xq0W5MkZ
z91(dtUm0U3Kt(kmEFc-Oaz=ay1Pd}tt@g5jWoO!0i|qh#p{4#4NXeiTq#+oo$gnEl
z)_|b2BtJ7T!n+#6LlUzJ%Ndc!kjDw_sDPj#d;Qs<vzc?7h-wfzl#z3riZa{|bLwW$
zmEqGXFeH#&J5)PWB5W`!=e9FByF<AGR|HL*Mow?abFm?uHeFsRn@&|!(B&az7G{gb
z9Y&_7r7;KOu}TOKNpAyAXW2zf)Bq>9q?DdUm0^h~pDwH5V>U!i>1jd8>(~h=d+?fW
z)qz+A{+{Ft%yynlbYRhM3aYlaggHS(g;I&-bVXG;jgY~t_|_xXoN*_eiJltp3$#VJ
zJ!V!m(Wze%IpZuLf5|ehwoEoHw3L<Fc1Uf1MvZtu-ORt5YQ;;k<Ixl05(>#FU@^Iv
zDXE&q!{93|rAz4I01KdnLEHIxQc|L{7rZ5Qs<a^@h%l>wxM)!f`a8e2RE9`_Hl#7A
zbPH6h4*VjdV+Zh7duL?DhX`dr=kpM*$OFM*Y7k0RL>Ky7pmJ^Z1C~3LIF1fNIn4c2
z>^L-LJIzdvl41c#=L7i{XflfA2*xc$&gcR<-^X&{V1Efh00$t57h${Su?J*MWOL|T
zP9C|Df&AJ+s-RF-z$L8Fxt^??<H3d?n3C9E8j)+BGz(fbgGMEYs(^AXtSO-Kku5q;
zmg{A^2N}D+h~u1s=<wU`pBTni&Pa6UXD0+vm~`s%Wyleiz|dK)#4*OMWumDw5Ex>)
z*&MqUOS2)-*>ny!H!mZjE>E6I=THR0Et3UFv)qg&hMfmLU)%Ml<+3i-f<k9f1cu7V
zmgQ9E$`B$4L9?7~APg&XBKTeeUl)rjjJu;_F6pSuOj#C{oz;*{Wo6^L%uG7N#dhPz
zoa#GY0nae&<zvFwogtk@Gk1nmR%Sge%%X8AK1mZ;E(_^IDuTKO9zId5LaoGcF`Y`K
z;c6;_;UJ?nlghxwR64FF1F2%`{bjtzv*5}NjUKxqW-fOv*Rpb44wf%`pGF?0(8&U_
zGEqW34<4?O(H7daD_vQNELE0Pn=VVk?<r#I1#YzSZ^6ww>bB`JhEz%w601t3Qg8vC
zEMynNc>DpJ{OlLV63Jb8GL@3tkU}M=$k?lMZbCww_bWhoN76BTb}F5Kx=Bi;lbVv{
zs3soLigbS+c&?!+Cml=K?(jKCsyc~-jK~uO%)jp(%zq06UXqwt+fN46C(09eI1=XZ
zE^s_TqGYlBI6@^(9$%dxi%0O-5SI@?#PbM@h{6F}2Jv)Ubv!Rd66ntR0yrG88|^Og
z@bL6>cX1T*tUu-PDD#i(mWbfLc~KOH!{zb#0)bE@7CSgNI9gu#RxB0?1$;h_%jIw=
z>fTuY^@}CW7b0m#CubK|H#c`86?u7hxVyW#x;Q&IFii0N-&vrn#6=E{&aUnrUf#Zb
z{sDnO!T1Wnub{vHe?K1|FAq0YXGi40!ovR-4@jLQ?&RX`>Fpa36dEpJ&Z5!Xm{(kE
zbX24yEF>tv*W1(0#mRwX;s1vLB066n5+iXh-+<t-NF<doZRrCCj%c*xrD=M6!|aTN
z<kaMZxTuJ*-~eAQcUNZzk$_K>@c%*`MR#`d^bH7!hzOtcc+YFU*#5a$+sp8mfv4uC
zWTYp>MM**eeZAaV9L1=F{~HGsOI_^f>hA3yERjU-yn4%gm)DP150qwRr6xp6LIQj|
zT%C}E|AP*Q*AePYt{%RDVUqYKUmP#;1TP$ZtD!6>J2gHkEXdcB<$(LY^hDxy0+iju
zHz+)0?uC02x3Td0W4ZYmNimXOKQF=o@x=dy@Ei_LAaZme)FpfWH8tW^7QSmQFU(Gf
zjR^MjaCH<3c>jGuU{vqm?CujNku;3_H`Fak&{Y=aq{K>seB7NKh$H?t^wD5kE(-7J
z<sTOO<jwz<x`l_n=_T38(cuB!Zcao6Q}+TU-w4Id9=;(#+rR$bQ712bU1@PvqBO+M
z!^J`PU*sc-!{Za-1H#i^|KC$5R(Nkyc|ls7B*2^Xf~nC*=>;Mucc0*(z5f^LEC+ql
zr{yF`Lww!Q22+azlwN?k_X|t=KM8MreYmEwFfBIB-_u1rB@Iv<^m`YtfY1&9AJmBo
z>SmT^B}f9j&<XhWWB{cXI=FfV1s%CJ`OzQFT=>nK-`pcHjhZjauE<T226?-p7v6&b
zLf+BUCpi4qQ<3eplYJ`1vG!l<?=kP)r85gsqe6V#9PhyZL*C6NB<+)_kT;*~Zf`kM
zcj(afR!JvQ#CL0F7p297`noxa?#2MIJ(3U2x;Z7&-%uYrBzto2lTWal;^@fVzn)~~
z=*|1*mZZlL1}4`4#n_&Z|9NVj_fGqv1ABHpu=Akh^IuN(YcKxk%Ly4UJv_fOgJpov
zoiGuRtcR}W6Ph_i^5!co2OrtGZq52G%jc8YuH&so4<G$vg1Mt3I~EWId{`%(fB`1%
zUA;pxewu3BwN^j6b=8u^OP*&J{CvEvxvol9C7-ZH8P(s948(-^xK5G>aKjV3cm>D&
zI92jr*6-i3X3^}~Gd^cOzj3&p-uvk8#~LS|KKj$9`6cPm!QL)ntcoVkK40YQ85sQb
zl(Wts<hwU6nN?nH{U0NSY7gw$v31L~fl20%ezsy>ajG=X(^<s7!vaj?x%&qXO-k-x
zpOG-L<4(1A+lo15Ma7R<KFbd5-nMS#@|7=7D#5GE<`gDJ26#9LZ)bq)ISy`qp-)V<
zbo86EgWArMzkA<k<ze)(2iGkqFUZYj<sJRk{ztd3xo^ROIX_M+f_ZTH%>2Y~KR1Wl
z_9Cn|(D>e=^CnNFuMet^H`iCw2b$0PiG=y+J3BTkt}M*TOtbtyAm<<7xo*jv${9;1
zCqHUFxNLfMT&NFm0eb}y<2!i<Mcl>rPN`e#4nDEx;fEgH^XQ((T2DP!zkbQg!pxME
zWXptuyEZMGQ(jsopPWAW;Ks#e8PP$k3)uNSPk_b`Ju&&ppESqo_CLIB<JvWA)@|6d
zdGp4#%NJA@W+cWZSpFN8Z?<k(IlsK9pz!=%9r)$d^NLd<{M{V|V=+K{U+m%&cHdnX
z|A(^W=|{G#S~7pm>^XDiFIX^tPGxCsYFv~wdhJJyM_k>wYT@+4oSe*$?nd5hKC)_7
zUP2hLfXxMo?-T9+a2L*h+j(doM*GaN;zH)ElKgj13DM!9A(H5rxvkHCI<kHl>LV*X
zBm3^;M}OJ8v^*0n;AGnf(D@kOpFH&NHP})A#I}`l%L=m7*`HRAkBJNq3h?s_lEkGK
zmQ_rjH><oLBRMH$>)q*_&Cjiyj}~BJfK>pBFLL$@DZ1;bzYkXJ-M(sGSsv*yr4f?w
zP||FBczF5-MZ~4&6_=J4=A<UX#KbG^Mc=%C)y&+u5HDxTR?Ld;ANuQiBtHFXiZu%>
z3o;V1yA1UA_3`p>b#ZofB@DzSr)OrQB*a8YA|lV;i~Q(6HZGo)7U}O!6kv%x4E<U6
z<Qw^Werb7LN=$g5uP3(nP7Y$RgOjVLU$7)9CN?HY5*8E`5-DA9`Cgr3{n|PC38CID
zr~r%j?g1gMPA%{6FU?Mf2=vCLN-V^e$k7>F^Ptf1@Nl9OU;ohPw4%BF#=CJa`VqQd
zx-@_&fQfyPvv=rSVsE?-c9y2ckV;M@;Pd&UL3Q``3kV7hM(SRkUOoYmgq(^cYfl^Q
zhH_;6yn=)<q5zbiSU({2jVW$>qtDLBPn7tPGKR<JW0U6Q<x9v11^S^!pgRUjlk+Q=
ztbgFe$yG4=-qvO18H@s$*hl9toEmj}onBIw9u-KoFce?x<l^NY5+;#I!b5`meY`w9
zz5PR@lJhDStlrvub8--R{ao|_3;`e;kDFhFX3F#rug2&J_Hq)j<Yg`Er4jK7331U8
zp+SB=-rl|ep;1ZMrL&i9+%b73d}-U#vh+xQH!;!|I(i0$-_=~>UXN{@Ux?1@EE1sc
z-JQv!ca@7$veJ{|q~SsSe!hMIp^@?F1=AO<+49z;D37e0jZ%0z67O^Ik?fc<`R^aw
zx~Mpb<ZmG<R;_OPrFLmnc3MJIcrd0!|Df=w#H^Cp%h&&TGMJ(J7nh_+d|fd39o+-M
zUzuvrHTw4cZA(g$!+l&FL}F*J0PWb&XX@ho^mu7#pdW@|up~CEV8+soHzo!i{cz{X
z8ClVR?x=nzuaKlEQpeZz1KSpt5cwU%j_!T|@7ZCRZ|p3|NhaCJ+sns41l@4P(kCaw
zd2-YIf`kw+4o~djE7?7D`s)4nFDy#L<mKq->=`5-FO|8qya0Rc0B;X>PoJR3q`VpT
zO{Uq44=kOQ8sW>~WA2N%IOUr6R^7f$^Yi0z_i)5EHEiAZ(NS~H4D9nld_7!U-Mj)K
zlMCiNJ~7Vdzjm#jnH?R#6*zhZhy65F@}nQtJ+^*UPAt~Yn0WmoyY86r)a=5P$Usk5
zCns00ps2KIvy6A5Ft6QcfcOxSd&4WIO5SY#P0horre{d~-JMYV!4Y=^*yt}yXXM6*
z`nWkcIJ$a=#^sj(XCfGUwQawzG$ouTcJ+&Fm^%F)ddJdf7&vZD1YR=13@y94I*G+j
z?*7vBf(hGEd_D8f%IO)AX#T*67pH9gkwg2pGVbT<=;Y=rnRDli(ciC_nG+lA=`0qJ
zk}@ghvx$*LKiIu~c5VzYzhp8MO|Yo`@eOlw2|UvGlOC90&g<*v7b1hsVj))a!SR{@
zo($~KEei@0gwEb!F;gW^%>T&h%FL($cP9rY_khSVcPei5<t>YfNq$25jvhg=sozb8
zRsX<}(qxf~Z^VMB)7R2FF>EEiu8s~)9)Y1BPB7)%wk7CSOn!EB4~$8j9BbE#iZrpS
zzjWV}$=l42)eq7Sx^u?p=#yK=$v=Nmuq(UQ%*aIdi|(E(d8_%cco$>#4amB4hPi*w
zhIwQ54~c(dQm|Ja+b|~wS(LswRr(h5OZ~C>!o4?Og1m8k-;NbCvhDo8eNwOw9^X7a
z-_bK9>YXXm*JAXSrAjQDuWy)i>zS{{1j4VY`yN`qpd{56|B><UPa4}lK5_q|LMN}#
zs86R#-efU97C!<3Y1iYj%IB<jvh%`ozkTWTKmFm?Cu<(xxqeYaR$PdWtE1S##VaIs
z?p@IKJ+P!0vv1UmDUu)km&N=ZSbPf5x`B}?`7;)+-m>G7$M){sxA*bgJ2$UdSdo(`
z@%O;($;AW3|IJ-e+x{KPN}YWqQBxJ){3}fUjQJe|d;vz6Us!B<LB+f!E7xw^v}Mbt
z4QrP#npKjW7#Zm0ira&`Z&>`cyTKiJaCsSqf9#a$cd^Oehn%Ei@#p3f9GQ@jS2BGT
zHslKz%%3}}qBu7#P7>(t=IrF;<{cbUVZ2*rfBK;n<u1OFIa4M7%b_Q?EX3IIBDJSL
z?CkCn91)Y0o}E`%Tta>}DnBP9B~BXR?}e=y?!JMNIflD#EVYlUs&Mp+yhp=sdyW3B
z{xRG#(ELtJ?d$4=g>GzO3i-iS@{_qKiE%Lzp;-I4IALw%?ibj0k2bLJk=4^({G`cu
zon-gAQcbo@Ci;b9M>hwzAZct;N?JPkA>*Wk*yzZxV1IJ!ifyT*lNWu@lD={G>PlBX
z>6Gn%?CA%vWRUo{I$-v3b^QK6*K3z1XOf@v&qz&-i;4&(*Urw!9CDX8h1=4q|Bn9m
zhxTn*Kx$SjeH~mp%UBA3sIDj^{~2^*Y-DJlkB1AAN8>oTmfiaZUxvxl#V;~$<X#im
z*I()$T{kNy2F>r_;OyaF%RWUaZ@11bD9lQUizKc``eLN-5fn3d^TWOj^dqaL6Z&`Q
z6YXE;t9GrdAWa)7?R@<IXp;}$d{A9bkdYV_>hI~|AQa%v;}IC0bdP=IhV0>$6&U~V
zQ_R1I4{m2VAKd$$Jpu#Ajg6Xre7Z0%H8z|uAR<?%0n)Vm=kAL46^-$a`7iPJQzHM>
zp}lP7kDUjWp0^h*qvls;mt@9E0*HHHbohlQ6;@8Z`QYoLrypE44fB7pZc6lDsolK>
zJBC0HX9p)Y|Hzg*XMDf99CLpFP7ph~c!$JhO<y^D7Y1IVcidO%<Q<k&GbQ>udgrpT
zv<N>pQuzl(Owd=24lkdclMwEQn~wuFClSfT^N-&J@an<si;J=OOxQ9N^2XYITP&3~
zQGdilb4EX#i<@sK@eoIHlae)k{#|0L2RHLVM~~pR@+puXeW&V?wb*zCF_pJ(#FB}p
zX%?2IkqZt7ERX#pNrkgtn;f!X@1}WqSpUT&O(g-GdUD%+Wob<GVdWilcw#QUT{=5I
z9-CuwIN%u+on`so#wU8+tiet)TkPg9P5t8(`kw<2t)0sp8lr7IgCZwut9LFgO(kc$
zn4z&hN-3H&1V=xrdSvyC3{wB6P2kIxN#<KWv;FG_yEZK@%ZMW0@8B|V<Hx*eR<P}f
z2y>8ENPO;<Nd@|??7`*bsigl&p8Uq-r2%b6n_4&6|L~@zmE_nSUCY7MCw$>#3!Yv}
zQnaTdCP7EcfteR3n`qV?BnK(j|AoY-O>%!d`q_ZycyskrkMG*LW^rW!b8{sYVc{!j
zngrCebFHmFbU@RlU7w7+p>E&i`33QO(j#U5ZW3!=QMcATwda9NtC!3v%T1OBVQv#4
zeZP>&Jm$rR*J4x4(#OtTn)K!*<VWAFWp*>B|4*-*c+NNKW3~Gp+_+-ltnz})L}@U&
zzZYQP@8>%SsNv}cS2Ff@6tMIYCc6+fUy)<`mmbNSe<T-AJm+_vjr$*5zhu_5{LEzX
zlSIs+vjFv<KQVc8>l0fT|0h?xME_ColaV(cCFf|#Va)kYe9lV~>2p+jtZL8ZrC3s@
z#7n~he6Xhx@Uif9@eY=3J^A?^^M6r3xpUPl693L3oJUg2^hv0X{=5E(jq~#3f|>KL
zsH}+&63p*ujy%0<?Sk^$)HrKxBjE9vi^8b%l9?OYe`|lX^6hV)-nVn@e9V6senLK9
zNV?BSuA<H6OV!v)WJLv#<5$cR`4gqU%bJ#h53ZSCmXi`25kl%(mc9@(OL#&~#lqEF
z9(eRv_t1sw&s{mAt9feQBimNbFUyP#Vfq7dp%)(emr4B8)Odg#KS_Mq^UwIa!3ie)
z@M7EkhsYf(x$+72!`jk8#3yI|E?z;ANjYV6?pwWS`-6|{dF=7WAAj_b|6%1F;49g-
z?cvzAZQHhO+qP|WY^#%WI!UL~amVbAZQC}!q|doe|J&!Cd*8QyduQ*;uBtg})v8r<
z&M`*WnCYoW3$juZ{=x=8-!T<3=HDIuaHN}|+*>e#4EV<hV3qqPE4{pTYOK1nC@&j5
z6)FDP0C*3sz`)-UTXZ~9T2@{WDR~tQZ9RQMLjye>4J8>7ZsxZL=vR91mY%$&r@u|U
zvxDq^T_^~D)V~Sod4695n=iKJ=6DM)iE%NI-btPBbWCJSJQ6B;R!&|)5phXr85wCQ
zaS?v5w+ImL?d}ito}EG?Vv+tXvwGQy@-kQAr+>@je%1exa40#9erNty`<bXlOH2Mv
zqJsW~c_E=;;SrHiP}4Cozl#_--*NzEdTKI49JDv{5bv<m+Zds!``zx!LY;J_-s>pP
zzwi%u3}PnUzbwJO{dV_-<2}55%k5y{5K+)Dv2pPT2#NmCrM*9Zh>Vy32Ll!H%|QqV
zNEie(e2U*8p)Xs}J{GD%OeAmf#2?u2+X&>=|H}?|Z)_}-1ehp@2=5$ZOl%w+Y-}v7
zcM>!n{#(Pt#lk>CMudAy{GnjrkkIidlzy856^A+N%W}PCGO*x(;$N7g%mV*Q74&6P
zoR5hd4-*X??k%<=ARxfQc?UsJP|?saFy9)+J0gmR00##TkA#XvNGbI6oBh44#Q0jN
ziLm^tBm4*cN6oGBzhrEsYT}%<BzQQ;Z$q-oo`HnqJ>Nq@L_$LO!-F>mP*G7(-j=ZO
zNhwSpf4jH5Fed}qKLODHfPYDuh4TK={A-Aw96u8!36c8iukqkZLyC`y`eq;b7ygL%
z)^LCE(Fusjsi{hTe=rl#-WIC=1^@g7f1|$5K_Z8LIRx!Zl!e*pD9QhH(~gyn6b}RS
zt^cub2}#J_A2RsfsHo{^xe||mznhzcw@6l+>lcLfj{p9n14tMJ9sbJvl81$w7#9;A
z*`EbvDSlQOVq8oNr08fLJ40nr_Fvjmb`6j8?!U~vE22D1f0gJF{=~ok#Q$+A*+u^f
zJOA!$r6Iw?%KRr%dLkvk%Sb_lhxh-MnErAYO~(4!Xi0MX7ySPZ^37XNMb9U(`}=JR
z{j4>m_&GQN|FAKrE-%bZOHM-2`meAwUv3jaoDJpq=!xE9<o~4Lyw3qh*kmli#=mzy
z#?M+yT9Ajc{f{-u3{@q#8EL5ge)aC%{OiX^4|7!!7IN(W!vFY_|MGSXa!N%0ZqvP3
zKWlAS5kZc}KbE7+G^P1j8R%{P75lF(vA%D;{|*rSSN_W{{tpxa#@iW?s`<^9qw#OC
zfTE<>KPFXsOKn*}4i@Ihf2I2;;sPD?<@o5|G8AYqkpIGg`-6dlO~xcB{hMlZV`89#
zp_;sG;U9~uE;etG2{#ARZ{VGO+IHhZU5u54n91II|G)8{{^WnX<?N!$JOA{E@)AQ`
zE%Y>$7XJA4yQi(5q9`Aa=-;>ga+4D7ZmuTEPKAg1KlxvOoB{Z^xQbIk^W>j6@bbFW
z7-nf|Z1CrDwvU~GvV^cu;NLfYn-%G4sVTulLx}!%>Hkj(<e&UMVmcmagMV5&d;8!0
z?6=xKmqPuVOw?s1#2f!MaDJB^<!!Ak%|riA{`!9@pzq|@x5yTYgn>`S<Tt4KpKiSU
z*^CZ$v(Qmdko^5b`~R4a_Oa2G<@+7~@fZIS0`48N<(D%!`d@apoEzk2Z=$PZ^{<$>
z)qT5xk-a5x|BV0nC;#;=w;*Q{kkkF^n%sLhG*;+ftoL`Jqmzs%Z(BXNKk29coc{{=
zi-QS|hDXjKAg3|-H>5WE|BUGS&(>T@i14z}eKY?~zx~C%{0#y5o%@c4N5RZ5tM>8#
zANu{f`Q8s<9#%TCf13Xd{rHbl0Q$=Tawa|*_0ZoT_y3~#m+IJHS92{Hex^Un|CI*d
zPX}<x7<nbt&1V1aUGVa{o*wQ0cCAYBGLpZ;V*e`vAM}^}fRvtFOhvos|LnkXV_cY*
zt)YrIHv=i|-xDCbJAi^sLdzj6uWdi|f78FLr^f`kTE3;F9JD0ZsQ*jn|HA>0w+s^*
zi-?*<Kw4ct{_@}T;N|tSDkjv+-dJ6lpM{zT3mFdbZ<zms3jMBs!KYy47E{zUF1!DC
zJa~D%ZitQWb+*t^6ys(j$A8NUA;Exw|E2&36awZQ-J@j_lvXpesQoweU-xaXkpXVj
zhN{v6Y_udeXb3P6e^&(dJ`aF`|I$BEGIEQ^X&GC7Jo(o=*sY6>2ynAC)|3<BVx%B^
z$7TKn4cb5SUx?`M04JZgqLzty%H-eI|4rmZh55PJ7;DOl@v_j6;G!eKLjEiIF91M*
z|J1*c(XsJMD8BW9bNSleaN%X~TWmy-x3jgOrh+&hD;*jBAE4CxssEQGc<){CuK&X!
zq@ZW#7nj#Cw6t+68ovE2<M$JlQ4ztuZg%E+YI0(HY;?cWcd-AC1oB<{`49ag5d}RP
zuc)kwj<J=!Lr7`w_CKlD-mMMPq=tqDdb`<M8fq)ci14t!S;u~_*+Bf863}-E<e&Oa
zB63<5E<p)-Rc#~l_llE8SW0nuMP*f0&6mp3y!3>q;K0B@KQA{&8*@W#6*+MMPG%Z1
zLhL`)m;a9b^B-OCANp5PDh4(lK?zx94P8SsOB)AA7dJN#4^K}|4-a=YS7%3i8%t9|
z9d#vHal!X;DGC0&0vGzvarbXZaQ}z?mz;)ym78BgLPkMFT}xN*{Sj*K&B)L|UsqdG
zU0Fd^LYSY6m4TX!5Et`TDdt^$`+t*R|9AZ}5h*1d6Duc=fRN}Pk7;~wGVf2f6B7~Q
z=iy*|2cijavCxqJrUKj2n1KTTU`6KbD~y!_0Rb#jIMmyB6f+l32P+3Ag7<a){FHzD
zw0QeOv$QaA0{C??y}d!e!GBqRH@3HN`ok8&+neb90d@c&e;fh;@ITfD00MZA{DA-5
zt?{e;t0Djs0Kk9j?mv(Fzb}J;0|NfX>s1K==KW_tP!JFRz*ijrWC8^Z4TFEYG!zsx
zUQGZH0RW{9tqo0FY28@qnCKW^;{o0e4PaUSZJVUgP8zsD*G{u!AktV)%Lb={rhFsm
zTZ_C#^p~<%|H64>O8m39#FPuJn42UMri1A!TDwmj5u=Q_^-O4hO{;KWlH}T5u4J43
z*IlnVQKOwGSU&4f)<0uDXv2Z+S2l^6_`j6G0IxS(?N+>vV7sF-zf8SLp|z*UXpZ1U
zhq4p`jy<qLla6(O#i*Df_pvUhvT9;t+tE%Cf>YM>>0-Re)UARcGe`MBKsDNcu$E0C
z0sA&gi7z7hDJb0n#Ty|Z-@9NM*!`&MzzWEIl63)opi`|%msI1U#2xKq06)qGVK6<|
zD+xGS9)<>5Mg1uG)tnL@41c7Uy&NW(nI1*+!jbzaSm$yviW-KZVF0b|SRj98qJXeI
zoUj$^S=to7Je%`py1lmy+2}BxpC#gb2>`2dd}ODa)nmP4_I#In^)tSNXyOD{d&KE7
z9ifh{^3Ey>^wHHRM<VkxX@Xg7?bXqNW)~Q>9(^Hu&Bq<fHBSrS#!2za^MdNiB8Ds9
zV}EokO7WETZ`9hywVUj8KxPIqcn?2zA`Rn8SbvaEo7>%{$uUh#c;T3hUAv9k17c2n
znP$PC32|q=fiQZRo_^6$)<gRYKS@2mMtaz&(&$wg&gd)ivzIuwq)ot5+hua^*fWEp
zgeHka90YqoARKzr?p7tOK$%B3a=UZ(L99cB?QnHhPr?I+-F^(a`<Op`!5e(R2SVYR
z%-0lt-=+Wirjf3=W4;10`U7A>>OM@_w=BO%q7<(afREyIag0CW<3x}SH$iI_PAXD%
zcv+1KT+n_V;sX19?o>9T_|7e3sv$6ES~F6_zU%Qhj#j);JI9E)d|ULWhImjqqvVmf
zC0Ump1KzX^+rCRbnI9QezZ>-wS3>MaH9-O!x$=>RRGcodEEa3-7G3HD6;uflxv8Nh
zi(MwiWf-RwPXC704$ki|%eEdk?gxX(WaS=v_c3qyf;;$v8%eMWn29DV$P+D*w0a};
zZC%BrIBU5=JCmpD=N(_gU1oqj{AJQWctZ1!8M=W$y=JUe>;~&v+(=}z4R?faS?#Qx
zQF)U&QF*!=(N%Wk!plk7p`uu>$hE?k)5Vk~t$T$<-DB#5nRzm*O02ba;ATg*Cf&x`
z!)Q4=fzd_)YefJC8CEx&x^;AZ*B)o92<POxRkqf6kNdU-0y!TjzI?+L;(J1aH+dxz
zco4=}A!~Rp933X(2chtTSR<J~3zuip+^S|sZR!b)p8)E8Skeg#3wHi&3w*;cOoC^A
zre{NEHwcoW#~#!Maf00>2p88^8)~IDB(adWf_y}&L-9iqDFXy2TkX~OGPjfjw|C96
zk)@YNIeb09S<6si1NRYPvYTq?8i2zBTONnKBVkWm=rgz_+?DWmgH8{F+TBHHW*Hpi
z0knc*r3WCy@76P96^eZ>>#MoL(zd{1)V7Az$n)6k-n4Uyc1tspnbh8%BsaUrE6f^d
zI#gqBJtn(BCJP^2pC2Odi9~~^M@J6xa%S;!4h*j%tjqIPMj@Bau={1M_<WyUabAhG
zsGK}B<4?60OB|-Gx9|bMAuA5)Ls)Xx>OUG%@tWOn;#);{7}Ayg-0Fn!@${05N$T_1
z$}MPXF<Hzg<t`_7INaCcNvgv4guu}ymS;^OL|jA=e|4SLHOH=K2G{3tfW0!DQCWyt
z0#hgc9)i(ZE0DbT5<ns#hgp=el}u+I2XHm|ifr?0l4?V6od<bG?%zl#r?o#0Ca$pI
z)Lh4rRt{WpC=j(O3rw=qd)$g`?I*hjV*vmC0w~}Nacr6#gbGL@D!QA264KQOrW85P
z4|yb!Ie&e|su2+ygZ5la_bG4j^umLQUXT{9Fz3bb<boWzQ@M0d&+M*n8nR<5?JN^=
zz_rlouEf1_)?j~+*T!M3R#q==tq*5HW4F1wOqOQlB$#Yaqm<X5)NwYm=2bA-j;D#~
zfyc{Q$&XprK%-7MH}^F2J7KvE0^(7MD1<@(=a#~7n3yaJh4OYYIc$KUD$KwKaQ3kW
zu{(X+YnjV$8}S=H*y(MRs7RYDRdtiM>;;r5E7ihe!?_5>w=N%s931vy2tsdRKV0E>
zU}3)C9jTks3m}Ozm{9o!)VIVYu>>ed2E>I(mkn;zD1X@I#Iw34vYBvfAal7deUAOX
zFvdulKxk~PY?At{^6Vam?jJyU;pBf9J&(J^FbyjK^6L00N=xz8Rc!5Z5}#f1T;Xnn
zrOU&%Vg&7X08ue*=A8^z7w5vlw#(egG=##K`3yl|K$wRwh?+w5aWL#mpHE|bj?4G<
zE4cS2^h*@g>ia`mjQyVS7k}LF%J$J=AD%|l**n8;6m6987SMq^!=nYZkffo(!)gDx
z8wlF;@+3npRPvvajHGyZuChBtc9x9MpL-lp<1{~Yq>g1}d)}ge0!|BRMe6MDGA9Db
zMPNB(P}r8uc^2`He6}{iDTeP~H|Ss2>%5ukh;A=Pb(eay0Ze+j-$U%RW=Ud{uT(ir
z(=wr{EKGXVq3c#_ef3UwPK-?wtQGtjt^csCiE7<_6#{wvlZLiilTOfF^NwZImGuC&
zBf1ee;fB?5Mq=zOWVcL6B)WGQ!E6CGR=ZlLx#wUYOYqAcouzb)5WBBnd@ecz-+s2y
zff!f3VwBkM)@o<h+_SVKbWi`JKmRkjHoSkjQb9+MHP!*b6~f9wADL6dRNI6zYbza^
zqk+`Nj~XIrYhni2xUCqzC`9<B_GYohbBK(aClHKjQ6$`q7oBT=AXj?U&oHnT>gzN8
z;wMtpz6W#c*uD*wLRhu*&)w43@gf+l3D%0^8b8tXDQ^Mg#OwMDK8O183p)zWaRN6Y
zcD8DA`*5)cg2#TZ)IBuEX(&aBJWh8F6u%K}3|D;xBSBbE6+K;quM&USnA7qUp_;J?
z@VDvUHS+~Prri59>+IiyN0q2hZ)=B+*}eD@oneGO+J-@%TT@Dxl?MkH$=u<K=Pq`!
zzP`he=5tlGKu^1TFDAZ(1&LVQZLYUps3!Tfmbjdfci*y=l{L5~M4E2oX#aCqRD?y4
z0Aqic{P%1r+Xsf`S7Y54fg=&*^wOexzEDWgzVzpBrd(mGA{5$`AaS+3Vb65QoQ?MP
zb(E~l+u4LJU1*P+9vK`>@s%!%uUyg}Ti2lv4g~>R8tI~qmAEE(6T~p;4{AQ;FrVE3
zsBAZTH`d!3V>(5`r%3NOlvhrZD5c`8n<e3Aihr)um?`|meYw$nTxEDOGv@p4%rtlB
z0PGO%!>8MC<BZ(SXs%Xnkp-i8>xTv{*AIvI3PO^t5*9S^1Fn?rY0!odHNv2Wfi=wc
z@Bu^GNr`M6Q9+wPGo-D-q-KafE94JlOw%l`F()N?RY+V_wU3{6sRUqk5c_L@Rp$K}
z$Od21I2_jiO<adL0H%QHI@GidHC@b>uu*5G6Opon!@+B<_hPPJGSJg9)b@;Kzj&c$
z?i#zuOtn~^WbgAN`0aH%^_e9rlkD=Kk?B!$cU1{4?gQ~#R#ss6Ens8qNs8otAZ5LY
zyDjWF6fWsG1}y<&$BODANdv4YOgU9-kEY&H9Re(ZE{P7|`vB)2kV<8#Q%Tc+L9e(~
zxL!hU;LNQ^AQdEr&eSGAxcX{xV$?D7l*}Iqes<O_2fF|}-y4S=Y>H)5ks{^{PJG)T
z*awNPjETKAe8QU}O#?J;nJ)j;@1rvi3D5E!M(KRZ#L*3{lN1O4xe=p_H@S1|-X`Zs
z2kuXCpN20b9**W)Bf>!{<K5hE!y3WqKrX^2zWc|C$B{i*g#v(cBbM01Ru;})T8}p9
zQ9vz8X+3}5F`6V+9ir2)(;Tt>y+XXA$o<G9t!Kl|Bn)e{-}v`rtge8_dxKrz(Yx6%
z-A`YWF}{>R<Ix3SG0y7R0(RVxHr5p<_Vs|;`KVlxll3F4hAz*5;Mp8R7HcMH7KezT
zXw{1gt_XSU9}Eb_n63_Ma+?ITR;hcD8Vu|}Yv?HpY2V5AuiJ>PTMM6k3oxyS#!NyX
zr{<dgtcMv#xqwgYbpHqr=9U2vD;PPfMoe2YX>ulqEQCB!J%66gY%6wd9*m4}8zZGh
ztmoK2@s%>dbJ1O430(6F+Y=z>HGg0y2>kvjNldc{C8wR3?{@-zZ=$g6A#iWrwJc)~
zdw=-hX5az3Iu@`%+z5W2ZKHLtTlA=T8D{#3fVrQ5o4^t6S;@sX17Z5(NF2;RxP$Nk
z%IsFG*HHNJR@oA)Y~Xig;2X!xUirN;e&99#%)J^)fWG*;X;wWfuRO9fSVWi&nr))_
zO(NlKRDC`cC*B6l?;8VUH-B`v_{l}*QGI`CG*4aH{`D4#8xhF}v|_W(50NHBvO?Zr
z-^6)E4+m`s44-kiyEwZF=g@n)#535JGI|eC)tAD{9Oo3Tr&6imXUrac9)A3F_lJSH
zs5+bsvF{8HqFlQ6U%k_j8Yj%f3@xv>Nh2N=nqLK%LYByB(Tl$th~KF!opH#txi}0;
zNn}UHaOk;(iW(x!$m8SuK-^*`Ot@Krf<utFY~vyV2*ugZZWUfrL(0){1ehDq1aWHV
z0EgzkYKEDi<HP+aatn8RMRwTPHpa3{a^E?}iKiF6&Jd(I#ljhYcOuEtrM1|HKo@Ys
zYE93TmY^yQ7t>VNmVD%9ri!|oR%K*GFNMd4nb;|g<=R;Zjq)rzPKpfI<ZVh~ohNpF
z!|$*hWTUJISwl$1z+)v*;7ECkSs_k#bk3^M>7dv)kJr~ry^lZTI@n;P+uyK|GzqOw
zZsNM`(~4CqC@*METH}qCi0b!hcc@M=tK9eyN(HLsIE(V*6p`Q~%!|lGPATl#+!+ot
z*s7y2D)XQrx~w;+p4KGP=xF)<{WULq_a}qTpAZs%UMBlL86njv)a-tkg7XWMv?Q*p
z=@c04@&6Ej&g%yH^*eQ$wFr}@g9>AT(FNkyg&J%y#mJn@ZxBgvxHS=@5J)JYvawO=
z9QZ!nN8_HgsW<CB-mt@%E}Yc<I*Fl|b#u16saWXEc6Uq6gdmdx+n9@<dhzAWTu7hB
z6y=}itK9;0FrK!8sehuXs{Q22gh+M}`DQXl)!Xx9G9})muaJVhYb`Bb*;&|*XrwT&
zoj%yX8)Fpf`O^<xHiEqZHd8RRUQ-AakBv!oLPqH96Idr+D>82Sh~v@5QbO(-0S^y>
zh~$?XRL=9gD`adQ{S^8xq$Ca!uDIeyA{w+YEbeG{&<7~{aB~2Xl?uTP_esOe)(B!h
zKA;3w0}EqjR3Qr5BHQ9yUW=@oD|i<$xs@if`58?7r6znv67ALVQswb9YB`6bXxxE~
ze7=>Ro^XWn6?>{hbvr(zgh7>>V|DKC)>JnT0Mtr7<8?H6ndtj`C+Le1F0P0~azo^&
z`JHuG7j9S8^}EaTFM_Q|X%GlfTmzw?I+jAxX@e7t{_wh>%C0QqiM_|(s>@D^bxFFR
zv%qA6J;hq|yl|4tBDp#V)lNHILfImh<SRLZtCe!opUx8xw!;Rdp0pgr7Y!rJt>!<5
zT}@hWNHG{?%Vx3?>>FIt+~AxP3jwT>rjT)hc`Vg0Oj(AzTTzMvbtC0Gp5Aqc)zBL!
zk|K<v%si~g^}{3anWokY+!RNkhK>U1=kh~v+jXCC`e=rR&v-<tCgh5(6`QG~O>G-Y
zZ|hlXHOtI?IAp3W+U<gGkO{VF;g=)KEe)|7oRCbKg-!JI(<bAkI%JtOmXE_IhNAp1
zTt+AX*H@Z`7e_|BatMn~<C+eBB2uS{umL!{*PQy5Dprx0l`?&Ln=i`#!%gfNl0*+S
zqX+?HMn7Y2$U}LH^U0DUooI4PPinRr%aC&eDbvhA3<@U0fOg*J(Ri<Pr01!^bSw#I
zWKumjNpt&EQ$;2}M1dv!XbyN6noE=W<>wQa{99k3q*4*%Y>^Iqtls=oqq}>JZ+KDU
zw?V>B3lrjNO@s*jmEKc`hsnbH(U?QSmn1Ho1%8&6!XgbAD25%4k}NPN*TP~jMjX!}
zY~cOSCiF1qPTxRm=k!wwr46$<Q(je{ep&!*cjvE^R9dOO@WWha*)^qa#3ZKwbluQE
z?o^A2DT}7B{j8~i--@+Q9kf=hEYYK~t|+h%;NO^Pd!Ip+udp(YJZI-P$qAv&cunht
zj1C+pc8glsIe%?=B^F-&ockos%knJPMG8@WiNo}HgT+P*2{hh;<s`)T^2?y~Ac!z3
zm9B3+NIMujNONCS>;xqoRb2_@7qj{c?hh%YB#jyn8xE}`(;SP_TCpwtVD8dv?Vv)1
z%L-Y3m#<P*uneZ|Us+t+;(k=wG~-)EE5XPRTdmo*&6f5#wnuc?61^gU-#PLK^M8^+
zhA3O5B4dZOd-Cq~gU%qm$*Qt)F?SA=SY1}dTE~UM9eJ+r=C)LA3@gY#m`gESE2b+n
zWR6PR!9Hl&HEEDq!@u>xM|gO3?y<1xYFh*?W=njaw?lafpMJG<;%1z}N!o<*JP-y=
zlr%T(RT!9>Rye|&eLk0!_b+qe30%c`v@SWj9o4t_s55U#d|S2y)In0oWUX0)dvhJL
zx-+0LW;7QVY6g?^2}^-9PqR_92w&|1T86gDqhfm3uuB=VP0{4E5%R|?gS~aC%+-<y
zWNwweK@FPksqX<Nq|Zn-Y|bkJB4r@9wj@LM{tu34Z_8#=ci-Abk!mP8=)^wmxw0PV
z@t6In5ekh%A7OhpJt84YS<`D5IP#op4(IX{R4MK+lx1*RgueAyb@*O9W6rws+%1<u
z_c(pXo-1ovrYdL-UEfyv<3_hEqR~6^jg4n(R+d4)@n_o&cpx3^pAss*^r(1(ZVOZt
zf+>PxMS?MgMfYZfJ*`eD!56n@i=Bm3A!GVS7BH$&BHHig%A%?2kyrmvc^Gu2!->nj
zd1P)@^=VBz*!8xpHl2z=tAc=*qVwZdWMdhgXQt%v%U!tG0|P`yoBXa`(p9ykGebZ8
z;_B8Dzwf`R`05mZ@bhd~xy+s10|^Y_+S!XJM2eaD<oE?J5@kkd@kc$$xWtSFi(~JG
z(P1cy{{~_v<BozeB4y31-*>x{ZZ|*>yGhlxzJna05m&4pv{x?^_fT)f3J&+sIX~B#
zG&+sqon4WZgoyi@z9C*=o6q@|21^L%acl`I1`ufMt1n0ThK}^YhG+R5%s`fYRt;FY
zDsf%w(VEViv=o9*nz*X)J^J1khTKW?I8&~Yph6TIjgZ4V<Mz`7;DBC~lhD^7AOWe`
zSc{=Gcov_QYqz8*MIZI4Iy|DKYelOdIHYvSOt`)+OT>W?YFY2*)=eEXH2V4+l-)&?
zsIj@8ncpmbnyIEA04YOKt$`Ln`UIk?E~mwO`gJGa26XlNY+$Y%mr#GzoibIQKHSOA
z7M1WqclzOKat*r_=^_`lft*vm6?ivf1(0}Yk0h-NhM{u~+0R0a0@ZAreH<^`r>@@M
zeD$BW`P?wcpp!|kWrhXXp|F4~%{;(Aw38J3JQHM3=EHBf!IMvin}yt38rg{CVSxJ;
z5(J?7r5KqcC$*F%so@qs52d65#JlQJAF6-k(&N`rJ4rUFQOOK!1L{6rP4{iN2VWdB
z_%O@MY5Y?)2!qF}h*Dkyhj)8CfK=q=sQMaLvK^AeIC#8Iy)wu$Ia<Z`AeL{2>tcIq
zfcNr-@*_u7H=L|R;K#+~z5(0F`%MO8V=Rg`GUV~hr{gQP1!B1qt#5{Wrh^jHUA*IA
z2_u&)S|Sy41et{5d$WWRMV(@nIklXZ9HS76Y^njKX}n&dpTO#8{8)f%eKaw5)gb!e
zR#Q3{H4=;u4}UCkCi@p&q=2gTM`!WMpWdFa(3<9!<);kJ2kJ%%*)wj}$6C%xG=tvz
zLFGGI*M}&>9@%^|BG#>@gAa@7UHk}6@hUqkva>ihL*Ptd8;%CU8pTT(W^s%<;&!r+
zY&R>NARNbEn+;+s?1chhVPkc$Z7SK+>W{ZQ1!MR1^BUm(L`3kdsL1T}oNwe|0)w&4
zrdPg%3{A`RU^xiYCiP%KOk3}VSOkGIEEYis5Xz%#F&WN6JXeIQ$rwejS&OsA*q|z;
zQ|A$RgK5Heg|A^s+|pB)7p<yr>;$AKvl)!`OfEm}AiN=v4E@-vwolL=@)~T#o}`Cn
zDV7?nF-q{}f81IvXp_ui@ra`=C*BG|CQ8=60M1XC=A3G3Fs8&cuypPfbh+8?&3^M%
zelR9(qlNZX<F&jayOE5cY}cOb?k-*wMq4Q|VL(>}!>%7_`63&|N4`%Q21#!28sv&z
z{^-~rD9$fzb}pj9O3L-X#q22(;a@ha1lamHs<vzZbl0P%4#a9BM&05@!xk9tDtVd(
z48by2UImt>sGc2HG4mvb%lBi|au?Z`^%cd|s_HVrh@p<M0P&<Jh$fkaFkP<!_qnv?
z8iOBzj>PJMoL(FR4$>@p8Wvc~Q9yPC)aJ0+cQZcT++chB@mX@Q>)CR<Lr+C*tXcUt
z9tmU=1#*q2Mgogqx7i6+;q19*6hPg)Z4Gl%W05{%bZyuMAxSkCxxTSGr~z<x+$0cG
z15x2JA~lEShqXgiWshSQb*RO7VV}&4!T9R3T@}Gau%|b_jGP254JQynwR>LZQlc&H
zz63lP*s;>W5vX>g`9C13e+|Xomz#ZBlXkk1mg{XcRcdV5mOu`ez)D^dORk0fDT2)%
zQ?w1wQ2;6mkGm~?^lh3!15V<TpQl?wFu^v#lPla)2fI1t+y;Cb>Wd-Y&@K}b37>&V
zXOzTDcp0;Dp*nklU8&t8ACtSYtoTG37OLBE;Ugp8RBg^$IIt_}KAXA#$kzaLuphK_
z3ggCUviDDD@)eT%QHrcmd^tjfx%oF#+>298i#p~>#9GQygm5UKp06s^>P2Ut!qJr#
z7{aVOtCdi_u??rOU{a1Nv9eyZK!`d`Yt>ky>O%;dQ=92wAk`!V6yq?-YI2@mg3=?v
zY>LBs#Y}+G_G=$J@tT{E)Q*5CP-b^=zo^x%GvHF4cK~1Stj0iefNS~00!w)7epb^d
zWac#_yR$eZ<k7%3?0;@x%R=HyH6rz}18SX3@qci$f%}O*GT_G#B}^O{yngPw+-AAq
zET`d$Ws-d%p)rkUKW-4S7mA(T$;m)1<ucQ_r%tMU5F)AlY`RLiK()AKZ7LMZ^%bNg
zNAVbJh&G<5vqwAbhDBE{L7RYDiZq#R+}&0MS!RxJVxz1tiEa=$g-#&9xk2-QG>^QS
z3wuza^s{87J~ZPU=Hj3xDU0t)!7%2`<YbA^@;+YINA{T6jA5g11&Q>nZQ@w6tryRQ
zIFNb!_N~jicWPo(&2esp*+S1v?2|A~{ZdS0>O{KERpH9$G7-&csH&!PC7$JM9=C0N
zSae$4vw>YB`Kdq!c<HT#IHw6(c1f6OWBj&682%zRp4&s3OqTfJM{W!V`x~oE2<5W$
zHi47!cyY>2I~68NZjC1Ontp;AWI^zh6lzF9Exm9+F(v4Ll{O!7jnO(cPk-PlkX$53
zphHKX_S-ET^Q;&&@k}+;AV3;6-5}yX8McT4F>(Y+n?ScNe%KlQx*sKt{MiVTz?O|U
zBB6d`;bTluu8i;ZkSDG+lTfB%iV8zTUMb>zohIJ&A1-*^$14)PExq82Z2;Bvggczo
zq^7u8UkgGAXLzJBMKLw#M6xZaIA-E}_^g&Ho?fvp?4>h1;%9+j62UaT?pLc*!<XQp
zX<fGgE9-9=Kj&nKQbz9hGfgL=5c-N_fQjlS(!?5R!^b?aR#vdySDGfZWFsA_4?WDj
zVh0oX^FeVzp{JF(kyQU^LJKeIT(drlF&XO*=yP@K(ryT>Ot2IVpa{K=V2)nPjC+Qf
zpaQu_4501wb$^TgTZg*R2X*&%a`SE040#INfCJVGd6HN3^oYFBZ!aCZCNH^zA}U%O
zk|)+FY?HOy^946hO$x7(4W9JJvm<jJ%RBq}Ev%s;7&7)2)1C5WBv!aY&N@R?Ey?uQ
z<ETG@=4(}~#qucHZ_B*G@4lKO|CG{kuV))J3k5H_)oQEJ<`mn}`BYdtqE5gNKu_r8
z`Pru5JObHR-~*Q4XMDBs1K^r{8p-dQvdUmMhf7%elUx#62Sp`sH~J;4&sXjuEf38_
zL@#qTI(Xm*pb#z3{)AF;hI^`U+vX=@S~;dFpaZR;ZaCM}MqXb%YE_ez>hRi;(9elP
zbz8x-Eg=loD|%^`$2E|GpK$wbyR7{cz}H-_3*&e3DT_ZQizZ;2%1$hTL-Ot1b$^~(
zXn{_hmERZiK4s((k58KA13Qe-^liz>EK|<M_s(z2W}B-D2a76rc9@zUk9JR{`H;xm
zIdFQctr08FBM#nL!8$@Hyx!V?7DX+lGU@@SqdBof+}vZ&WjE6LBGW?u*r%%vI%W<_
z#J8Z2hh-Ez7MYOPix2m-#1K$Bdk=Or-?IU(n0yy4R7Yhe0fo{xd<^kqdXtf@w9eJ4
zYrZ}Tw%A?IoF(XQAF+p+w50Evre&OjFHGUVDPZgcNs=jpYSY>!E4zWy+zT$Pu8rx<
z^-04b2?<WD$JC9ws;}HrOs{gS0?SKh6gpcV!cgGAcfc%Uj-;&6t~gnQ)Ipy7Fo6Hy
z{^zl)y@OgH&N=NmoUZ+pCY!lc%7x*4nHi>V=1j>Eul<J2l37sc%Z~(P9t;^xJa1R0
z*39$>aRDRZJFD;WoTg0oo<KQ}{QJG<<|05x!*iT57M`^zJZ&oHkfWCeTm~JP_!l*v
zewVan;&Ht)r5FR>sZ3lx?e@@G@do*sEZKjT0u*xLNL&o_la#`)P~LXYSatKL54~Pt
zAVd@`ol0*^G%YDPysYNrd<C+zI0n%6BMMTSWcqsSZ(+38A4;}dEvaiRF^@RsE~D4x
zW8mLvKth&u>qZ8(7y6)v4mRiziA3!8N;n(>!=?5%xpSXH`k|Fqzgj7CqZJx+<oeAE
z`(J`w4)RNBsj`^gD<37*6v}kojMZr>Q`fhDjZYfG1c}Y6DZoF`^$e8?9%^2<3^u_v
z6J#OaMpbJYjvx(P8~)B$k~zSE#)RIOQP>&+x(F@oup`Qz2Giz1A|jW9CGg7olD!4v
z%{hnDG-b8!WLA=+fXwbO2pF;|Yu*<YWnIwd7`LxavgYR9pH3{+UpVxFWbF#dJe3ng
zTD;nyi1++c10GBk+k~0R|2bMtb3pMWCTpdS8*Tv=273q_YOa_2%J0Yd1TLX4S+WsN
z(GO{k$I*p6Qr!csPhB>Ks=K-k{k^quNv_mKI(z^vdeL?ev=82eV*6(Uk>jWiUOIJr
zP0fQdT$b4@Q)L%17E)I2Q`EOap3!*+w%eRanP$mf>g`P6x?_&>9R|)0Q$G(Q9)6K6
zA7}7aKTHZxD(KKTfl!KC<{$`K*ywc{y!9u7lN(f(0C&&XRw~<B;1-N6@?=(>$4NX@
z-*j7gn5<{W!$rt#>uiDUQeF@+rsneIFNo2JymI<vL4S%Up6&2u^4imQo-SbZu9||E
z=!M6c-$vO<En7#&^Qkr2P+7X>koT@J-Y{72uyOHTjo79a!%7f0oT{0bm-55o8ERr~
zwP6B7|N6L!A1;FM*`7#sJ)S8~iPuo{45?5au!b34At@N=gn|62pFjvTZJ9t@`V7jp
z4#X%O1lBak`bQJ5RA^AlPfoRQ;gI0wEiFZli?mHk>@ynMWQ=18f_&KsvN)liUFh=&
z7Gt2(4=K@I1&r0JF?IYYx#^;+D#z?wo8d`;&c)FuAbR2<7{KV*z$TB;o$vtZK?;`h
zYYNi))$iL?>55+tGnr#CxH`a3hINEQGjOd}^cgDPaj#MlJ%IPZx9i#PRrdvgz9h91
zE|9f8L`Z`<sl=NABime2ZDmlwxjGyG;J_8cSO&Q+%2K%-r^4N4aZBc>xK2;?kbOz_
z&mhohe4%CxAdB-)3p{T~NvjJ8KXmSz{pis7O48o0lB)DDcU*9|r?|&Dz6yP{V5e+4
z=ApxnI-AZ=bN=kUF>VqMu|Eh<e|i3)`5?$XPec^Qv)ML*d399dv(_QWkPF!Dxo}Xa
z2IIB?oj?-;NlWED=EKq$>Vx)0E8_HHggn?9#s<1+4o)k}gzPH|2-SWxE9LnQl9@Sy
z2j)Fq2TT#?Slw^#Fr`-94*EQF$;JX_1ts{J?ix4;j4}hON_XU9`7#QL@JVuT3(@mh
z!3hAl!1^#Oj-ZfmQuSXDj}?-ycI;#^9FDQsX21TBm?vMAl4l6bY^BvR_GnylKx&(`
zmcaW8f!{{kQ7ahiG+*RApv=DhjG(D@{Nf=uP{Y~{VTI01rU30&VL8xpFS$NGk#;GV
zdg@;gNC5kY9ov}m)s!+cWT_#jJE=J=vcU{6Q;HQ6%!2M|K+>msTcU@}tid{O?iTRd
zU_mw<rm$4;_qc7DUiEGV;hZVpjh|4qCo9DxE0nV5J+W8g^3;6GJb5DfnR1@Ig;k$i
zjESd*zxQY{J!gC5mCca<)F-|6y|=f@v`Mp14Eg3e6>!~`@~BGF4Q|jsTk#Q`oK+dy
zR3w^kr-{vN*NwP}(6`PD0k~OLOY?)ucZc2`<z=q5OGy^^oD&i37%Lk_Ow&fc<`+YQ
z+q*BUGa?K4GgF!`=JZ9|{U6P^?i+qYl8?Ce1qA6I!CD)Lcs@U)WpU<!OKA&X0)ts3
zz|wtF^HAwq#u@#H*8w#<Gh)9zzeAD1v@E7gNrFzWpQPOYmPisu1S7$=FHqJ>VK4!c
zS<8%Gv;^ww?F8T;O20I$>mS~z(TIo|-ge<b)WWt!1oNfSOWyoLRAR`91sjU85A2-0
z#g@8%|D?_59=5(OZ2s!ZCJoF3mn#8`4C9$hKWmOhh>s2=E-r~eQNwjYzT87(Wp>X|
zC)08R5XgOvHMyuFA!N3BiQ1(6(BZ?5@X|cXKShjeTa4;@r5lFeF&S4&+$d%Y5m;|#
zq5Y95n|&b`>U(IzG`MMQB){PHXL`ICz4SSmr-nyI9RZYkV!<hF?#KO)uD+5$?am5T
zrmFTngava!$9>M<TyOexq}*>?9)1XgpmzPbi7=w!rE}5Txb{qbztmAG0PuXJsi=UO
z>D=Nsv|<%ch)uRS4p;2}YEw<YQe2u~AW_eUH<z->0`?g|7bRkqa{B}^PYsJ?T5;JX
zeqYkLS)XKgAd0E_grqA+H|f<GZ~nOU@=%@^BZYe7c#SM5ISWs~=D|0fw|?=Wl4OoZ
zV8VKBH@G<e$=h4~%ZA1k@eaf+CQLs77wb*DMQv{{ufHtUM5W~A2{34;*e$=K17+n7
z!z(4Ft{_i_A(qMs`u+@mqm05rk_#qzaj{wvx8AJdo^w2JX{<~<FbBX$%hz~GoLGG%
zpF72Cfe?tyov;;#p0>&eJ_^{Z1moZ;V5(^2t&WUg3IkS!Xf4rsS!&}wUS@(4bC~Xt
z!e~mLkrs7HU{>HHzz0Q>+Ux2=<&^b_^l>sH0Ew|cfTtqEtR)_E>1OIX$s&!6w#8Sl
z&JvM}kHk--L?#W}w$M!UP2=$6gQT+egsXMZ^xSPt;BuL-me7z<ob}Q2G!EyX)Wogd
z{62ew{5YPmgs2lW2{W|k&Lw3Mfs=2|eDWOcU-dFPM%5Cb5z5%Yt3kWoiKKy6@m+c7
zh@dFqjYX~IE&Zqgs8hHzju!BMO@*Q_y0kmvVo?NF{-MXb%6?1O$?&^{5=(Qfj;aLh
z9*=yKdMb1xQvCuVe19KzD;fhs7?62gvh&E2=)DG~Z1qb2`jIR@zcIuUZ-l^#+E3s+
zM!4IfBOCU8TMnW+59dIc$x3xDT%=59?(?WnU%DxpNaOQXVL=3figDF1K(8F1$#4}B
zZZW%Nqg4|Ys}k!CsI(JF=g-(XlZecozZpoC8k!MkJy@`DuLN>9%HF<BwKQQTe0y}w
zZPr87embFpjd7+=&hla09uEjG>0GVHxUgTD<as(Td*ZEr3hz$^X34}zJ|v^p77unb
zk+0W)1fQ@Dv09!I%-f6=%&eT?1!5npT+KQz=V^+}rMA2}7#cD+*(HD0W96^a1WQ31
z9>4g4>~|r(G#OqD4MZ=Q>k|KhOj}ziPL5<9b-^7k`!z8z6|q@STw6RLj<b}`Ri$x8
z>hKHhaL4zC3nTB{SiUU`O%pwZJTX>nKu;hb*7+hOD;)nEfod&<aGvH8I*x)RAYq?#
zC~X~>hs4h5iRv!RigPr~f`=KkBYdcpq;W$CWZp(0nbTAfy~|>k@@Bk4x6z!#%6Rir
zde=0$=7lBu+n#H){$Wzz{q_lzC>QS<1C1%Zm<&A6TLP~j{*JNo3D>a!Md~vhfC{vx
z+ZHkdJqNbg7%r*mh)jeXstcKw1K-d`!Z1UalaIs4`9rDwK0o2Cl@rT_K|qDl>>HG7
z<10&V2?qB0AMpvrnEM4cqDI#&NO0)uc}fl$^tR4+r1B*UL&S;?N`l%@VH=l{)-FW8
zpu+XTC^cj{paRltg47CV$95onb!1@nE>sGM`A{9MNy|HPNt!H*#z33_7+w<1wRNhZ
z1A=WYn!3s}iyp#))?L{khotpXY9CTv@-p}-XKof=H1<<0Y{W5)n;&Z3p~cdqUn<QW
zPCLw~lc?WdvAg*Y+&=3;{HE;AY$~iu5WvKU%pTXnG146qAK0J|+1#XRyRL+yrqDbG
zy&M}{9Ok$L8AD{an&L3WeXlA-u#tEzS+%hk!N5mBc?)b_F<<EMQe#-Gnzo*sCtZ7e
zyj%`quR=1YD>>ERm%EwX@A=_3J1Ltxt*FePS|GT()7<$FGLH&m+gxICMBZJmlrR*#
zYt=an{dU`!WW}G^dWRwMK7b$J8ufU?p99>w<!tOOHpEwcOixOv;+BsE*WZI?#2et!
z-@Txz0n)ft?(3dx(`3PFz}XP7Se@Uo;04S1IVcP0w^dr%1WkuU9!cFKQ)!3c#Kj8i
zx8OI}R#_6V?xU&8Ol~OjC9U6#GLus~PpC-ZMs|cgzrmhxbYCLd+XTZ6JW}t|=0ba$
zEOk?uLvY52+WVj&%EN$zH40T(8k^<X0D1y*RZew8Z$-$gqEc0X`&`cJGQ>axyZT2m
zidsW&Om~?b>%C#Df#jo*NT(kk=ROdpvV@Lwi+5IS1=_;8LG%to#YWE7m?TN(E>#DR
zH1M9BlLrM;S&k-8w)18JlXmwSI6ZXUs!(cOVe(?~1;S|Cf30g!w>?lsAi97E9_Cd|
z<}6aj=+#o|G+0zn3wEYhrHcAKSLo`CWsijQQrzEQW3tNN1lcFF;C<*Uw@tWGJ1!uN
zrm+d7=-by}JgPMC)h)Bc81(0e<SO!f+u$S|Raj#J+|)=U^O4#-@wcvgievNd7#S3v
zM4aPlc~#)H$^C^;!NBBK44eCqBcHN5yM3bDApB=5r8d5{JYffpxX>U)KlK9ol%+;q
zZ|0eQTYx#uN0^-YE??db()4_6Lwrue^0G+9jEv-b;X9qb<Hbw773YX6L?jewiIKok
zacgk~by`XmWcWjzIEdpq>QgyiqHWqe!qM3)UFQ!bYre%kW2K5@WgQG#e_*S5>4@9-
zK!|p5(68v;q$mmwBd!s<CspyT)eW$!xQ(h-2B0U52o%Fc?cnujBpTFd9=mWqzrTEY
zdU8Q&`eI)hu^|&ifjee^)I&24XDcDG>e*xla7U6a-gXTdN`+glB@IE6n<F|BmYL_T
zc)>}~H<L+<?k`=|4$t^9Br-%!#b<D7?(xuZW#oB0H%S{>A4UdR*c}Gg(;^6_yG08(
z60Ss^@c~AZ&k=7ZmnZDp=ZFh4IECamd4MSDQMn7R-DaN@&_XW?$045jXsW)i%WrPI
zFo+EXWA(_&eGopFctq|lnuh|21RaI3xG5&;E4VjT!wqwCyurv%(xLpYGl*#X$J<Dl
znM#dOlxW|Zk+DH%<Vw#au0f*GNh%3|Y-Enj&e9tVTgyh}=-H{EO!Z_HZ;Bb;;=on@
z;HGT}2ELS$GFMv?9yaTaIIFB0!%R!9kGb_zFCo%D172xj3|+&P=r=DOvp%@z(Y}fy
z*$i=fpte0&msmXAJxY+1$G1UYLK7z3{&JZV&j^yF&T+$Y0}7&3Tr+KBKeHSh9CCtU
z@kp6!p*&vMQ*qS`gfc^b2|SZ%34gqQ;qS;OLuVCmfz?o&#b{M#2$Z}FjK&2R{8-Zf
z`8f043-)@=O;ebu;eM6={!l)<nJhxX?OM~1GR=-gI$*N%@F`dbp++QDX8N2BGaE_g
z3rksS)%n_Ufj1Gj)8Kezw2*^A9+|wZ<lNh7Ri1g(ZuEPuRO=^Qc4|Ji&oZEEl1y+-
zl3?Ii<SDcofIbu>xLP9ZXslt;!;vqN3I`n7=+Fw%{*<#vE6>>rl%!WD=BP1-CoK+s
z@i^mn@`0YXlo)cv->VVpGqbrSzWJ*4t~TQ`<M(~A<3eV{>y2QZD^}2w!D=no%l(0!
z=cg;1wMK1$wbFzrhhb<=qI5;gBlZ${aeMTIo0GJb+$@;L*rSbDlvlr_2g3yB)HLT_
z!Okw*CB!nEs6}Z+<z1*0?0yBp48gKnE`!=Jx`4~Fl?a2Ty16q6#4x=hO-f@+AM}Xb
zQ&kuR?ZvZnkutfju4O`=Fi|sj-av9#;05qK;6wN~B1-LJe6Z8XP=zn>#*4^L7vZ!S
z^X-CwK~%Y@w59WmQ%)){{SEw&eCYV9rh3WpD4vNPCmpSs+PZ#nmom`nEc9%8QU$L%
z9~Ue%M(9Ub20peM0M_e!d&2EneG_ppj?@sUE#BZ5PvX06r8^x(8gE!YDSr9-;yzbR
ze=;L_jjJj_vK7p_NSwj@B@Ae51lfMER8-rYL96`6I`WZmt#>FM-Ed;lNZ{MvlvnfC
zH(yLU7kC$(!5@$tuu2s07l~fnHH9^lR|v<fRb?TcP1?$TFeIY#wu<Uc4@1TEl+K2j
z_{E8Zd5-G(r05Ygi5e-VLGA%&9A$6C<}U3b(iBOhFP&K>Wz~6ZF79mipbM79>`&<O
zxel2WR1Ip_So7rjo&mIaCL5V4M61YR=#!QtS1)O}+HA4=Rlp?&?UuR{W%G2CyEo(S
zs5!Vbeuqy=duaYJ5i|t3ZELYvd=L>+UXlwZo(p<iFjCow3(*xCQM%vYk7ZJhUowj|
za7LUK*|>z<d+V>Dlg^Di0Caj2E9*Z=#6FWl7en6z9jm9RTCps4hz<2w$8AX#<lCKX
zEOBj!%w{I6V(usFVYt$7rzV>zFG8Z964IZkB-Zt1(Tod-Nlg#eSg_QJv)~ENbAGZ!
zAM-c#)sdf1R`FV!iRy47E}8%-kAf;-cBtX5YzsQw<D*%LlHQTp+I#0pF6=l6%hDu~
zC@ssdRV)$0UI9d(3ecEXi{HIqVzT;tXyhh<Bgq)*XuI+QQsgrqEks0o2*Z6`S?z#b
zQ#Ei(;@^sYP~_f_9kD~P282pYZB*AZZ>~Aqjdsa-bYX^;a|0-Iw}~2dSHg%p6>2(F
zDj$pohUO8*b-hdA1dT1Bi<%Uel*bb6?iU<o1+~gz+$vNL&PkBZ*p8#WyNn{_Z;)`o
zX}yXir(P^Cb0>xBbkCd{*$KbAo>+q1!eT<&km=<A9_f#Pbk;+et>|+vXg0Ew;9#3u
z%heEBAOZ*uWI4BRVUP}bHg_LbD4HkhOIODtDpp46;11d1K07^mOz%P|uyEUIFv^^J
z*y<nF4B%!H+VCW+nUS873Wd~fc)ca))5ZZT08*+es<fck6vI({5n;R6&pnA+Bebt~
z{izw5a$F(?1YTMscc!4{gey~<D-_88?nxR0;>yyB|B~kL^B9FzsgY6gHJv@yM%{V=
zvgPHg>QP?7w?rqiXUrLF`a!t|-tW;fXTh=%$HBpxK(WvC1D1dhtKq_i=2aDI^w;T-
z3pKPbFrgbuypsF3;C#biUr|GXK7{uBJYrFu3Dg*PdVgB<289OR=rEgC*IwxB#NF2o
zm@=4<i>DdF!g;iLp%~m<jTWP^)PM`_?||kW{et}iz!ut&Bsd=)mfwQIV&?2i&VDXs
z%=2j8H~#WD8eQ6F7H!gV;JE7q-&7W#eo4FJ>JlF?L<Vfd;hLLAX)Y%o@Q5w)4kIE9
zQZ^%?dFJmTx(gZfk9}}HPYBir)QhvDL+F<-?I4F(v=)x>c)Mv^>#{e3hp9A%olxVt
zL*iR>*;4}+BrSDL_87a)LxQxp>Y__<;&e3S*8^OGz}{{8F(U+Kaqj&Rs=0%(ANQ-9
zQ$UEEp`i>(88ikgRN?sNLYG!LIm@91`9vJ89}}m-Y=4Ftxad}Or#?+5D%zhTvr*qL
z-rUU*EDN+NLbnwoXE(YK$2&XksVX-|Xl`TUc-oZijrOU9GzcLWN!O0pZ>kta;F~M!
z;PE9|d_U#l8Eu&^M{1BblyMw<)oWkat+Daq!D;+lQsJhv)m{yslzrifMes<hYsf~=
zw{WG*@yL4gV3ag3<AYq3u?ZD_h~1Zw<s@=FGKv!9A^_;uJC}A_t*TaRZAKcm@202W
zx}NiF1E=78#SUd(Ve0AGGtKHh(M`*nIbj|?rB}DAX%g@3^fP>9#s?2f=v-eU=%^;K
z1+R>JU2Amg9`-4)xZ=j{OXzYa^7JT84%&r)NHESl==Xj5C}{#8N<cABI6Akzm}g&!
zSp&v+a)KY+z$*4~Ggpl}(v|GZB?My!Qd9e+zG&1SU>U~ZnvqFj<GPD1k9Io*GkK|T
za@c&)2ElB^#&}+QlEm$2_FR;pOCc-6FON(NZFFCyR1097j&l(|N=Ugxge+L?X=a)U
z`&?s>ntaWh!xr5Sof0CsUjsLFg^}W`D6;!POB`<f+}WqF@u3IfNnq~YYurAiIj9m7
zKSb{F0U;-JSjp%dU;3(9An^Q530&%&VApj1JkArW5gX_{l>?NGa2=Nuq+i0M-+)1S
zbLYbv^NMJaseOh`GNYhKxA4A`UqWAUYIMR_3w$LX%IHxY_7^rr;PNwsrxDx+VP03>
zPp{VeSc11zBn;bWKj^5xTA4yBep8~^7&Sq7il@S8ukFx1ZkF%Uplnl@#t!F0SP_lQ
zGT(m+L6^NSt^J~IsG)ZX@sz>M*j9BhNt9Z>vk|99JrzoA(d?sa(6KxWBXN%?wI6xe
zVxc0d!85{hnqL+A^Mt4s3)<u;R<)hxl%w;kAOtFH#ow^nxz0cmBLa1xhR(zIZdvEh
zC-GpKDk%$$EcJ_9{;V7DdiqE3c67a<IZL;r$5E0g@cK5yWVC$GrWlqIM8+=SZMj6x
zu`;vjzHm|R<g$*|xFgIKda7=-s2f02({<D%>9xnCPHLvk)md2VngKutXj<fc!JKU-
zLJ%xP<^kzF56K`|&d$_ixoc-)Jt);IDk5J}$*scx3?vRUGt#ZWANPo>c}(<l&*C!N
z&)>ULXkj~9GG7!X)zHd4`<7<BvEyj=Q+0uyz_qG$f~F2<XTuLRe-s*vz@f4?l&B8Q
ztCuAicunC5%er<gwP}4w1;addWc~jD4M6h0zUp&GS1FFiV&Z>?LJj`LSFIky%2v*J
zK89B>-sg|yN3Oy@0?<d!JoB6e2McN9kHNEFpegIwP!3|nAQ;7Nw6j;*`j|kGse?7M
zEN|H^_v|Hidt)rg@EbXpoBiPeDtxD+4gB*P;8^xwhSD5DgzBgh*N|zr#b2RGF1JY(
zjxvuUtt<GsSwvBKGL0VWXAdpe8nQXtHkZm4T)%Vqv?Q=ZitFU>!t&BnW=GJ0mEuhl
z`X}BxO6kgNQh-voIZfxVNL^2bkC>!}9kBsvRd)L}QR}nLB4&N*L`Q9Uy!jL5x}nLm
zP;1D^U?3<uapawuSzK}ljmP7~tYlV*!MGQY`7(il;;DIS{9Gl5MhVB)|7WzUxUq@_
zi4tf%q(MEoYY+Igg@iQv^Re1<;_=_NTXykE7~`kZ03FKy*$mdwR^8z}aK{hcO&Z^B
zyjp5q)w=qDz16Q#q${xEC<Cs~;c+~yaj1$ft2Dgi$nT<uy*EcsHX6MLqtABCd&!Y?
zc~+Sk7CNn&s)T*R?ex8e+v!aYx6??}#V9d#4C%HZg><LHb_1+@bk`MeqjX9`ikrzt
zbRq6gIdlvsLYD5T)3$e6C;-X9D$|Idy&_s!9Vp{Q3IOA9Oex%)F0+2Qy~tK?Oaz$%
z0ba?>wUAqKBuPy<ZC{_iM;5CgN&L3f$L2Xr{4LFfk5fr!9&_w>B9A7ke}I0keqoTF
zb&cwri&igHwueC9Iv#~POr`y%Z`26T1gE6?OtOT25UA<*)T-hn8^KtXmg-!UbFw%c
zyPskQ^*Q3k(Z80YEI&NgUBMsP;|0)5dJ@E<Oz^Hv#ePnS2pG0d?s2`ZBmVm_QM1rl
zRjLWqT9*Wuup&<F)yKD@_d@?&Z;VXY$Tz#%YbKm0Ea_T|$&7F#9=EfKn}v6L@-Ocr
z)dMS5(Z?+mU*=zflY{xjVF_BjBn3F8K}jh+eM0S%=ltu7`}K{l7pe*84{Bf8+-ngK
zUzVxVEP?n|5NGQUPBK}{XMG7CeZg(lID=OFbTG|8T+#u!y*C&?3)IosM{WHBLreaT
zuEBcR@T;J8L}vDSH7963)ecj&vnpvTwB{4KKg7Bi&ngn4`F|%4?5jJ>>Lx={u-GAH
zghW%)mPUn<^||TB<|b>XEVHY=V6nIcFe^cKa|5YGJp@NjnF1n^y&7DSfGM?Nc#FK~
z35nB=5}N-_*om7~U)7hDIT3iD)@$KoXrdm6hM_Hv!K&J_CEb<i0|x4nNw4A|w85_+
z8GcOnLFSYIb%Jti`?ys0lcK)pj$gFWkd5J>?$1r*PI5LK21+k8Dj^Q(5Dr-pd-32l
z)=8x5D_!8eUEb!wi^ymPPIZHxn9OE9-^9&X(5Xt0g<oMmx3LC6(UFjf-GYVFSD(Mv
zmL78T`A;|r^KP*N%3a|nnNgNgt5F2^(#~|F`;yG{mxl}P9d5)cfkly!jLV5HZ66Iq
zZ#luD=bviI!d<^DB!O5NHs3}86g8Jv@|L?qykxs7plK$ilNvi$x78y$t_N!=WrAs5
zqt;lzg@FgHX1tO@`mneRwL@S}S{40xDz177uAIUYT31UwH*vRUSM!A=cBMl&)#VN%
z0WCe~;ZjP;|1&P(6=J}g4B5(+c+@3oVFL(L=_f+MmP%U6N>W9E6f_B?2N6m8?Qd&l
zBc5t3U3Ti4Q{sBH$bK2se_mGpl{DkI!uPCL%JoN5y-%2_HOQ<{$|5w_H2q}GcEXcE
z1DdGcmig+z0Kh1Y7d?;`zIN6#!7H09L(ZiP6d`=J>d3%h;`aUj2Fb;^e!~8m4NIQr
zaJBOHu)Ip~Yo4-<KrS)H#46fQ_DiYuBqD8$wJ7f^C_=n^+s)gBQ}Y#tLW;~~ZO+5i
zrDOT<-}zqi|65SYk&Y?%r|V6<&lVG$()vI(nO|1mRVThI4<6~K2)h{~3oB!7rQD{A
zEKX{)ok(JK@q~E&84*Ewhg>?p#{G|hpqw;5#xZ3(FvQV)8vvowx+~ES)9PQnFeAy)
z<Kljek#j@f{B+UvOiWlJsa}0yo45n{Zkd4cq=+`R+oUqt-ZwkGv^A@l@oJ4=x7F%T
zYb$;wmH$*J?Cl;v6Ygv!q8YYsMOxn02_{n1Xr&d9DxjJSa{=s`ilE|IUGyi^#Pbj^
ztmN6GsL<tGBR^6}%-%1D-=_-WS1tue=yPC9o*-}<#Y-rMYzeyFkFh<W<=|V*sG3L>
z>;~6zp(#b>*g++@;oUx8POORJ)pp+MdmeFUHjl0xm02)8_3m@TXhNDeavAKyTWWsm
zFip#q{-k|nEjI2NXWY5!iNpq@BajP^o6;<bJ`m$}6J=8z5|9HE9$0OnYxYd9Cw8mr
zc***g@~sNJF!Rb8yXZ8&k>`|>n=N3o?g?PV%&s(Dd5SXz!57Y%Y6^msZBGyFwP~2U
zs1_&=YDpAHPmlu%tu&=F8)CxfE->U4(bh@B9ow#T824+Nr|GkwI$;Phgx(GK2sg!(
z&HaHo>icC`g11nOWv-OK6kC-d{k<OoqGaFUR9e=@wI1W6V+gyelnDU#SpIPGd6;kf
zt`dLCvGMA^7O~7--HT~qK8`cTsHx_THyjAMTj4*=TD+GZu2=E+AA`e)E)N6Y)s+ux
z)*4?*L^~3ikcAytqMo~+{gnl`SWK~rER;c)tAr#H@u72>sB2qvB%a{bib~|Q>MQ{+
z^<1Bk#<p1z3nzfCnGV(KHYRz^K`wEGm-^!YPU-JxK5>`Gj)1^~!x;AdVoqJ&w@SMv
zua4@D1x}BpAxtQ*5jI?eDMBd2cVx1xat`_Chn1)yPu2jLl4fFD;(KBdL2v2t5$*wi
z7=R$}<1G-t>$k*+V~iM*r?m^@_5pX1-+D?Bh|bdg9NHs14z7AWDAxs--nniZ6mK%B
zqVDGvSstm5E}C#rupLNF{@Jm^?`eDlu`;p@p~RGOdhw%mS!pjYaB~Zo6nkGiUbwCg
zl~!r4_b*Q1KU^NSgk%nUtPs#S=%mf2H7T6UK;eOaSS@lKQ|#Q*FY!2hPz*I{he0eY
z1!Nbn3*%suzrx*BvBY@;!PH9FI;W*HQxndU1}F$m>(Ee{ZKL;aove<kZIwH2DBD&9
z{y!Mki*5cv%B#3h$VDNifD3rT=pEo$)4GM0x(!M=*CsA#?#;^=Pg_##<e>pi?A}i?
z8R@J!L%+}TX2A>xvBI?k#=EBRit(L+wwNb;Jag~&!B12PI3Zz~lQOID{u~SwR6du!
zo%S7&^$iOPM$J<wqF+*Ud;HyaBlK-k^y+?5nTr8lrSHEvZnec)*$??RGggsYC}!pC
zq}R6vvh&a|qbO6?oNyY~tu96^>O$~=L<q_D^jmhcD5}|le`w6AIzt`qID(<roZ9Si
zZzgbNLmHKbm8^ORNG^;QfoHYoUbwtE4c?ju1y$P$Ytq6{%aBQaJH?jPs&gIDu@ul9
zcnn;-p4lBq!X1>^%4=u<@;i{Vicl3*?35qzA<9|P)OxFJ5!WQQx8#vxOLDX-7m+|y
zmLuu19>bA@#XhR^51C*35LV)Gsbk-X02L$vzSoC@xz+zsb_&vcmw{LACz{K!N~IpE
zgLLl=u<&!MI(th(<wd`o`EH)U>$<p>pC6Kb-w>`hl=W1sGkEA>ZjNw+Rl3b>lM$)&
zi}av2K!_m-$S6;$hh-pw{G@iFLsbWMyXJP@aikY<76ZQ6)W6xwA(S@%2}wZ`?-a;J
zg;7o7+S{qj94+fD(~B#QiCQS!><ZPIg3*P(H3*Gt*lZ=&QjJ+b(jH#QGH#=&^8;Mi
z^F{btS@ALwYV=IeZNTYe>DI(W%|=(Yt~TZWACyr8u1OxcShbr&`({<Hof7NS9W%bf
zAZYG1`~p)tOJZP6s-e<Zc6T+taEXjK$Zw1A>wD#R+3vWa#@<HG9>z;fB{S2czxXN&
zn6WmSiwKe!ENwJ@)1!!;?D>CU9|JK#S!LQqrbxG*w(<M=r77410HWwt1|q{^-#n`a
ztA`0K1!JSK+D^!D!2_8j%CPF{X3<(ChY_?zEmx!pq%+?k8_BVst=Q<QXHf>|NxD`E
zg_AqPqN2QUt|6bJ)ngdpq~Hho>WahqCHzti*58T4M2|H2Z#=sd`h}w`b<Un=whqZ!
zbmrtEXfuEUp@~InW`;>Gz{s|B=95aE7_GXQFQqkSvo}}1Z5>4K8YKxR6D^Y^<~OQr
zG*-fUDr!HKT|RpnI_y87Ue&v?TCf;&<dGLAD)nZm)&^*48MJI&^l1Az9M@18!V8xC
z=J+vU@&~6{w!=8@!U#7a7IHykM|TJIYlPu3H0Mxgfeb~19yisjn*;QX9S^#MUnzFp
zJ@jwBKv)Z<S6*I+o$YX!7RSysWA7#QB&dyX6<%`L@Fs2Z<^IxtIzT+d_6TkzhQ)2&
zs??R+eER3v58L@OV#uIn7z-G%BimCYeK>4~ervPpc2f#Ja%(c41%Sxa4C)9M#F71j
z35qZ=Ge=jAZA3OS<Ou@*JCEHtC-%m~Yix8{Fx!2QLD~G!iU{!Rgkd|KG@=+x(&T^!
zhE~VQbu*i9XKd>0%}#jkZoM3UQj^@-r;hCouy3V++eDtRgO5d7Ni61(yhaUh-Imqd
zv_^0$^j<Mn0*^uPMHyAwufj<-dmulb&(B3jz;ekl#x)%!YZwJ3Yp1q)5YWLW11|(-
z;dv$2ENK?LJd83-Exl6zNRALiojlm+=9<dATwRY!FL74L#EE04P4(B=ARZ~rn}DHG
zLZ$u8y|CTVZ`_#l+wkr`oX6?5A2B4F`cpw2V5A9xTj|`#6@JgaB(9w7P24_xVrLPZ
zg|t#KY%WLuQ6QXZU5JBj3Tr|Ha!yQ=El9~1u8a2g0Mq?jlmU&&XSwy2a*XP#8Yt9>
zCqP3c!2;!T5XlBD_nCz2Vc`5WzE?WNdWMFN_hUh}?`i|zF5f^*2_}bKyoX$t&El&g
z9AL*i9;UonVCWxM>w}vJ-e4Xwl!DN(>2wqSD;f3*|1U!$3xNK1f$aTI<moVlRt(la
z9{p0M#pNAe8^gk1LI4x!DFeaA0FKQg{-QYmJLp0?jZ`exIO&zHG9f=fv!oC4{FRS$
zeAix2MI4^L<<7@Bd5gy7xrCrfA=*|brz?*hA&FlLgNP`Pk|R3g=>Ib+*8fDgfbC=2
zlLbe%nffcPY5jwo+hCc}ob~f|!m)R=<Kh%+!D*pH?-rvd*&hW)L8qdZmHj7x8~K-a
z11K9Y=Y!2`H23IWBf#_-?SjGzAudul;ob&_0~&55svz4gSRz0cmurv}qF^@x5EQh!
z`89NSBUqDK!rNHI0Z|S=`2{-_!S#AALG^kjL+$ib)XO3*H~%lSE63u-Sr)rf++_Y6
z-ErA)yJ@g2gBs(1D<?gDmloY)Jxd4J=Z#vyy6uu^zgR&B+5wL8TM5IT<a1~Fqw%$|
z29}Q3cNJ6%?>u(1wo7e5D+24(mv5IEAai&1?{$LQWTe?2<b||ZP!_?Gi7QXy;Wt>)
z6HVeBhuHunq0yl<jW{Akcaw100oIM1_rU&5g8nG{ZqyAyr>APIe83i2p2$=di9OXg
z4IZbLTQw|{JiBfmvk3&b$8jaYSJyj&-Q}?glDk=$kkm{58Kmxci<M=L)!%wSX<is~
za?h+ohUwJ5Tn;S^f2U@?)W_4Ta#jc)N)~Px0>7-9c2LmvSRtfe^i$P2#|Z7VTK&Fp
zob-bqpxMC(n*K|8caar&=ZnI(hnV9Y4cnVH(J`~WGyvT)J%nmOW#Psi44v2IZSb};
zf4OeLSy&ZL%z`ajP1^A)5-r$mb_hbgjRpjA_wbAppb^ys^D#%p=H08n3Ri|nkEZrZ
z8cf=w=QJHhJ=#d!vC?F*+F+`-WAV(V>q2Fukb#p;9M#0f3pgh)V(svpXPB6^4@vqY
z5vNSHyY?D?0|^vgQR4EU7J_%vaqM1_4AJu)uRWnQGXcPDcKk0*lEuzKNCbOK6OAyD
zrGB-V6PqcW-PbK9jE(fSA5R<U&_d(?eIXLbKC=N_X~n7icdUCqI$Fv&ZM?3#!%_u7
zkcy;e^Ar8JwRe}%)wtYHvz5s}KBabMgZ2}k$)j}e&G^b;gIT<WLp@L_25mtmay-o+
z`!VZ$6zg&d27(<#An^x8teOtWH|E03cJw+#U4Ft?I^Lpn;Ih`n{Y31#k;H<^a2;;y
zE?Y}=MM>E`cS-TMR4kGi{hyV!X4ZS};1PJ#-j{C85YDdE@L+nV!0X}PxYuc)0(+!k
z_?dm=#H1|<Jj`0~$4}EBHCp~V3xEZ{IIJ(;wV0%ihmjBc*XCX9f}PG{(u&!$spIR|
z<m&DkKQeOyoLx6<gZP4(FH;c6r-Px;=L(m6B<t-*2=|UYu$^Mt!eURSMaY;<D&Y<e
zYzb2d4A35<1HbylhYtLJ$0rm02cE?lp#7~e0>3mQjF>i@&lSyM-YVaE0z|qnrzj$;
z%q&*2MHh;}Bw_fc*iJ`$JKMI@t}t-+YSF=Id60wnZQVvgUBtD>o%cX1Y<7`rzvUr4
zBXSaWmTHOyz*j_yLY1*5QwG!0QM?<iB$BKmh4emnGOM!6S=5vXTD^c7NLH%?dpP{F
zb+rTJsQ|+fyY>ON{P(vzp%%{xz06BdW=!FIJb5_K{`o;$R!#b5d^}WeZh=GwW1uHH
z7&-0E9=)+}L7GJWSq29ATN_$E2dIv-GmR#AN}5om>R`ApGnN7L<~2y?QoP=FHLe-K
zv|1G49%yBzXg%dB#)wWDkxPlnz}Fn7zwPu|Zs6tCdCy_3GC)iov8+x<6e^<Ihf-@E
z9dv=^waY1yGBtqJ)Tu|fj0rPbzM154w=RdtBp22+l;EKHk(vqis8umI)4>!3d@j(I
zN2oSEH*tmmt@sEsgnLdwz>s{QY<OKnM5mOMKYB`aG{PlMj;fK{$TTbQKCELph1|wq
zqG<QQru%7vxOc;hP#UIU;lQ>d<o%OJzK<@xjMrpA1@oC#ji&zylk|YwQpYD4YEq)I
z(Gc)Ys~+8qSXxUX+F#v8`g}YDaS@QpDKk=0hjfN@!}4s}5^J35$EM#vsRi1&Uq)$R
zU1;+Rc(WG`7;{E5DeL}Eh0qp&_{?POP&POy_Y8j!O%LI0^|KZ?h8JOVlr2?FD5+a;
zaxvYjtUd?@+?B#de`>7L(|w;i3D~|LTnVb8xG;^oyEvqm-Fv>gX$MCvk<hXlZ`|+7
z8!n)s#jE6bs?`tdVeO|KzyR%18_{uOJTXr>NOyYTB=)^vnl7S3e@)6y3T+KhT~>5R
zBhs}dhTtYRSFy$}_L0?|`KaQ=P6s<pOx>@LloMvrxtmAg0%Mr?1ij`pM!5#D>&^)}
zlQw02&BQ`k#F$U8<9h-!Q{fH-y-UAk%OdYt#a&C^&5?x0s$@jl<{J`&0;6uNM+}TL
zxmj@IEKyq6HFd{CHT`=NsgM-Qhk3myVJnCyI3Oo9^u)abwPN+LkNwbHqB(J;*D0-F
z0r}8@Pu@FuYnG3>t#Cb@eQmDW)R}VLGzu7BfVf;y0l8h#yy7x<?x8p%xv>q~UyWFY
zU$?4%ID>5O0x2y`TQ-#rbaOnZ4MHTMcOJnrSPawJGRVExiTknWuaE@yDrCrT3tl9g
z`INP3#T7lwz3T-bn&(6mfY^EV88~K42%UCQ651lh{i6pZ>y(dM6N~LaxL&e`SKiQl
zqq|PqIDJT1EV@+awoTfdC&ipQO=5E*s1pf<dV+Khn^f~*;}Lus!!UD5J{~JVR1vcq
zqpiE64r;YkuDvAkXMO7ZYCl`Qq6<}<6a{OitgF0Oz1{*fduXqa6P+2nQ7V)tQV>=F
z2?&QY_R@juf!oPnh@T&PWMoP>!UmgKoIiHk*#8PrY_47}RAk@La1a2|u(_AX;OnwX
zfYJ6LLqC7(pW8>#XwI%k2MMws06Pei>_}sxMfw+V%y5qNJ8W5B_#d+%AF|(a`kTk*
zDoW_1()(=xI<|5lsBp9tkFbqe*!#wq=MCmJ%cP5bje5NIEG8ddq?+a79Ix64xewzG
zD`@#MHn;FK5plo4ugwOsoi@<e2Nwg%aiT$3l!z}%S1b^K;O}diCgQ>=5UZfVwLWO0
z&;`IaK4(R0T7G1Np;!3V%<&fjso!EYOgY1d(ojd8cJ&2VMZ7dv29R21zjLd&RXy&L
z`944y>uPQM<L0%KtiRE#ZNsuDlaL=I30#q^l_Lq}utnqT0%1o*-eOZXd06!;HkJ+@
zGws$Utgq2P#@o*#8EqXsuKYtl>9QE#8e(?N6+)=|B^sKUthh0XK?P~|{y%S-hifzL
zpoW#;C8?8`IY9D#btaN(rC!Hye2pq4fpFM2LqS7)VW&jorgx>6q*GRvc#<mr4)Z7&
z(oTHsmLcVCfkc+REw!?(yLPBm&kkLzC<+pOamvE;fL3lVUrD*RnNt=1$LnGzogz<q
zfl)sDJyR=<dY!U?;JWF##?-BTiq?x;b7=!D5Z2#8--4pDvUE^*ESZgH3ZT3ih49EZ
z&C9u*pFAnCU%a*sC~PbK{YY2%#@Cb3kTXO8{?-=*BG>G&HSb;{imQP}JT{VX@myFu
zU3_DgUqb`RDD-Vb%0-u@%T)O1J|^VmLyHK*$d+82<tlw86`t6wFQF>6<W3z$UGMfI
z$9ES^=<kiTRR*_sz2N}4;SFAsJ8pnh?IEkHe;M!Rv#g#J4-mP2>FUhT(WA=}wCdQR
zdFPM3swcd%?yacQ4fBf(l7Rv!#c)`#bM@#dswIDqBfa9O8#cpQ?g$Ti*646a3NCCt
zEIytewKE>Im8Azkez;Uio;QsDOB}?X<&xUm*xX5WBbomvPv#HO8`?V!aqXk8AkRvE
z!LXhO$j2)6d2VsK^b%gpJVi(n*w|vUwP6Zkev{uRftQ4S<HPUGBv_>~tB+h?(W_Od
zK4vUs5S~j=JJGpeUB6yx>NDc;_paWKq4Vn|jyO)BOmPyxH#jAn0PP}0<G}LxVK6lA
zyAFB498|i_!RYO^O2OxpwSAm>VFt2O0h(w@e~K1*-TA4stBL*xYB;C(;eS49?~GMQ
z*;kH;O3@u*C`O<%-|6!IIytFnnV4o@Ku}N}Go{Ew0zHcXyAO#cK0U@elSKkuCU)$C
zWEAFHZjQC|X6gn35uOl`yh^x=!#Bk0;C{kxxp}7!dLt*7Em2dogy)g|Se5B&`z%>}
zkqv7ROO6h4x`(A<OFwB$*%uGbQD%@o>^_SEA(c^!MHx(==^^f|jJP=(+?|NQ6r?)W
zV@Xx+ALwX4?dIbK@IFn{E&DYHe4^XMjkWhppk(lKR=@TvK4!P}c}*p+l8|RsgDU<f
zMxxL|;Nh9#p99IIAo+p2OmHuu40>S%c}%53WN^D2Su0+J9@2~W<IFbT)I4(_$xVla
zRnhf_Kd)z*-T^*jqr(A>Q0$)TY_jInk(YaZZa3J1ype|OAX-!hh&pZ;K;1o_#|;NC
zfM2|DMKm2MZw_?e-*qCK8Jg|7BDjZpdAM8mpJiP6XIX!HI7o=jTz0)``)pA>cYfss
zfpLRtOAZeFVcP&*`YasQ&B5jcp$4Q@+h>7Ui?B%YZAyrQn!~ZB^|fC|!w-~5MiA+K
z<M!XqrpQR^T3U!&n(!WEJNV4*s77D`e7IGP6hN6LAwA92;gOW(wIsdV))OsqLH!6g
z8E}cR$Il*{Ni_E0z14wSN;f)i3<b97)>g;i>9rq+rSyItlAz{83u!Fx>I4z&J}cZ-
zC`-@=G#$@UmynPD6viXDZ)<c=<CllJ<{nyHFoy%D`CT?Zl80>8Ky34U(`aimGJAUL
z6O!EFoe-%)m+@5{Xo`evp_~#=T4t6o=K#WCss5Rkq-I?dqm1K=nZziUpIJR!QpoFo
zU**=sM&_qPcn@I$%gjYZx<6#U`AJ7^qv}N-Iax<kJRY=(rtseI>3YU9q2t^46*q9e
z`#xQc%N7QcTQ@G89dB2+ul)gq9LXT<rMPG`sW@x0nQk8SfmrjO_II7}nc>*L_ANT0
zyv13QDob`N5w(-ii27wk-YuzvKv;@EV`FEWBGoG-X%ht9)cQ!yma{Jh=t8Fh!H4th
z@2$YZ%VB}-w&MH`c2ks?v<fQ(UzyR8fL;Qz9+7u}V``#+;t%jf>PNy2MUzucKVI4k
z^*6-u{L-n?zriyI`IgAAE8$IlvcHT8#!TX^T2SNRj=iBj%N$Tf3)p<JT88Za(^t>6
zci9pW*+D>(obu?Ucdc0YkY(3aXpAij-DTnhkAdjmZGB;R?h1hNI10-OJ7Ub#o<-fo
z)QCnV)*bK67G&LGs(@=gxGIq}PnF3C;&FIN5y%i+lnk-E`a&xrBqA9w_)EX$9QMly
zIbD^tH#JKs&Ej+=4A*a;)cgnWI#ljntu-e9K0hVva>{EDX>P_Lu1$2mWX*~@t5B2b
z9(Dbu5EtR@ku(iY+ZkI_&}VW@>cXlVq*IDWq?zha?_F8A`^v~sP;j79aw+Ilq*h|G
z%GgBg7Oh+Lkq6zB??F_5@siQ_xJB<LTp?07x<?;nH9uNGs@X0eb)QMZGrh?RicIoY
z{Qoa^>saK{dQlS37DvA;JU7CM*E$xK_rfyETcYm_po9@?q#;T(NH|%z$fVMtpIWRZ
zJ=*-kFVlBzH4sVO2aU$10-)<mlTuHaR+CgImh`l%1*36bmOX;IBOxRF(X7^<ElGQ(
z>$7cZNGD{MOtl@r>=(}w4JNZx`@<z03;b>|T8ALD*hZ7$hT<fzbMx;@<N+b}@Wj|z
z?XOafVOEin-(20#d(Vr^Q^*TBMRIh2Jmm+ZXpIOr0kgR5p^fb)b)ujg&KXja$mOpq
z(lM5XjLD`TDm%IWe%SjPg%UmTJOEnmAyw+InSrDjvy=HgbRzC*Vq}A3k&EtA5{J?$
z4Ju_8leY?J9O!1V@0De<7kSd8B0=;MzkTl{edp>lbj@b+#B2w$6P0HFGG>U42ggIR
zERjyp7lPu-nx0I9E<`NE?Fq2>7mq_W5*8B+a7=|5Z}uL%>ReqIe&g`qTtA<0jHK>n
z|1dbY9-6+)&DD`>bm|#P$s$gG?9w21qNer1L)zZqg<W~DMpuc$Xq@Z)`i&|uz93Mb
z&sQ#v`hvc*k-Magc2Xc(A2I^=wUV~82XEk~D;}KvVI5sl>T!~6AZ~*62Polx-1j($
z%UIa`e3WswICP;36ek6HCp*u~VRMcCH_(Azz9r%GCODxhI-_fgHHQT|u{!uCL)#3h
z6351HX9<m%MP-53+gXU<`BN?h^N9^Nze#3G>35J=83)NA!3Jd^#j#lcor~^O5%9W*
zruxh^tr~zny_zgjY0_^gxVpk<o!(3K>QX;b&R0xV^&iw(ziV$Z(HMb=RC~UM9?6Hx
znP04g<9-QwG)T@8+#_I*rHw!6!Lr{NzhBEhJTL2UVHfrQOVHCPdjLbUn-c^Y9wTAa
zq6^~Aq*~Z{2!~*>8{*`ojRs=VK*6|VF}=hAJ|EeDd8Ikc)j91^UF0n~NK_dSfz=WJ
zARBpWga~cZ$8g_eRSw?__6G_wIbQ7&ueq{Uu(@%#U_9c6jX3U_%6eU&8gM+1VJ9Rd
z?LaN-ebAE&O=~&kpVjpCED!0k=bh}Ggm)1O$Df>h8KukbuuV_tMcvF{Q{;0J#jHtu
zU)_#VR$jrLw8V%la5{`kqI_YQ6_M2^t>U!*LQFg%Q<nprgCy}Y=2x?5e#s~lv1^QV
zp4kQ2>hWsJ!0Q{tj{2gk2QiH73z4Z-IiLeWvqsg+rVQvX_7*%~2h_*d@4tKC_2xO?
zZK3T)h9mq8A*1LzO5VCAJbu&NDHe+T&U1EKuoX!eEog@#(WR4@eL)HA@n7u0!27@^
z4D0Wj{9f%)pmli-^u@$o`D7)2e{&i?llS`D?F&#va6ijt+JCq!cu7tIyG!%effKF^
z$7S8?>;iTnzL6IVrSC$YaO-E$f%o;tCrzsiFZVoX;xh#&Zaatndf%#8&O3oM>medg
zHYhE}2%eCvJrx&U!ivwTC@j>vl2hzrn*zehT0w&}nqGEpjM`b(J7Cs-_~XakELZ}`
z2L%I+nEJEY!sN{-c)rbn%3%kz^gTGTuoL!kp)RFKOid|BT9O_4{fX2vmFXwi950j5
zMrvlZJ+B3VtbiwX{d>(9XLXa#Alv~1vk<b6Vux(5QtQY6L&DJG$)MNDeWbtsJo$*I
z^_v!tNKf8+8dyX7KNfm8Axl_xK!G6@7rOk*A|s{h@e3u|5#p*^(gYZ0L_RN5F~dw*
zbFlAy%Y3R7+NGTfvELv%O6Cx1g%W1Iig(9XJ4+iB&RMiA1sZJU*vkC*_h5P&N9=bl
z{F~g&?vk4HC0Up%P%r|O7cgF<@(RxGkv}{iBb<z}$e#++nU#@t)@hGib*l?(D_4;!
z1sbhuV4TFp)st=MH_E3>0Sq~5@r%5=-va%WF-yt`i++TTfyOb(Pz3{#PE?87sP{sG
zS7)@n@;=*ci3K7Htjh?zl>&Rt?3FI;hUiqv6%5?D%ui))C=l^U0)Ns3AfyMh)c3PL
zUR5h4TrI`Pm6&uW?IxfM%1%H>qvfxJGUYA<F1mIYDo|>8I7WgEJc%JC=&nlwcGb96
zk9JT8@P<TzIE4Vldz2{X(?O8AV#j&Z0*I7a21G~0w~K{Yt6b2>K>LU~H50UMJR+l^
zSI@fbpCWeiV+M2;igDVRw9Q5p@*kj+zIeHxn|=L)^(Bcr)x}fV&>xLVZ7ml~(|ZoS
zag_G5q2+?L-e(Fm&pVoL`7<CyXu%MlZVw9I6UVE<)J}|%0gX-<I<`*2SgCHR61}!|
z!b-!0s}1O5r(+c6BvEV9e{YFVSjU&HAqD%6*b*2|p(zF}SlsAHr(&S@g7mekNF-;S
zINc40$BK*3(b6fSKo97w?mZnLO330>w6tA{A=zE=8BL1=^P=LBL#t^wDI{jvazfA4
z4P-t;_Tv3t{eOph$CGs<9Q?lo?5z_vRog?%>@#>zoS&S|*%qO`O3B82qhUfgPZ3Mb
zPFL9r_Hmi_V>y&MqWgA&qR97PjtL4(_oTA@lecaES*gQFv8eD^7hazqfpg(=5)Su$
z$li*dwzAjIXAoR5-pn>AIQ&4)UE%*b>_f~bL?#9CDh1GK*KOwvE>06kl3zF5O2@}8
z2;1TYvnX13xbig+)cFw3XWYi#Le!EJn$KO4XB@eMQnJ`65dnH4VC3&#=*LMPdewT^
z%NBCo3TrHb`r=_OhFBDK;1hgGU4%IiavX||9q>Nsn%e13c$X1^_k|s(-8-h4*wD+p
z>HEG`mK9G68!zI~JSi_C(SJ=44=Z>laRF+Vh9IiTtnJQVA!ro?E6Rsi6c0A`43u5u
z$rHd~+sd3u&tz%M9%qhvmEa8WoxMr9E~g3|^)5V^i*f=6eX*ZcZbthIbb6sk(}m0$
zy=9ryTK7WnGJUTF-}2rhIr9{@<=C}(t!U9^<VBE&PTNpR5p*vQ_vg@8Teb|EDZUDZ
z|B1pg=LEsa-`*@4S0jftU6gSjJUAU`;Sm6QszeQ?oe*%-=Ay5Ptfw}HMt*<}BwV)H
zF$vrfGtv7s$}&IoUgej-?RTk+?B$cnAIWOX)U}E!%+)q-j0uSW5#RI9LL2$Gdmi#0
z#|FFWa<8vJdES?VLkdOV2RraZ_q5#;L-9zwDb|FC951tSd$~pR5F-lQ*VPX-b*m*B
zKClFkQE1l?)^2NNgn%;|UVJ^C#t~y@=2GH2d>*Z*I^(u<GC1n>Sl6B_pRBtB^yEgf
z8cO>7s{skJF<(x0QEXF*tDCwhO4PR0IE@*vu`RPxJo4tUOIfS92JRSu)E(8LPJ`<1
zwe|zz>C_|r9-?`McjzhDUhtXcZl{5;S^jS7KzV&ebCX`t)1C>FGLasq>?{Xy$#QZ8
z0+d`uUqt~2jdxow?hQtRrgy>}D06s0YhO%A4s9vPY9k?^(#fR7A;T<cy)^RCRFWb$
zu)rhS$tzN+r+&5aQ?p$Q9#Qc@a_fkqvL}t8NJPDRH;U*(HM~qV+D&PX^vGmvcz{`^
z3(uGy32!~?{eUgQ^Q9<($)sr5i;JhrHdVK<$sn;0GlpUGO&%Yp8U(sIJt{Js+WT<a
zFO2vjb@n-Mm&E>;if#0-*FYtAXB8?za4nD%A}d>e?P{<BY7gMz=MSCq=$HQ{`ZR?~
zWlC>?w05z}IzwW}x)<jy<#iS#TUqroQB~1dv$+{Nq8oY67W5*|R_KC7AmV%qAaeT#
zU$`$r-=U*K@(qDNNE0&pA9r+2d@33D9`>4V(SGyxtc?J7vdt6A2ZgTq;c(t~V_P-{
zj&9LZhiNw2U38-}_q_zfwW+Ob$WQ^=4`{lE5SN?12wt9$1S?L~&&t0}uS@El186a1
z@;tGYO|58`l9ciyFRzBOI<GRsb8*&I*jmJg-*;Sj70+WYOX5_zup0(*C$~DhPeedU
z?Ko;T9{5#p$U>&<KI5a>d`tGuEZ1j{&bSxn@ar4+b_@JF2>u;k=kV&+_;ywNI|=?B
za%1>(>HIpw{vBHX2Tow<ZfD@hwr-k&ur|=wTyYLczjZm4^P#xxvxod>6xgq)6BtO=
z+iRVkw*CCS7_!2T`CH`iZP3)134OH(dwpl|0@P#9xVRj}!K$IK1YlDoGr0(=bcU1K
zPeSLWf9C%F8}A$KK2!E`Ty#_oKI>=@{Q;nb%4L-QJHHTsuEmY?;E)WknR*f@G^gEe
zB&p&Rb*0$p6rM|4Z1y<aJ``fq9-ZFjucdR0TWv;nnfN_{Am!@kSu!6~_d2lB%F+UL
zD55%BOtPgst_N^K8KH4$e$3if7dbm25T-HpkbH`ZzA1G#i&VV-C0eH#iraun%P=GY
zJ8x`K$1vqpA**KlBqclY+P)cKN?5A)Op_`~Pqm?f#vU40`?cB;I>~aX!`H9&w(_Qs
zj^dp&+!T#DDW$G@Z%iZqgnQ|wZ<RZ<Q>Cz=7;?8yY5hM=$j?)x#`avRw+aHJ9J-G0
zBhKw!^bykhhW6Y~<FE3KlJ573E#ahH|4=fmZft$Al&TLPBk8e+X{_th{btiEmf|m5
zwPix3{2rG`g>_n##A*7mCUM~*A!SSCCnu01&h>)q0j=;!clLqnm&hC{z+%d1T2$0D
z*;P1^{ICzW5i1558Tcb~uq9xk8w4Xb&?^2_G9eyo?Jln0%VPuUe^V*=tr@RB(mGRX
z%N!p?4pj5{Q_Z}o8UfSJNVp59s1>paI7s9QTqU?VWgNVuvsQA&xPwfKc}|DGXQ3|^
zfhVe)B1M~dP4=*bx08|X7{h!%x4F1~&Ai!hUjy$Cq#zQ9`-u3=2f%El!n_xL#Y}*C
zz|V+2gh+g9%_&HXW*?sAz#$0of_4wwZD4A`%C10VbX;&-4q1{>8aso03Km`^mX{AT
zT?GGX`o|Q+hjZi2HIjuvflUSlaFV%oCW-K-_@^uzz>zi&VIYz_I>`vsl4_&`EbCDy
z38mI_NNZVDXbUPrhC3aX*&<WrVb&Rva;Fw@Onwgy%ffdAaqOTs$`9khd-X1rY9p~u
z_|x6Fyg-J%RL4TDWLN^5y_HZGn}s@X!PTZCVD!j*Gc$%Al;0nEVojQ+pz#7d9mI;K
zYL%ZZ#;c$B{>#$iAE^QTd=AXozsW@seS3Q5F|ZVu7tyR}3MyFxPo}9F1=VkeId6xR
zhaK_md<ps>9dR#OT{C~gWp0U20;|x^y^aPuLTeE%i=#M%qZ$RzIjl5{IHOzWFrFWP
zgZF@(Q*B`1a#2CA(eaRa?p`p#JJ<hD`hae$6skfZaRRg-I?Z>hfLvu6Cjwg?k9Q06
z{{Vkk=X<0xT~=9Gayi5d4r={`W~f)|6$b6^^;b^*1F*1Djp!9);{mGW*&>OsUx8zq
zO8yrRs8)PS@k$yW#8j=}i5{B5rXm%ZQH_|(M$q+l`!c>xVmJWZh8ny@2W=Z`K7j(c
z73obP+UsVMS5FtujS<r!2gQD}<cuuI=5jdz4Y;b~Sma&^RSWiYH;bBNQbOtei>K-H
zfy{PG@Xsoy8ka13h>AdH6d0W}KpDBSJNIy%vw4;b(x6C>u#;J6YIA99p}oEh@P!k-
z5@Z<s{QkHxRFNiI1!rOK^PeS)yO3$*M9<ZL3tq>$;HTM&)zlp<DKUCK64G_KOB-XM
z<v`W78iBEr3?%HCQ=?c(A{8`CK_9^Gs9-A^#yxq}%2uiKK#}>}^%@MO?41#<uF{b;
zQ(p18D7<Uwl+aYQ6SfocV8#{=aD9%|9CoGMabF;FVU-bCVKIc$mn}85fR7|$V4CeT
z+@{+{qy8ZM+kI?Y=HzVhNWWupUg+fudjCJiVCzTUh2EN~j_mH(Ed(q}mt0VLJo{?g
zQ(hlKKg$5d<O2y>7>(})+RKuj6ZPFtZQm7+Nk}61JBT>M;e*>A+H*@NG}E!)b*H^m
znUcc;I?vi(B7@d%lOGebs#(-ZrSr#66Q|_W)nQEyn`AVMohhWFhvMt-NS=czDd~lc
z*G-|2?;a|C96PMLUgTFG;@7-Pl68R2rvXW?q=R-S)VBXcu`K^|i5Ymz1h8KxU_1Q&
zvSn6a$0+m#>n=Q=+CkWVHJMS3)i2!_9#OBU(9jE@t!_BEF$yDGXX21RVfo*{9MWlm
zeVny)uDrGN5*$qXU=VUmWQ<6YcZ~on6L5F59Ji@;p*pb~8T_F7o6B<3?DNggxIS#;
zj_vM2+gwR8-j{v1;?TO1!n7EqU@*^pgz|S!Twv`bkq4<Tdd|=+m;Kl(o#$)tGAl0~
zlZ>pmIM~&uX3VIh$YyVU?<zDo@EWi|==Cxt(7S~Kiga!8xNj-q;Jg!a0k9X-$H7iU
z4n`FNv+Y-Ck^CPdr_XK<mL{xlhaByyI0xUD4Fy#HLf_(fpu!Wi@qGnW`?|Ki9B%b-
z&K^nh@j&#(XxDw>%V~jL(Pl8E&wck1@BOeYEVI*nh?V#5yuL3JnB;3q*M{7WIed_!
z!p5<EjF!gIcJhZ&`Pv!C&R}%G(#3`K2Cd=R*9HPUr|6;6I1O{8IO$X$0uS_`$kx#s
zKg?O@b%sD!Si;*(7`IFmF;aUbxelumV2)w_|1#)LL(CKrvdgvX(xbC#Kjf%|sNJ<Z
z7S+t<btnc}5QED}#f1PLOmx4c5>n$u57Cr2gs+r#gepE#-JYHW^7u(yUPS}YBRk{d
z{L4^jdsM`GleW{$AY$@{!1mqTFP?7Z*dnkE&I#0YTf`>&($%sKY&@ZKjHJbB<4gJ_
zu>l}(89_JMmcXH|<o(X8C;v(eGB(^SN%I^E(~@10{d1xN6(I8o4YrONO}u-qzO*qi
zsDv~7DNe;m{Xtf9)RrnP$4my!l<X4$fQWNBkpc`HX4tq|y7D0tq+sccU9A=WCvE2~
z9t$399WQM`?9o93=9kb#EZz$rT^rbz!ewL3Oq<m)0)SEg8Bd#N6&FgUqQG8rtn&SP
zA4u;We2Za!OV&yB*1eSONcLI2Wuj1e1evGT0;IO=+vadKU#9bLNqj7JLD4=qD`)zA
z9n!Whd7m&9d$B52TDudq`FX7%>}B(pC!`DusGjSS?yaWEpEajU#}L=ph0KZo(7JjH
zrPkFuDci)MQ2c!xmZ|4Yw@r^;EXdN&xoOBx;gr=nWLPAn7Uc`x+C~rz*;&g;e2d#;
zTV=*)Xkr}#8fAXxP%!5D<5$NcKBxebgBw$zt_mc;Pg9PQ6Xx`}I6g7?zw<orFD>)z
zou7l>soEwqqv@MLXt2L<(?H8XeSIhwk?JN14FoBseucwmvWY>!h-%O2x%z8f+0ngQ
zYbyo3j}K?Q|8;A6SY-W!&e>s}q>{aX(w{2k;+;ngMP>C-|9fk`LEj<hjP^hgh~z(z
zsd{$)RBJCmgeLK<Q^q${l=0HJa6`4~6DU0PuJhqDaH|S}cfcHH+z%eamq}yt2A3p`
z?K)Gx^j-yI(`Xh`JQpYX!!?+M_O)v6X*HJF^|p-|^9nj|`jNzKAKHT<*pyXI)@Gy^
z$751N3<QDBCq|hDrkUh+4MR_CG3M#ORbI4A<K>VLe$OqxnqU7q6>>oFiU*akcE|?B
z^&((PQIv3OP^mF<A!I`uo%a~hFmm`sM2@g|JT#jM?r3a)8|vE*&JGdfPH`KRhv3cg
z9}LU-aX26K5V^Gd6+6xj53Am+3sQa1dlY3eGaaz0B9Ut&eyPYzVwjqirO5S;v;hrE
z$x!)8l=@Q7&KsiJXR$o)xSk0@X>UZI?6ZPKE*xhndi)B4di>&g%BW;rQhb`*<KBjt
z<anq9u@4!a?YbxG?afXF=q1|gJl80j(GFJ)XHRoODoMMKL~eRJ#C=|KissdiO8z?r
zGpICaf`FLC{3;vC%xG07_%lCb0J3df2qV{<*yXSxcR!W*x&06jtQ2|DnBZqK=V60;
zr4e?*wyPUZaIpn+wvWI@6;tL6oM{D#8~+V3K6xnCQ<^<D!}*3nGs6l$Sv#s6QZ9$o
z_gt=pNC19LwLg&*IUYHE9l^T=)G31F&o9Zz7jy@nI&0!SA)wu3m6HeVMN1~=6=L#B
zXXvd(nw0n9oEQ;-R`FHonN_yn=OMG)e;`-qq|^0dM+PAxVmS)Almvl<z+Hd&T)a^@
z@I(nuNlUDHo&06%sNFK?eg$b7icdj={|`L5o;vqR=Y=kY)QdImAVf<caYBdJ0j(&m
z5RfakDP8&p>5k)+kgvN(8DJkqQ!5=79z<$`07TdSX1aL=FIgZSFJ!$%i9W*TH;pP;
zIkB%8h&M<>mO08Ie^0e)a&-P@A}qj8$9?1szHG*P!`L8dPnikw{zqWRG!q`elE)Z%
zIhto$bIINM1ji0=@R@E9c3AtPwFy1>s(=fFjQBaG`0?09gjN4u$;;&jFTiLdF2xav
zf=Oc?vgU3-Y5MhN)x6vy)8!Lgod`kXmunFq9)Y^`z$6_=;5)5a%kQ<c(1qx4A52te
z@>d>=0SzxDQS!R|$n5wrH)#6e1;5?ZCkRXF7vVMgP2<`aVB2(Y`oRkQr5Yi-h@e+c
zy}P6Bw`Ypj=h4fb@33n<2wtu|0BrhScrK-aL;mS9*E$koW!q`Yx3KU46c+P2gF3r`
z`J$)X_n5THz_@2MB0onOD_yRAL+lH=!@S{t!7&MDyZG7!rDeB=Jkn^mQgH&tmbUK)
zMEREf^qU8f!@FIcTtl08hrM*8GpV)S_VQ_IJqyFom+P*Lb%uPb3JCy-&rQg3yraHY
zXM#6zuiNE}NBnsg8+`t;n`Y0%BpZZicD4T|(CWAq4zprhzQ9(hL6AvHqYnnOiUtxF
z=Q%Qfc3sbN{_!*jt*BIOboGjgNIZl)BSn=Or4@wRE&ZZ%DfFFO{xPNN$Sg0R;#>zp
zTR2HU-KXl53pRG?q#%jm2qtsY#5~=ietIA{j3svj5XicKpGfaMs6A(I6*bSB#N}yb
zaF_<@i#I@NZDt_q-vRnIlN)~jE#zJ5b(Z21_;y7{<~d1zroC9++oxo@+>`4N?3|ku
zJ_w5sR&8voF9Hx9ULzvH)QkqQ`ukonqM}XiB|7YsqdJN@U&@J0p)>*CLC)MrglP(r
zT^+h5Bc<0cI)H4Qmg6l|vp>{qn8rmKp5YX!xCSXRHeJKCAHEC@p;fdZZJM5*R588y
ztKI(GmDu&Yz%cH3dj0ip>nT438n8F(H)~GV*Qqt<XZc9Lx=fA2!*1e<cUc0Z2Zn2A
zL&F~=tYNw$OYJHa;Kjbnt~mfN|1M|7iyb!{;&canx-N7@Q5_HLx*bJqa%-#d*rD*V
zBBX=P<^sUF^Y=>bepasXlH}1E0I#x+Vym1tO~9E7nwxe{`d~99KYTtb&fnA*J8MR!
zT9aj4uYgJeOo4cdr5|TP-=^9mD}!1f3lp(AGhpkvQH4(KRW<l;BV;T&x^tSAMyzFv
z6?f_#P@xF$;BE;}$<~ZcX<CI^PuA(yHcVhlDVqv%_0o7C*R3JOl<p+vT&@bxM7&pW
z8j0ds7FZM`6OM&2|5iiWhTV`Y07?A9CHPN*;edUK_B3G$%@0c^K$i<#ye6z9l4u8$
zwvvZ2PphQpibl^D(~;ZBiJ7S9o|1;!@)i|vrU6}@4s3_X^$F-68`-z}NMAMraCGED
zjvl{jlf8D^W0saxyxo~<K6Ow^5;nX1&Zr$VkY8p^V{V2z*`xguNX)3%?h%!$8wHHg
zibqCs$3rjx+5N<8D0B3Do-0_iRO+XG&#i>o%LGe?su&7Su3kLo)_lL+$FU@%X5d|?
z>$Ry!>(Mm_4ISz2+G>;V3Dy#;$03Q1OD)`Es;MRZFUSBq?MmJmLDhkYaTAgmr5wmw
zfxsAZf_<BydO%8LCRtqKg#uZPW!#AwAa#no&w?@UBA;PEL5I{NE?7fu8D*mpWqkZ~
z%yoexzFO?q_d@*D0NapY7YgpV&LEy4AB+^~x~E97W#4Y_xT3HAM2kW=63wp4ztpjG
zv|g*0cvF~Px#MTRrkQ@2yqi~@;6Lh;7Mf?)-q4XWjtmb%oes4kruTUh_^W0zdnp?8
zAjKqQ61~TNrLx7Ck@7_%GD)NZ1WQ~9r_rBPwj+A*5JZC{8sy6)<udL4pH^jyGNvD?
z6TU2pgfD<)BX*uiWZRd=TU~Z+ool!E?ZUVPQOc*hYN1fbbYAjSuxRfI1^2H7-d8wv
z#gTKe!3&n_=18l9M~t&taZPZ!=)bOTSvkMv<E#(SGIcP!b193B@oT%}N9mB99sD(R
zy?JtW(V+~JpXA3z3;Yp)Wuc-m!QVtz_*)5$d)gaxcNNvO|6)4|moi(rLejX9x`-sT
z-Y!+R)c8NuDNNB}|37SA&?}0cg@kx6g4{njc#->6UGn9ID(3GQ6PU*@M;KE=yN2Q5
z@12<Oab+DuE!isJkJ?~1C@d9|LStqaU*mHoTKBDHY%oYK<*(twcZSq57bNF8h{-5s
zPa<6K`to7%Thoi#{~A?-$%=)QNNd(!R#!Bk|6*#rpF+kt=C=lLFs}Cjk<yVJ=Zg|_
zDrjx)QJfMn)+FV$xLK7mg7=UYQzrB7Y<0K~NqkvLNyOkM9ehvngz+a`sIomuB;UYu
zdN{;T;4(93ILG3xrm7cCovB9H29J@DEMupll<Mq>>i99aC0REtkZgDU!IqsBG-qbT
zEPF4At*8wOF{E9RK>u@`1H9d|3FIXW7xMu@8IQR7T9d}z*Uzsn88-TQ@LsiY_wH>%
z#VbGSBJIH_LDn&_UOKqz7b$yFw4BoLJ^Vx4Z?*Jb4v8?zOVvVHn(@`}I71kwl12SI
zh_>zg$#AU@&go~yn(45i0&moY@Z)ppSD7WC35X34i8HL_+cQY8Br=bbwR8y%H@LOH
zu@8(2Xp<#*a49{kHWP%~UnH4VR_vB}9lI1HoWKDhv23dEBXb&o+f)@e17lLr{!pym
zIy??vdiXkYn75Zy7<#g8BbQ_nk6Tu^IzX7P&~<IflhSEdl12bS!W)nDsQ@G1p}qBV
zKjcfHGKVZH$iljLgydUD`XJ;Md4t%@fsz{lnz!nXR_x~S10V{OcKXC#YXAj6`oEJ@
zAZZxL)7Dw3n4=JFRqBZhtuZZl=oCumC;;Tvr`6n2hKuuW@vR@$zw_#XAY%mazVxu+
z)K)r`*up1-znt)Xf7-PD7yP7pM8xQ?$$2L7$hMSqp!XeDGnNN~rR%#+=syj2Q#TqP
zqYkngExVgyhgBq%BN=%2@u}Zx5U{Bw@L9Z>pqPA+b=$=p$5mI~7p~nd;Fs2yD#Kd|
zson`bmgb-0IzTN34X3{|_+<R!W2E}vjUa{R8~hNBFTvt|IDbYAugC!-pi%BgC+f8U
zE&>FQ@U`$g@?Oc~e1#Hv6!;hzz6Dgh*g-pAL3S*g^@YY}q1$0kI52lrWfbs&%sK$t
z$nO4NH&?-&^R?{C`CIU4ty5dF-0b!*Ojf>I7YbwOj=Cw%%F=b~`3yF_q#kMk4Vi~T
zOh~yDYQ(({raw5mQtHRlOz%SPMQVgs2P0b=S;5|@wCQ=A<|CLtme6ZMx?KT=(~|U9
z-XiWJ$v=rbk&03Z^FDHZI@K~<Ftg%wovCXs5AyqAD(H48F~jDK#C#tNLmQ7BN<{WE
zz0AM*0NeV&#Nc`2s{Abn6Hk08?XE>`n>0J#Zpfn;%x<?<Y7=R6C**_75k0(%ne&^#
z)p|myEqi5R0TjD_jQwE5JE({2D}`6)vAYWQTS%eXM@A|E1a}ri0UG%xn1bvBXRn`=
z6{<!NI#@d2-;~Fuby5yP%xhDzQ$u2G`$7`;w@dlbPyL`@U(_p~u}qBfs_bff=reQT
z&)+gpo?ur7rfaG$xu>7<Noe&1RPaSJ=XV^@`^aEA<!@O&i`_K<(oibuBON<rxRxkw
zQtB4!MGc}zDZK;8h(?U6<-me&(<zdLYy;R;#*_S+ldo5!c`FdoMt+I?lM0=(5Tfl8
zK}+84rk`h&>XQLdtTY~<k=ns{^YzQ`{<u^#FRSN@otq<CM{sA=O*;Vl+h@8#K{+V(
z_u}ys!Ffos&L!|7J*9LU!fHepHradLQfV}5Awc9r5HuvBM;5$i&wdfnGkYc4eyf!B
zIr`P=Rsk|vtWJ(=L*B&_CJh&euzGOD+~O;pCix9e_HDthA{M6vO`K4?xh>XvP7M|0
z1c_1q3e-(cGwe0P)^8^O$&NJ#AdWExCqtxBo=QEXwVw}E+Kc#DO|us3cRPMTk1_~q
zZN&f=h9W0-1UrB4Bsn=>J<M!k;7{ZFTSj&H=H0ND<|aLHh@Df~B%P7Wh1lj71qxNx
zYZFlfKM0J02IaG7&(nja$%Ocy$x{4`xVeEP?X8%a5TX}`oLSiWFU-_2_s)ejYH6ue
z+tZ%d)LZjM-}s&>Gt(o814wMqfl;v|ig}LeAN!@1ldua$4aWIdZl~lPZq)rJeziAN
z2>2pG?=R&HfCMA%%O}vXa`!*HV;|!7szU|3LZN6va{1BE#**kDV7ZkUe<n`arp=0`
zpzRz3DAJhBz<8v}{fL)8z$$1WDQkcwr_wg1rF+BNi4X39k->MkL~{QJvrne{53cp9
zQBx(}^kOOrc~Vhhhwt^0h<ji)O_?Uf&_A(^-^ABNQE2zBTrwqL;x#Yq0Jv`VwqjXX
z>9N>-U%=&GQbTCrK#HU8J}+TtlhsXnWT`yHci5D^&bWVIqPxy3$g8a&^{ER>N%QGm
za4KJOESha;J-tDazmA~GrJ0;~8GXRhxLu3AtY=!2AZ`GA#g`mU3SGG>;5$c4D5-GK
zJ>T2>vj`mYYZ@J<&j6zgCK*z^#s3gq;mg}btfJ=w4^S%Zq<S82Y~SiFF5e}a2`86E
z?Z=`Y%Mj4KeZG@RB?DL!!6ky4IUl=|WlK<TW$Btje<fQwYBaM51|F1;ThRIU!0LvZ
z$FL2-UH8l1=s6AVz=t=R8sIRoA+K=7GI6}QK_uPyFCfDg#gsTxBO~SLmlk@z|7v{X
zrL{odRgXhusBfI*T=lIn3bOcwh1Mtg0H=&fO*H0VL|6f%;hF`}#zczNLF||MSbO&y
zrZ%t?6CwU`<RhS5{k>_<Va+Tx2gAWlJEB|8B+B}(e^2izGDDc{`5-Y-{@R%A@2bA6
zHY(JbUjYtVF};`EfiT%PqvtxDnM|(B=;iT+l7@e`20qokth$%*NV7z;Qgd~aLHa9F
zVxft1Y7#G5kOMzwGk_;%)D`&pEx>esLL>E<hiOsLhm#Hni+UDDU#@w_;!6B!{J|m0
zngF`B*>#A_gtJQCh7)hv@LcI2J)r{3BrvDdJ-y(z@s+HUkk=rpTO*Fu)0a?<JI*Qc
zd#Xwk5bU(-TN?i1m?cSkjs$C<;Ak8r27gIlye~`UBK<71ijc(nCXibiGM}nB5QK3|
z4YYDpczRuz`XjM~>z2i`5%@|pnUfk-u${2yN%QY`6`yPr<YI(AuCF`j8J_%pjGrM#
zrPs#3IzK)uNR`QtnoH~@!Q@7W6EBAJ4!|z0*vGZ+IwZOfq+MuWflO_z3H+>j`2ZPQ
z4}fXF`sQ0ymSzLIy2U64z|_pwgKrAu0ZR){xsUY0<9u{)2~~K!bJud6F=&f=!ed~@
zeZH<^z(z4H;a<yR10#meEgXp-53#?s=Yvp`Bo3pu3dn<Yjcry1*&MR`zVWI%B=Z<s
z^=29>hwv3b8@}6*y^eAq7b$QhiGVLSa3(WO@D)=OIT^NMj{i>?hcInc;l?o`I~V}`
zGZ>tV06NMADlnX`ed68@6I~vheVSzQ0boJ?nIOS7Up(rn1kd)Bq4gAUM!cB!pLj!m
zp_791H|>`^M35Dz3BDJ!>Fc$f6fdZo-GY~O=5tIF6F)$SF>X0MZdIj_+WB4@_WI&;
zQq$^~!MinsCTza76{>Y{Fh@2@pD)sI;(FKvdo7+(qUfQv&0F10@T}Hx46%5l6b}n&
za4>|b#gV+6+TdT8Blk$0d%bS}LCD(7Ky32o{jHM+zU^0HcW;HvEMVdQ;bmf6?Vod$
zcO0-Sk14WTcdnEIrL+d!UVW=i8a|EV%ze@hcN=oz&nePrx8Ren;xgowWnWQymF56d
zQ*}x@wyXL*sVx;xC;voB$^liHV={B9OVPgSaR}k@4@je?&xyCxj$gmF3rDD?mFr>h
zv_6(16*=IbKN;TJGy%VNjW3A%#heLixwku$KUf7Rc#5w!_aQScC7W+)@Tnk6kUd@c
zm%#7|sJ;5YOA}7D>;D5H(*>VtM?60HJj*(^ZFR&tlbzgg9qK_!)+xq7_UXfREox`#
ztLCp!$9$)GSVIYkz>q>}(fr#Z3yBAI;((l4Mue&F(I)*>FPe@eQ&*=o0@7{;5T_4l
zMhV_$qQF8X_5(I>zg9x4CDnWtYHA1-py3d~p<rcw`m>k^kMR5gQ0fMCjJu4(T=!me
z!0Egu_=Cx78~+Sa{hAMytpvz=fR<yp517Dd-zkObjBjfHdd;^xZo`ZyEZT%I%7MpX
z^Q+*t^!N2{>ShrYM0Svb;3@@s#6JMYrP<c^EQpT+7oUG+E+)+DZUI^4W&M~9il6(&
z+w*O?RbwdKF4Qpum`2gR!{o%NGdS~ZR@Qc&L)0y^<$#DFPJ)ug1nk6FrP8ywL(ph<
z8U}R?S*71YO}40P%d}Fgti6C1OXL7WS1ng)&r{shBGPv_VNt=*Be2OS5&~<J)h{jO
zTtGf;-#3^e7f@fZFPyXgN`mh`!oU|ZU)B33j%_BsjT~Hbh<jlLm#DS~1D9Dy@L9jL
zO08IsIKz!fp0;x_fh#nEf{7;QgFp^G*B;aPd2J~uAopVvBJCPhyQ~p3l8Sg^6=v$^
zd?l_Lnac;RflPzd1Rz-GX@M)Z)K9!Ih$P}s`AftF8Ag1UvKXOBoNN687tuO}2Z#hr
zYiz&>v}F(z1IutE(O6c`L<A6Lan64?^l7`INLE3NFy2+#-VQ5A;IJ?=0<T$2jPHKM
z8nQWkT2`woAnSCBJzKi-0U<XrpnRGF0lw~+b~utlK!l=UGS4uFK`B;VVz58Uf}$*g
z#=LDTVl1_{zXg?Wya~xh*rlcpt@K|e$V94=W*<Il%_Fql>LoILC8(w{urTcbSYdSV
zS@QY~fJkT-PDQRlQYBOn3vFaxI;{3hBV&nc*fupdx6KaJE+qth?8!<93%MDgd5*l`
z3loKzSczdHM%=Se)$W6t41Dth>dui4XA<g&mp2fc%!HA|;tEwd&#*?gp2l4LzKNh9
z#8UBwGOi;@>^L4|0*R=Uw-kaW1%JMcSeYJi>>Y4e7K`BjR(k{78t#>pd>0U@N{1oK
zp!bi%k3TSP=EJg@<n$_&ZvqEU;To(6-|2O+ER?pB+S{^y6<?y}YJB>PO1gcVMsy3U
z0zxbOvP*;D@|6B2&(t5v;6YN;o7rg(i{bjZas6Ff{;sk=S5o+XuA4tsUZ1O~ztz>I
z57pFn>g#v)b$$A}iRYG@Pe9FZ-SI-X62?o#)u`Ylv{`nFKCf1L0EE;svW()GCm)s#
z<SMlF7VC_E+ufHF|7K(xO}GH!vYQE)uJS}*^~*=>W+j);i<Qk>;q-d`9jw|eo?H*#
z@T!u4Z^cH}nX3X1S}_~&u6IX+R&3As3pK1@a*y~s5-WL|3A0Wv++__0cEvVMchO37
z;hv>{^-D?TIaR~zHAwk%ue?KnZSZ)b6t@U4r)V(MM%j`HO~7=T28iLriJu$Q&90ap
zfO}mr1=!6a>gibn%=-@w*#sywK(ULOr?ipu@ayqfXFsf>u=RCg9R~aUYtox56thn(
ztIzI}hg$KM8HVY@K@r$1=)*N4wj{>GwF?L(MQgon-3SlHdVr$-#WGNC#%MmMMw_8B
z)WHoEc^48k<{Zv21daQ`w41zHvaiYk^2w;L-DjVCmq#yECEVy=nE)#HecPP8c55y#
z=--aF%;X4d&2va0p>a}AwU(F{#o@-^aJ;H4ZJF?|Ib$aO67Kw4>t29hB`+&i8d__A
z@sS)=<wEvQted1mnRen5Ev|e8NY*K~^DTf70=Iv5@wwc|!O+pnmoQzlm+!oJlXe77
z`AFAON%Ws3Qp*LB<205PYuBzbX`qPzUSbANYZ4dHs6OdUEq(L>`Z3i}emYJhH4F{B
zAI|%?buwd5N-~azzbQbMoux^Ts1ej-^Sm{!w3-TS4@g;|B(u@LTP0AT57uLp$@S)x
zgNIghj1j<^lNQXZiXf^f3V5Aj7sTZq>vV}EY<3Ul>r=w0{stb&*t4ka)}-8r<Rb&-
zD#Yg!I?-3nn2uYaV$$RE#zR&iCR6S?bd$maaJdG2V-a-@u<j+Nye@>3501kS_C5>p
zrfuE|on-l<q(6%>O}f^n<nkJtOXMW{P_<<Fod}=1emlBS3gXeHeaNYsOk#04<!@mP
z>1eZel{J!p_Ud{I>!@DB6Fw=B;w?J=U~8ezfB5{DSVh-Y*1X$~q3q6cC3upr)iAM>
zkQu?%Mad$Leq-lnWU13Bfq1s5d$}^S5az1=szPhxazci#0#v`t6gt%ewr~GOS1r(%
zjsH?|2%h;!)^tz{z#5}fSWBkNmq|tI%_;1=RBbzz)Pmb)bN?Sz6>^i-5yajA5izF5
z^Qrc9CxYat{Nz%M3^sm7`KxY8CBycmqu1nRBdo%LdkW%oi?U$In5%SRI14d8xNNFo
zoS`4rFOmqiJ3Y|h-;wfOQSAl`AI!$g3F-TUgQ7QoyA62=SjYqJ3zXJO*gAI3Vf#nN
zXU<$uUaT#LOVTavTyg5k<an@G_dCj^(b&O$@LkqK|1*>|TieaVN&v(`7Vdd7S0S09
zpEuZH2f<Hw_U_Xtnb@&{0OXP%djwgJD)y&Ne1T^B-4Ov`OoGsCICZL8A=SAy5Kd1;
z_)7T^GT$G$lX8u>OsI-BNU>z*@Rhnk8*nI;$S>l9fw7MAF(bx?<{rM_U2)DYrlqfw
z9h&ji>fj@flfA%v^4&6G<Z%mvF5!|-4P2esb9j1mvF???OaE&rlh+%`hL0@rZj1Ry
z1UG@^-qy^B<KD_RnM4hnC#Ofo-(rkc)bSZr2d@2`xIj#nl@|0QbKJ1KR{E)^TWjkv
zpM=QIujLaA%Jm5#j2*>dj@==~g^%4znLffW#7}r=jNXW)fz>|VeaK=PmWxBZj|A`J
zvefl4Y-8~3B0~8^5qN=W@S$s$*bmN%tYETYi4QQ>tn)l0VI#QOD}YK}dP{WDPJf}&
zqTTzlMuSt9<m!KFDU;aqRM5`|HYbkn8fVQ2Y<ld+OfM#EAhO0>`;`0<IvZJh-aOx&
zCjMk-*RKeD3h)LxO{Pb0i)feYmbbab**aDolIQmzEt%&*;8O(P@9;DyG@=errn-k=
zZ2uTP+x**m<|3wD6sNTI=d;$jR;ogxYVL>dZ1&#p<JDIO=<P?$q$545=ez1w2Fe!=
zT&+qJBI>Vu>p^s#gZt<oOiI0>bq(Pk=K<3baqpJmtiVF)5abJ`cbEs})2`f`mZg86
z?-KixTCseQEkscR{_0JZps;Yk*KHEzx3R`vA0;3EECBaQG0X~&#cu}b(<wh(C3onR
zu=`=ebn$n93YCCWA#_e#YWmVZg@*AzeQc*>D06l#TfhS;oRxtq{J-!Ob4n2bm`lI`
zRP2xeY0Sx1WHX2|e(t)T{)emg*q9OWag}qQ@IO&NzWoEeb;*Qvq12|VZ=6A{>@PkG
zxlGm(Yl2BQqW;vigPXx6M)nho0+n7qN}Vd`ZwF`K@r4y<XK_2zMSo&y+9^0EG#T7s
zo=4igAXb+|$G^db&B+_D3M{$(LQ7Q28d#=Oo%0?fInTnkQ5qo{QZqFP4SRp-!t2Lc
z$?4Nip51WntOKPN@+v#iOlJXewto{=8f!Bm#BAL4e&!RNzuqt`VUnG10P1a=kfM~M
z$q$-bU<?_~LrphFpwB(6?VBxc&Mc#vS|Vs&JVWz&W&KDcHP`wHkg31eSmAwkK@@P_
z$sq;Qua@oRJCamU+)wV%Qi_`jHNSu)_IW)zk$r|mbEGtBsbv<AF_@22WL^ZdN2bpP
zO_&Q8U8ErC3o#8g%_wlq-%vQ|5v0-*sIc-XzP%dSj(XNlPm)X%CO}p}aH72W@hQWx
z@ZJbdg9RbQ50AhA9{*XJT{VA%KBp5pLC#XJo-sf-#i@EX-t=#1U%zshFlNtSZR9)s
z3JeIovw!s!W}_QcGCFNZ?m^Uy(IUl`?>aDD@BmFCv>SfEN<d`BY+=G^#V2Oyy*@fC
z2fwy>p%}Bof!6j1x-T2od~ZQTlx$LbKI|o5soUXCVmv-J_@||{4(Bc@PL=$exQ$Jt
zqH4IZcNq%Y2O`*@TL|}XlBGb)_TlSRCZ#wzda2jT@MKdhrdGm)e%!>Mr$B=zs>L?5
zT>ShcWbyw!yM_qA@v}yC7B#&B`H-WM)3W6bAbD(<AhoguR)fS8+6E$o{yAYCWLfyZ
z%1eRy`WTbhO>JE516#6_;bSr0PzH)MKIG5YsuWxf%iflB6aGN!_#l=CDMH>+1Th=X
zoMUh-ZOHh;1QoYzkt^KYo1@w-XPzl3-Qy5U2v3!F+hwOODW10~B*_|ZBB>y3pmASB
z0fTsvySc4*3K?1ekgs#JeS7@aj^Yn{v^RON*ML)tr`pQ|MxEEZVn14Co9VQx3^3Jz
zD_KZ@!!YkzVfD*vR@Q1QCNMVgOAqu2_(S%KxX^QO(a(5}z5PD6>L>eA43O)AFwqYK
z$uZ_aCafH<cY(ji1}-<t1Ch`RiEkNFs>_1`xIap&*qh7Mz@@nx7bV?J=vuLeyRS6f
z<T$fta#OJO#87<mI-YPQVd1**KD`y&K4R=!rFKPwH(~Jhx$2~65UO}jV%u22EF;kf
zRzhIv_QhU5Tm#4e^4qII!1UDOK$E{E>=quY22@_3C>3>_3BKiur&wZg3wdj(E7{7r
z5M&kUgj%LNXn*y%d-|Y**HK{m8W?DvCU6^H+?K-Im>R95<0Kp2o;O0rFKUZ|#n_h7
z&xwRVBR$6>&m%$PtahCN^5p%>gZa3_SsBKk&q38w&$`o>Og)*LjHIlGGcr6?e@wNh
z24L4Pq2?tc@h)b71|Pgj6PR1w*P@=xWgx0Lt%P2wT6MFNVE9L95Y5M2FT>-34lVJK
z@(zmR2~flTa1Fjyt+a7@i&MfVlrEnW!eD^diKV1Ctar)mBg^4#826o>S~A$m17V%i
zJYH*>P}V*lhbpL32ZA1tAx|EFa1UeOclk!CdB@4k^D4cxn6S0WbTB^cSZhm-#pT!N
zF>h1omJKS~tiy7iz`X3!?}1e-!EOz!C*NQaC-d{7K+La)I1oT6kx{7;xdnxKu?Mv0
z-`Gfv;{aFa&I(Fg`DKRbf<Nrz(@9}*@Lx#)$P3;#XlN3PAfc0ENA@N*=_&z`Xez>z
zc-%)e$|}(#8E$D|3!lGK!j!C#3)x;0kFjUjAN8iF6WR6nyVxUXMEsceSBU7IY7I}J
zy#Gv_8Z<dZ#PYoT_ERE)F{NM~=+IZnft>uxEiZH!#QGloJo_Ng$<W6xV9JL|yBsF|
zPS{ZH{4!|~!A#`YB}GZdh1^Q~J}z%q$|Vl|LQ;D(DtCsTO|QWcj@ZjI$HTOhRkwh3
ztCc>@0H|>+(z$_w+MeC0i<oXG|13-d&M|h>EywshY?21VBFnfbGNHo#paB`F$Zlgu
ztKl=?_pL4p8FAp8<b5ecK?p%^F}0~;pVD-e7N6F`%&7s^L(MF_pGhJpH|2)FSmy>Y
z^aIrZG~c%P%|L-63j`h)KhdvY8TP5gGjz>{Q>CQ1T;hrEF^`(wxy9IJ>F`yKhay3`
zSWvELzN*SdFl}Hjv#VS(xo_+9MbtMlul;4^PAGd;b05Y&qdA%KRto%#rl$mnunLwm
zSG%xwL?wvM4NSB^Q_W$LpYd7qPseu|dRamFa3ahkHBuZ&VqvqKb#Tae;`55oHn%B<
z{+O9Xn~pxJ14oTEr*R=9{#i-o>tTyQLBU+Lax}kh@dcv4GDBSKYdnhK)1yh^uq*|{
zRrv|eVdHxd@}4z+8N;YMx2hWmqK}TiYpt5Grwl~^e~$a0P)QudXHNk7R77B#s85E#
zoqgXM64PCyjt=<ds?T@@;=2C?g?Uaiig_QFhiJ~mR8yc%!iZ1wa-a91BAzon+UVuz
zy6=s{b{Pp`j559ZR5sY{etXnSVVsWE^1|f(d<q$buQ+I{HAZ6LSIHKyXX1BVIo2BH
zvokVXd#b*DOaY}h=Zr9~Hfly&eMz^fxsHx)e1yZaz?+D7F}tcg#>FH&D}BkdDr*v9
z3Ce{V!oyH=N_h~P`J`8LTFq@a_NO)>GUwzMaJVILiDTF(pi{ag&47!U-d{d$1xRb&
z5-oj(s)=*R;C>`6+%M0T5V+3e(oi(a#D6Osrikf@98Wd&4eI-0WIlYd4wz6<6$1^@
zjxjO)`4y4O*RNoLS2Z`@h7WdTVOyR44PSJYIz&rqvHKJipkTu8_)y9qh6lLiF)jV}
zr<P&$$(5@kpa&BM|03z7P07jhP>|hEM^LxS&cI!ycut<u81bp1jMR0~*2GH>BBr07
zy_4FWvLNj{Ce>)%1RhFaND<Fg$lyKh7zC}@1nJr@cOkE@Uu1NaZ9@F)VfdIyD|MEM
z+_e;S?&^^4GL^NlM<ZgqijnH=^XKBfp#y!J789z3tk9>Exw~)L7e|KwW+uozkZ4;(
zK?gJONa@`pIC2SqS=f^Xy2R8+p62%f-y({|zBTRMDFeK&Oo<OV6qYoON<n4*NS)*V
zfxnRkY!cE7hApO#QJzVMVUnX;{0=RWB3g0zWVWc^xYZ?&Cbl1p`)Ojo-p<!ojq@35
znr%7@>>}V+U*_)ck`OQu$$KhIJ!YR`11i@Q6olz9qM<<x8h9^b>xkE_l@Gsu+{(my
zpPjObq7qV85d%TY$A$}YbvK$u_1g5-kZTC_BLM#yM>#QZ>^c6rL(#mmifZF{?C2)l
z)&7Fi7PO;JEPj2+4MkPt+kT0lSby>|YnG>7NxbQMHZncaf!C76urEl3d5nKJVF{EL
zj*&xyB;qSlNm-Lq=rz+`L_~dhJ>3%Gb1$oEm0|8Zi4U|Rd`hA}qNXzo9#u=&WJWq?
zKJpQ}e2l3={;5PHU>c;p&RNkxMirbQC0$FM=c!4cHrkYLuB`%YqFbOMBdR1hesV=C
zL78u{5SAGcv`s+ck}#wsSl0qzS&6rV*4raG-?S`_2)5`wn#NnL5a~lt`JS|stGbab
zVynwiin5Wc@F_MbxKIkr2mTZ>2*>Zl)fKOmND2MEK_{s0duUdtc0B-kd+lxL;LelY
z$60DP-)l#c(yv^g2r@x`_c^LWx~{U3?y3ot#8-MMvZCs+>flab9leV=rQx?py6M7N
zus_0|$+9&jwN;d-cT-bAF&%S2o>q-fvH*YkI^HpdY;<b*5pc};WfrluD$EbhW>)dI
z{TZ6`oy#%jL1v>`50;`+s4R-Q|0FsQO5@h?UsH~lE>zms>O0@LgWqsnKA&J@*wZUv
zA%hIjp%FNoCA);d6Q=wni=x^NH0>vHvM^#~hWwx<a*n4Oz!vs+J7EAcJVdDYKW;6%
z-=YH&_U?47(HOBp<OMCPm2-t;1M?g4tUYX!?M1*4P;ABZ5T&teOn;UUNJEt?HZ6Dv
z_oM`x5ZK0eFCE9`iVRw<jQTSu6teb@qSI5T)|$%})=!^1h8ayA4geS(lN8KV^xY|0
z;Bx@}-OEy^<r;|AvTvJ#cfMUF%J`ASeqg?rTiEAiYH=70)QLBH{uNn{`R34rLy-~B
zQbD&z-^Pf+Rqom7J3?w?<1J|Dz+%9M-m>V-ockSku*<ckrc0~$;OaIEpIA^8jsIT`
zYU4oMj=5-Y0q1&1(~XIUIRTPH@za}L%f?TS6hv$j>4r+fi|BLy(Dg_6laId~VE`F4
z`pNBK6WbDFxFoB!=9RcK5bpxf7&`8|4a+m}YHmBXB}9Jn)C!Ry^(8W4=e1uOPlUoE
z5QyiPjW;Oes!I@Zj`_#V>Qu!!Q%A&y5{AKoUS$_nF6~C(#R*o|@=k6_&Tw$@@P0`g
zc4nVP@M?o;&U1=?9q@-u{_B_@IpR4(duNGVm{rzSf=jp5hT)(|e@q}Lt8NxrjtV*}
zvQXyN<%Qy;Ee48bhD}+t`Vui%HLRXQW=#i0pVJe3ig%FrUspu-L;py7b%=v{zCE9Y
zDlB-{&|A3DfVh>mPN7q5sgKzH`MZbjJmp>w`4JlUpA9PTI}9X?g4Y*#0BrlVpLo#I
z^s~J$AX-#n4c@93zVN_PmsYtAP69EaL|coj=`!hq#|^xPfOtdt$Iy9)$Ir|UL@RlA
zon_t}GaT6C>^s4tC&7@-Mh`>Z;bB}^GxJ{pNoVne4Yv-}C2$Gndm{7(N(&O_<(9X%
zOV4C8r<YofOx}<?0W{j6IWMH<lZ4U*lbQ@*gTrivO4;5%w&fYj>SrNp9U?e)tC${6
z?rg1tC$1AAB%^{{M7ecYID@AXR1sR>C;w#yk{8U|O#0<J)wRG`)YbcWtVt>#FwKua
zA&MJ5BI2T9#&!DG5*G_7O$!fgK}T#vzkMWG7d=6LsV$jAVMeQ`Lf9^eCRerhi7$E;
zt=C{HIeJ|__<Mu!Ksyjl6;0_*tmc33R(B^xf0qh{-&o*+%`|2(w>%S0N5=rcn12rZ
z^%yuwT#xBZ87;N^XlcckFrII>-d&J5uI&IEHu^Lr8Z@aGL7|_WhaqgKu~v`Oh$1U8
z`A%|R&fVv|`$&@<CktyZxR~(omJWE|yHOR)qbozZm54?Gqzf7N+yggpMW|GBQ>$5a
z0*?}Jiy+;D^x^j1{~Vu^f?0W-LnQVO{)E|}YGH?jY_pG7DgEk9Fu1{;(CyPDjW(9>
z<Wb0ZNl@B=>ep#?>z#cL9h)y@#h&I=OOgys89P-PzFpFZ)g`3xA!5abC~fX89fd{5
zK|C!Vp>m}oeg(@>*N(ZG<E}?yv&NigS?yLn`h%DAM5Io#q*<;Cy2bTWaXx94y7ybc
z81kbK$r?YEXgT9cTcAR9K(_w$14V`%0b~A5gulo<qqMmQ2&tc<uEK7|R7(>Q_iJ$*
z?C+YvqSiBx!Uej>+B~Up4@#EZ_hIoQUen8?S8fEa(aNAe{v|Tn=4V?yLQKH7JayeF
zhQZz2T}lwW41;&%ZrYxLyruVy$qb-CD!C{vf(Ko4DtcfL`_E_sXOS(FzLYY%fx>5c
zMy$bh%3XP@hbT>C`AYZpQ((kF)Hd#<_5^#!F!aAZGv&_veGR7B_~ivsr78M6h=M?a
z@XJu8IDJpec<1vTx+0F3g_7+j{2kyiSfr#)BQNYtR2Xk!6!Bp+8BYjqLi{jVc~wdb
zl($R=`TT5K<?;QLMXH_>Uy;5bkH6Ztn=1}8H^k1TB(gO^kJ8@@n$Ve@fT@oq*d}Ua
zrNyMYD-k#9bf|(HQCFu%r5ux`x*gBYzi5DG_8*?X1au?6C?5SL{d@!XRneI`-qbcQ
zlU%z8pQrE;#BNvga^lepY~wF@w#s@3w@e*y7PLjS&&|gV?6dIDvPTOn|9lFa`hdi1
zn*iLbHmQlmM<D5*MX9W8m`-u>rP_`;EepwcO6uBwTiFiocwhj$dy?DYej``j+Jvei
zW3JX3o_z?}S)MFi;cX9FdDaer+N`7cspVP*hJ5f9^odi*y~`lv_1PiBfl}(m8?g|t
zuaE2Uo3ny~&q$df4Ac)*auM$p;JiOaMupnBTB~2MXg)hIW4L&c3z!|YKXaN^Hf3<w
zvrEHgrRz6B7tl58Kb7?jR{CO&YjSGDw@x~%Y9>_GJ8~^DERRb00qg-}Q5}fpht=X6
z0^F*ve~s81@R{@q<4e-e9v-zSVG<NQw<s9S8ls%DCsI;YN}eXo#Ov`h!Txh_*>HuO
z_$CC^#gS)s@Q{G}k>=qWDs*C8YJJTJ(m;upTSy9Wh4=@iTeUT0a7&@RS$hV*ikGM>
zWK>H0u3ZI?+?)@6g30!4wNm`Io?iPOoejhKR@Ht3dO=F`z?l+I{W{%Xj(6E(WLm+e
zCVQMS1UT%yXLotL*P*ud-%E;SSEmgi%Pp~j$59WFp={)ja=g%f3PD<3`)=o@y=$+j
zWQN*ZIP{R@I#%@H*Y>(f?2k1Hv6a;A!A(LFfy_nGdCn8%bJx&IK-ZK1Oxk*QVKwie
z@S|C8<4eCEBn+f!7yNMCqJTBDMFAUi3E+A*Yn?{|;O6BWI(cDmT;ZP{D9aiP?cPVL
zyndi&TligCl7dQYdEQ`1WyWwdlB65Xkb;dDzgk-eE#wk)n>#kQ;P7*10^rreZHq!G
zM*~qZxnq9nrY#@PE=N-5Ja?nY0q~f2Q5LIX;X28~pp&st&JZD2@FeI$e3v!6I&?+b
z%c`edCUB*ALlZ6`YV^wN)@Gu)fAr}isSAPPUR=`FF;#P}<OOQ6D^I2QrLk%@o}>@N
z`-6x1<taav*=dwdM102;@A0fvy9sw=a<Smg5c3tj%^Ho#YzTMh8CUT|*R0Ps3peq5
zS5upmD!sTl-8G;Ng4ar4)w<3*wk|FCF?c3icm=0>AX?Fd56foB-1QWOCu%6}hX$@>
zD^#jf3x<Tqvtlt)HXpND*1-|Da%#~F!`-vO9021kv3`7$R8FG<OUWZ&z9Kb}%XV#(
zpSgFnbGZY3op6au@J_>T9m(l+6op)dK-F5%bA??M_`KTivm8P*%mVE!1x5^Lr_1gT
z+a#d*tc`*7De4zeTxOj4ecROsoU~yK=qNt4#@g0ua4s>%u97*?Du&z(EK>r2eeY;(
z>G{9GL~{k9<ZaG+{l38cGW@)IP0YGPalVI3N<t&bzHk9`b^MN8B=%`AvdgE{`dcOb
zNM;ZT5V>Vb)?aSYh_@$k2P%_i*FxhyFObk83)ct6$8vW?fuUdEMeHB?fj20l@H?|O
z{c;4H3tDEkWr06(^?=~RsoiXiD!r(%S0ceUNRJJXg>h_Kl#NmF=VG?Z73*b3e*PUc
z+EtDL;+IF;zblBho`F~rIL(mbk+Sh9S$`|%KM2Kxdn+*C(<1=lM1<^##~zMZx1?@(
z4N(!LQXen)?~W#w#vM5V9Q}cSK|2`1TxsU9$OSm<n5Yo~VxI=^gE-3+@7}?WuhaKz
zcsY0<>bk2V)XA<^cjL~_X+FwSHZIiT4z}7Of&WD^8$TZNIpMCJ7;<uinS}&yue0gC
zkeMY6*=GdgjK}3gqT<Q+N$S1;fw7X#+pxvd-1PRY;=PD7&KuF?+Oaq4jKRSA%G!V8
z1_4|8SW(;)ngCv#fK!$Fn>BPlI&uzKaORY+q|cxY=7IV^hzw~$N3u)pXaTct1br2n
z!z_-e$=H$gW50wu=Hgp(N1Pq;mh5h;TP|EV6#EYiS;LbBPc7J8xA+|l7F5R8l9xD@
zSAx@sCb9&m3d*+Fp51Nz0#WB;%H|FhyB9^Y@A<tw_SnKrY@-6u&1hHKKin*B-gf(x
zm<V!Lv*Bve?o&TMK|UK;nSuEBUrgpY=1I~_r6#F><gb~BW<%bM^gbfB9=jS|I3#*<
zomfv&UIS~05p|2<uMOU-X7voCTS<M*^yRW*sIvzoUCbV=(+q4|4}zMG)Lr~G=%hpQ
zPa9Mby_p#+6p$?(-AOQ@kNKdx9U+`_xf*xgLNEHvkFWi_oisvE)|Oy*4Yc6y_eKL%
z1aDHHnE_(^)^o10YGiz2ud2o3#01!mt}C6wt^kwi9z(Y3M~kwd9_y_nEugF9bF58_
zE|y+wgv>Z=U&H<lE#|FC7g2!c%uZ6O<iC?hJ?YJ7re}+^kqTFE!NtU$vd(E-i{2QU
z9fZhI!?L7;%V6XzD4Ob`_2(Pz2vwl{Vmg~_F`rk_xnKNDx-(oZHJ~x9Q}vBOY|ZwM
zJ4yQiq&P1ZcJp&33tB45=0+BmB;GUI2=e4aSwFnZVpc{MOl$GK=hn2C77#tk*Qq=g
z?Usr-S_!hf=AeTvyP*!fW-QeK{}}1J@i2IN)Tx~S^2J$Fo9nQO9xmD&g<YW|{Px=~
z&MWd8OdY<(ObXZUgi~VWG$mk3!eI1$>_b#!M+I8HAkX~X`G9i_<9rYv_|ca5Oe}mb
zcNpGG!fMcg`QoS<_EPjXm(#-KR^(&nX#EDNw5wmcY67H5QPg}eqj8>5Nfr1crYn2&
z-E%i(K_bB^r?wJ3;%peISU`&-3nmd4GyHWs37zKvytO>x`nUJ>baDE+Q~g~H;rh4x
z^>o$xx=a0CA7K4kyZX8_{aq3Mt?}oV@>4+#%DkiDlluCU<ox7K4f-YG-`WA_jX?{6
z`(Vnmb?Za}Z$efrlW;5fK=OOyN&6qT?c_=UHMS%#^=O`0gpQ`_OFL1|P*WAKL6(_l
z0%f(lsYyNmQ82@5iven^EtE0)$sa$8i8KJxRwdK<YR9E)+LY5naqmGwT+<2ZkYp;r
z;%ON+2Q)nwc|!a2cr>L#Or+hbsJxjw>?m|GwkrPaCe=LE8o}pX?ppSkMUW~(zF^f5
zH-+5vs^S=igKE>Tk82d0=dFnWRQZ7_b3ggu&yfeEs+LQXcpJok>a|xl5g=)zam8u@
z$ao3~2)9OfIc6M5d=|rgw2>M;)*?rsxY%zg+N&0=>uu*$pG*H%BA0*-4~vmp6w|{Y
zO+46784;h0<VzE(-)T67aSav72;q$4--VB<i^LRm^ASnpW^$p{)reo|Y6!e3`phc2
zLy|xA<)U10djUN0ToP-=A5IVr2>9@4t!z3axu3D@{JB&TuIL|FxsOLzR;BP52QMw^
zz7!tKF0{mut%?v)L=Bf<a-#fQWMnxss%QGHApsAuZAOg?4$x^TW$xug1nnCCJXwrS
zsjG*`1JOZq+w?DTj^_XxIaeJUQY|EPr=6V;#4V!E=?iK?7o3}LeP$J{Tr+->*j3cj
zTAr!jQ`N~VYr+%b^KMgy=?mQOoPDS52PAr>+@j7H#qUm^!?1tOV4lm9+>qDmrf&*b
z;gKf`6T)p7(-`Qa@9yhG3F&64E;7#x4%rzi-$Vy%pTdo*oSwE4vFb%sB6XUOf!OjG
z()s+p7)Hbut3NHl;3*F=t54GPJ009b`Yy4>)#tRsps1B$`If1!^Nj%MUVIY5w%EUv
zR&(d&g0I(UOQ&+z97xFWVjAlIC8Wzq@YEJC8>i;B7Nn;g0h^+GIt_QG@5L#d#<%G6
z?d=9L=}yfoKB+Dw5m!zFlOm9|iiF~hI!|d#AYP7oQYT&iLnMk^<_#-sV8IJ`n1QXM
zVe8G|>`yR<?gD+D51ysG%+*9O>JzGMhVBzmiqIR1p5%Kp4M4_!$xVJKU<?(XF#=ae
zi5f&GHbBx{3mFW(e9T>2dYrQho{wD@of+S@1Yo{^vZuIcsXQ;H4M8A|_Vp{?MPQ*}
z@xA$MmuNzViizJe{-k0Yr51Mx2`yk37~-+Jzbw^&!Mf23h;NWfWbj(>Pe`;-Sm=at
zM3CFGNoswFZ+Kew1YkkbQNhAOOff0~0!rmXBO&a}^))mZVOQ(o+@U?~gMlptPx~?7
z&!ef>Q80&37-dU&9Holt%lL{C4kyxVY#ErFI1R_;?GkbI`bNOe{(}NRfZQT*`3SdO
zmokv{a=4??ACI}>FSq_CBhl0x8YGxg9_k$1e9f<7^ndoiOo@?MuLt#lGC!W*h;AD!
z+AW^Rt3fa#wI(cNQ)o9UhG<-jLKXTD&O#8VD#;&watag4-~$Sj70!m{f@WCQGiENu
z%qM{JR1I+u?bWi+W5M(@n~gzN;osmQ7Vm2ePfdRJ?V`zzf@Nm$Kaq|b{aE7%ckLr4
zY3}Wq1iH61a+BAIs$X(BzQ+4?oZAQ45$KbWjl&8ymsg0@5<#36LFZXUg&C~=7+=!|
zpk;duHTkK;>BeM9Z6r4Y)R~k7VeiUurw`KbyC=a!4($^8bpIP9$~CkcNzTXm-(7;f
z#KFx)-GPqWY!q{MXTdft+sJ9~NpBRmT|7Q3his@yNY|==%%}XrU1Ow;HQh}kN^lj7
zBaDFgG#*XS#-dUT7Er-)nC*28@H|a-A0`HD#-IukJ;v_^j&&fnu<Hp9eWx%^K@+-D
z%JCqv{@<hbgB@X|FuxMv@K3__wqFn2_KKDH!7e2E*CiTUV0%8y?SzHe+qoqWDd#x<
zVAIrEF6#e&8$aDH`Kn!7oM@eL^<$*+dz*ku35zCE=mvw~!6w?y^ThfLy|^|U;GWI+
zM5Btfc!?DP&xsYj?iaz=)o)9u_TiMi4mwQ_wPb)%N*zB4`qaHduB(f;TVcQAJAp!8
z9tY?4O1F~E3x270b(mlQ2R_;1dl8;a-w7_&XxJy^%mc9vKznesGF(jDkAurtYr{Rz
zbXlYox(00xEBt==MT_q|4Dr$%%=}iYj;)6qdwhsm8H)Hfy{EvfmUfOt0-QbRx`BqH
zzlC$zgV}@DldFc`AK4hiOah-xzXJ~J85yU($iJyDOA(VvMz6Hs<(^mmxHcKlZu5PD
z6CV%erVZvkH>&C*%7_({SmX6l+OTRh`5lM4h2uLM2N!Rf(*!X1jN*rwn|T`}-l2-$
zU-!OAJ;4&;ziIY6@BN{%@SZ>TXa3E8eER<>W7jqLXe-e;alx%W)!UH1MM4%ZUZ2Js
z8$MT!p@OO;NTP%rtuMOu?H|JDlMRDc_|Xh#h2Z@STao8=8x1#@XNS9&Vo4MqfqJsA
z#}(5Kh<I#j-8Mf~Q6WDcb4VECJ<Y=4pBwEkifO7*8lexWyHjp_d0jNe|8ZuYnXI^S
zA-DlVTQPI<;@9&9#AYMh{;+SnrX?-pLT#z+C6AOXySNM}vzY#6-c7u6S7e36d&!T}
zta`Obrb%A8F=#3r2qa@_T)pW((D~d1>kJA+rZb=IeJDk^YEvq!N%v7oB*uZWEmIdV
z7WkA%^L!5hHxvvpN$utP&%5paP77;3AT^0R^C$6w3)ce9A&X$d;uo9StB==;RhtFd
zaxWL#OP{~UxURILSX;gyM@IoFOB$M8!oZS7!LC@S<GGrfHKLYk{GcEYG7@9w8Ppb%
zvTzaNjhG080{yItgXh&mZ(7toJ|uF#21K4%;y_Y0p!qS~>5d?Yr=cQYEKkj$xJ=E_
zJnB(y_uwVp`Cz9BxH=EJ8UgnDjn5f;vHa!CBF<U<Opu3IAmwv4_@UO6xxE6hQO6#U
z6U4`&7e3WGb7F4n^YMpx8zo`Un5=G#07z1p1*Gk<fNQdizw<C@xihm7G#}mxw?!de
z=_0I`s6lGcB-2gID*Zs}u;Iu04dP&x+~N9{bb`NE9RV?ppcri<({!oEE8(loaA{(T
z^Y79x1RHLss1NS}R`_)C6Pc!V|7a#Wkq)b6{=T9#96B@2VMkc+6I=f{?E%)hxN1xI
z6d1AU3xXkr-l{nMLKz48nK8*gq2txOFmr1f2SWSaJ+L$aoy?m#t2U)^Fe8>nrOQft
z>AvAkO9IV?DUYK<E|#3aVu&H#wZ<n7GucoZo20|4R_Np8TeOJHI0gScS<c`U{xKyo
zHI~*px|iHb-qa4>cvz%Nh$h_UVG&2%5~FkRaP?XFH}hmO5IF>^$UXRt(g)@{xb^g@
zjL@@2;}W^~2e%-mayTs=h;$350y_yk+OG=|6~vugl>wnlRwPg9?WH~6se&cn$KTEq
z%zYq5t6+CClx&eG?S+E^p#t;07I6brCe%Fj7@B0ZsQNN8j)8Rai6Gf{kYraV#eu5l
zq}bSbGu#FxZ7@OECY<wo<DZO9+}vX905*T*e;CUXrBvcM9aiR3s4{+glv^>$LP}Y^
z{1d(c+#am^xN;{M*!+?dY-fyLPr%F=tSwQI@_1u9DA)Q9&S40ylcZ0R4^JoTO@&i~
zXv~+lLb2e~@Yn=w2w$+m4pF!$xWz@1bqHZMbYSbd7<C)J)LW2W-es3}6L4gTD7hZa
zTm+UH8R}(2>p_x~?=PP{c85d~vwjCayEQv;6XB%r3N{QzFM<6Pc)hA-T~%KLn9VuJ
zs(G79aSD1F)^8#v*`j|Q3wrebO)1%@1I}$pjal)(MAE37ecDTjTjbO5(t6THNA}J{
z?@K@EMZp@?>Y-p*mar(wqKP$L5LwTFdev^c-%bwuSj1n=a#}XCDK{TlN=HOslgpq`
z2xu+Cu7!%|VTlM?c)J>>1Ucvp!2Ze=`1tq?MOl<53e1BR(^dcn6whX!*+3zZ_zmYM
z6b@2>LkRt3KJAP_4a;?;6EZ{xstA#Rs&=N-bnLjESTCuhb(zLxmJr}3<ge|sNRCI6
zI(^J|EAq3}Pg83(B{17rl-<B8t!&dDedsLyYO9REqhM?BdKnYQ3+M<i^uXnP9!7x6
zA(U+NnI56mFR7DWo-5m1^bUwIg%q4cJ+7uYj|Vu)b_^ni-)HP}fbO|1qy(q%n>urR
zt9J`y^7$)4k}EF(f@Vr}HG@1(|4|uxvEoK-<~1ds{#X<UPM-->&Z%KOoJ<r9#p(Ug
zSM3{7qDhFKG~A<cEN1d7)RHHch=jw{{V-|0kFEZ&KXJ_u(TXpr<9c5zcxA;cuU;#!
zAOIaGN-8fzem74<b?^drKP~AWI|@7pp_5)*8U@YJM|6J(gKplTN9#RPvEiD{SnZ<q
zLNexZTHs*+7+;ECuJ9~v?Y{8*tX|7ms|7h#uirjd7^%vpIaNv(CmCC}9~(k|32_~~
zjZ<(EZ^=#OFxwV20m@XKnyt~GJk7Lp046K<4ZEu5ukx=;f9a5r7J=SIs47dd9)___
zKsktIx@hC^Q&k<ck;DqCgo$jTMWNYlvY;^4hz>2D??H=$L0I2=YCE{<7xCZ`sl{<}
zY21wip_mHa1YlRGO_H3sZI4o73Vo!&2!FSkO$MbIL*U~PEuuk}BP`@{Q@j9nbGYM~
z23$I0l})M}RWyPbUa?OK*`H&xhD6TqQF-@EMh13g-i{V>G?Ts)<Y{Nk!jm3Yv$#F)
zMpw4^yI&Ybi*6Eh0SEti+c+qxBUF}##WHOTN8u4oj8K2um(7-M%9KK3G}w(sMZtEb
zOn(ktE)$*yj42^jf3k3sOpuV87F{!)c)}B4@BM#wuGX!=Q@wx5d+*J$8jZq2Csdw8
z8!`$esMmtz8UQAFnLQJ(;w$~<tyi`G3OFJcErhQh@7N!s7vxYyo@rX)V7v3uZKhOk
zLfQe~SJqz9;t@YpPg38$Aq6NAH49Uz{auzIvhC+a&-rzlU=C~M^Zx$)+ZwVvo}GJ*
zaLkKe7bdF^etDVQ4!8KBrZmlXiN0qpxYE9v{)KNz`?e+17^e?>k5w7H6MleAW>sD^
zzybq+{3&kev90hl8)Mm#LnvEnoko*vz2fm6M^IEK(Q!|$i<HSKuRtU;cDl}<6@Iv-
zGF#Cg=vQvZi^>z9XF_GRXZ|%6HkJ~7g;KKvx<dWya#TzAeqSJ9?p5L++8bca9^)@L
zG}t%!`;Wb*>$`-VOZ99cJ7qAsjgNN>x~@H29$E-YIv^#?29Py`WJ%t&Hmq>@lq1AF
zY$y8PSy{&r{F0YL`VN<{fX2P4sgHLVpiwwyWUAxdj>;T7Z(ugh^6ZN!d?aUyp>*X)
zD%o*S4NsJsWJ1xG<F%&(K?<v>0VrAk`*|bAfimzVU}}e@I>#qDChFK?yS2R;)-@oZ
zXA#_TpSE1q+bK}a01$+h7*#44T^#O=Yx9uNHP9lFRi%mgOF!;GkC95bB{&WRP+=2G
z5Qj=PH!Q-f3ZMj!fzyn+)&#|hPdvtibUg(fGtTGk+rpR%3W#d|cFVK`xMCx<zgafX
zk|Mj>T-<{(VkzFEoe)-KQFbLizf2eEM#4t3$PL&>=NlwKT+=R~KF?Ow%hC}qCxOK?
zfl|WQlH_(c0V|8Ldq+x4kuNbtP-c)7TRg+_<Ihq^7j>qz#;E=^ua={xVg+H1(k9~U
zKb%ko2>fK<Ac@Sk>}&L7ewxC?;5bS95S!ox=+2}dmb5?GtWcpwf;RsAxI)3}AR*lD
zuaseo(+^)$A~<!o7?+MKK#onVX}o~S3goUTiXG(tQRcF^9qJh5H5Et{&q5ilzY=J9
z>YAR~h;oB&xLy^2)AlBg@6;mg(`Ze-cpK01ji37`8_hAYj_8{;=(mldceuFc>P^Uu
z-u1G^f^{&VOseX86}^^R%UBOGe-z?wwM7)+?nkT~=@Bik{N%w?UuaQ=ZXC()ycXe0
zQGVU6=BP2e^X--kd0*6kA>e!nZFKMJEeaFzh4Yz^y9mnvIjdA5qEhCBWU(RtdS&*c
zvx@G_7jIi0>mJF-vGz)eLLvH~Ff{x5VvaB(;GaQ#)EuhKng;p>d83~|XOE|hD5Kro
zmjvs7O!5=wW5gHeD5Eu_kBp`rAqYY*%Y*(@-GIZR{QWtmCAbv85Pd&-!Sj)6wt^&y
zw!5_fd}HllbwM|0B$QtI6t&CV9BBQ8iQ%@`xa4Kk;uL{}i_%dy86}hH9?+xn2BhCY
zd$>M(2zLJ}mLR_J>P_WFnlzyj-lzqU5u9UN@qDBXK!XQL8vd7T^}l7T{eeM(EEe&T
zG*!3Efgr<|q9oV-7w($Rkf%lBM;=||`B+QM`8GdM>$iCZ+_xzdNBn64){cry=Y9VT
zC>hRG(XsLY*dr(01Ltz^hD1Fr6Ej>=<z1^jpW=kaFGsQK*6u`%DS$)bFB$+PR%?wm
zc2ddPGZYVSKb6fDUWF40yk2pyA6>#oS{t$Q;~*Q9s^}#mdIe)BS+R~fh|06Jr-~O@
z0t`5m0n^tgAi;e@k3+QoRIuvE8Vdc^!K|!9juL+yD0)V8NSAOT&hw6jl!6hI<OE$7
zGIT4KsTj6KGjf-N;h}D{)Dc?@R}v^bwVz11cN6nIaZAXM@n@|~)G(;RAMlw}nmq9o
zjpkI9I2ca*q$j|ULqz6GaVQgUdIGIkrD{;0xZv2C$}SWZ@8IBEI1-{qjBoqHM=(QO
z-NGm}L0U8kHI!{LR~Z>i^WqE8VN=?~n1kz#xD^<HVDKhb+ze91GSkKj`B7@K5V^Ip
zsX`f;gsYykuQR`ax+>!$N-5An=n0!u18G%3RMdFO8|Ao^ry)MuT%95%^#3TqT)(%Y
zGS#>_t{<{ou>1%fug@O2YqwQZRx^A69W>Z_l=L5qxVQC4jOnBMU6<=CiUiZl(fF@J
zVo5B>2TAQM1){Y$GYd5iw?vM1ikiOS3lv5M>l$5oX9EJ98U?m)y&vAvzcAr~wrqxO
z?Jw=#de0c5TRTMC*_SnOkTj9EHnbC|(s8ky5*Me1_Mj<+|7kcTWU=q*Eu@ILHRny?
zHxJWGr~*ojKG?sl5BK4K+Uhg$Z+~|zR<5FM1w`UBEQ;mGsAv1bifqi2?dtov$l1j}
ztXxihL9ct`%_}#bk76%EU{7PuY-`@?BGZ`F7(H%LdpeXC4zShX8<5B{wMvTB0@q*?
zbt|}DZh|q{GO<0OXO1`>4A1-Z70)t@iUyI(McX=GsYV2Xv+qksU}ExIMePj8&v+qR
zaccNUnWoM=`-^?R(=Knec@C;dic_gQaHi&eISh$+_WlU8>A&Sl`T|AxTN=S}6uHen
zVqr}1Lnz^TOGYY2D4aiEvJS0?TTAL5l_&>{qhbo$2{^#Qeiw8R7T1Nr+vO*_0Bl@W
zjB}9sVx{#`2K^o--KeY?Vl`2~^5FSaLAniCDduGxV24#fm*qs*Pt*^b_j*1T(-@Nw
zMq3K0X^yrGO5P$o>EWq|Xw$*k_ijc1eg8o9@Qw4^6}4f=i7$9K(dhmGL5N#+BzqW>
zehee9JcF)%JP-9SrPijv&FrmU_J#yn@6*&g56<0XaYdR6;UyMDEH}w}V1@~O6?c-H
zo(B$j!HP~=*om68TD#uud)l(Gc1f2Ug`iR>f3~+-fM2CTIW%eUC5N;43HGoqm9L$#
zfroG<;q2Y+cI{(kpA)ghkF2ebLWJ-ji_DT!+6G4dV(AuIFOfbK9O4%LD^>51<Xz1{
z!F6E19=aj;J}wP_3Jt0Tc-t|fA^QHW2fzYD{a7xi;;y-@3g>nFZYEd<+LR{d;^`KX
z{^)-#8TGX6m^r-zcuqVjZs6*+M#vU8vVJ^cTi;q|hG4&XM|6=NJVPIh!e~1$`6yV*
zQc}|oSeiw#K*b+&jVta!p4HHt!nbYU(t;JMa*F^cNE%~jG>_l0duOo-;)Jtpr}A9m
z|5(KcAvmpId9fBeI3Xf41Mv5*av=yg)jHMKQ=0!)k~mT*#ucXkqcA7o*^~2w=RE4%
zQ;`up^nZUg{KAk;^;XEr-lhlXu5?=`e0n{CP}9Q%q~LNR0}H|!LEqias_5b6-OqPO
zf@l`(`bAIBjRyr+SmjRdVa$p!Jh>5edv}pCg;L1fsEw{qqc5r_P$nnbow4XxUzeA1
z9jblABI1#{o_^dK2I{z2(!dbFE7JOH8tz;PI5obnSH~`Ukk}!dm`_2KM+?XV<<tB=
z*$72%OF;d!4ld-fck(Nc$SivkQzuRcm`jOxh*8DRJ=K=VSMntZvcQ;=pwtVL21<Ed
zsqRd9SS&0&UDSyLBH@p`g0(M~7~~P0*)DqTkc9{<r`OK_3HRh+ow&krKIe=d1-~Ue
z=_EawTA+uNOT*OB&#f|=B0o}A^GICokaY<|jzUea8xy-fX>^5IlGimzS3T-_B?~YB
z^|N(t8ZzGvb(<~r)?2qah-w3B4zSt6l(8W1GKuD4!z53iHeOIOp;|{~#o+8AgF(j)
zn_Ily^|d*sG9#3y-X8)}D(M}{?i?SA7sw)H)7TAIrBS3|Xe#DD)+35l2oCh!Inu13
z7}<o{`Hv~aaYyiwwN0?;t+3?g8G|v6CB!l((K<-;2&eff_Pmj9B4?+s<dJvGdo0xf
zqmkptcnr}gQK(dXI+YS!sTQdjC6BjlGO~wD$o6u*5nv{CH)DPIvpi2jm|zhHgDooY
z^GUEVfaGoC_Vi8rdcOU=Pk!E>ar<}U_VoXKy-5Dvp0NG9-TQip{k=SX-ju-bQgqP^
z;ZwmqA}|lnDor0=>akU(N$qQG6)qr)4eeV<@DM|<SUpD%heb-XI{<9sqLar(UCB>n
zR=biujD&DElyeD;^4y%`;*RU1&gj@Vl)5(z6|SM3tC;jN)bjsTmCK7cDYTJHIfE%)
zk%VooRexbw2G~hsTsZwI7ld}kDMP9{c8@mqC7K)!;!ieHODE`cOFGMd0ddk8VVB7*
zXFHH2KAOSx3c19ZoIW;63@ud#3*|24Qbt70o!UL!Z7zV0u=<}U{ndQy5(qp$;Ak6e
zTc3zFUg@anQ4f0p&aZ^?1?dF1v|N{451|wA>@&Jv>;4pA0QzIjjwf3upaW}9@|&CA
zpd8|>3`5khR_Xf-K@5``IWfbfDeukITs|NJZWhtzSgBC%6u<~z1z?S<mG218v@dwZ
z5Wwi<(h8XZJ$TLR+SVW@I<~P)GE4**N8#&!(vN`w9bF_E1`fKnZx8@7l~R5!v?x&k
zqc1QcSkJT}|4(606=EKlkqYbeIv45tZTN&RR&^Jt|1`-c!W>-8H6-P^1x|(l3By5O
zP1@R2e@}f{ln#kQt;;d^=;J}nquiWNIY$29<fiFVBHG5egL~f?WASj8J$+x*hX){@
zY<w^Enba~<gQ_=$RsU@zi*?f^y-63#>lh9u1R7$CTH3&bHoMF&Sb=9yvTN&{#{C5S
zl*|Gm9O6<BaKqr&YP7x}e}W@a9;vt|Q0N@368^+6Fo{Gn1^9?Bcz`xnzS&V5v*4S?
z%iog?UIMJa223-s&I07;@0qtCgCI7Fs9^su;E{I^-`#A_SGjh!zG{2yGWy3FAuo28
zKyl@N#de!3SE~&MycZ)#V9z7mi%<oRxW=?tI{l`V@?T+WlmwkUNU$=Q-ALN0PDCvt
zxhOvDkpVQ;LF+R1wUhfYS#U4hc5IJhLk_5U1F7~nHrL?R!aNBDQMOA^g3)953UpSo
zSY&n7<5>M;0T6(e@JFrGM+7oV;qM?)DG8^6T55qSF??|U9TuEa&>A(l!1ONorw;nG
z4drLqIm(#`@_b&{EV(-#z9*7*&?16G)N|}=U_$AYC|^B7wdWQdzRyPtEKn{sA^6L%
zwRban4lO?~FA^nAYpJcZ-Tb7s&enqWei)Uk8(hnTnKgL(Rq$V)8l7mJw2>vmErQq@
z?$w`<LCFhbUEq1eTh$SC3sQ;mG`T<V!*Wq7(?ef`kKQU&3s=YnPXQ2l_`gHk6d@BA
z!{g8forEo^j%`ul^;!mfF1y^;o(&n2HC8J6J;aJ;)a70_`A}h1%;_G=sTS;`fk|8f
z+O20+<X%+oYy4TQB+o(-IXzL0JnkVwI?-lVfNV2A`b=O^b(XfpqFo9;ZbS~$aup=_
zjdn~^1lNd}GG!uAGvV?tg>%8}_{l$)skX6A3?&maYTA73UtNs}Z{I7ahdMEuTcYh7
zVH^Ri$xHlR8=^wN8tW7>Zrm0Q@&H!cvLMj^GmvnP5zEk|W$6jh@&f^Tc}_*3RLNbN
z^mZpD?vdl64S6Hj_j)IB)q@gKx?6{guh>#Qj&n@yaOAx%Sg*9g`j&Jl7*tm_BA|VE
zg2~fta;oUuw$z}R4i$=hexeNZLbH|++xLv#2zm{TRV~g#f3V9ph&e4dm~LlGm64|)
z8LH+&fl4&<{<{sq6`bHCk5qZ|?%qVdETNnQ@4Yx7rShQrSf)$`-4`BM=^0PF9?-5F
zWA1N_o{Us$TfjrJQw+}33o98ipBj71bt7g)L@_P<VZN4h(RzN}dwwQtN-|*i*K=|#
zL)^h<v2ma-5^lmYj7lrXwNwwxfmU3|gmY?yOsU|LD(@r1wOz=MV$6U9aC_hZM&syl
z`T;i%!u0{#&8+V1Tw`qBD1I2?Zoe-f&+Wik-3H?xr1DwWkpdw&9mLd2GEe}CN*{EQ
zVS7tbmdF6(vArxlhyWiD7L_;x4pH*R#StiPK7~#x-YkTCs$kKiaTgzA7dl|y-G)R@
zYuuK*(NNSB^48PDL#m*sm(;z4d~8<Zq>b3Xc@0~)uo-kOanu~--sw<=y-u{-#9mZe
z<ez)!T%2f^)Qv`3{Y8yRw@EOTK$PL{9e%m&k$Wa^93%5}tdYl<v*AXVH%xF-9jCY7
z@VtS0xG{7LR(`$j_kp7p9bNA7Ad*v8ky6pN%t2vX`1dTNJy>BLUZP-Kul5*Cs|s8c
zU<B?!>s1I(@nh@{1x5;kj(%wODBzqb0Ws1Qh3Ok*RzarlD~ZU5R0IEL0$9gwAU){v
zG-9Qx{waDfKRZzbC9EloPfL*_+Oq}MoC6)C=D=x@TcLZumcKAM#NPJM%eYE`TF2Cr
zoJT37F$lAJ4xpvj>#TOCW~vB1L=@@7e<x>g4<%XY8|_7pKG3URA<4BIfBoZJMNmtz
z#a^Oo+td`Pqx*OuxTy9qG(pZ-Vxdu=)p>~5RvqD%<nFLsS5n=L9dSF4$>U6-4m@$X
zPceaR0>?yJH04?~<<lfIW_1a}9%lG~VMGsovhG`d%6|)_;L4oI()gB9UDVrJX_amK
za41>8Kox3IC_Co2xG<x%LYMPM+kBX4TuT23cr2e^WMviywR(led)G=DJJ5E5;xT>j
zy%E5F+C>tC+!fG;C}k+(`qX6-t|L5-4gIGz?OKK3u<<|q=5B&|FtLN^FK1q`WUHJ{
ztOUHWKj}D`-$Bv(^2t#72w+e+D~>j-JBmBo9z-Teb8#hFAH<z$f}^n%R78w8frd53
zkmWd0j7uT->72DRDEV1-m<cqL@>zX;T{R8#v<u_uFSYJ{-Tu6p=r*|1P*KqtJFeJr
zE4mv&K27U(l!@m{;WONNC0p!5x$b+iijKuZkxP+xfEbU`eVV0ERMSj_<_xvtI-#Pp
z=B8pwu}4Y%yK(w%hSj9#UXqGdxfEb073zFGPEclQ0|t=64RVjCr;j*RrGK(zhe}wN
zbpC~iNg{UTt}hA-y8yGaTLkKi_|~_*3X;#SU&yrb6-T_48)<RpDxOmcBZxfIS!3%m
zf7+kB&%m!l502@=glbueLJi2~#qj1Vu}2B#kGJ<$Tk>J4+Es%Bnc0${!<yC3FHlM_
zhqwrySL$>q1?r134U6OHY)9>rrl-WQ0$0k4_vTIVWsp3ruhn&4c9Y=}vg*ZeB#<CL
zUSlSZQZ&aj&P>g1M{-TZ5f(Sv)%=_NO#E%(wIqii+sNdd4=VqCSI|+b@-o2Pa>7(=
z`P10uVw;EjA{Ii?RGAq3N}M=KvMpd8IsbSOtJOM60Z1x|IR1Gj0I-lG0u#AGiP`!Q
z0{J$HJ4yc<N{YYZL5nlUraG+!7QHev<6&bw3~MgkCdZNW#=;eGr5^#VE*sC5=>Wo`
zwo}I+tx!;%;zsbqP``OU7bRuU|5t2$DMQ*N0(v|xpd~JU>jOY*s^1L~b&87VWN?U<
ziGz#)VA>ZTyqA-)9?Y7_3MLW@KP~<r3<>wKtn^d=b&d6UWF?BYKDV&(v4SJ&9eGl;
z^k<?C%#&C7k}ar<VSBw=Gkz-ijW#MartUyGx4Kg*jaF~-Le`{q_YMS9$u`=PMaWyy
zqA@9<dhJ1p1~tzk+s3huLsDY8%I``s5c9H^_ka$&CRHx@-*)4FvUho+H#2enC*vU<
z)mjBj0MBvt2t3?DK7dZ$-wZb@G9Mj+^<5k-{>vi*Lt3>WE_Zs#tN(ZF6PK-Py|wlh
zNn2X|#GjU8efa0JGJ%CokFbVtLeGF!h`Sl<tMZS8M?XDAJA(~^!Iwaqw8D)`{|qpq
zKY6f#VZ&scpHV0eub8``LWxD0z=Y>NM}d+w^w(_WQvGnA&C8<W-5N|wdVDxbosth4
zRxA-vz=VClITG=}OilK~>U)nt;Qs_Ok%o%G^OC{pogURY!koXujPP(QOE2khf1DNA
zT9B;3)%`~gp9U9_pd%hu9CS5(lW7WYIUpSa#0yGpuNpVwwM%?JoNl0b>N0&cY(*7m
zI59t;dgE=02q_c(IKIB0$FSL0K$6|}(Tba_;b~~MA(`~LYYDECcFhwPy`S>2iXqUv
zF*VW(nJ>B6dcyRG-tGibpakAUguL{{Qi8(4BB(b(<}#zr7;~bol7A!B{UJ(~rSrbd
zS#b!OBtYoKJ>IB58<a}Ra4={Hp<Cd=MvY)Z?-VM_g=aj$ybJ>PdSLWW-e#uO4XVpw
z1muV~_FvGN(#yHJPN!3I`4RM%<`yi2`0fKPE{YxS8E1<PQ25&A$I@yi3}zu;JL@e0
zLo-YiTo)TxI2|El*)y3Tz;%=(IFg%=oxPq;zMdUYcUR+;H{!BzTvDPlZ6=s3nx~D@
zQBUHppxmY7_ce_8?AlB0ue=VzQx^^?-I+`k|6)k_3TDim!1-=?g;;9qRu9_zEr7K@
z{7nVRc<d?-9qQeg#T4CQ5wCE>U#OOwW2QDb^rGA+2r8P6xG;Z4mDy;mTki&W`On;r
zNiF*2+~z*w#nxd#HR^O2a|js3YaSB>-d8(mu^N+E6u8}4WuCXkv~$SPE7b{qW)+ud
zY_|S?dEt>s0xo*2Q_%_erkwX8@pj4<f6+6JtSIKzB`f=qtK6dKbkShzO$Y0x1U0z^
zC=8Lqok<si785GiZE^Q0WC+w_mpgo|o;A(#5ymx~xpC0^iuJbS`<O@4O7()RCr`BT
zs_F$v^&jKn0pgxse2_vOSpm!E!E%PE?w!X&fnj~sn1lZebYJPK*xZX6dxGWE5U@?7
zZ`-|0nU3|oG-sHQDZSG$mwkoh>xsMxd#>hX!tUU=uoa=R7JcgQYH@ej@&v|E=V*c2
zbQ<8wVhX1s1GYCOhacY#1<KC8o$p(LQcL<zo;8`m(XIlhza6WY?SPjuVg+AJ&2E$3
zcB#d!@q^J9A+^X%gW6ku$$Im7vAn4{;)(j?7?@dX8#4|g!MO;gHc~G=^f|;?)xk?9
z|0Yxyhrnr;Rw@Imy@Ed+u<D%{mCHP)^p~m3$3}v{pyA=ftAWUcITyq~_hfP0x~*+k
zdFZoWoaq!-E?#VP3pbza^(v`oo-_i(w3L%!3kHTj9)DyaET0ed?lMhBg0}tmEZCJw
zzQg??Q~TD6B`BDODFDj4<u$YDK_8XZbuTUQ^#UNx=1c^(AWMBjw%KdluXY0Itggz=
z<ca2DGCY<bZ|o$M73Ze}n`%dZ0yoH;5MtEiGHZ^52F)tc*dBi~VnnZ(RR3lT9ciOX
zRgP+6X{NH`@&ShC->Qz6%5s7HXal?QGf|0PL3<r9{6-7{Zp(Iy9ETo?o7|_FAE~a$
z2)hZ-1cLMSW@5Uo3}AF`inB(fR*R<gm?wZ~T(A5t%BWYIJmJ8~!uF<rU}t5lQeDdv
zY5=o643*@qbNw3oT^CbGcM&bi{;A7|2Hi6L9|BxcwRra$XUgmr1=2G;56zXM(aOfL
zGyfxSTM5q3^8Y?zs$JVG$&uP!T!1-n#xYGmy1yu$RsigJj@KaTbuPSenm<p5QIHDa
znA<z^i`@tRUDQUgj`&>nVpcu}43mRn1Zhx^yDfC3?LMGALcWP=h0}4NzvM(U36XW`
zzPw`Dzd7heycN&B@w(9x(iJ-|Y#KuKQbLi$q<fm*Bs5+In8ef8^>Vd`KY}qM@H;bj
zJs;K_Y~@S-4Yj}EVm+B+)|FOBk=4&ikm=g@Ku>=KdCdg;_nR{OZBDnZ$<&sa(T#PE
zalRpVrN3b#shy3^QXK^{0$Se1MHf9Ym`$hJN`C#UIi?3PzOfd7;vR8>MgJS8zGpp#
zFF1Lw-41?CvHl&;cUYv$Evh9jvk3K=D>R|3TiQ(Xwz(<s9<sCO2t<8%U3EcU+zb`P
z8FJ5^CzH*dqCTLHwkEEJfoa|lRUsgLx`pn1$XDEYlL+6Pr7$}Jf@G$5<#dv**pdG9
zQ`VM?MpmK(QblzIi&~|P4`ltR<Dd@}Wj4^D-RGbznuz$QDJjo`0XVS*SupX`<6j>Y
zMjAV%==u?>*}Lv~k8+DMmLX|UqQ<1?B|xK!mvsvFn6o?Qh*u6Bq_09-TL%zV__TE$
z%e5JUch>LVh&W_E;caima7<MRSgAl4qdr8^$=!7Y{}rwLhFa-W*y^#+g|LBp+)954
z+b3pF?3R#bNwt_%<d~WDm!T$GT^Z-`oU!365v|!VL!Ot8gje=z2+$&@rRMiqWfZ~v
zI8TS-_~ta)c~)(fCMyj=NWyGfD`f1cnu}mev!)4juICyh`9X02IN*e#PIQ;?Eo0xR
z9g)9-n7itbiC|KiOU>Bm8_2Bu(5{di?wPNOucb*?*Hd83S_|Y%L_rr{`kg1p#K*`n
z;$CK%xgCrxlA5kn-8EP8(!Nj@&qg47_HiwCAu3mt6=8_<z+E-1iuNQ1WI6dWpci4y
z#o2)ITf}7!j*u2UiAS1E_EhSP+$ndqyD=5+73GbwRSaO*fT~-z6<jC--=DSU^A!>h
z3l0(6N6(^_S15+NeN7CX)LFLEIVPbZvR>xbgzLbv&x3>TmSN)@ahjs!fu&BD^@Y-&
zI!vO@p;4)DtO{tj@fiXmoPzt|unZ7FZ`J2b2`PYWoVFS*b)MeqX{YzP;aw`aR1^3%
ztoY1DEq{?*%pg-3aS6Fg?V1^3S-?MN6MDF)(~?*KDgS^n+ig6Z(VyRK7+uV!c9T=F
zs|S^Ym#Xb^d&AEgogv=nrqlAl3Ja}3<MHOY^qxQ9tY{Fevj*%(hBJQUIvOZHTQ^21
zl`I7mWOhgy0eTl+;^V)!q`#K$*8WN5$5pS+Kqs%e_B#AoL&-&B{Ei#4?NBsWQ!pyo
z1cxV7vz6uU?(y!?-2xNusx9K1pAq61Arm|V5QfV1xcf5$yh!T4Ww(!cXM4m9Eu+}1
z-;)+k)!Z9nqM|*p*}YiDlS7$MPH$5`)v~z?7CS(f%y457KF<iEYE+<3b`@J@DKe_t
z=|_W(+f?)jqm2856e?m<0cq36gz84%PRY|rJ1cN<83m$rXst&V+twg!Z3h6-)HB~4
z857XXzzdoVd{SIbI7i_gjA-CVw=LXB_k}^B4HjNjV0r#5rOBS^zTHRN6^@b&_-+lp
z{hFF@(BaeZxD$ti&?YWV@6KrDnjKP+dG$SR*RSXskjDt!7N7yMW3~+$wue=TJ*mF&
z<V`hjH_DcLCZDOn=Im}~XY+pI+5Xd;7xM?)X7IE)255zKr8Y1t0*=y*$=l#nwK-KH
zq-DSpSU?2Qhz-DWeS5iWArIypux+af7!zuccxv_L(DPg^pB*Iqbtlmhr97Z@Q2w}h
zxfvc2fl~A%yXzU-J7FQ#v3rPDb`cfd3#ax(X<2N9HlJo6sNK<z<eo--@RW?cUv3Qh
z+Ft=qTB2ZZ-B=e^LPrG^Ov#pIp`$`))uE$ab!EThoG9WWd+9ytc&23f{vlP78a%mb
z`!-(t-GRG{a##^MuWKjXHy$N`azcBIVKoampDc(T#yExBnuOyjwg|7E+?C^D@_@cU
zZ?0d|t^{3I-N{9+n%8xlol?3-w<rcn)bD0)<R0ASwI?wzQE!mnskii-Cogkx3joJB
zZ*%l0ZO7K_-w1lm*2AifIt8f-zzo*Y#Vu0`$8hM`Ja1jlS<*>|2B;X=T(jD^`KH~4
z=%loKgY2z$H*c^a^J+mfYvz!M5>7#A9GyzH>z?|#weu6YB&i{cYY%ekxQYS$k>zyE
zOpFTjrcsuw@`CcZOG0^rMRR^r1&os<b~&^nWZ!|%Eg_HcVGAGbXN&ow$|M&uko^S%
z>RXqXb)dVW$x^LEnSacD9moY~54<)Mn;7+tz={SYKb6LF5f2IY>O6N<hygLwqj&dK
zZQ@G+J+@iEn5aXZU@x1#{uXw=M5SB1uRKVLLBI=hw3B*=2A8qpl<(p{{GE0bPLzp=
z<|ime%hf^TK_k>%CsKy#3w0Ho4((2Hh0V1-MGLSWy-hKkBcxS)QQ0fQ>^v87KCYnV
zC^I?&kL)7$RhcaNU|!N0gl0B!-Z)K7RSzS8RZvH{?GzKo4uO7fs!@YjXm!b7u{dxC
zN{XSivfDZgmyDkZ7kW<Oy@c5qMyIo@Ya@!Ue;q==k=rF&C(o>6UqQd}sxSH`Ig*L`
z(P{G$j<Aczr(sy}M3m_GiN|)e7sDV=w&7KWH|kye%Iv6ZV9K2mbsEASMK62k;PVvV
zdPXO&BBlJh^cF&6PB~&B_AhnTrLdC8HU$kFUM91%h1Kc_e=(&-(EX|^WX8b_)QrAY
z)zQ=_hq<xUlws*#{{U1yY!1D4a!N7(G9#Gy{;_W1v*#XO!><@P9W{k|*K8Kin7mib
z0x1gN!Pd}`OGlp<G_68i+uoHoNjVn1g@!cH-+il`ex<$jc$`hbgP2NVPCLh<x+gPQ
z$21(JsNGe|I@U3!mh&sYh;Ph0l#UdT7F0M>oXGp}vF^gAHi2gqa%CIs3c{?z8!*1w
zD%IpXW-ibL_xvfLPU0bWq#IvKx2kWWft^-ko~&l@KS{AIC`IDv+aIya{w!(AFZIF`
z4WJEXa&K=$c{GqNY{!MhmbzD9yj+r_G7)&Gh_ZOC^B*wtb&X|h>9^*M>0Aa6%9A2?
z>^BEG%b}Q%xQDd{o+U~Ijg1?}N%u9G9Ih?`4TJ~UhfSgFmaA?17;sTc?m>*$EOeGZ
z*mthv3>^oJ5a9UKc6J^l<Q;SDL~RVu+hB%%pqrXcBM)JOJp)^h*AXq#I=ENTYNyOx
zm*dh>0I(U=FuJei!Y}lHsjtyuiV(;MKiXw`f+lzLwv7z5Z)_=UhFycspN$v}dHdPR
z<1S>exDWJpW)MPbpA^E@Y-J|OEimALH`BHG1CiB9Q|ER=SppfRveOhV{~o>I^hKK4
zW)a=5^Vzp{O7$0<vBZJdPg-&9_JiDleo`uOB&PhZk8-KO-40MWmof8wnbU>{8#2#@
z7Yx%-#@b9K-QrTZXD?j`17~(tlRvTB!wRp=iLKT6B;hY}ZIms<Tp2Ei7ov_BSOy|f
zcRlo8Ufpa-G#oMYwJ3oEa7HsG=m4x7a1j~dzGvGg+2NHYKqwHKPuhEVPH0ZHe;aAD
zwKxRY`iZ)KA&`1C*_0s(8_$aoMCvSU6$b^^6&?9cW%!DvFbhsVkRBZG8ZoVYAAF>P
zHv1fDJ=eL|>ZXbpS?<d3h(m308DOt9w_BghvQ)bq3e&VTsJ0e@rHJDTqYi5Wwuc5g
z-p$qn9-dwRN_Q6ZO3&}w?ER;aqx$({Q8$610=PX=Zyj>ZQ4X)fkP64WqP-us8X_N|
zQc80@2d?b1xNSgKX0}wp;5^$rleL?Nb_O*jDPw$XOX<@=R<XfRR1?gcgABf~LbWW-
zX5ZTixBX@}I>@gTutmh_!Yy$6^>|9ps-%biW5N+rT`0f}wXlsHuN9o5DZKHEhx{@v
zich58R7V-|U!bV@a!bIxZKw%@-03(QdbBA54`&iU3tqK#!TKR@Us(sfd?NR2lSDdi
zwu3$M6}l>G(YyZJm9?hIvVVyXm?<-1u5C*qmQMz;nWi`65m>7ne*SrV$xK(0uWOXr
zC|=IR@Ht}}I(p0l2D%*@+pdx>fJHd@)nZ{`Q`HmDL{3Ydf=qY`Ko>33)!f7lcyL=g
zg$o24Js86IWZ&~bWO7PTp{muGvt=3q06h;`uNi#-j1BZOo<FkEDh`j}ULTUK=T96B
nryVw1zLl%Jui_!K@%J;`bZMrlo)-VvX=83y0000CLjGoEdd-M_
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..01afd3c6da9b3cb4e7dee5532865f0bfafb6b1c0
GIT binary patch
literal 15086
zc%0Q+cU%<Lz8`vBs=(5gwy^Zxdy!@r5wRemVsD9pEjBEuph%J4q=>zj#HdkY5{)sM
zSYt(F1EeTz3o!5eX3oGu(CfYTy+7W5?l0rAGw1xu_gBwcf{-Aj2sJeVU5$x3(gfj7
z5QMQY{e2($dnx*xqa*%qP7q;Q1YwEpQG@#k`tQ^S-S>b+(?35F@E;j@Q%@_MnC**=
zzB+xtY}JoHnytKa)o8(?6Izi;>t(e}1JFI{%+1V4|Lb#bQPi2ZYdm-J{mZubA37XM
z_@r|wzsIFaK)RIjNr$|q4vV$F{H_^1cPYBp2$3W_q`(V=i@g54!*eXN-@kJx?j#*D
zYX5f2eOqt!^|2#9r7iV-RYKCcQb@Y*5t4S9uUgnqDe34L4(3CGJ)<Imm)-cvp%mRy
z+R<YgpOxpC_Q!FnnY)+x=RVI1Dr>yzU)KDmUnO7QQ6Yjgnl*#xd<7~}w2jm<+g^Lz
zwpc(q7k=P-<i5UZx9n)5?VJKveg7%m>ReYJWj&s&eo%tBZ{FXTXpJ7=!(z=(H>B0|
zef1We7|zRWZFEF?+ikq@T+<<Zv5c~YsoR1A?ufj5N5&LC`D^Hw^QYB~Z5^DJA9D$;
zXsrWT9CF{c4GCSe(m3Vr2CIV3Zs$?~=~ens<eUBYHFw;q#Wqn(t>cb${59ijHyK;=
z?w*lvw2O7ZPT!D<4|Sjqm(tE2&aBEBlWnynR)u^L^z2(HAj9?vN!R4V2PGvWOeR&o
zS~o8HdVy2yiV;XwjiGr@w}#d5d;F>dq$|4LH0j(0)9o(`;Ca~J2R$FUPel6fxOGRC
zHN@F%R)%fRH-~rnC0FO^yA2O=TYkhRr1Il)*a!AAO+Npf@#aU#yn@ay2V`&0JpwXl
zuaFEWe$%AwG9o%;^ZD@Dqx{zKhuTGMi%J*CsIl3;g>^rAR|rYR;*K7}dHV|uSN!B-
zp4;}uwun#h1ZxLXwuyN0JHE1+oMJknqP{XD<JKl^$53bUgzQA`;^um{av^E6yRk`Y
z<mz~q=VS%5jJgub0)#QdgB!BH<A$rh>iWlxK{D%dMlN$!w+(i8+HiG)S8-Fb2jbD8
zL_nIY|NVrtn!d5^8Is_v`o*4`^YJd|!M>=y$87PDUoDf*o-&=Dmu8c6Vu!`NioI6J
zXO6fbyTh}*U2mUhjoA>6)|XPUA5IjLBw@7S&tPuOhdaOr$l_QgBCR&vt~Hsz@1pIF
zXYVbyK70chv&gJ_tUF^*EP7T>R?nL9A4RJW>T0<BM;o)9@AAxdx4z`%cZw|Y+j}hY
zTDz?ZJG*$fAK#j8c~qf2Da)JoQ?Gw`FneYtp%ye>-eB29SL00&7Mg5*mTr>zWT(;E
z-@j(htn!mL_fsACOsy0_TtZ&7ez1@*$OrC&`{B73RXWZXBMKzM;*8qo;>@5Qhy`+p
zG!U60@{m^1iBjYREL3qDzfRS2(iT;Z*i@F|$P`60&*f4|8Z*#6fN6JpzdC+i@{4z*
zKM+4qR3v~?BPkW_K=q)x%M9inJY<&g$6emezw52C>OWfNyl=D4X=t;~diT+C$BPE;
zx?dj|BouwC;u4i6DbJdUp7p_MVBz&7KDlH6y=4&%k(5_)(HyoS*<{U)Uo3N)+H4Sh
z>`Q2@IU>Jw>PN_T%IM#0vg<oclfS>C<~3!vgpAx|w3ZXBhu8fa56s>=3KsqmhF_mM
z$jfPNwL$o_M?}YN+Q;4Yh^V;hUM}b*w{kjuI3qrQAKRRU4#Qa$KgzK!lF^#}h;;u2
z4>GW~ig$dp$;NxvQT*!x-vIxGHC@Z`ekH9UyOe8pY}Z^q?_J*B3GvCh0>w#05NkYu
z7t9BGwuk%8)yGN}ew)$S!I%e`LH0(-B{Wog6GoeEeR|ufP(a!i^C_7jPuXty<E8n+
z{m0yM-_&{)HngkTho&m(TgCbm);$cY7LoxdcKRdoL%jF^FMDX6fUZCn7AZGhDp~k$
zLVNgOTSyJiyAtwuFOy9Vu2{m}MR@NrdL5IgnUG8;xNN#s6<F0tnoZoC1#9_cKRFPJ
zV*Ah<0U1(5$JqeHj~~_v#5GsU19#Pxzht$|AkU(zfKVp-{6dD1lrl10ez^d}mu|qB
zgV^5Ql_Jt%-Q}C;zR`9|Y8Hgn@P+Ovm&?(2OSd)W#s(L?-s7M3u+S&tZk}(}qsoAi
zhTj9L_(IT!j~EXqhxZuHDEWbqkc2pAgs}iTu(ZZ+kL6}JzX!eBA-w~p-OK6x?pG}$
zeezyCQ8o7n=Y-9%57_-=h2x^ik?1*nMB4ZYqyxIu^_|4?+Ie?7(o+ZU0D7QpfiRi<
zu1(cFCKKHUff7m~X-NfD4$8NOc?HOK7}=4{-SXeJx$Sy-*ERLG3j3vp5?Llr#$YFc
z_GhRwoDo6o6N>R|iwIR&guE)(o$b5(d38`VjS0Xe_y^d*<m=NnC8T91VI9b8j@cNF
zWPfLg@(d%pYte@;z2VDFNh_%*5VZg5;=N@JyrYaAr>D>HNv^33-gNGA@aFSBdoQax
z#dZu$LchBqf_N_Hm~<p6xT?K1pqkF%9#{u9nQuO_?7~wp|Eh+`m)Bb4caqkS=Za~&
zgU!qni++=omR&2St`{dIs{r|h4eJJM_;y&#p|-|J$A#pSlU)=|J|QB9W!-wf(ld``
z?lT>;+%;rR%L~9H=)kiN2c&Ln`XSJpgp9l%%0)*l#B>k$c%fPV`5E7B^R>TyGwwb$
zj$Dw6^`PQ3eY?}d!>zSbPl?EBr-X<^WIUn?`y1bLyrbeUCX{r&$9sg7y?+`~BP1Cd
zP&Pn1K=JV=;859ltTn0=ZZWn8pM!hAUjC?_3PE*G#DOl-W$A%SXwBiUwwj4OJ9b~)
zchgUc$i%ZiUF7uB!mg27zaCIfXFFp353v}(CO)jPrFm!#_$2KM?s$LRmU}N`G>ztI
zjQGY2*}j&?)CYKf?+QAegzOcNkq1O%K*k?0<ki`;2s)oA$Ly)yJoAi*oOP<><Fo^B
zZ;#k^ek<G7&xN3Ko`T)9G{3OI7uO>9)3G5CV*vJtxM;QW<$Fc0_j0Y6^Z-<!y!qVz
z5onF@^7=Nm%W#OHc8C;*r(Jd#mv?)G_pG!yO%uByjD5hfx}>C(Qh5I3`6KpsyzjSv
zMc@9`nQvQ^?IPBo{e98?uVDXP{g*NNr}q!vCm@IK@9eRfm{Nn|C+Jrmk)E`?a)62+
zcZ!;k^$bM~-57$-{cJfEO%3mq9}>g&wl~B60b+3gd=Ty5jP_rN^zX#YYJOya_O}+p
zA7B+Q8?+Z{XSDypF4AMwiR)<Xu{h2shHgHW5LNu>dUW~om(hD_-wx0E{l1akgm2Jq
z_7EeK^(=G)3;sUK;E#y`&=Xkhd|9Vx?z0HhiAH7_^;ZG^R@na_$AbTXy+CikKVTpz
z>;5Z+A)L8rZ4<!vsDg(Z!0#rX6p@qAHTFao8MNinMI75yAijC+_;WYN(9i$S{^pzS
zJ(khnKnzlaUco${Pf|51jz8iU2;NKg525AnJJ{}HQZWXUgEn1=9e;%18FNfXjz20S
z#~nd9-*mAW{br5#*LB_aQ-L`4K{k6-qZlWh{{j6D1+ENd_4Qfid7UB#15EB=bO6r-
z4#M_!lDx@VD$z3@u)g!We8({d+H1!i7Lud)w>5|6+&`k{ITo;}2l;?y>=^2?>(Ot}
z7csIsLVZ-&-p!tvk&We$)S9r<mYd!3$O7rWsy7DXIIxHAJ-`kjH6qew&ABt^8CQ_s
zFkrG;SkcQ>K^eC<+D=O!qpWXff#Wn!h3gURwC;y9eifZv-UDRk?R@oC$u?{%&RJCM
zH%WcE18l&<IAn0(j$@H;MQ4v+NmHXk^6_oxelE^I@+gL>;CKu9NLSk<%F$+F^=8k^
zCx4-yw7W0&(RCE)m$T&5VI2FJN?ekiQ0k0y@E3yv#ty)PTN$6USWt5l)jX@D<dg!i
z-gt-%6m(2ECgazQ(F>X}1=h4nI{uY^Wv9Rw>D)_fZ}4lX&)NC<70WexD(0D~!$1de
zM(b|RH_z+n06Rb~v}Jfe@xmw}|2HJ-dSz3$WqOfIwwO%XmL{vJGhD|%F5I`I>5=R9
zKW-!5CK-%Op5s;4_7UvuCbl=&)H1J4pgX;EC+1y&=wF9QD%nM9B45~Tp5NKU@Icqx
zs2<CB(Pp{k>PyGWmyK@4twOhg_idW)<F?4EvB$XWe*K4gK|`CWbx@j|w#g#LT`yih
ztqOkRP(u3@^zuf_uN*<Wr3a2*gY_g*8j;HlP19dh^zs0BpfCw>Lqz2cW_F?<y%Dgu
zz;ea+7hRE!I8(EKWsh2Y7V-KX`U8*|__suR8?XKCth}iw*baIr=|T4H;~^r+0QHEO
z$QEr3Cath8Ko-Cz6+>2Cex);N^+n6gf4+qM><inv?Tb2kn0=v^v&e1h<gEN@uL9TG
z`wRB&vxRMhI_H~TXQ0^pC*q;o0`p;sc>y1>DeR;Oa0UATfv%u_Ms;it>X{$w&fd2g
z<yj^keaYUvJRp+QirHapyz%}zv#iEjNFSY`4~W%3ya5C`#5}j1kM_N9xco|ns_%?I
zg04jrK4I^F^^w5O$!kO;o1y-Fg2|T0yG(byIcv77;f7ge<2{Np>TjB+y*y{M{`PL&
zIs0d@++&>y2?;H{@0a$SU&05hr6j9srNeR^Z>AbB+eX!YmaVeWSf0!f6GMWwuOdO$
z^-^E5Zx5=U`N$tykpI`BXMirD=hhQnK707ohgk#GgLPpK*sBZGDX=fOo*-dP0R`JM
zLTpaK{kP{713w@)$Pcpzz#U)!<`GaAfFFbrbR7Zt7wY?&h!XJ?zC$b>Ptdar$Y+pm
zAZ9_nfcg$}46##^`0s5ykZ(!6wle0Mi}w$cR@IGXIgMGPHD*Jx{>(k6IEzpGXuR~h
z8^+7d-2^gPa`IQs{DW8Z6N=6a8J4_P*(P+Sl#+T9mT5FW*KSZJ8W42vB~N@IPQH+L
zSPL+(NznRslax~)t>PZLN-weMsM*Flk9b)Pt=0wYsK<r=UP#)N&}1)05NmBwjbNQs
z*T!9Y{h8jBtn*5iL0PD0TY}b{K+ra^A?REWC}H~8|Au$)EoHo>ous^Sq<ZkYbw(?$
zT(!t*_yBRu2Js8A&W?$}C3L;~DS}xL#A&$Kde`e#<Hg5st2mD-MsmQ6JDQ-eXhzU}
z`=8nZ?gzX8&Y}KySGFH9+i=<W?<}&LTCIy9Hvf}n$c@Y_i6K`^%y(ye58Mm+1!S?w
zs%z)W-S?Y<u}cO)`%D<N1rulg9T^zjAs?GcqS{6)dfPU$w3jdG97E4x7{0}M20mfl
z3^OnfiUfTmHV<QFV)Psc%K<gu)`#^&LKhuIwt#sI_y&X__P-%RKi;J^3`6ziAE~g&
zX=$@6qVu6$FW+<>NApbc=26b?aW8CYciQpjsq@aqkG%KLwIV}ac!uRECQpAk5Egeg
z@{w;`mQvDKL(q6~5|iO`{?Ko}Dx+f_YPjs;5sSQbA=C{0c}II9J);`5$F1l?heuhv
z5N1MdIj>r@{o?k>sOl^n;vTiwySRxu|M0^zIA2UYSRPMoo8B2EwuN0`TNh_e^$ls(
zkadWcafloUdWQ44xiS15Vz9onx`98+%Lgp-JGz(}$qvsAX`LfIZM^x~a6;-4E&uq9
zPFrqX^{Wz*-o=gWLtID09BQJhigu)TPVLVyCxJc#2zs7=GsVh2Io$Dl(*^s6eNlTi
zXLi*MDMhu_XuVMc-G8ZLd<?`9Gvn2gkdk)NTW~B7)hq(bL3szAiAeJWHMh|H5XVPb
zFRDoksN#1AR-sxaKBF4z%+q7*ja+613B6h{rXVa!zu9O-pDh?X*%h{S=}p{uk&u*v
z*aY)5=y8>a{&P|S;|5|47xit+P|wl=^`3QMA7&Wdsotp))y%24UdXUCSE6SkIU|-%
z4y<T>KXjjnbW6DmGgX-B*g1Z^e@a+QXB+hTVKw~j(3;M!p?f<;A$$4VlpK5M84lpf
zr*eP{7)!P}4V@Z6v-hL*;2gpe`+~d}jwJDSU1i77!%@w4kB9qyrq^*2=bh?*Q6E)M
z_d(q*bOU;BD9gyfGpMxTTKIku8C3B1EhSy^K+qN2a~#)y*S*C)X*XB7t@-vV=cL06
z9G4xM@3Q)Ave))oy90{re-EnW3j?t&e8pwx^#>uz+kEG(yn$UBS~Cif6^<{`V!DU#
z)`rQK%fx#{`{MrdYQQPj8uS%V+1ZV-vV)*!GbVnS_mhW~)gSZOdTlx4-wNvqayH~4
zh~v8WZ`#-w+1egs9X+?-N)M{)_{hl6Ylm`X#!dHIhKc1rqh}To^h_3J0Zgw4KFwAS
zUpB!ktLa^@?!|E9M)5ABX5J7_{3|;60cFiE9g>cLZ$YlqRMO>Y$f>azKB4c1ya)A$
zIU);ug}>=weNi)GSrsh<k8L+ogR46Qfee<!e46T2VK%kv^+#pfuv~(Ush}S<><8cv
z=A6~nDn6xqIOlZBd-uU5?cSdb-(0BRCFU>I3rrX)uW7)=`c=RL@xhp&<DD-eIJbnE
z`e^JEf%rG5)mT_}N}3K~mi`5=F9tLIFyNfQ8Rs|7oV_qBn@`ZQDCW!s&R4=v?^0_q
z0QZ#cQLM3D|MMG`g?F*ElKO0do~>J99vI$X9f-ZUvMdb`ZM&f9ywOXxJI&lt?K*e&
zQI|Q{$82I&@6ohyhnzG4V~)W9$e`}J=G<2y$hU*UaWudNR_V_g6^xu<)-nv+o$_0~
z1;@WJ&+F{s_4egrxJUe>eA=v_XIYHyT|m(FJM{ZJj0I|b4_EIMhenSmdU|1ORo&Z|
zLv4bI#{}fW<3fsJk9KyCDt`LTEIbh~FjmYD;aL`U!uqg~%8&IBX9EYZ0ToY++Iw_H
zuRTi8JqFlOSwcpRYrOg4Npq@S?ZXb#2d;SD=2hO=!--n+6S_YQ<%ea`3akVPNvQ~e
zp805F-7AHpUQU>BOdy20<Kz=UatfljlW-nD|9kSuE^<WvgJ&!~bC_2;Vf%spS!^$A
zF8>JT;=MM&e&B}ZWKipwEIs=NAt5=BpzBmsmTR<^*{=FWfE~+z{0n+#wh%8pa$dCA
zeSPpR*R>ZOc&FXG&k3Ik@hk%SCFoJvF+SBd_HgTK;CCvbc<LO1Cir*UNf9~WK=TKV
z&p60O_C#Netgg=U_6#n0cOTB(AU6as@pJ%&EVn(bmt*tR5_CRO*PfUe!`<Ebk(o30
z!#)!;sd*<_w?;&Uq8J}}u#0qEeiZBhImH#nLuE}1H`AD!x+`$*k#Jf>!db+OGl)*p
z->04KBBS@bc&K6KG!Ele6~_;K4J*IMkdk-LV5ZAph{*?i{0rb+icZuoWZ}4=iE4$#
z=6M}m76t$0-(7508h~fUp?Gc`nDyX|f))q-F<2~~42dfGD|;H|8_rQ?VVZfii;O$m
zQs*%za|Ono7Umstgq3xC`s#@4whqYE|L_5v3+URey<00XsT#*oZNrs6r_%Eqe!sZS
z<Sc5=is#J~|NDS{AsJEG%-8jdDnM(%yCV=sq5fbEOTRKL;gnDSywCZzi=6u%bsp0?
zsp9#M?lZQ|l8}_N7V~@X8y$=2l`-L^ZypUp>%zGPb2j2vHPDCY*rGc*^Avh+B0Ouf
z?p8L%e|{hTj-TNl^aJNFBMu;2#&181)|e`WWrcvGO6O_EJ08zC*<KgF|IPKNj4K76
z37clA8Cv>aIoV>dUm;-A#Ze=xn;(umBqG0rf0&yZ%q%}o(DMwo@rFD3=J^70ApSqA
zf8hU67wNtJ`@1L(EyA$?bgH255~dot<y^4)^wgn<XHV=O&N$v#;rynJWl#!EzaBok
z^8I&69|DH|kk9fjBsudATt?4QXNtxtcXIpbe}MlEhX08D0&)cM;n4i24a)kwjW`w<
zVm!zZeP_uKBZF|hff{}|{_c!_hZ;ax$0^(_F!S#2$bEd#r|{o9^G5s|&fRwr=YSzb
zYk%L)@NfB<_yh46&Wyme)Y%)-)$r;MLc_qgQi84vEyQr4p~kUxGz*zB-9BddcIT-Z
z%Ulw+)HubZR2un=OO=$8hP}PS{9c9aKH4Fq<n6UECVmbUe@f_?w?SgXw*);4Q!`xo
z(@NlfVD017+pEwz09(@MHDW$+P)OP*W`B>?iO2Y$&PlZ_y$qsCpH@sh{GloCSch=x
z34Tx92?06fxPXkVuKQpey`lu?U`rfB!EV}KTYpUh`woo%z4;5~{zaXn?xbA@usvCN
z^N+@%_{kSP=dt@2KFnZfIPw9XjXyk)q-Ri!4=5=PG1QB$es^XH%2!ix9)^5O)e$F9
z4laCB%hKm1V!x+k2Aer19a$JsEmi|D`M0c(f1CWaF3pIgxfrvGS~2N?+?<bf;%5T?
ztewR$gwHO)2E$Mu2+4om$TGBnGvqLgX~2W#@VxuGVwu_p=$Me40B4HFMC7Q-`g(2q
z;F&~U9Zc!pDlsoHsIt9N96Nn|03Ca*vKv}ij-w#|LVYW*WE){_mQjCAJO<I{JA+_o
zfDOXo47}>2&>%3r6yt%ZB~$}9o}V@Th(HKupbSMHf%8xiIds?Ui*l;kAy{4&EQ5(f
ze8$qi%60)$e~Q;WjPG){+<zvcVK@`V2B>>AjW_?5%lN>jFeGk+Kzw$};K*iX&UZK-
z*kU{=JI&7V8*`xjZ4}~}CJ{O2kf1xf;Mp&nz_{_)->G+Na7^`aSoLj9z<@rIsXf6b
zVNS_ea_R!E9Y9ymzbNT1Iyuoix4o@j9v;y9QgtZy0|rOb`7f%6JW?**LU~{+t_vtU
z>-&s17*XAFdGsM6IdWfXU3g*b4_<4|Y}9d%fc^pcGJPC>z=!=gqmnoH7B@Ch?+;fD
zqI)>6%ljzMj7)-_6>=f;4^;oia*Z)Z{mU<aAtnx4515-Ue&Aivmk%fz;5~rc+FE5p
zo5^DF1ZsN4z>Gh}2BiJA&~jo*grc^QJ=QZD>m7PYCn<TQ(WWseyS($?yaV1D-1NO?
z#_!cVcgw@avN{$J>uiX=ceAP4iP74dE1-uFw}E&sAdVwCo<grDqGljI*-x*-xw@GD
z%3)H(`{?7}Kxa_5>B%T-xafz@S?sj-;sw954;>8eOug(X7IWyc(vEK3_`-66?m?Mc
z2_I^Hq8_@$#w@e(CSwDp7Zb;kxC|bJjeM8wcb?iVJHAibb9^kuKJciGd1hf-urXEv
zTTr_h>jqBq^vrm8#J{YinR>4dc*nC*4>8^u+`z1xyY<Oad1KcEG2M%wb5nCq&Z=Li
zv+mw}EY?r<lVOjLG@D)ir<6QvGxl513G}q^u8$**i+~UPAuc0b&Es~=F`Kk?rL>|d
z)DLdD0n;Lo&R@d2OuhqVh~m84GiSwltpc6cj4YgEz=q=UE5-(L3g&(WrfDztF|kPe
zyj)xc*K!fbOFH{hLP`eC-JyPqLp|LTISqqZ>JAZ06m)qL@m@Br+iqq1S9b7yiW(X<
zT}HyZWw?xrR<K*v^Q+Vx49A&I@eZ?N<JG@hmR4m$%wg*E!OlOab0Y0Y*`8)uO}Bex
zC>TVBG9hWV<5{bUZP*z#=aDs>*sUk5lFwdqN`LU&qoARMJG1a0S_|Gg^0r-Zb}Kz|
z=Jy!KrtTx?bFYy$tIpSW;&)}mXPyqdm_fV)Zqi;nV>w49Vti^6pMF=i_q<4d(Wxku
zlm8wl1LF_W*+p?jk6qU5PN)1PfomE3{}e>jT-UR*i?m($(*sFa1vrBksXuc0LeJ8+
zR+yPuEkAo3*$HyzT>a6j^IS{XyIjO{-j8>rck|4K2F(%QtRm=ob>Q4{un#kbhW8Jr
zqrUiUKP+K?=(9!NJI}rEAeReC$IO>4iX4X=w9afrj{O3stXF@#S9FmM>5m)b^(?F9
zbhrh&W7eE@ENBrhI;Ub}5goTF-m{yUP;U<Y<%Th@NPO8Dj3kyp%`o{=0<yykaT$1G
z?<&}0IqXaNpMg0QwsvXyO@kVDtF*F4s&&fECoafmoQm4IEmLkb*rY#cu`l=_awukE
zJEL>@JqK=PL!I`-tPRLk(EC8_Rr*5S2g;zTH}CLB6jy&k{P*<3llVIq_#KeG^E?4*
zmVEBD{^X2X=Buwfx65ndQ|FE)^gAN-c`7Y`AK$cYQ2cnHIcnWvg09Dz_gnvy_Z522
ztcQ%<<ZQC_Suv_HJ~H`%k%NbQqn|8Ae0-)VplUAow{1}$zsx%&6yMYuXwBWN?VL3?
zj<Z~&nO=x_*W$l9%VvC9L5}0ZHu&nhDP}w0U7+7N5tBn)7BP7SBTIZA5X{WroX2F_
z^BX#Gc}dc0dVm+mtx%6LXI=jr?}>m808h%w&QYcY%P!0?O@DO~`F8`2t3FwJ<-s!b
zC;A;5c!rzvp~)om$tCv8sul7k?of|GzJvIvh;{bgoV|Za4p<lTqAbU8G|-7J3N>1D
zbDe4W>u<SP%}=<y+nUXDk!`3ts<Vfpyv}ZT{|Cw1VwU;-sma!--y0<Tkfu3$LyU|z
zmzkvl-+=S~i}yDMlY_Ab;8Rsr&)PsOc!3kbK&0;6gH!aEoSkp5^!(QbOTS;LzvRqf
z-Nfny)aQ+1c}((>R@DV;>tUW%h`#yz|25x($-(%z9Oi?04<G6_^#P=c`BldEGVde(
z$9$8u=s^-)*TWa;e+03PdVh&RV;4d1$|q<JTky4(pm(mtQd|<h5`FJDG1vbupY;Q-
om+-X~{v**RcMHBUdSUd$=#A22fS6uuv7XTba&SdA8lmg|04#!oHvj+t
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..bf43144e5e68f1a7f9e958858237c159939b930b
GIT binary patch
literal 34168
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%0As_1^B{`s)t?*dct>dK<mrq1i8pjrX2T+ze}g;
zH}`Q}DicTj;v4kG(NgGhmTZeMlWeCz{Es7lPMp+tWI?$p5D#^$-gloS!6fui!qdE%
z%uP*PYYn#d2&)u6-k$V7Ysh<Gc&$MWHtzAkb&3g&xO()s4_KZ0qrKYGTtu4ovJ4z`
z)E#mkbKq)@e(~y=05&X3y{_0^rmI3ceQ9=rcG>U5BibZ;X@(Ajs{Zxh{Ow86Qt9tk
zt{QVsnf)amP;J<pqkW5d>>Dg!DLouNJl+gou4kCi%f*`6#R5J0k~ksyG#}llJ+%*W
zR#sZN@`MF}CjU1>mfQraAR2EhDZ*h;FknV5h|BExFEl)7^}dgMyru$YjQu=}F~D?r
zBO{*OURfz*rH%MC>>meclgW?RyPsZ)O^vxA@7K<j$eO3O4*1MJWjy;eMdP-$4n|&_
zXalFdNJDYw?$0!G^}3H}2`Y^xf2sQ)u1AtjRv$*g*ZghfdqY@S&84m&zc{O<3`0z>
zT9sjXr3J^&!8xoztj*~U9vw5^Rm^F0N1=qkA~jOYLeE_&PW=N*fv7<}2`xkY);db>
z;7zGQO+C;!msUwml7O$onp+8bqSsHx8#H(!doz8-k^1J7%UG#qlFQHQVnS#cDa<)K
zK2SFU1tQ^;Z}}ou=k)WpscfoV!ykV7%Bg(#@btmY9NA!n)hv@B@9W5pptkevdN%>h
z6+=&K{Q@lJsb|dRJN08~vxDkF@@rf3<R&!G)@Sxfm5;sk{DE8fw8RAT57~pcpKjU%
zE}ad0(D0E}lehP;LnlJbTRt=;;^;$|u^5oU+5e<-P8RE`B+>a&%NvLN0bv&}USi64
z{_Cl$3@j-D-Hpj{;A+xR%guZ7yI4j*A%GPQrmn2BDe`Bp@6xSHU*V59y7TFfETKLw
z`7G>KTtwssW&q8xn%!9DkJE5@BXNhvnlW_$UPDEXtue3C=bUdReEv=^_ASlc(l&^x
z*ekLK9Li9*b~t+-i1|{#BTacdU-h=?FyrhJMB)NlSTaz8XS57Ep@$urT<%eKt~&Bv
zg+t|JJmp!`xw3X{T0h?t@QN$yl6~~ECN4#TVvYID{-mrjq|_hH6x1{`gax$5V#j5z
zvgP1bE`86}^)j|sMrSWtmw?`;d1OO)jds7Y`!Hj$lKu^NIaWu=kL=AlD5f0grhmqs
znu-Piz5JQNHv9AZ=|PJR4*znV5n+CiWvCm={^lOg2|{X#bh*$9k_^**R%JKdAL()M
z8@6RfYN3M5x8@Wf_1e(xPSywC)5t&&$XAUS>7voOQ&xo$j6B>+5-)YtLuBusj>N&h
z2uqXM1lW^P%N2C9kw!3YKVtSepVKQw*|s_8@>UW*l&V~YJW6Qzcpz2F&SGJmaWy(>
zK(iM==;af|h<T7MZ^xgaQw^-dtN4y!XTMjI{57}m#hpJjw+mtWo5H+1EYGxpSj=ou
zX(XR<72^EvWw86Y4%*iO8d&BqZ>Jo~y}0$KNBVEHgWFAVDd9di?Jpq!dkxC@0H0?k
zIa|I>O2n`=18l#-V6gL>`6=$Wx?*+!?oUDHkmuN}qi&9YS!&Ol!H&0?`wbWU7Lw8Y
z5&xz^@cPrc<F&3KBY*;#rS)K>F=IjngD351SNVPNxVKohAj^Hq@k$9!txv7=)6H3L
z@JpY$gxzo4ie#Nmi?zga{66J3SrtPRL&LsmrY?3QPvuz8rLNkLab>kz7M(}QPfc2S
zSGQ{3%4s!!PnaaB8UwricDBUS{h^*P1ZHt&JFAKHT0spp{RpDNd&{xil5|M;6(v&*
zt>zRWBN@iQqxIba;FiAVtZdsM1)cs#XEp&FQ{ON6yV{|8B%p>g6nv=|>n|>xbaOqW
z6qolb;H+{#A*HA1fqx?(&IKGcj<RxPToq4M^2gWTZ>e?2C#&8N4@}3a@~*DaYhC*g
zva?lnovB*gTUhV(hJ>Jd^|_sesdN^3orT#G{%9{o_5W~4))p2^Y&8CD>-56FeUg%g
zQ%m;fSGmK}nH24c8t&{jdW@NGX^FJ(sj>H~0{&gh3SxEhuJN<z-j-R1vHq<$AXj2_
zDCvI4NKSG7N?{*t-W<@LvmtL-R|rA$;l&vPF#~R@%$GY=7^4;IbiPR85<{~cKbha}
zp_`o~hA<(9mkAIHmNd&UdDmknOlQUsv2NixDStC9FB`Q}3ZFIDpG%)Hf9xNl*h^Mo
zLVPe)pnL$%gq@9?%crkLV8fsS76#ZDZ@eTRiQ%Cu%A8WsAyjOvMIMu-mvvxy14cpx
z9Dnjt41ybU*FjZ_P_cZ|Zn^gTfgC@zII#a7TE6|z76q}s_(KjPm<N=49j#se&A?nY
z@Y3e^z$6p=%&%97mes}Fq*9hnM|$fd(OffReYOG}9a+NP0)uYvz3x276gp+Y&|*-$
zR~RP~N&A?2Fq&he7tkjBJNGWWmrKvZgX7Zyp#8=~M=-hvJBgoTd_8noqqoLEo<bqD
zQIh3QhQ_s{fAyed>Y;oscs9{V=Y0}{IgL>hWG?;`{%_p$3bAo-i95G5oc;;X-et?p
z5&Y$QU{|aP2V3m&oP-<AM?~aKXHpzJhmk<Rred{EF{bKETYtSm&__gt9OLi)^}wSC
zz3-uOQ8IOI8Q3eows8}#OW1J~zN)jWhm-R+bC{VihpmheBi}Rk$#8hgMrvrWAI%sB
zEuRa`AMn2g+O?sx;f9GEari+ypokp`+R|<j4X~<<LzK^ISM`nDIn}1(Y?hw?9)#sf
zlpTLOiyE_ewV}^V%STEw>AqhvLQ~*WQ<Kgpp0JKTnFG}8drQvmqIE;f#WMKBzXq?B
zc~O6I(L&7A<NRa};bId$^DBqxge<CUUHr4Q4$~z;dL6}#znm89bz5(*ZV_V|N<+76
zm7r|QO+S6dq9K7<U=FR-AL9$J5vl^JK__Knqpo5ERkN$>?@VXgn8;xI10EO&5FAMX
z0W6t@qR6KJcj*cYVJI(k^eaKvBA<SDtg97^yYT6>cfi#_m9wr6dNRmOxTqNkzIA-#
zY)Jx)hlz01zE9OI`eqI0V?6eKMFmT-$dXXqOm*DJO#K{eGCh%J@}|W(RQ`126S{~A
zg_AT&6@HtJyIY+n?vcd<Hv!=S-~OZb)06gsJu00!irgk(o|5_ru7FO0JQ-{PA+%v}
zqdT6L9cIY@sk$Z(2v|f4>qDP@g9$#_XZ)aDoQ7k+IKkk6x#GF_C(UL9G5q};pT&e~
ziXm<&0e*!akhiC%rVzFB&mdPUdTZHCE(Rh`x^(wCUT19<`C`ddzl5nNomdn#f7!=$
z_8t)M1mW<&<hRAAgJA41Ye(}B2%a9tdt;gY{Iv|cr<n0z)cFd##p!1o_ZMwz&U8)}
zGi*%HPNnak80lo|H}eKFk+Tl{>I#0g1fjd!?6OuOxx4(X#w2!r;Wv?RWa30soGXsm
z{o`0^SoMEN^#|ZVdJYykQ3M=^e|Jt?gV4IJLSW$|^Ih{&eBuEv?PBPcw?M#G8KfT>
zNeRvma{BC5D(Blhk5wPRf#5dI_d0cTx2%|GDdGIn6@5i;&Cy;74%GJCA1>crUuylr
zz@CNBb0_WvL*I5F>ba@e%mc=102=Y<E}?<4l<IfE5{@6+MCcEW{S&nmz#Q-6#JM^L
zb7UyVV0{UekVWh5w?2MXU-_jN8AeUCMAAHZGoPtEEqIFhgC>B-1DB-kt)V0Hy!x<)
zcDkAC>6AS!eX79*Bj*sbu)bxD+CR|m-cI-NUsk}LS`Rm|3P+>r_m~Kz9*te?@1)&z
zoIkjJroJrq!{#GPl`iVcZ|C(azX^JIG!z&;qdpPRO@feiV4hNn({m1ICFu!+BaMm(
z;HL<URTD<vGJmGa$KuM1$1;bW{6~I@p=cX(Dp+rAt}2Av5N^;rz7mW~a~?e-%s%W-
zu?D;8k&(nU@*DH2m{mVbkLp?_iMD2o4#BRTM_2mIYRFzqq@pdLD(0PAS;Zlxo87--
zRDj+LzAX22%r}2IsVp!4k(CaGj_bT`S!uYIbM;}Y7qKgeG$a9A5Cw&5|GVlaAT;;?
zJCTta7>I{#e=olpmvbMDL&I2&k2o}7XMV>It=#Q@^f;Zb3M@m}`dkZDIG#8}Fq_8-
z;`-91NxS%uSYTiF1(f4T<o)1G<mF_lh{Wjx7S?3kpsguPU_1baFU_DSEZB0YWgi!>
zKKHMTHA_v3;THb*z>n}$Te|TbwqLLC;MB;AygatGz}uSiIfbe#WwO)h3myGG9*20{
zxNtZn3GFxjXM11?6GIUO)CxwG&&w_E8XgTUlSq!q9*Fut1VmM<?_+(&4WXwkn+>|z
zDI|&nHgPVQwB<OWDBMMuE<L^h&+2|}XpUizkXCR6X;$F#zX@GTB@GjbgzX%tbSfo0
zVIL0x%OOS3QU;wYEPt&p+}V-e{4a@%!{4l~HWvE`Fkq}M>llNj8q96)$cg(y-vNCM
z0210nAddpIVb{BxSE2?~q=V>m&hWphtHLAtN3B)Km_hslHrDe;yF1STT4eth;g6B;
zO#_b$`+<hPgr*X9+HJIq%L{Xmnk!JMF}PQ+IK^--5p!o>;dyfCa^f-Uy9n~&+oyJG
z{c(;*O_`&0uPirNhqG_>B-Ww`>Lpcf=VkGSV+8&Q!;}3G`oFA*{ycdGT$&7Yy)Fp|
zNkjGb8+4X-*RoH=>}1`4IY;V5v*`Abidhu~X{adF4#B0x_%Fk8ncE^~+Y>1fn$WeC
zl<J5E>o@%`eA=`kV0lf_lXWekRH23!^dU^pQ%9z(<_YlUTPH3kIf64Iy_(^BA<Nt(
z|7n&dCRb}U`S6Rx`QbYZc`E|>Pt9Ai^4*K`;I_FEnE6mGlR3@2U=a$`Fdm}y`G@2q
zCY^X?ierGoMD(PU*gEQF?Peee`vg7KzvYtn_)j8qvgh*DL6SCZ{+~R{_7n}`oiyy<
z=4TMZ`|+?b_QZi<f2Gki_g|ZH*L}{~)O4bzu-&^bk`>v8v6aUa6~%^q4XTM)(xJc)
z1Ov3!X`w#ptkFL`X1pHG2z$XKMnV-I>!d%iW3Ul(klspsA1V^!M(F)JCDr*w8_GoB
z^H8<bw4CD*Ol<bNh846QDeu0ZbKTWr<ZkmU6=3JV8QINd4Fy&z<|3^A&fVnfeX1zt
zJw2cwt7u#MsH;&4uXqZ2x)cY29R?Fk!F>8z^y*>#m2E#X_II@T%6j%I&mytNdAqkP
zD&KEq53M~F_c{u&T8Co$xC6J;;XKK)Id7<%%P){ABp@JY6$JP?sPOk(!_;cz%{KrT
zJnD?2<o!Yjmkwq8u`k)oi%dLZn<7&obM#aANkQ=LSdUlt^{RYR7sg|{x!BISb&)wS
z?ogw=fF?ea8PxqgB$B+B|1C%;5)QUlz4RUYx<3WI-AOTgmo$>_wnhhRdvgaQ5|D-;
zMtWCq04(x<Ygl;0>MeOXFMrjyY1k!=|EKb&@5pG?Rnj{Wp8LPG(lVjX*9s2oXmK~u
zYh(iWOiVkN&2fF9**z&HUj=KQnx9BKlM!C+4CW&@inM*BKc9$c*GAW&dSEFq#V^H@
zX2U#rU9Fe{$A$=aIDDN0e*B(7^lZ6i)vR9+&iUldBPmFcStsTs$PiLD5IZ|?ys{{5
z&71(VT20ZlZnrp({}*tC|JLHR+|+yO>h9JgBOPt*_o8oynqrvhhbKQX3-;g2u-^$5
z{~pSEiT~uhy$gxurwxBJ6=jGwYOiUNo)oGp_Wc~L|50cBx9z_sy!4JuhS7Itkjn=2
z6CXt<<`BoRoX&~g_cSXP6PRo)Z`VA^UM%krdHrI>XieqBZWGUTH%3l8jC;AXAH`NZ
zV9OQ5#j{QeP-E*NQ8UkAG)iw00-ybL$|nB8EYoUm^W^Sg+LgG{d-dnlM~*1%-z4tU
zj%_>K3@mY`{L`<0@izaSvbcIED=L{u!ai7?SF84VH(p!x9zKZ{a_09|`jmWRCRLGe
z5a78}vt}I<M=4EI<aahN5iUgg!;?F@M?31K+mH*%QJ^FrT<tMkRbjIJl^UtIST*rp
zzCaX>%$-KVaY$j-`p~(LrLGX`0x%zI>t=VKj{N!CM>aD}Dpjx$Nu&Xb3eK;CHY=eu
z0WD<+I2DaH8-MRB4<w+*fm^#L!Uui$e-vsK3)vv$-sNDF0PMssmVztdtg{m*sEHST
z8Y!BU;d1ub93ra>d6<WlCk5H8-}%$k<03=i=`nTNzyTYYFR_q>pJl28TaRwhEYjYn
z-{}<?RQSJ9zIix|DJ&TrHtl-0-HPBu4TR9N-!zkY3)FVW&Xv8e!^R2gdWQbp(NM;X
z!$j_mR&dD$DNy?{XcW0rKOs_c{2yT3{$wwixk}_!X0G@AUin32lWse{<lKD_W$C<A
z>?+TN*`t1+p?PcI5Uj(Z)k_@33{nOEm+2=zl9;kCRh&7kSf9!hhQ@H0?$YZ!T|k)~
z*Ios`byE%Czqq<m`~qV<6v`!6id$}r2(LnKcV37ce-nB1a`f5a>9|{te+tG%ZcbRa
z`~|_hwv_e8zKlFF?LiwAi`A&NiXiXt0u0i%4@Um3y8CoZTn)73*ay<P{0PD^!-u{E
zb2gwF;r#4Iazj6P6>lbT35M#2h4R1c-||aXKT_dAhoh-yvhPB5W&*n;tdstRu&%6a
zM)or3^|NpNoj0+}Jjk}}WDh=<;(o{bL%Lc%ImX46(dp9_3f&d!a=3sp8?g{yq5I;h
ziUX;H=lN?t208oLC){P1=Q>DdTPJnm?s7>|3Z^=u0z|$%f0@h`-#GnvmC}6WBQxKI
z?`fAa1|}JOd_jHpO!Xe401CisRpDve2bE4EkA_bkncRtR!+LyeXIG@FOCLY^N$7H5
zcJh;vL=v<)iDk2cDHoEIn2R;6RfUF>1c0ipZ*$JklQ;9-%N-XRhD$d}U#D>0sCw~R
z_*x$h{S0`TT3%t=OiwmdY_x)<ECo0)<=^JS+U?S+5}ToPN0xfJ$R#1JB~7I$uk9YE
z1y}w5`bY=@L~!FGEurY~IvEf}C|iiIZIb4v!}ekGEK>%l_e#LY&YhEtGvTx9vqI86
z#tK-%#)t|#NVPcLX+KK*P(s3&ImxyRQ~0+|x@?^_-*Z_yg{gsnkTvKS4f3|}1-z$3
zbggawxOivXHTvd-+>GHfWY(CwdpxmCiFt9W3N8r1`~fSIM%=b6w12ngH+RjvEBZ3s
zH)1cmLUBs>oR2NMvUBY@$@H&#l09oiA;~&TGSWaxkium0!yUR>53?3Tc&hA&fzZ$l
z68PG4LbKp=E33t?vL*Itz+|&jp&7*Zz-ila&eNkgiHC7sN(wM@fEXRx$8Aw@P#P$b
z*gQL6xP;0ufYrxU4^EwXWpj3{K2lA3k|N7r$^_-);R%1~+1iV9_}!DuS!cL3BBU)g
zz#$N}7`56_eK4BADBDT7Kkml`Ch57L4h#y)mbbaq<9Ya~%=hG1fjR&ShghRPL29sl
z>LFu{7E>9QNgqB&A1w)rXT$4W66^?JIlVJdcCh+Oj*0}PYF^5RMizP4(@hn8q)-*{
zSECi}po6-;1ID-O4NRAGK|!{6-_p&o(WE!`w*vbRAc_W;LP7pT+yQ&1ufpvmHri(M
zYKy17Yo(y_Y8dI1Zu|(uAOE@)MGejzreKo$z)3D)-CMDV@oD!zoA4ZSoA_rR+wRk|
z*IRvRG0rIi^x-L5my(+Z>=*(Nz-EPes>JL~@)Z<zz!ORtYc75}&10LAmDI!YFC!K<
zXK0L(7S8+>tQY6cSfCW6&cw44setdT+)lb%=13S)GjV4Dcl5`mm-jKB)(F3UjS=@p
z`wR795a%rg0a|l5h7=6E%!GKNz<e!;j+D9Q-Fs|JIs80C`pBs}I&yO+ely}GM~jcL
zO!B<b=AAVgHkPL%Ow-pQriM@=r<cD|+i(FzcH6;Vq|^OCPR-s5;q8nk-f4TRzxDd{
z!JC^ieG7ItaTE&(C{PE#Wi=9EGkv^wd}=Q0|KhB3!@);Gm63;)*&2x~`1xOLvZMu`
z7()MTk^9--0b<7tPOW#n$ybC~-*EoG`AsJD9@undAJA;zAd4tmfJO`#l51p0Y)0mG
zMGWChltC7$QJdB^?$=vPq+vNP@iTuL*H?edq4iemof^cNkxWu>73YRcnF#Ah71vu?
zj?U1+7d~F7{Pi$zImadVh}uzlJ)FK%=yXJ+`_H<e))|9dLk_W(_Wy1RXr^fCN8Cab
zMn$szpNHXp<Z|LooFaXOJ<#LYS~;No_wnV=At)=)4_fC?_`-?dP%11tQP_v_Nmb8#
zoyLu&aH8|KIa3cpS|^#2g}oT&V!b;NpP3|H{D1L8B*PkZaABT=-#@<@ewUNwc5F9Z
z+Fn?=!2NuMgCs`f3(jupq$tW}o~WdYViQl`&ItlrXKDy{2`&!Ydgmy81IG_=uY0?{
zpnpJp{_e3flu6<<1fWm?Q_ZY*=qY|tXEhQKHT5}3BA0Kw{FT7LhUdMm#GE3?7V7kn
znvSX$F!jlWPB_|}ccJOmVi{Yv^OCQk-wopk0sl~5Y1{K4^UEtOyBh}5Qw)_<09a>-
zn_#e#4w-@t9-%HBK{lh<E**u(=Xd3Zunl93pSP+cpr>})Sf+ROTkojxPEr4IQ~uiE
zJajpKi}`Op_1~(~3e?JdEPQE;9)a`U?=ZeP$f(|uxBXA=U@#D+3dHdTaNWnLiiXCq
zhn>6SUas+LK9t1rSGO`h!3&e^e-*MSPD-*PHw;bSjxOrMAqgXe%Tf<nX)2u14VGA+
z?_v8V1o~9(tvpmvcU*rq3;CT0C`H#y-(gn$&F~{AARa6D3;@q@CH&VYC$8`#f`73b
zFrCKrX8!N@+kj#;+s-(T2`L`dcNyh#o4b2W><6Dq2V8|Lq4p3L^H1=Rn%NGpAHs*Y
zu;8ZhVCj78@n9iMQ}~tDh)9nr*piMoAgzX9_}1p)Zt%$i{FM>_<0p$F4RK+RiHBHI
zDUiZ8m4$zL$+rdkR2k3IYv#51mpn6&N(#zl#`q@Vo)x@%P<=XY`v+b<ygbA`gb~c_
zGRU+xfw~TsnMJ#ZxC|;h@)zNPhD5quoXo`sh%Ixf_7_6VOIZQ9IIeCo%!R|Wu0Z!6
zBL(Q0oWJ(oFQ)499=E+eQ`6^t*T?UAmEy`ouGraMVUm45H~X@TJvC=FQ>`zQ?^n~#
z$xp9SH?u$5wd`uV+T7G7FN*VN(m3l@C!|}qswQK_;}@Lx$rlLlObsqstO}h~u%A*Z
zWedyKpnjv-@o%#opDIhYp4mc@hdb7q3E*Ih3>}b~FqPi!wYG-G@*p@P^4K-17uS03
z=VqNvuA81_W(P7>a-UYj*wFQmRE?9vN-V7igAmU+02n(6>Vld27K6J5s)E(FRV1u2
zu>Q$m)p%!=$NbG(>!kMYZ%9Z<+|`}=*&wr`a_3wUNGFY;z~G<U_IuiwGU%7<G1Bv%
z$NO}ug9ywr&5Mx;IRB|u6Z#eQfAKj1cq#;G^@HdI1L@ET#<*A>w-K5tCEEOYxIf8m
z&H!>?+RtOObuWq%Wxm$JD<HMr?qs&|bzZW)cD%=;XYwuczbALSY=YzKl0HaL!_-U8
ze+2$wJJ_A}z6Plf{nvACK>Jy(Ic%S~kcwG!j}1Zn?8=A$gs=SQ{eHE~FtBvL@&_kX
zj{TW3+dWR0hkS95i2SJ6+sXIWVC09FbnE7<Qw&<lIcrNj2QfQRK8Fq(mwop;LP5R!
z#ot^)|BQ=+(64q*^fpqNfm~)X0S2zP_z)cL-v+0J{PJa<4}?69R5{``P8(t6x?TLN
zLs@qd*WG~3Trw;+2C5vsex01BNZhk@zZR$-X=@AskpBPe0vxp8*o2?^>b{1j+@ggn
z<Kl5dqYay^=LIo?5HzfSg%MxK7@YtIm{Rcco&=U}puuft+LZt4{{@}|Vf)dF*`=pe
zmIN!@B_5@I09VqHHvPq5Vl8A68#<F+uk4N<`0a+CJsbB9b|DW!8SqsEpxVoTFMhnE
zn#z03nEYZmrU(EqA^~S#h+AOl9;k@HBU>D@iobGB&74(BD;F-9Rx-OH94L2{)|d=r
zvL<O_@@SC*BM)`5whepd;i1+ScSai?+1R`9o#vrFWPl|CQU!hy*fOwFWB7i7?_28w
zM;G{kV~_v<EeSZsst!U^BA`fs|Kk#h7*uh=fQ6z@F0P#RvC}H%o<6H=_6c=GQv(*P
z(KG#z7AwHp&f+PSdb=ssvgX}^0}sF2yZ>NMG6t`&?FalafXn=Pid<A3e7Z?J(q4Yx
z=mS4+j1qtoM%Wq<`v~~&3q&%IeRm)OzIaV8-xKPJDz02nJ^Q?QWhXC~S~9Du)LFKS
zuL4y)S#%+QA1+Clx1q?89ow{Tu<_Y#k^O&ot+z2UWGCU)wmbm+YJc4(=0g#U4L1QW
zcuoFeTI=)Sm?i+gmo>l>g4j3U$0Crq2r5#L$$Ii$I<sWlhfk@PzT||GsdFb4Pn|Ko
zXi_+26%}Oqd!onI8t9LuV+T4Dox2amJGM0sb!>Qlux;~!SdYy-T2%zT3j87os7OJl
z=}k5Mai#V7aLf~c6NX_8m{<h5(F2)vKx%zrPi+AJ!BD^oT`<3V!nt$Hrkyq;JauAq
zsHUbYSW#UXtSAcyO5~6>1p5eZ0%KrZk#uB#N1|ir;dsZE##qP8y9e8M9gYvcYdVV>
zR@DAF^IrtD>evtH{b>ASTI=)SxFG<b;JyKqJ^~Y~fU*u`aU$@=bIKL*kW+a$P&9W^
zamB3q;;I>SMHQ24LX{J%LKU@T!P0<*fMvl7Sg@?jgRz`*z_J3F2rJwFU<E9|X24Lw
zPDT?f5sll)!ML4_#O*{hZYTO<b}}-QPV^4iiN07m*%M92y9UyUu4p>Z6HO=K1&HV`
zQ(9l#tH3WK0u!*CYJ1ZTzGGVJ^WnH604Mmg2KZy0YakMV2_eYHz+|KD$8VN!EY^Xq
zn@EJzvvC5|C@8Hb9#iJB3}_ViDIyR7tvi<i-W2qvlX;G5;5*^CBmltJ8gTZijRKpF
z3`~h(IN+y<KvfU1&VGUl1hQ>77Jzu}49ls&F3UqjKonV-jOQO0;0KOl0&v1G-2zi0
z@Jk33LCDPhAdx?%{R<@k85xKT!_)$x0A*qU=-dG+p0XaOJ_b`wuhRU~GdX5~?}X!?
z0G!~%EpYax9fm5)fI5}|T;}tuw7<#)pz6WbQ9Krd2?02JQx||g7Xd0G0bQJlrY{uq
z$CbHHg?|_V0DQXz&R$0ZA_3?KK}Qg(>-_lt!_oeHpfsS$|JS(yA}Q#Ipb)U@w7pG~
zU96v2_xwXRjzIGdMF371VIuHj8JKLQpf@%B3(@{!P?3P2jzC?fpvq0q0bQl(#d8qH
z)ZYCNjzh5gLlS@!hDikCIi-oIz0O)N0lW<SGV`CRi+C&xGVnWlKdyj|3`_`u%0qT9
jnR%}Q{BdjUQ{n#s>SE@0BY|Mc00000NkvXXu0mjfUF_$R
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ee2dc40563a1e068ba73859657fa785304cd9d06
GIT binary patch
literal 28756
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
KYM-At#Qh(V0HJdL
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..448e47f947d3da4e023f69279e7f8a830ed5ca75
GIT binary patch
literal 946
zc$@*U15NyiP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H1120KLK~y-6Rg+CmTx9@-pZDH7!wfLY3=D*iwxOgH7e=L);L1de
ztPBg2rbg3*l}qCv=z@PR9g}e*cH5mUG?pf{O{Hnag0v<UsT3>Ip-$*fn9H5H_r6~)
zqzOIA*`4R?9$~HJXy)hVy-X%^Hjd*nj@HvsO4>@T#BsbDhT*TJQYkvR7cUQl5TaZz
zpYBrX%Im!YZ>4+tN#}B$cv_`dt+KWK)cz12{86*^Lb+UiU=KlItwjhSipAoEH+!-R
zg|2=ts~r+uX@WRrKr1?f7CVg>^!@#a?}O)ZG2wo>u(0s8wbpt7<#PG-gqQecz|DDb
zXOA7FDfIWV@n{`fhfyy<JqYMG9_M5#q1wBb4$hyy2i$Xo5Z+)qy*QE|9`Qnn=X!Xq
zi!p{Lo15gDK7+Aju<0Y(ZLV5NW_;Xf1bgp&b@}pwlg(zQUQ2aOn!SK(t%g(zgGDMy
zv)Lrt+XLT+R={>o56wa!wll{&`My)G>&|#esVUi$!`Y9?<Z~!2LK`rapxq*lBI1rD
zk4Hz@>F%OnG=95HG;|ETxpBsErJPo-M`#ox=@A=!SjF=fyOh@+@_FSh-`>1ItTp?=
z0Y6^5N+1;-N=<oMYfl=@)^?R_s*6H42UdeMygxI8wU$`M#7Yula8gO${qO_gjwIR`
z&k3}y7z`t0C&?6giG}^YShOopF3^#{O{a*g=Gkt8M$p8{2w&@E4_J0<Rl<Q`o^1X@
zZ+8!wR2qcEIu@-B28+TVg<+$%MQAnCyGf*!zj=*DqjEor)=v%%Pecx=q)Y5MSfw$>
zVjR%M;72X|R=~vM8^n&~_RrU!g<-hpluD&&tKI%Y{<)@y$H(xp-Q4+om9?!+B2VyF
ztx8*19{*e8r&~7&UC?*$n1{aqX{A!}9e`r7_~2%}{)M`~s+F+xo){)GG(aE>*DJTF
zw|tIGoZ_Q%A7fXR&3E<s#igaCTh?0picE8Jb7w~qi7S)&{8(`OIPF9NqZDqdMS6Xm
zUuw1OwS$At4q@|(jW07hJKLE~r)RX*Zzq(Rl2PRN#w;tPR`>V!udS@CH0=@SKhXx{
U3^ThEGXMYp07*qoM6N<$g34vUH2?qr
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c1a6e99f7f28d66f4dd6901f4c09a2e4325ac3b7
GIT binary patch
literal 944
zc$@*S15f;kP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H111(8JK~y-6Rg+I_lVt$LfA9Cb?b>Z$OUJg1324BT5lxs2GsJ|8
zhaDFZHJA{RCA%9hCR{x1qSx9(JrNEb)RP`GM$`nzB9zh05p{96Wei$2V6<y#zwdkd
z{_!A7#_#<6p40OP=N$W)pP!dO5S&&@P5Rg~N+}mAT~SIcMNxFSSS-f-^J1?+2q8+P
zQoi3a-@Y+Ca4OX|NN<qkX#9}o_5(H_RoxG@@ULpyT`ZMK%kG6J_vAvMaPj0o>hhqM
zk=e+S@HOq`BiczvkjOFI<HRS2*53U7ar<^WH}|m+;!Ee8lK`bsDL;NNeR(KKNZoqM
z6RjB>8s^{CRmgh07D%?AwHfjSAEa$U2hA^@pFh6{Ec!wSIg&|VJ)Fvo$}mRyKGK(1
zYuH#{C#Rc?B)W{aCPH=i<)P+mU&~vH<k`}dudaC6Y<4PtFf(E5O&(OMbhW|a=xR-~
z*(7c?AZ$V0#>5c^=#VpAW`bwqzVA;<t@V@;39PRPayc{(VJuijJM5s6F(|-vkv8P*
zY(y)J8S@p!^iFz7Vc&^J5?PB#CQ#O(tVLPF(|VoK^%ds6S>*FySD+hH4<jxucIfYR
z=s{0OZH(*!o3$$0RGPtT7MuZRd3So6{_ZYAtqpRW8kmrr7xURfmq2#WTKlpUs^5JZ
zz4ywoV+f^CT7&q1B-Zz-dk5G_p2E+JaiqP5tNl&V#554Jl)WQ?J0@(P69a6luQAXc
z5Tw!|z<B~=z~az;4}SzFsYHstc$>*&gw}dV?(FQ8mx=#*eLQy}_B?blfs#H>JFK->
zPhhN|6-Tr>A^Eo^u)^@;t!uR?YW(aKi^X`e5q=nL-7};4F=RHw&AZF2Y~Cl9l6%!E
zp%AQXZSm8M>qNd!yiu_$kJ}f@<#NjdC=?3I*H*Vb()X7wo@3zX5rRV_v<3WDzQuN@
z&EXSy&b@yQHWux7ceg%WSXj8>oO3UoX?Aw@^k^Wzo_KZSxJ_r+^#Y7Fq@y~nvBk|l
z*J>+Io?mz&+n3(B$IQ%3Z#tcx)>==dggs-7_Uj#0)><#^?(SZ#R4PrkPx=ps^~c_I
S7%Wc!0000<MNUMnLSTX@g1sRC
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e429a402cfba88ebcff6eada2d1226557c3ea736
GIT binary patch
literal 946
zc$@*U15NyiP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H1120KLK~y-6Rg+CjTvY%@&%N&s%mA-%7z;%}QfZ19jcG`+U04^I
zvSg!%xM+%D;ZEI{xH2I|-Hw=!iK#ZR3pI7&!We&IVhw3SVI=jB+LoVCpqK*fyqW2|
zci(;Yx+w`g>+gKKBb;;WWpZ*-`M!TtYdxf-J08ceYs99kwVscn=*ra8RJ?aDb`OLQ
zqEspkv}Mz;p6bmXY0c$n&KBqk)(LlRvAVh8zWY7;dwt8DDwRrC-2+kW%Ee;w)L?Js
z>;YNG_}Y^3EcMz3^~B=KJe{QC?dO-D{`Q~xm3U&}Eg{4w&N-(5N~O}k;A737b!w%O
z`WAPLVSh&lH~+m3Jst-;7609-)8ScOIh15f-1w+AHZ}{)dO`?wpwRq7UrW&A=@_Lv
zl;>fsWo3DZ_H0O3py_H25w5|{Wy6Vqs+_-_IZ^ub{5cr}!SEBk!B7&0+*)5JF$N1H
z#t>FQ;@UkhRj_r^q(MG+pLP*5`pnLt=XoQ_7&9zwhE!_&d^^U0uqjwez0pAH7*YW)
zLCJ_`4@Xp^n8SsXG;JA@N}A(QqKJ$|WSY>aMH`DwEn7QxDP34#;=MUO{9*xI#NArN
zJD)db^XfD!Gpww0P1;IU*ER@Rvh2?XU>#V;3nxc-uInO6qDhSg5z*cj^TBHdztv!j
z@l>^@FR4u9rJl$85k{kp0VlwLl^!aS(v&e^QxKY)w<8dmdrnflZ|4*+m*@({E3mS-
zL}6bWel816;E-4hQp6w=Kr_1-VO>O_Yahm#d9}U0J@eNMbG^U6Fc1rg@tV+5;he!b
zi<Jh1W~Y`A)+1hh(GppY*U#lwqbT}OPEAe4D;u@3sB$gs?jJz;0hj0hU}1TcSSl{x
zXkcYRc`4%k3pMZ(&Rz`CrA={qW@e@;0gA=q)nCh7Z<z2;i{~ix^x=0tO5F<1d|zd)
zqB(iY@$s8k&iqnHznSshot~cl%{k{DifMd&{Al+h-j_$7>^_uApK9Xs^1<^|Dj^GN
zlCLiXtBafN^aI&GRO2qAqoXakTyDe|GnCEPV_L^Dtf#ZanE6Vj@>9874&5H<e^2_z
UPHp92g8%>k07*qoM6N<$g2J7>Bme*a
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ba036f47d33e7ac9a3db80ccdec293e0ee3be034
GIT binary patch
literal 962
zc$@*k13mnSP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H113yVbK~y-6Rg+6-oK+mf&;9N<olMfnOq1!P8cjoL9+3D7jrB<t
zp;{MNv{X?D4Okb>D(iwsmO+s?$ftr*sTFZ0xRGYjMF_~`(Ig8SE6t;MA*OkKU%t$p
zd;j<TUD!Z+HfM8wXLXKXW*pYw;GmyQr%!9GyQOq5YOT3krYWuUv{GukSS(f!=fy#R
z5JCh&&{lJle(r3odp>of4%Nvl9&cX7ZnT1xwRQgeruuVzjr)QinB|9{e*g~;5BIgV
zC%?}p>ivvok&p)Q-Wt?~L$)dlEv*>%XtC?JTk&|M^5K9G;%jDR9{_?NXlrfrzdIp)
z-^3f(2no5|aooH6H=LDdI_YEMpBVKyhYN3*gr@SBdwcIq0GN<M2tR+KYNRP!*XTP1
zUrPACgmVr{iwnqPL*(-s`Gyb>W!xGey!=Y!&E84876d<D^D>!CPy4B=XYKwDR#w+w
zh~OMx3?U3dsLBo?BCv>IT^X5U`^eT*aQ>aG4k_h1pNM*FrB+B0B3*k7<N(1IfI}RY
zVRQvf2ml5$q0oIsA&M(#X|b@jy4#b|oUvL$X$RpSfi@1B9JFzGu(geEznR0wS0?fK
z&>YxP*xpt6^lBN^sTj#5_4w9W--5BUypGJ#D&*=ifMZBWxKe0FeLe|eG{|YNr;yE6
z@W~LNCQBe9>Bq4xS;6l%Hnl)F4Q&av=@4z5Ge{=)01*5X0kB}9v9PG%JdGXl5Jhg%
z2QUe_2I2-REzINTXLiu_!aM*1v-#hJ0fYeyjj7uTRw!g2s|68F`<t7arI{J^S663k
zN5jb_Jn_^vIAH)b5NyC800vt-24SRdvClz~#6TgttdzRx6^q5n>WX@QEBwQ}eKExG
zCc=#ygwaugOAy8<6s$D3J*)89&>mdE;QF<Uy}uwXmrA7w4<{`Og+k$npFS{~<+r#r
z`#RrSd5ItF_wc1lZG303gG1NK|CU?$i?5!evu9tu3czFLN6*yX-+#J3r?0<xeygMT
zRD{MS_rcIuT^6`I=i%31GRsTze0gkaY?PVZBX2xVZ*OmPDwR4%MBRym=^-*Qirgd-
kP4DjRj!aEWg?tG54@-sA^r!^w`~Uy|07*qoM6N<$f(o*_jsO4v
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..411d7a78a0a3c1d71a6e9d73ee7164eabe1e649b
GIT binary patch
literal 956
zc$@*e14I0YP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H1135`VK~y-6Rg+CjTvZr`-*fM|z|1&5bQn7n5eY3pZE8b0YNGCJ
z6GK9pE^J(ol60f2Ok8!L35y!t(OFzKkS4m)CQWSIRFf)(g#%2`Dyb#3A_ST`3}x<R
znDg_UbKHob&-#6y-OHSFILzeaBu}T)XOvRI9(S)xDV=OlRVlS3gqSav%kuD^9RwI-
zEDXcJ_O$zE@TKgjY<nK*L<T|MCTh_J{@&Pf^WTZ(-Ay+ZhT(7SKan5EQ&Ur8y+a){
zefbp6WekEqq1oI*M{LoP${~?AtnZ`0PTslIoWCqDf5;g7!a3(S0EA&U*gKS%>Cbzd
zbPctC2whzTtgf!$S@<Ztz_IhVi6aGzw=d{GQ0v;oy^9L~7JSAS?<^*64;;((1YCdz
zKDh70I*YZnhX^_&q>n0e6eAe4u>1p||IOHY@N4kabokYEFPqJlil=I)dG}pxY;Hhn
zf^~pageZ#8l)KP~q0xl2Ed;rJWO5QOkM0clzJHDrQ7O~C&v-UQp#*qA1Ljc?b}xly
zvjw3f6k{;ZFkGPLRe>m$C>%F1COOQVuU|{%6<U!+TSmkB`|wU|!$m37zpbGfZh}uU
z96jEK^H;hNJrTI^aSLa!YWVG)C2o!31j5Q}fc$_)@kIr|0GSp>u4Ld?3ZxaJQP2?J
zM<hl*CD;ssh<q-Zrn0+@cLzpdc%FoY0YGq$fOdidfwd6=7$~N&wJM;XK#_-5Y!^9z
z#rhgts$kfkcNhvM3_71vaLm9#!-8O;LC`QzxW6bMtw1uL0TC_ndc9t8Kea7)y@Hd<
z5-cYuMsQC5A285}pJ>F9!0Goa_Jxm|@8{Nq5VyT@xhxxx+}IztI&}Y8LdP+}>~+HL
zKN2J(-1|j9I*t2Pfty$NprBEi$(s5@cBxXS#LPJd#u%HJnE0UgjooWQ7wUX#MIzND
zk<1gO#~V2Rxrf~I22vO-%w){+jb}cYot^v4IcJ|b)A;!KnPivxa^Rhvq3l46bniYa
z6n54b9^dnD_v`HX_5*imZf@>p=bU}&jR%a5jwTa{#5p1wW`QmdX}=ZQMIu^iG#cMm
etJTOIlKurBK+b`Ue8F7+0000<MNUMnLSTZ%eYC3p
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..95bd319ce13d756a20341b7521bd554cffbe54b9
GIT binary patch
literal 1055
zc$@(r1mOFLP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#u}MThRCwBA
z?CDv=AT2G<z`*cdke!|Fgr=sF^uK?9|G$0v@x`-euO@!}{C)oK-+#U`GBUuyj~~Ao
zOii^ItgQ4H00M~V$B$nO4<0;a`1$kKmv7&G&inrTJC~-WB9D!Yfr^QV)?^kI=3b!T
ztc*YtK!(6D3;+ZGK>)u014Kkn1^4&({_*ki{s#vI#oXNG@BRJ!JR2Jo2NM$z00II4
zG}hMN*7*4P)cN`R0Q>v<0P^zn02db$03#zD00M{!XvlJ)nWmpVe`UCO^$x?+r!OX*
zIdkpghYz2@Hpt0IG4Swkdj9zFgZbC5Uku;A|72ieV`Gq#5(CQv1Q3&qjCioDtoX`b
zzkcif{ri`JgM+==+S<^DmzNvpt>0ipKyS#t|MZjl>(}oLpFVzJ;N|6H(9ux>%K-!s
z3mY5rH&<6%MPQ(<c=6)RL1$;POm%eyhL0b=0yVNQynFY7;qkNg&xQWn{N&8Li{TT{
z1sq?sfm*}C1^@&Q%gvh)A6QxGYk7OyYQ28_PD@2amf`*Tk3gw^z`$Z=c>Vf4!<TRW
z#63Cp>IgG^xblzj4+9&+XLuk21Q4^BnC74V{~3HWG~^jXL<AVVef!1m@85r5VEtuy
z^yme{hc65a@|<^+Bp8qT{{8ju&-d^DPcd={G055`vx0&EAOHYC0KWeNC@4A2*x26v
z>gw-0|Nj64_V)My>gw$P_xJb!1_=-V1MJ2C8Rd}x8TjQ701*dC^Y#Yx^6BZv@#xt9
z0R##E0*Em*w3Ok?moGpKKfO6QIqZ3Pxir3h{rN&jOwusSLBK@j)g%U~-}e|qfYyEE
zWMz27$ouE+ZRX;yUw=&c{OvCTKmf6T{K3e`#K6kRvK1K0TR(mJ#`%wt>ATp!z2^Tf
z-rT07^-+kIoeS(=?*9x7%1l34{{H9eyK<F{fsLJE5<mbkYinDB6UV=Q{}_N?VEE6-
z_D6#A14EGP>8D>l|NF+q!{#cX#>&jV&(6RAq?rHyXAtH3#q^Jf+2i?Z#+LvA#KM3B
z{AXZf`1O}*%8@e+Y`^|9^q9J_GBUjT!NBm~3j^by{|vgqzZoA3ayJ455KaTYQN+x^
z08Cqb`;IXD`T6}vpN;BYW(E#m;(h;{feDz%xS9S60R#|U17L;#y*6pr5e9~z&;Iv0
zTd^=Ru>WUx|B`{>$|L4W00BhM0C0K-TKbO>Xvi&2hI=o6)Cuu0u-|*ne*NtarW}9(
Z0|4(~c&K0)VI}|o002ovPDHLkV1f~|8dU%Q
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..66f3ae4f86a864755c59d0622cfb1bec43b018d2
GIT binary patch
literal 702
zc$@*g0zv(WP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS0007YNkl<ZIE{Uh&r2Io5XZmoZT79%Y%$UVFSXEG6r{A)*rfE-^kC`LLoeP0
z>9K!-r$RAa3cUz=h$kx*p%C;S)QeO+MyOGc6l=R-OQ@Re53~ES`+5kQCRIByFqiqf
zna@0ewkVZK_lw2iTV2<oC<-ExNGmC&001Eb0DusJOeRx|pflozVPrQqH$f?FB_X6$
zhoNa2(&;q$7XZ)mV47wJ;4&Cv3;=Kez&XDXKnQ^(NuZQMlB6bJV`BrFrXd!KT>!L?
zP6z=21VI4b_u)8B6QHW<?DqEdJxP+Fs%lR>9>@6jIAmGw5EldilF1}iS65Lkm(kVL
z)dUD3Mt630vX0|iI&%235CVgPgNR0>sMqUoT^B-#rUToyVOiFd;zF43`{10zbzOL#
z_gA82S^qU30zA({KA%6RR4S&TC~zF-pksniTD!bZTCCAPVrdDLg@yCr^wd0+<u}g`
z4?jf!K-YEDYPHsnYu}wxiXKAnl5_N?QZQCl9<Y%SP}|OY7#MgF0RZ3kQLooq4dI=`
z`U&T_(btEenHj{##=uf3>`hO{{Pp!2Due)I42&@-iUL`dJDMq_pa86L8DDZa3`|Ub
zA06TQ+8TZbL4*_vg?ZO?M^#k?V=TP?O~%-DLdY>8<k!jUY{D;<`i2Vy>@6;0cybb-
zb2;&KZmviG;QjJ)^l3Jm;G8FH+wO5)_jPx7_hZ8_^2ua!(cItXrKzd;YyJIqzin-S
z4GoF2TFv;W>(3<s$fPs9YD~*=-gu<zKOXu*ocV#+Z8RD|wOYM%&Z3EvTem+RFU(gw
kpmbKP7LQHy)jMGK5B^gkEiC*%CjbBd07*qoM6N<$f|fTt9smFU
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..76000beee2f628cbe3da1bc018be510e0e7bf353
GIT binary patch
literal 612
zc$@)b0-ODbP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS0006TNkl<ZIE|Ikzi!h|6vy%JwH?=S617s(R$>5w7&@TB#=yqVr2_~C7G9tW
z8!WsBQ+WUeCY~Yb5~x&?CY39Kt426~pmN*DwYm2m1~MRJC_VEzAN`KbQCzb`<PJ~)
zEKu^U3(SV!0_P&~!MW~qk|Y<v2pA5B!}Ll(M3jhlBI1gO+S}W6fiW=Y_xsM3fVFlD
zcn!QV#yswJyDsnxI6XNzasLPS0n~xTEX(@+e%}RBAWf3QyAp`wSkEGlJDrY`BuNQ4
z1M+USo6i9va#L%)s<mDbky}v|*;(ZD=;+8Z#st7`pwn)*FXw<bj?1p=zHnXlS+Cdg
z4-O7Wz&UUhMNxS)8VS$_%+k_Qbq?6w-7Nu^z-6P+Scv1;1ulTR)oK-4mH{|`BO>!x
zh@z-6i>L>KK~-xV02%Q0@bJ(A>fe5Ee|!6B+Gso%ty$gL`t)uxnE(bbX_|(;UT+G-
zfK#v6L#31gJiwGnCC7`K%_lcDH(wUhDc_n+JzZb_I0K5&Xyld4<q)U=wpOc^t+hUX
z-`Rv=7<xaCk6GE-!79bX_c>i#^JhCtp66k;S~Wlp*f0!3W6Z*AB^v}m#k;6fOfAbW
zN|7%v+M*~bMNwpq<A~PU4T1m>sR7n?UB_Bm1{MM1`+iBi+1R-IeSiNU!0r3@Tki*h
yDewRgrBrJ?9t&^}Kq>WQd3o6Z9s!P0>hmAqc@oq2xl<Pa0000<MNUMnLSTZioe)9*
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6d9a37281ab6fffb97293f758f756ac2acfb3bc7
GIT binary patch
literal 623
zc$@)m0+9WQP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS0006eNkl<ZIE|H(y-!nN7{!0@y|<;kZBq=@#E+UFOhzGb(80wxurO$JGbT<9
zEN;5^udpx~XBTG^8iyiDX(^<Hda=>l4<RkRTyJ~d_i>QHqyuv1=lpU`&ZD@XMC2Bb
z0Su6EE($m^zXMK0<b!olx9|HypaZnq?RNiMfQTp&aYV!x5w*3oWdmKH*K9Vea{<Pf
zW#A3)T5J8dUa#B05pdjUwe0@^`~(U>J`BTVv)QzPKG64l-#HiHd0u=Lxm&B%EZ_GN
zzyOHq^?Ee1Lht>;i%z%m2!X5Di=VzU8jZQRxg+3oe}CW6TBm?9P^(s}mnIUlyT`AJ
zH)mIh#TzTFAMIy5J39&B1Q;|LjdZ8e5ugg_>FMe01mHM`L65+UI2w%cJkJJ(KvXW5
zM`0KOSb!xWlPe4Y0}_LY8H5nWaS8~5?Y+G{1E_!RoyzL!)BeWBbBSZFEH8ho{9Xsq
zAckQCySuw1zyqv8q2MZ|6yN|lkw{pMS1LWZwzTwe6a*ZUN^x)xL=2cQ!D&P~opym7
zU~;)!+8C4M?>lSPbzSGz;USmT)-X!ZOC||!k0A~LA&4NG&1QiJFs|#mTI;E^N+y*`
zWt?FqqjO=1R*EQ}H-oSzBbfr=bUYNxveF`w1B`9kmN6y`<N=*bCKKxI!ovKwO638-
z?BZhiAXUq5f7f>vaDU$3T>l)mfja<7sjo9LGZyd=u#{4pe*n6I6nJ9G$GZRk002ov
JPDHLkV1jPI6o&u+
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a211700785d4f811bd535432234fcb76acdf2f46
GIT binary patch
literal 625
zc$@)o0*?KOP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS0006gNkl<ZIE|H(J!?~87>2L+d?h)FCT*>tVx`haXp0VY(7~xtJ1Dq`;M_mp
z;tz217jzMX;_RTfH-lITF(rf0q&34iNli&|PR{51z7BQ}GK4<c1J8YNKR37FlB2c0
z3zPu`*w$qM7vi_TSZn>sxUAaqya4C{zVG|PnGW<vs{$-stp1n7Lvw3us}GFZ?Y1$~
zfttI&rxzc0^uk6*&2PMKwOS@H0M5JJt~nEsgoBE3Y6$x(;ozjyZnsTf2n;>Xvu3^!
zMKPsx05T$oGCa?-ff10kTCHRXaJIMhve)lDLBow(x4(}2ZRWEP$b=x0NGXdz1{^h;
z&ABOn-#>r7w6wg5%II``*HIbd5vZ6j(e!#f4Kx8&tJNw~8JveX$P`q{V3aY5CCC`1
z6yqQwiXs35Ftpajl!H;IK<A)xMiCTB0;O`Yut%0=0OJ39tFg25e7L{=LgzWxx3@nx
z;t!xDXho1f)tDgS5XXQ_SriHd0a$>vZQHO;>h)(gH#c9UVaRd4o`(-WYXvGJoFt@<
zg)j}!noJ2?*LC?<XX(1GYyCMrWpQ^GB?M=VLwN5ZG&ErXsdm7$0ZptFrBbO3M1U$5
zi)AY)m*tfxLJC1rt*TLUrc+%2V3Gwo&TXa43TQ>HCQ1lV0;+&?9LE-K*49=!jmATO
z<@NO+$Hk+{&);%Y02?dj!JYZsuK!|H15ela{_fi~A9w^9LWqOE9sC=h=ivQ^00000
LNkvXXu0mjfwnP^-
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e2fe97d49646f10ac7815fc2eb4ff020adc82644
GIT binary patch
literal 611
zc$@)a0-XJcP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS0006SNkl<ZIE|IiJx>&26vgrXGc!B8z$ysQM2!#<DiR=Cs0j@fg_vk!rzSQw
zd;!0T4ULHjA3zH&E!cu+gP}6vO(Vj>0?W+K%=2=u1#}dI)7|3ya&rt<O!zwc*0_8Y
z6=)29POb{rIDI8!3v;+*bmtpa27GZyRQ&~ig3S*v2lQjo1V+x!y`w6l?)J_AYcB`n
z#{FfJ3_L|Fs=T+IP3pD{p^LSS=rW+nJ57@gVQSaOJKKF_X~B2E9b#>`{DYz>>9ZXO
z1zF)JtOa*W5M}qIxCk69Prux6@6Vxd`|iCjr|nIKT^B+{Rs_6($|?KpeX^pu2<)|w
z-i(fp&m)elKYRVDIPe8XNnR;g$QkOM(qDrpjxKI+lzRvk#M0?HdS!r6A|jk-1!WLo
z1IB<8E&|<LKs|`3TR`OvA|99h!`XtMXJum`s3BQfTzr1AvhqT`=hni)r?v6}XaE(m
z3I?Mdrp!qraFQU#6G!I&kZiYF&+g36zqWbKMyuuX2cRk-j=Wc4(*zSopo$YiJr<gM
zf+%28lEa-HZZ0h$#&D3P<df&4q2v`<O(CuUN-08WA{q?~s;Fs@WCH`?T2T;;p&A^N
zZgHSi>j3mzrlqfm#7$7aOHVRi7i&gPgkJDs-c3(WY^|+50vMl}`M%LuZ~puprVQ|K
xBK|Qp>}#!GOeyeWhSgn9-})9)s_=M{)&JcgLd%V)K7arK002ovPDHLkV1im!2{`}&
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1d691451514079074d6c1a4b057d8c1406e5621d
GIT binary patch
literal 1627
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
Me@j>1_&}}yALD7)0RR91
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f882aa2ad8a378c229aecf7c2651a42a2f8d25b8
GIT binary patch
literal 879
zc$@)m1CacQP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru)CU<25;%fnYk~j(0{lrt
zK~#9!#g|QQ+eQ$EpINRFKs6A@g_VPRDB_&r!a(c(f?nEVukCO1A*c4*zhPKG+j|`J
z;9e7?jnk0andyNvO<JTSS}L-DL}9rf@6Nu@>`L67Pgx?s>x;iesW>}d@Y9b!$flFK
zd-Zkk>eAOO7q2e;&6~gd=U;yHZ3qZ=y-cN&e=K<a{sV8{{=>U>SIztBbb7fB5n)vW
z34xep#4PL7AAfmtu(LCLy{U*n0V0Bk5JW%(X|>$l-C^(ZM||`3S5F`BKKgSL5%ErS
znV`uLAZ8h=iL>(sXXl+}U)0YN;N?~YG?54aO$mVSzxx(b=j!T;5C7%>{Pz1F{4Wvc
zL_>ru6U-pbbIMYy`cUo7>FJBb(eq<wv)L$YSDG+nH$G5xioB#ui4X!0CKD#HTEl$)
zgu`bCJUyIuKG#tj^2tg8nhaGX&r6D;z|1NtVjzow7^@*vo%~}l8rv|G12h?$40ESU
z2~)-0D>6bL#z@RECX>lV*oNNpScl%+DT;!!RLrXV4w;a}Q2h=85vk4U_rf;zxgMY>
z5=Bv<>b21fJRk(j6@n9}1l{gC2HRc=QmLer>J@=`CBn=I!Evi64Nj1(6aKN-_HKcy
zwsOEyh>%vdnnK*A7hCAZc2IyO!|MUsgS9({a1-tuT|NriK@WJJCxR2KGG$Xws3vU*
zakD{eO)8?oE#Yy9f|X}E){UGhX2aNCdnmhw=aK+31NUaN?v5Ls)eoH+eb|Blf?JoA
zUIESOMZkS28fI2MJ6EbE6P9H;3fm<CBErLm-OOfsBgEXRFgHSsSer^!n?$rOwvB))
zSu8fb;WpUnGPaI(u<Zz_kIIvECptZSv6#=F08kbQHDmAbUUM!iM*-ZV*Wm3fSo=0}
z^!%8^X9t)%MOmV%OyUDR+nJ8ScGQKWU1qZx`}_ONnb9U^2;<w>u6-X^Rql)JRs?jg
z?MY&HVY|^5Yy;bk1Z)di0J+ZB_b4ZuPVVk6<x~GX{|}6*Sg|qp#)|*|002ovPDHLk
FV1j4(m!$vz
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a192060bdd1b432c82cf6a4f09d016856ee95701
GIT binary patch
literal 1458
zc$@*U1x@;iP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU%L`g(JRCwBA
z{Qv(y0|+oOGBV%-t*!GGFflR3LwNrgpjyD-@85ryPn_7}wRP+A7eMYG1`+{405O0Z
z@E_SkG*DABeZlnUYyW@${_{UJuzvmi|CN=KubY}Wr~;L<l4?Id05Kwmz|G0p0)PMg
zH~jVIKhvMT{~1@j%7~Sc5{pYp@@3%UWXEa9+O_)_PM*AcQ{(^YN_~lsU)fj~{{hXo
zZ&h{kJ~+rA7%Kn>Ah-k0b!!>2u`=#sX6F{*6jNk)@_~<G_ahUAw6q`w4h}YgK3TD1
z7lY7`V+@uG&lrAve8uql(`$yOZ-3>vx7?lsl>Q0C|FG!;2p|?1<If+)^+MVv0t#N9
zK;CbLUpId;u&rTY`2G7g7!v}#yj%=CvdRn!enw#a+shXjzHQw;DcfD_{M4PV&H{yg
zU<(O=0D?Q<$1etX8G9Xu|9_uC64#$U4Bx)-GJN{<ji|W%`t=6`57$Sa{-0pJkcI@q
zgQG$WJRBc%fZUtVP{42iKmfrV@a^Y+1}2t24F93&n4R@6!<{=%Ksf+s6r!iyxM&Wb
z{$DTyfu3Ms`277JDE>g030pJ(1Q6T--+=)H*9-*m(hLmC=CPBWtKbg!#_$8^sb9Yt
z7@?M9&F26Cgc1VC4xkA9{RfH@hM&LwG5r4XAFon?0740Ye?%lUqQFOBx&fN?<L5t6
z2;c<(0Yr8P{Q4`x@a2~RI34`^2Pw?{1L=Pt{^##tHnWU0gG~^Z&GHjv8*xPeKmg%P
z1BAfmAF>SWf?f>l?CkIa333F;F@Ht>0kic#27Q@-3{02rge+RLnKdrXHxU#$Pz(nE
z0mOs|0f+;L#s7dw9Ar5U4>uU|@^Ulq@$oS5^Yegd2<8UW6%6X?s{ZrlZ3JZ}J|JdB
zb^t&C!5#1e90k9L#{Yoj#Q*<<LkbiUdU{GgN2mnMn6Vzi5dZ-McK|5vaQgPwPlkVA
zzaj9)FARTyLH3^r7ySME9~e@s3`Rz(44RrM0h1=JL2(2?05Kse{s*!Q83Pl>zgHg^
z{ylvQp<(#lCx(CDeiD}>fl&ae=|PS#Fi>WYmX-?W?Og$P1V8|>pcW#CJoEoE(1Opn
zE&0ntTomx~ax!e%bQ~NKAjg1cAt8|fpi~7YGXVq;3${}1|3_e!_=-PA{A2!0R1_E)
zse#kMj~~C`>TlnE2BP?Z_!U3^p*r9<FwTDfefIG?L4*G>6Bh!ktgJu>{AOTbVF71R
zq@)M3n+YI*P#geCZ2w<>Wgy1nzhDOtR`>fiB&0wM9wsJ4p#=i~0fg#+k3h?R6IU4h
z`|}sCJO2RXfByUfwh&=C1KbfX01!Z^QSjj_BtH_9x>-;|0A%Q|Uw?r3FW7RJPeD0=
ziHQ-(a?}6@2q3g5AigL@4gr|O2um@2jO++xhXVu<)?7f81OEPjTMo)vn3gi&bOdq;
z00a<<13rBG%fQd|kGLrK{RbS>kQOy&FynIsvI77Dhy~Gx_<wZMDPC&})z84@7~ypA
zK?LFx<kU^9Baov2Ab{Wwxbo~%_|HE)Q(k`(3?L>1#Pm2A3^067oFkA!03d+i4%mI;
z<x3z=0WvG0<unUE2h>{^0@X4m5=wB`Xygz82q0ujK&k2jwEfP8UQwX~9v;E>AcL@5
zhTjp$Apj6S=)MG{s;^K?por!80W*kHM<6=@Ab^<2ZFhny807u}$TCQDAkz>_(Z!LY
z03d)^$ZmN9tJcexA2U37@CM!%M8=@9;UCbum}38d9iEqPa{vMi0Q+WtY{NEovH$=8
M07*qoM6N<$f=oDrEdT%j
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..69d59a38d20e0e3f1265b9cbc0937d1d3f847451
GIT binary patch
literal 1339
zc$@({1;qM^P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS00009a7bBm000Aa000Aa0e#hi%m4rY8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H11h`2=K~z|UwN_1N8%G#@vyzg!B_##B2PekH6q}MZhFCq+SmYcZ
zU0(t{v^w<Co_c5?g-DBWpzS$^6yu6G{W&B#r9=TAVpmon(W!1+VuFM4Ql&Ef(b|qy
zJG1lk;NA6jy=%#Ze(;!?PrLKp_cOC%0Nw#`9{;cXK}65Peux7&zg4T<<+cql2Ic`c
zum-T_bNzdR@A01xS}YdB>uqfx0f-a;ZgbdN?326Dw0$C9P+*KAXMr)w;$B3W#tsQ!
zN~A0hH47p4$Qq3Xip3(Nl(=~DVsime<cCVpEDHb{wvB~_1tgP62q7>#JB!n&PoInu
zpm{IvrCf^^as)JQu4yQhO1N<00?wQ{gYNEb3=9k)olbu-K0Y2QLfbDv1i7XiAke}_
zbq=7dt<5Ls>+8eN(9jzIrgdG9hYIk?fn!B{h@3GD4h~{|ejc`M`y`{Iqwgh?$xZ;@
zXR}!?yaZkunx$DG4g2lXsZ$sn97H~!2NAgmX0c0`E`50J+_`rF+&EkUubEslt+kp3
zRfs$9?CeBWR~HI}g35JrY;5fP-rnA!OeXWKPYYnQW}0^$$2syO_(#!Qudc4bFbp`3
z1I{^w5C=vNsZ<L6{r$cQBC1VIP5omS#w}gfCm4WHb9=jG0a15D*j*82M6@<JIk{V{
zR=?AN8#E(ViGo5}HO5#+I-NEFe0{J9!_Xq}aYPW&+Vu4Fn*b*KbJ@!AQ=cuD%P<TB
zLI@vf?Y(s>l|o-%pGsbvnwr|IR;#ykU7z&71<g)CFv^~u9`y9|L}p-daS^6z9v}y>
zJ2Nv=HVosTuIm#($UP7yB1q7z2P%~cR##UsJUpzr8+Y#9SzK9JDeAiZmFM&`;5VG|
zMp#{s5&{4_J3A<qN*Ea#@qI+(<n#I8pFVy10>J0$esM1Y6cT-K^JYE(c>MS=QmGUY
ziG=UFckkYxOG`_C1NbbP%}Vuo|6`;^AC~%7$fcAZBGl`3-?zNHjAF643m~1zWCQ}X
zp8<r|GiYJtQc6fE!8ymkzyJz`0+PujIOllsq$G2>+&Am%>y5De4jjWMlB2RArG(=+
zuq+FfWuaCxarW$4JbE;Tcp^dh*@x2`8ymkx1*8QX$GlJ=r9{16$J*K&o;_Q}*48H4
z+dGg-4decU2S44;-O3Qr=282M*6Ve8_39N_mPL(5gKXO-+qQ{wPMmWRLXZ%G9LFIk
zr4P<IZEtUrVHh+wH&2e^kZm`pTrShcpMG*5K(8k>3VsHnB9Ce~B7);Mux%Ub8ykox
z;&2>+O64W=>(>jnf5=?{@WT5~5M}-;h$4<MB7zVC^?DtqxsA6wI#8*+ME3ebVfyCH
zF9G~T&DfzdVXMTd04XIbs{!dah{fW#n#uh7V=i~aC6`S%2@}wYDK{L15O}M-U0%&x
z`}vodnQPcfd(+5O8!=7O@|rKK@l@<LprEaqNlVMmt+C6OZvg1@L>&hVKnH*i0KE2J
zvH@TRz>{W2Ey|dhEykDzAmJjej2>bxG#6^a5CG}IaUm3NW#nFu#9d<MZWsq}LLpDM
x>jZ$4?)*f+4~5Kj!Iilk5Gnyk#u$i5{tLgLs*$b}ue1OF002ovPDHLkV1hpwS84zN
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..60f135178360930a102923bdc1fff925b95bf842
GIT binary patch
literal 746
zc$@+10u}v<P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS00009a7bBm000Aa000Aa0e#hi%m4rY8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10%u7?K~z|U?U&1H6hRb*zf*<@vovqwB1<>f#Esx(;>0l_lEBD_
zK8+xVAYKy<5y6##<O#BHosEwW7mbk_rt7$vRHdrAdu}?(#si10>M8pB`<%b4r$tq{
z%rKWq2j<-1=;-@55m~+nsH*NSE?&D43CQz&d12uy^YgWt!n@rbCnrDsjd}t7exEGM
z$g-L8J*z}OPL}<eJw1t_1^r>`W-lNt%OwfO0a#kPPQ6|Sz*>v7mORh>*rlra1fsdB
z`ZeLP*Xwb7{G&?1paKpKV2nXkG3I=`P*p@Ex=6U0x!=l;wOXxE>5(l+;clMic|k}h
zCKX_e!CG4_AT{B$=PybHrLo>>Mnbkf?E$d5atDCDFJA$;d+R15Qs5Lk;Nt1yN6~zg
zA6z_GU5UKWY~1#1M5MqO`ziQWewf$;sfZ9XjUOrnq_5>F4?O9#Be)w|YXNw_vkMGb
z0kE_C85p#}Rk2h+cz00rKo}|9g|(LTR?~YxL})b|ktb44rGR1aH+~o*pxDDvB0|u(
zen>f$6&QCP=(M+@mc0G&5jfu;oF`h%Mk%MV0>eBIhBKe5!sf<Wv_GufzZbQlvH~L0
z{XLx24=HCV6PAexLBsqob_=RJP}Uj|@s)V_>J0#!8*3P2c>Qi07<i(LGu1v&7EVN`
zz2)B*01ww&(fcCh_?a<+F~aHT?}@<C#f<SnT#AU#Znx(-E(#SmI5?bIz_=pA2n1Z&
z2fdIF6OesB`u}YhPR^cL14xqY9KpG&(6e-78=P}#UFGKja2YV2n`A5j$X`4;hC+gS
c6;xIK0IUL<b>lA8M*si-07*qoM6N<$f`EuiC;$Ke
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..757cad47ed519f9e9040c92759150989d03e67b4
GIT binary patch
literal 1239
zc$@*(1StE7P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000D@Nkl<ZScScp
zOKenC7{`C-&Ye4*>4UaRVv2|~@qu815EG1qurN^sV}L}WF)rA!W1)!~MZ!XZL_`t{
zD|Ca=#2}zV46no}p=yO{O>OB5Xn}Uhv@`9rGjm_(b8&}4Yai26ILVhgH}~H2|9$6t
zk26X{m})4c#@u)AjBgE>S8O!P%Bn<A07Ex!G`1xC&o>@Qw*fvd>7?WJRIvc9JLcDx
zS5+OWdi=@dk(ye>tU{-|3B_yC1FdAPv~#(!ZRe_e1D^tUKu;%LG{Ci8@yb|r{7UuG
zXDdCw1iPsboxBDjAYd(ffyhG!Zn~FC7a9&czkgr{FgzY&A}wP|^};Z%lH=727gyT0
zCV%xj+DwdeS;pB0SH2ps=*YF4W4P`QOi?_&bn*5>Z&bVr#DLNLo6J#jI`NJV;w$D=
z$JgrE!#Ih0a=C2h`hC6cHgq{Xx4qoGp>);O73zyn(xyCK#mYsoZ7}pR;1q0f=caXE
zu_+pk;J7Km_?&9a9)EdRq-6O5Gq<op4cU%%n|s`IXG({+uP?uTAX-+#Bh|4rKqWAE
z?*PJL<!L13qDxn@Zgu*dm!9(w?I6B~_zvjcD)}th040ho&sdLr`<K&0unm(2+Oz-y
z%5?-I62)4wj!<PSIB9SP$6mFIlj=ckT*vi<c+98*!uJf|Y3a&jH07akr1unlrgoI<
z4rK)KJQNO2zJy%P=ir5W+jMgm1<*gDe=z-#_l*7!^J;ByI)dbqv8DiBQbS++6*`ic
z-vF;*0zo>@Dh*ffPhIqk!MfDnE!eUERbipZEmWz6idv|Wg2gIHT<pd1(wu6|en*fY
zHd8ErQ2>Bn-<{hQwYoEY(@n&90u>9RVkWB0M3tKOW|V=3n?#3O_&1UKe(x{&I)V(a
z@1AIUSuYkq-a0&Z`AkdyrsT~_t#*48cqwobAQ><{vZ)@D&2^k?==^%~;la;<TR<9c
z$4{n|8Us>nFHk@PsBZpb$%Q2wmOhG;0YgE^U?h=c@9z2!cb&<d1`-7uCTL6(dsWb#
zz77=LCs@v;Gn{igvG4|c2pia`H2GT@x>9~O&<FG~K_8fG6x9pvf^d`|XoHT^?PU9H
z^yO~qPP8|E`KQwa3;`p>iq8~al)`sy2uDyV=!S-(lwgJInTXFCK$(C76*dq7B}hSd
z%EQRq00^K$C<TTQ1XJFZ<V=NU4G>g41C&A;2Ho8wxt-_r9)eSlci#cD0EUSIlrj+w
zra_({0PU&2o&x|dP%2XRX;D*C68&gR=;Ok}|ChSC2G9U16nv^I97p2|22cT5_Z<MO
zLGBc|tJia#n~%D0^T2{o3+ODM(O#am9=DNT|5H4O7|^~(YzMTU{2VJ5g*P62G4wh?
z<C#$rniYT$?0^VJ&ci@hSf*YfIE3E+7;y7;pY}XNKx-kF_4wzOoCKm2-`r*oaOC&Y
zYbW;n_zfzAuQe@w`t19^`p1AQGblu(=K>L#(k2)tF#qV5$gv}Dmi+{*1)c)t&Bmdk
z|D28+A%eWGF5C|gWWuBekhuo94RJf@oY{y2{0A`aP-hVaBPRd=002ovPDHLkV1k(u
BMR))J
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ce8da0bec7df7b25f2eded2ff7e5be5995c55f7b
GIT binary patch
literal 1237
zc$@*%1S<Q9P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS000DxNkl<ZScS!x&x;gC6vscWe)Rm%9XEzZA|4D;Nbn#bkVA5Ek3kR*5<zpw
zC4`_S&+%aX0AYm?@Q{B%$srKMA31mmo;)R&g+v%)+;ujy)4R^j^mM%(s(W_W?EF|Y
zq?tEe)Ajn*=e_z?6(j8Ox_9s1!EU#Ev0kr#k|fDt5uw-X{n2bTf3ntIJAeNCpSy`C
zyK%mA=g#NOxoee5WzWjW3f*p(5CYX|m7_<G((Cm$n$70L)2B~=|H=XG-o5*!bMD)A
zyDe#&QmfTMp69>kd5(y@-EOx{p64tqEa>v`@>eHLocL~*xMmioTeof<6OqMMt0kM8
zo78Hx>mh_gXV0EJa_-!@Bde>cheYIhqtW2@?b~wTz=6d_j~*SHCAOQzDTHu2%QD~T
zbeNl)`{vA<GnYsEFI>3r1o&ccaq+Kewfc3l+4S@C^Ou27r^TLHfg3k&)PPfIngT4<
zYPBole6uXOVvJc@T3VuBub;Yq|9<VI0Xm(|aqoR4O;hqbzj^ZH$-y|^OP4MUvMjrq
zrYWjg5s~As0-)i&r{C`*B9Eu}tLkG_rQ7WyB8`^@5D_mTBuRqzer)#Tl_bf)TFYQC
z0PxfNXA&Vmy<VTmuK=Aj?Ct=Hto|Q>N~MCx^nL3;1yI%L0iDCSnZxe975}*S*?aGQ
z)c?7gKCM4|u$rVDZxJJ?=0Fe;N;AeF0@gab_xL0cpCm4+cx}9v<cB|ax8GWBJ%8}S
zFAEp1KK$)pz+=EX@aExnEC=_ku-^Kcm1ha<HSaby60*#a2ZM;g7{S><;)TR3bB&C~
z{yuNKwa%VHAN#!VVYRig+F;Cz7+Wh<$a5hZSgeD6^P7n6QLhNyE(A4LBRC7zLE^wU
zrLtG4)fJUMKeLdBiBmTgKm@E&yvq?gAh$VHE2snYkmq0ooE5B5oB=0-qiEZJvw>h_
zqIf4(Kvf7q2x<r@IYJ&F0J#DJK?MO+01ILiBOpl30$_r6C(2cUpj$8+6jac>Bosgq
zG^#nomsCN^#uS2y03vajm^e->rD(Bsq!=s?p9e6eWKc8|Xj4}1<O*mUNKu4<5y6-U
zq@sucBZ?8h8O2IGT#SGWPnpRC<3&gj+=Mt-NfbXt;mhzkd`UzRDRdx;F(X>o;TnG$
zj_4;YqwSgKa2FePm%>$HYl?PwbtZr!)2MM7w#sbE!A0Vimb4Iss-s>nC_)Mml|l;&
z8X`<k0o9^^Yf1z~B<cp4;p`aK5lbI4G$x906ikTa6C?^xwfGGpq1X#1PXA<pQiNp|
zB3p{L61M;;#5o+OcwVj?VB1ve0-%f>gKJ>`T8L7H*+#f%R?4aYqQ&0v0u>kqkrA^d
z23OU%ClprpkFd}5w`)g$r>*s0*HR7!?aBJnfo!x@);dUg4YRQh-AyFRVsh3-t9Uf=
zuxBqiw;!E<9c?`C2DiVhYinJ7^6dGuG5HNad|}D9`}Vdg%oYa4`2-9K%eGm6<lY~7
zJ{T@%qNvNDZj9LxD@6~*xwQ>s6llBUg|Get^IH6RWVu+U00000NkvXXu0mjfxUEVa
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6a3a8edb2377721e37e0a0b6d9d52b4ee7b97b6e
GIT binary patch
literal 1442
zc$@*E1zq}yP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS000G9Nkl<ZScR=sL5m#M5&o*`b#G74TFR~^SvZPyNqh?g1UX0tL5!m4BIAWz
z0*moAS6y^51afc)2!n0>4}1uYl0!hqVpq8&rwzJ<U?O9KuoNuqO1qk!-8bF+s>+A%
z8Luqu?5?7M=DpWbUGJ-}zN#S{z;52WiMp=QG!4fXix^|kG!0aB#LT0jC~R?Y@gN~V
z2XS6rUY5G9&$#=q^F04~Q546C2vt>mv$3(UvcA6l>D=7hKNl7j(hCQ$yu5rQrS$uv
zC>8<qhr=OajBt09Wr<_Qjv>$Utvh$_e3E6^yB988c<@31+_-TAA~I)YpM((3udc3A
zRaIbSxI0u801#uO(P)ITXV2Q^=H^le;WwvGpMJPkeBR5!%raGd55TYP-MdGsTIYHG
z7iRvYyT4pj)%@1h);S{jbbfw*bp85uo|&0BCnA5ib?a9Ce=%_N>Q#uy>3+Ze*~Z4k
z?DqC{>i7GXnfb$og@t;j@0BZ8@({vrd%fNtQ%c#HGiSC_O6O0VI`xm|W?+4N9jdzM
z?z4lz0L=X7JkQ_%{^bC0>C&Y-#`r<gG=GXQVlWt#s`~b{_<I7V>l)1bMqSs4G1kod
z(Z!1wZ8!hRmoJ-{eJmoQwY4>*l+G<JElp)PO#4w);qE6>N>J5DM09(4KET@A+JCF6
z`Xa`7d^j8ybzL(6eJ%i<F#u#)R)r9D4K%ium6i1v;~UJ(y<QK~F5fQzhzQEEgoy0v
zd+pja2e7)IxWGQz@Sp$=YWrd!gn+Uv;qEUSz%v#4w+|Ni^`GidZeEkmhd;a1pPdbE
zdbj%KU+3ffe{aM%!YFP}Msc3!D2f6_uZLb)qF40LEBom8OY{%-vC-Vu&sT1*z4N=j
zKc$D=7&yvee|`Dr-B*A7^#h3m!Enour{Ul;B2^*-;2`qJN@QR%2sg+wLRr>0bObnb
z;s_ppiTeQF0`R|m0&oHR)!9Q2PyXnY|DYK>L@X_A7II>^C5VyGG!A!%Fpy=0JOlEK
z&_AS@omadx&&Xf-1)Ba(KwnV+@Js<s)qpv{T>v=136O*!ge(9|1R_EvKnOq<fGjvd
z1_&EK8654W)1<QtfL0nr4&el2MIb{)K*K-~0y{tiWCDl~L>$aOAb{B+tYC5w0ifLx
z?AeCyEf|NlnK%G<7<{~id$*^yEKg^>`!wE71CzxZFk`qg+yOPf3@~luDg$r=n?sGE
z4yZX)8Da$M038rOhnw13w^TZa0p{=Cw<{prt<;J#up@LOVQ&2n2%!DKoLU9|_)Z$B
zLr3l2(e1r0lYu7XfqPf1=VHLS-Zl_yeBT5Ljm0{S&j2yT*LRuI#P3<QiwOP6#djQt
zIw3ykN-Y(wD6vDh(=x<f{{;jPjd>>cq$E7S(5jy%7m+&{<0?(B{}cdS2IC8j;9!_{
zZP^Li96MSOEy!_ug2r@US{qE)KsV<_6v7H2OdcP10041<beRj<_e|RAbPoomYJj?G
z5-?7&75n$NqHf~R6AGoSL#Eq4G~he-n1J|B+1}N<ea|$W72YK<orb3XFf%=R9HAzw
zYM4n1Bm=3nQ&1hG4roWYb(4>+ZNa4Qq(D-D)Lqq}>JJ_dYlsM`>NAIQVCJkSij0Wz
zqjUY@&GSDzarg&KG1`2X)uT~X*U0LcLz5(^QZN^3@d8XRCRJunA=8x4SeogfnR)3%
zBjw5F!QDrr>r1!qt*yssW_49njhQt7(xhU{Od`S}5=4ZVIRKFEEX*tbgqekixO+Nz
wxVyW#yP25*P%}%~TH0|oRZXgDX669=Tb!)P&su^EGXMYp07*qoM6N<$f>7J9+5i9m
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c9e71184c5c0641bc14763cc14ae899c98363eb6
GIT binary patch
literal 1013
zc$@+C0}A|!P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipe-
z4l*kL>;fJD00VVNL_t(I%U#gRPh4dH1@QAd?##V&nSp^}W_S%kp$JqeRRLd(x={nR
zO^rfAS#&3E>c+JTS0=jFbfcm1MN(^vreZY2rj@8P6~d#XQ#&vqP+-bDn7K3ed$`a>
z<L?hRC+Cn06K4WlS3bF|JUp@4+&4<4Ad%JUA9JBveHCGYF~;0d(Jkh)LONOMn*Q^P
zeM6%FvX|RG)Vw^iRiQ;O<PBC=*UtYiqp4A-XzK8l1;b!=6<Fl~Kq~{OWkWhy+*_V|
zwey!RBMZHQCjjKQ2BR7TBv41}${45?K4#j`p-ybC%$D-kE)r0#{jJZkP&CSFJGeKw
zIQ>-9{N%vP7#*jY61bY71cee5Bp4(kNPK@*?5r<-wtn#G-i@a2=eAd8zf0a(Dgr=x
z^nm5f@4pSe<Vpc9W1s~WFcmcC$gae7!RKGvdbIx?hkMol=$*QbQ_a7AGo7)GhwV@U
z-1yQV0A4B$Z_!bl_?w@EFV+LA<}p+rK1O^MvG(d4lj8u4uft;+Kqe>E#C@YdCU!-s
z1djrsxMP*2UAy|~AHRLoM<~<y2PM#;JP3eD$H4i(=W3+>iT77;{#+$EPo$3yegq&-
zE=-&u04#HDIR?N6K(r>5D&ZCy+v5Q809bHuJ!Ia$SNouVXjlB%+;f)<UU~=sFhq`<
zjSEwKrnB<`-*=8I936T63w<#U0B@$cqjj^F*D2!y|3&#Omk!6U)lWLFocn-id0JUz
zoM<T;7p8iKI*<SKY2jO)s){-F%qWJR8McsF1!D}15+rAS3{hF)7)wuTVVie(Fh&b@
zjiF2*H?uo$0I-IwegdGBJpAIx%`0Ql6%wwH5K=)a$ynP!6k1X=v<xhlFI|0$M_Y`7
zCXDXywgk5B94gyMRtMJ>PX^W(-{TcE9*?h_kiTC*YGX}vE$D+q>9kpX&feP|F{|pW
zf+nVN_D+!8{s7?yH^Obq<Mn`6)?+WVhoFZbM@`MzUWotze$ORTYx_%6a^?0BB}6QG
zu*U!h1!LUs+0+U~;EQ(R=G?TC%IqdwW|w7hnSTQSpxfUhignGGax3wgjpVH^c!RDT
zZRNxt!RBttiN~*(^1;Zd!Xv%!W^T<l3C6?Z*x4@p-|3p?JpcmEjhWY!EOh|@Wu7^+
j`|)uAX#f&{0f7AlkHC5B4_ff%00000NkvXXu0mjfEMUv8
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6b94b43a2c05e38edb72d5021ecd40ab4e64ff00
GIT binary patch
literal 7015
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
NnrgbLRm!%J{|AfuEf@d*
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0dde6f395c07349ea421f625ef1948a1dcb598cc
GIT binary patch
literal 2163
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e8f418a4f8e6654da3f0a80f59fddfb40117f851
GIT binary patch
literal 1815
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
FV1m^CXG{P9
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a44b6d130b5aeeccc3641a6c0b831d83d9c03235
GIT binary patch
literal 1224
zc$@*q1ULJMP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipe_
z3ndRC4ewL{00c-$L_t(o!?l;oZyZGshrjCXnb{p@AHhOFh(km`+z5&kaX{q6Kaf9z
z1Ls7DBNECXaNz{v0A~bek}DyJ0up&3L=r_750Tge<7e#c?kWzmUXQUMHp;d%>fTaM
z*H^#luIUvsW52EXtN;<j1Tk>xa5xGAfdX%y)wLB?-df-Hnqj{ai%$cmkDcbs@iUaJ
zL@|_1B9llYNn|pY=Dud|?hH%stUXx(1WwGJpd%fUB@&IpL?T%tOEW(D)KL!7_6=Zw
znljSS*twF3lRnuPN7Hlw1jw36+C<-0Ad*mW)2mJg0BZoY705fJ-?C-P(*h8(W}?Pj
zdq72r#0Ee!V$(>0f@&t_xWoCRA1je_8Yk?D0|+T^E1;5zTS~|_M7G@Q*r_OxGck`^
z(T`8SmPN*=-~a&fVcC7D>h(T)_SEaIq6*r)Z8jdOVwO-<35WWIY6XDWWRBVPJTn{J
zxpeJEFS?<46cAAq-#8ps-Yl}dD7+cexpS|5@cya8FTQ}PVlkm9VWw!xSk92rq$fp4
z<FV$+SaL>U<j)Hi%c14tUX6g^h<FPGHt=Qyz?+ePFRR|UKnTOZvFFj08^<}LDPmbC
zzqg)=<CH+P=|>5)0a&^AEq`6PiUSY<GXe!jY|=8eAwn?2!5}E?jylE$L=}q})zktQ
zwG>du30+-f;j0U*UBA&p*>co|a4j3soRpBwEXRoDv@7bJs*E9YtU$_aK3HJ!@;5A9
zzk!c&N961QktOc1DG<yI9gSK}6P9ffwWic4q>AN;#mw^UJ1ktj%KF{gI1JyCSN{Wo
zNjh2zBp`2YHaq`cqPCoPwD6F{pKf#i%2h^xJj4MWPauQXjvR+^DN6r<aR#Xk(bNIY
z@0Tuf<mAaF>X?X+)>ytb$MW3Itj^7`^2@KpwYA-!ClRo{A-4K9L=-4m5DJ7W!Ve#R
z!rjlmAapud&aBVRKem8q<82p&dkjRL*osC069qh*i;HY>u(lUO7WT}4+GB5Mvj_ae
zW!0Apkskl6wd<}cfLIE611C-8bCPg?LkJ>>87od!qHs~njJNx<uZY<*Ky#FKMGC+X
z;K5_&yaC+YaN#-NyT_2<Kfg5pz3lf^JbSi}^g(8KeroGbQ-_*vs3}8%JreHSyvxG*
zr6>P6ZeKJ6p<fQ@mwjf68S0{@@)b!F_oi|u%-cEx467l->M;FkK(FXg7d2hqWg|bD
z(v_^$dS#!%7+_cp8B_yi!VKM_W+g387oc<{y`o3I>@%na+e(yu>Y~Pv{B!}jp{6cs
zW{Q~xqy^C{d*qEgU4Txg==$yi<WO;le%T*G3|T8z544^;&}4B0S5WwZ(v?)cL)Uj3
zHOd~t>M(UtPY-|y4u=;{aAEQkzJZx3YUY>c545Bl<nQ^@X9qa%s6y4K;7h8|p$Zk9
mqJwvyTfg06{=LP0ulYCqI3>_6%<2LF0000<MNUMnLSTX?Av50q
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..55ce550b4f2350f73598ccef8d1aa55d7824e33d
GIT binary patch
literal 1806
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8e428b6a7033b6ee8b06116f47ba1069461ba232
GIT binary patch
literal 698
zc$@*c0!96aP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOY`
z6$LxP;VzZ{00KHmL_t(I%hi)jXp#XO#vk9;uXH+{P0gvB8cvqk*!pr5%Z+u2pdjdr
z!JxXtuA^PH(I*7O4j%d<s!K_Oyo?B(w3665M5&9+U2LYdP06pB@2l_Y+sWt?I@bU6
z9R9z<^Z!2&@L!Geyj13%cl$gc&z$SFs}%sqzlG(O<f@DP7ko}*&u*<uYj9{cA7AQ>
zKPP_J8b{;r;Fc>o&DfqZvo^JLTb|CNKo<~*`PGr++%Y~e!ISNGY&~Mt7zP_e>vmlh
zOm$Eb)x|n&nA~6(b`JSBs`S<}n+FLorowmdB;tveYPe3Cj*3saI@Q<O)opFfatR?2
zaFvDoNgn{%Z?sxYIS)KDsdN^WW5CoHJPh5%i`ewyDg_sH4l(|x1eNELOby}`K@v)A
zGAf76H!)_{8_a#?-Wjb_rem1`XokR}pcm1Va5z=MUivIn0D$Cr5nta}9nl+e1W%NO
zPSGUc$TfL?d-r6sOs3&@3`$G^-Zx%+$VOj&EMlNMj!fMm$pui(JIY<#yD6KfA%luA
zh88t;@Wn+5&1FHcCCt1HU@4P&nkZslVHAb$56lOEDvNvRW%)sqQUibhBV0q7TLsI@
zVm=&0ES;N9(>VNj1k}$TA^@Po;Bh!wS!Q!KG+_%A=zyxW6T#OaL=w3NIU0u&!@t7c
zf>fPFP1Hwg?K(?Ol_o)b5y2mPhlOPPR=$Fh?@xgJQ^0t2p?9Oppuj7k5Ig}NwJLBm
gM`1KH_^%i2EBplCVa-Qb`~Uy|07*qoM6N<$f@i}q$p8QV
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..84c18e29fad89bfae9f44239e6ef9f9fee4ea0ea
GIT binary patch
literal 1035
zc$@(X1oZofP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00FxI00FxJI_%@(00007bV*G`2ipb=
z5fvp6?)N|d00WCjL_t(I%WYGCOq6vTem>vtd+)vH9dO5iaB&cD{&>+$rl$R{AF~v<
zim{Q&EN0nSH51Ef(=z8;rMcD?P1{iH*IZ@g%sEI#WrNfT%rM%E>o^XO1MWES;DF=(
z@$C=NYU}gY^T+c%d$!N>5dP;>RdqCM!h@0{eU4=sl)O69UHPfwB!FZvs9C!H50|b1
zAy%WLq|ep7?S=zhC$DB)0ug~Tf@ulphKX1#_C?wI$*pVr14FgV2@3$&jCeg7w|35L
z+gT9FPP0{Wn;qaX!lN|Wc(&_gLYMW(7{z@)-@0?J6oy<1Tlx6PG<H3Ks;X&iI}3&+
zNm96EqjSG%?HTFLc>l;$xS(hb;*p*#Pr7qzUa`MQ7%7pQOiesf`~4l$$>|OW0KR=8
z?~sj?1B?Tb0=KVNKGg8XYp1#$7lBIzVD@L5{ZD~OAPI2IBIll}x$oRxZ&t9HGIzGu
z$sZQn4oC_F2n&mH7WuQ4TQp6(+PdeiQ=dGy^s%b_-TSs5JX2|rOyDx|ZVaqilA)Ed
z=U3;gCB{KS05J$=$E3+o{}Y`*yk*%!k2_=e()qp}FRxAC&=_=_xH2h%U=ldzc=Wb{
z2P8hrQ!?`p1|otWCb|YD`vHVw2_yC0&zBA`W@NtkO`=7cuV%VkN`R~hSYRm1wih!1
zHW0(VOlTw$ZU+$GP;t*oo}7H6_N$IJ09+V&B<rxmW_SQ#2}sOLMtce3?@|a%Oj~H~
z7(5Li>2ca>78hpJe7w7=9l-2WyIMCB%~XdG&=Z>;mOlD1+O)%82rvs;u>bP9y67gr
zcA@-cBeQ>a^moNB2l^t>E&vLEabcMdLV&}<(X;V0q^c@!+LGCrlkL4vk`=l##YaM+
z(C+A%*|hE0cnW|HzyL7Pu)Vb2?_nE-sf%z=sHePcyiA(s7%<;EG4$fA)ho_}81pEy
z_u$1r-;))0e*W}O+q>)6tSILs7TLMTb=ZVUn7Yt)opv43_No}~<6VO(sJU`%G#>r!
zrsA9`f<PeOr+QsH@Jna!pLZ|zKcO%^Q({7fsSCr<>Fpz}d;14RKRB)-aeYh=Et72u
zvE{FCTvF%H&01iAff$D+AQ*u-2?Tp1eQ$l)xi9KX9R2z@hX1oh0H`drQ|DBX`&Mu7
z?a$tuTb|+IeoKJG#*NsAr-xfw;`u);7}LVXE@SGN<}WN5Z895_*YyAZ002ovPDHLk
FV1n@J>}UW0
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..90ed6d99f43f1bbffc1e7e16c8fa068a77a79130
GIT binary patch
literal 1037
zc$@(Z1oHcdP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00FxI00FxJI_%@(00007bV*G`2ipc7
z5d|(c?xT$W00WIlL_t(I%WYF@Y?EaeJ<t1oZNF~q)^*piZm^sAHi98TaPhJjBF?B=
zNQSr&i5E0#G=mrxg#==V$V5UAll?$IGEGp7WD2@4r)aiJNZq20$v1SDZk4U&+l8`r
z?Y_(Fk1>pi&#&jlIVVq^a}MEuMo|>!_HU_Hwz*49%b;j%YWP^a^E`mq(2#2B`oCCO
zT7=ku^73)lp6~Np+*xcZCmV<Xj1w$VK-W!Zn)c-fHL>l5kKG7&9F1B4z!u5RV0ZgK
zS#x0dM0$?2RpJgXvSBJnv)%23=aW&pertlJeLmmQ2Yx9UkzMSe>KEMX?gfgXxSIpZ
z!;+2560=j^<!ilZ>8aCNC=pyySc>rUXjWQAYNEKTpurSLF&|IFn_s*5AQl#`NC2?+
zhy3G`9Zm)gP7dUHitXo)|FKWK;Oqyk6M&qZpZi~7!~r;v;zH`S17(MgJZWxZ8yY>?
zZm+bNSu(hA0)kLlk+;h0m)EMQdh1Ac^@X=SUGw~*hT(%PZ}-%bun`ju6fP@W@2pf;
zvrRkvk2B&R1`rXLB|}dz^qio+rjz%r^kk&3D_`T=wQ+aamTT?KZ{jmzh!F?p98Wx3
z_>?3|p7O<KFc1+4BtnDpAppTS%}8GU@p_BN3~$?e(Jpmd@wz;6iJ&-y#gJR%C}sd`
zcg$E4p~<OWFM#Q~Esr$iWE2=@k6zgi;J0&sW}W2HA`SqA1&PHCZH$<8Clvz8xP?IH
z<WB%%t_)ja@x7kL{jCkX0CJkvcfU@w7#+q1BBKit*4Y~Au!IQ#3qxw??;TZ_YOa25
zJFV0i-f(F4YGh(&PVEo&1CRmCTf&480$>(;&P?}^q9}Y<hqpaDH}g@uBvX8bPmPR>
zymR}e+40$%b4dU?00Y3(zVB9_@cP+vre%oW*zoA#y15$Z9_J17tB=AvU)*zlAAzxy
z40~qa<4Iq`%MX7MeD&84Yd2TbG09rR9U{*z!)1yEp&JX-x>s#>D|6#~a59Nyid~zT
zz4?2|%De_JffXe_#huAZ1_EP$RaX1Aai{KOlCYaX7lx@*>!I#uEj0T{pbgQxWvbj{
zw>f3D?xlAtkNNVmD<BArI4qL{<AR6_1cxTZPrpBK@RAli6Kg}{KWzknwe=3VJy7Jy
zt{Quw_Km!{lyvSF7Fbj>w2P-AU7@ampZyhTu=6YuOPqfI!UlQN-8Z?`00000NkvXX
Hu0mjf7RKiu
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4578666ee4640bb6c1473a52196faf336c2ee637
GIT binary patch
literal 569
zc$@(_0>=G`P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10k%m*K~y-6m6N?|no$(Sf7hDVwB_|9@g-6P>6TKe5D=lb*hwL)
z(Ba*RA{D_+>{eX+XB5OiaFBxFVCfog$RHH8EulkO92{)@%;^v<#=bG+z}cSXckg-b
zxk^N^Dy5VLJOK6p0e%C2WXqto0ZJ(a7_nIFWhfMS<@I`xCX>mm-|v5{)oO2m?;>)!
z3*gD;^Pf_w)Kh@bXe1twM*%dO&0pnm`D6vTGK$Ex1`dnG;^%ZaeHI7=62NgZ8hu--
zR4&`?wj`6ucfkHXy#>Gq90G3O9-x3n*=+Wr)oO`pnk_(I>+Rd&t>znUjAR22g2A9M
zpU)W#1|NXwrs2k3o&GqN%Uv`Y4asCOec<St<`#fqn&x@EUYA0l@Ke*Y<8|=20)V|p
zB=WjitxBm>8f%*N46tqMY?fPeRr@}l?^HzSbUN+XZ1!dI{nxb%pd1c|zE~_+E|))m
z|IA>qNE_+f!{Km3*Y(73IDFsjcF#m)ahDs|-EQ}Dzu*7D>2#jlq}>I$Zy3gDJRX1I
za=8+Kc2~fBJRX1R^?H-(bov!oT8VaLpa30s2#m1!$^d@>M~5aO#PL7+00000NkvXX
Hu0mjfRpJ7b
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..01bb558a100e37e6985d700585a60bb38669ffc1
GIT binary patch
literal 413
zc%17D@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@
z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg)Ha<~v<98h?X+R;_%#er@=ltB<
z)VvY~5O6L^O)N=GQ7F$W$xv|j^bJVSOJxU&fAMs246!)9_p+^*i=jx{L-)B(0^Dy|
zyqUSeHx#pWX%{dSiN-WMP&*c-vV(<N+@ML}UqjT4Q;r)pY!u+uWpmuPlX?1U{+Ukx
z!k<*%d+wVf{LlJSo?-laeqIK@METP*x)tvpDp1?gP`oDOOj!Nesf_0rHFtVd9gm*Y
zx+%Kn5mW7b|A=12(xUtgvCY*HU5c^kwn;a2)e8GRdfn<#d~5c7tJDQ0w}Q5>QZ>zc
z-}7ZfMI2_6ld7_A`!aEI!WyaN*-`xL_K~^Y4vNZ2-}2;nsjBVBlgVzpWA(}9`=`G2
vRzEf&t}tY>9=lh-QNwwwy=4BqeE)}~{;P$q_e`&qpn&mo^>bP0l+XkKzt)uQ
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..5f092f97aa3db749e5e7f490158a489e16cbf4cd
GIT binary patch
literal 2442
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
IM6N<$f*YKb@Bjb+
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0f5fea3a8456c73a27c2f0f3d01b3bc96aee389d
GIT binary patch
literal 2152
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..613f30fecc041468d7ff766236dc509d815f7aab
GIT binary patch
literal 3287
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
VLvj=$Z|eX6002ovPDHLkV1ivBN1Ffu
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9ae39fb3291aa0703f045e00b9d640e753dc512d
GIT binary patch
literal 2129
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
Hu0mjf+T;As
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c9ab9511efb6da23110dea9a1630c8d59336242a
GIT binary patch
literal 3488
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
ZDv9)y!`<!HT*Ltrc$9Xe`tX@Q{RiUtqZR-F
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..3846e6f68de0ff1379fed451bb64d0271e175622
GIT binary patch
literal 5816
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..7df3baac6f9045553ebc88e3eb6aaf9fafa37e29
GIT binary patch
literal 27817
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
Q_-{Z!=#sym5!fC4FFOH5g8%>k
new file mode 100644
--- /dev/null
+++ b/src/qt/res/src/bitcoin.svg
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   width="256"
+   height="256"
+   sodipodi:docname="bitcoin.svg"
+   inkscape:export-filename="/store/orion/projects/bitcoin/BC_Logo_icon32.png"
+   inkscape:export-xdpi="11.25"
+   inkscape:export-ydpi="11.25"
+   style="display:inline">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6">
+    <linearGradient
+       id="linearGradient3800">
+      <stop
+         style="stop-color:#fbba6c;stop-opacity:1;"
+         offset="0"
+         id="stop3802" />
+      <stop
+         style="stop-color:#f89825;stop-opacity:1;"
+         offset="1"
+         id="stop3804" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3788">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="7.7328864"
+         id="feGaussianBlur3790" />
+    </filter>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3800"
+       id="radialGradient3806"
+       cx="137.01819"
+       cy="136.81316"
+       fx="137.01819"
+       fy="136.81316"
+       r="120.22619"
+       gradientTransform="matrix(1,0,0,0.99768745,0,0.29784356)"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1204"
+     inkscape:window-height="972"
+     id="namedview4"
+     showgrid="false"
+     inkscape:zoom="1"
+     inkscape:cx="-54.927212"
+     inkscape:cy="128"
+     inkscape:window-x="238"
+     inkscape:window-y="143"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="layer1" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Shadow"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:nodetypes="sssssssssssscssssscsssscscssssssssssscscsssssssscscssssscssscssssssscsssssssss"
+       inkscape:connector-curvature="0"
+       id="path2986"
+       d="M 111.77934,251.6677 C 67.147549,243.82973 30.788461,211.94464 17.111244,168.64858 7.1011053,136.9609 11.409199,100.0445 28.433065,71.630835 45.23974,43.579693 71.151762,24.409692 103.78036,15.888094 c 12.1652,-3.177178 33.00458,-3.99623 46.6577,-1.833789 45.59908,7.22219 82.56109,39.080427 96.48709,83.164011 10.01013,31.687684 5.70204,68.604084 -11.32183,97.017744 -16.8025,28.04418 -42.64131,47.16473 -75.34729,55.75648 -7.52834,1.97768 -11.60054,2.41566 -24.95273,2.68377 -10.90952,0.21906 -18.34974,-0.0999 -23.52396,-1.00861 z m 20.17619,-31.35425 c 0.63075,-2.39846 2.14458,-8.28561 3.36407,-13.08254 1.56481,-6.15521 2.69488,-8.60563 3.84031,-8.32722 0.89267,0.21696 7.39067,0.68131 14.43998,1.03189 16.31195,0.81124 23.9944,-1.14509 31.43693,-8.00537 7.63877,-7.04117 11.30337,-15.63267 11.82635,-27.72636 0.37592,-8.69327 0.10152,-10.44523 -2.27687,-14.53617 -1.48738,-2.55836 -5.17935,-6.48313 -8.20438,-8.7217 l -5.50006,-4.07013 4.37131,-1.87838 c 9.83682,-4.22697 14.47489,-11.84516 15.1401,-24.86816 0.41587,-8.14174 0.12573,-9.95645 -2.32406,-14.536178 -3.41249,-6.379435 -11.7129,-12.875301 -21.81801,-17.074696 -4.15735,-1.727672 -7.66196,-3.187464 -7.78803,-3.243983 -0.12607,-0.05651 1.28534,-6.088871 3.13645,-13.405229 1.85112,-7.316357 3.26253,-13.372021 3.13645,-13.457031 -0.12607,-0.08501 -2.84573,-0.778731 -6.04368,-1.541604 -3.19796,-0.762872 -6.6666,-1.640092 -7.70811,-1.949379 -1.54868,-0.459905 -2.47321,1.773902 -5.07541,12.262964 -2.215,8.928331 -3.69157,12.825303 -4.85951,12.825303 -2.30435,0 -12.01076,-2.489633 -12.01076,-3.080685 0,-0.263336 1.37739,-5.975631 3.06085,-12.693987 1.68345,-6.718356 2.78086,-12.49516 2.43868,-12.837341 -1.06646,-1.066455 -13.66473,-4.07084 -14.61292,-3.484827 -0.49474,0.305758 -2.13899,5.806491 -3.65393,12.223852 -1.51493,6.417361 -3.0693,12.177423 -3.45416,12.800138 -0.42537,0.68826 -6.84309,-0.416984 -16.36715,-2.818708 -8.617084,-2.173005 -15.989649,-3.583696 -16.383486,-3.13487 -0.393848,0.448826 -1.334199,3.432558 -2.089673,6.630515 -0.755474,3.197957 -1.623352,6.656241 -1.928612,7.685075 -0.438573,1.478093 0.970946,2.194444 6.717302,3.413902 7.407149,1.571906 12.549199,5.114005 12.549199,8.644526 0,3.559986 -18.770806,76.736553 -20.092504,78.329103 -1.007682,1.21419 -2.807318,1.40957 -7.196833,0.78135 -11.551776,-1.65329 -10.897277,-1.95681 -14.648875,6.7937 -1.878049,4.38054 -3.41465,8.32832 -3.41465,8.77286 0,0.44453 6.14881,2.29784 13.664008,4.11848 7.515199,1.82065 14.792647,3.72851 16.172114,4.23971 l 2.508106,0.92945 -3.31877,13.11716 c -1.825323,7.21442 -3.215633,13.21726 -3.089563,13.33965 0.549874,0.53382 15.058297,4.01313 15.382497,3.68892 0.19792,-0.19791 1.74688,-5.83164 3.44215,-12.51942 1.69526,-6.68778 3.30839,-12.52544 3.58472,-12.97256 0.443,-0.71676 11.73522,1.68597 12.76544,2.7162 0.21981,0.21981 -1.08467,6.26629 -2.89884,13.43664 l -3.29849,13.03696 4.8136,1.23571 c 2.6475,0.67965 5.33693,1.42786 5.97652,1.66271 3.63321,1.33406 5.19855,0.40079 6.2902,-3.75024 z m 0.68716,-43.88623 c -0.63959,-0.21166 -5.21848,-1.29512 -10.17531,-2.40768 -4.95684,-1.11255 -9.01243,-2.23295 -9.01243,-2.48975 0,-0.65492 8.11353,-33.1852 8.69895,-34.87745 0.34957,-1.01046 3.32218,-0.62569 10.96233,1.41895 12.84914,3.43866 18.00073,5.54314 23.11146,9.44128 8.35514,6.37277 10.49752,14.36232 5.75489,21.46161 -3.94917,5.91153 -9.15813,8.03413 -19.45529,7.92788 -4.79693,-0.0496 -9.245,-0.26317 -9.8846,-0.47484 z m 2.50991,-54.7082 c -3.73627,-0.93479 -7.21128,-1.958 -7.72221,-2.27376 -0.72057,-0.44534 6.3168,-31.740173 7.3756,-32.798964 0.64276,-0.642776 19.09068,4.708848 22.8588,6.631196 2.34875,1.19824 5.92162,4.059214 7.93975,6.357724 2.94919,3.358944 3.66929,5.201504 3.66929,9.388734 0,4.31035 -0.68714,5.95944 -3.98073,9.55341 -3.93586,4.2948 -4.08991,4.34657 -13.664,4.59252 -5.49512,0.14117 -12.62142,-0.48635 -16.4765,-1.45086 z"
+       style="opacity:0.8176923;fill:#000000;fill-opacity:1;filter:url(#filter3788)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="Front"
+     style="display:inline">
+    <path
+       style="fill:url(#radialGradient3806);fill-opacity:1;display:inline"
+       d="M 107.77934,247.6677 C 63.147549,239.82973 26.788461,207.94464 13.111244,164.64858 3.1011053,132.9609 7.4091993,96.044496 24.433065,67.630835 41.23974,39.579693 67.151762,20.409692 99.780356,11.888094 111.94556,8.7109163 132.78494,7.8918643 146.43806,10.054305 c 45.59908,7.22219 82.56109,39.080427 96.48709,83.164011 10.01013,31.687684 5.70204,68.604084 -11.32183,97.017744 -16.8025,28.04418 -42.64131,47.16473 -75.34729,55.75648 -7.52834,1.97768 -11.60054,2.41566 -24.95273,2.68377 -10.90952,0.21906 -18.34974,-0.0999 -23.52396,-1.00861 z m 20.17619,-31.35425 c 0.63075,-2.39846 2.14458,-8.28561 3.36407,-13.08254 1.56481,-6.15521 2.69488,-8.60563 3.84031,-8.32722 0.89267,0.21696 7.39067,0.68131 14.43998,1.03189 16.31195,0.81124 23.9944,-1.14509 31.43693,-8.00537 7.63877,-7.04117 11.30337,-15.63267 11.82635,-27.72636 0.37592,-8.69327 0.10152,-10.44523 -2.27687,-14.53617 -1.48738,-2.55836 -5.17935,-6.48313 -8.20438,-8.7217 l -5.50006,-4.07013 4.37131,-1.87838 c 9.83682,-4.22697 14.47489,-11.84516 15.1401,-24.86816 0.41587,-8.141744 0.12573,-9.956454 -2.32406,-14.536178 -3.41249,-6.379435 -11.7129,-12.875301 -21.81801,-17.074696 -4.15735,-1.727672 -7.66196,-3.187464 -7.78803,-3.243983 -0.12607,-0.05651 1.28534,-6.088871 3.13645,-13.405229 1.85112,-7.316357 3.26253,-13.372021 3.13645,-13.457031 -0.12607,-0.08501 -2.84573,-0.778731 -6.04368,-1.541604 -3.19796,-0.762872 -6.6666,-1.640092 -7.70811,-1.949379 -1.54868,-0.459905 -2.47321,1.773902 -5.07541,12.262964 -2.215,8.928331 -3.69157,12.825303 -4.85951,12.825303 -2.30435,0 -12.01076,-2.489633 -12.01076,-3.080685 0,-0.263336 1.37739,-5.975631 3.06085,-12.693987 1.68345,-6.718356 2.78086,-12.49516 2.43868,-12.837341 -1.06646,-1.066455 -13.66473,-4.07084 -14.61292,-3.484827 -0.49474,0.305758 -2.13899,5.806491 -3.65393,12.223852 -1.51493,6.417361 -3.0693,12.177423 -3.45416,12.800138 -0.42537,0.68826 -6.84309,-0.416984 -16.36715,-2.818708 -8.617084,-2.173005 -15.989649,-3.583696 -16.383486,-3.13487 -0.393848,0.448826 -1.334199,3.432558 -2.089673,6.630515 -0.755474,3.197957 -1.623352,6.656241 -1.928612,7.685075 -0.438573,1.478093 0.970946,2.194444 6.717302,3.413902 7.407145,1.571906 12.549199,5.114005 12.549199,8.644526 0,3.559986 -18.770806,76.736553 -20.092504,78.329103 -1.007682,1.21419 -2.807318,1.40957 -7.196833,0.78135 -11.551776,-1.65329 -10.897277,-1.95681 -14.648875,6.7937 -1.878049,4.38054 -3.41465,8.32832 -3.41465,8.77286 0,0.44453 6.14881,2.29784 13.664008,4.11848 7.515199,1.82065 14.792647,3.72851 16.172114,4.23971 l 2.508106,0.92945 -3.31877,13.11716 c -1.825323,7.21442 -3.215633,13.21726 -3.089563,13.33965 0.549874,0.53382 15.058293,4.01313 15.382493,3.68892 0.19792,-0.19791 1.74688,-5.83164 3.442154,-12.51942 1.69526,-6.68778 3.30839,-12.52544 3.58472,-12.97256 0.443,-0.71676 11.73522,1.68597 12.76544,2.7162 0.21981,0.21981 -1.08467,6.26629 -2.89884,13.43664 l -3.29849,13.03696 4.8136,1.23571 c 2.6475,0.67965 5.33693,1.42786 5.97652,1.66271 3.63321,1.33406 5.19855,0.40079 6.2902,-3.75024 z m 0.68716,-43.88623 c -0.63959,-0.21166 -5.21848,-1.29512 -10.17531,-2.40768 -4.95684,-1.11255 -9.01243,-2.23295 -9.01243,-2.48975 0,-0.65492 8.11353,-33.1852 8.69895,-34.87745 0.34957,-1.01046 3.32218,-0.62569 10.96233,1.41895 12.84914,3.43866 18.00073,5.54314 23.11146,9.44128 8.35514,6.37277 10.49752,14.36232 5.75489,21.46161 -3.94917,5.91153 -9.15813,8.03413 -19.45529,7.92788 -4.79693,-0.0496 -9.245,-0.26317 -9.8846,-0.47484 z m 2.50991,-54.7082 c -3.73627,-0.93479 -7.21128,-1.958 -7.72221,-2.27376 -0.72057,-0.44534 6.3168,-31.740173 7.3756,-32.798964 0.64276,-0.642776 19.09068,4.708848 22.8588,6.631196 2.34875,1.19824 5.92162,4.059214 7.93975,6.357724 2.94919,3.35894 3.66929,5.201504 3.66929,9.388734 0,4.31035 -0.68714,5.95944 -3.98073,9.55341 -3.93586,4.2948 -4.08991,4.34657 -13.664,4.59252 -5.49512,0.14117 -12.62142,-0.48635 -16.4765,-1.45086 z"
+       id="path2987"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="sssssssssssscssssscsssscscssssssssssscscsssssssscscssssscssscssssssscsssssssss"
+       inkscape:export-xdpi="11.98"
+       inkscape:export-ydpi="11.98" />
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/src/qt/res/src/clock1.svg
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16px"
+   height="16px"
+   id="svg2987"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="clock0.svg">
+  <defs
+     id="defs2989">
+    <linearGradient
+       id="linearGradient4465">
+      <stop
+         id="stop4467"
+         offset="0"
+         style="stop-color:#c1c1c1;stop-opacity:1;" />
+      <stop
+         id="stop4469"
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4424">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4426" />
+      <stop
+         style="stop-color:#b3b3b3;stop-opacity:1;"
+         offset="1"
+         id="stop4428" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4357">
+      <stop
+         id="stop4359"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ff84a6;stop-opacity:0.49803922;"
+         offset="0.36363637"
+         id="stop4473" />
+      <stop
+         id="stop4361"
+         offset="1"
+         style="stop-color:#ff0a4d;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4347">
+      <stop
+         id="stop4349"
+         offset="0"
+         style="stop-color:#909090;stop-opacity:1;" />
+      <stop
+         id="stop4351"
+         offset="1"
+         style="stop-color:#3c3c3c;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3767">
+      <stop
+         style="stop-color:#ff8282;stop-opacity:1;"
+         offset="0"
+         id="stop3769" />
+      <stop
+         style="stop-color:#ff1919;stop-opacity:1;"
+         offset="1"
+         id="stop3771" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4347"
+       id="linearGradient3779"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter4339">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.3240906"
+         id="feGaussianBlur4341" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3767"
+       id="linearGradient4345"
+       gradientUnits="userSpaceOnUse"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4424"
+       id="linearGradient4430"
+       x1="10.740074"
+       y1="16.148634"
+       x2="6.3055735"
+       y2="-1.2798394"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4357"
+       id="radialGradient4440"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5712985,0.01074232,-0.01353758,1.9801676,-4.5655476,-0.68355868)"
+       cx="8.1975746"
+       cy="-0.080271922"
+       fx="8.1975746"
+       fy="-0.080271922"
+       r="7.7781744" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4465"
+       id="linearGradient4471"
+       gradientUnits="userSpaceOnUse"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="0.31530906"
+     inkscape:cy="12.478576"
+     inkscape:current-layer="layer4"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1127"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:guide-bbox="true" />
+  <metadata
+     id="metadata2992">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Shadow"
+     style="display:inline">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3779);fill-opacity:1;stroke:none;display:inline;filter:url(#filter4339)"
+       id="path2997"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.7781744"
+       sodipodi:ry="7.7781744"
+       d="m 15.821514,8.1334372 a 7.7781744,7.7781744 0 1 1 -15.55634867,0 7.7781744,7.7781744 0 1 1 15.55634867,0 z"
+       transform="translate(0,-0.08838835)" />
+  </g>
+  <g
+     id="layer1"
+     inkscape:label="Clock"
+     inkscape:groupmode="layer"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)"
+       d="m 15.821514,8.1334372 a 7.7781744,7.7781744 0 1 1 -15.55634867,0 7.7781744,7.7781744 0 1 1 15.55634867,0 z"
+       sodipodi:ry="7.7781744"
+       sodipodi:rx="7.7781744"
+       sodipodi:cy="8.1334372"
+       sodipodi:cx="8.0433397"
+       id="path4343"
+       style="fill:url(#linearGradient4345);fill-opacity:1;stroke:none"
+       sodipodi:type="arc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Block"
+     sodipodi:insensitive="true"
+     style="display:inline">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient4471);fill-opacity:1;stroke:none;display:inline"
+       id="path4462"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.7781744"
+       sodipodi:ry="7.7781744"
+       d="M 14.4287,3.6919089 A 7.7781744,7.7781744 0 1 1 8.0707322,0.35531099 L 8.0433397,8.1334372 z"
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)"
+       sodipodi:start="5.675432"
+       sodipodi:end="10.999096" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Ticks"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       id="use4309"
+       transform="matrix(0.77323696,-0.44642857,0.44642857,0.77323696,-1.9715899,5.5529328)"
+       style="fill:url(#linearGradient4430);fill-opacity:1;stroke:none"
+       d="M 8.875,2.03125 C 8.875,2.5317581 8.4832492,2.9375 8,2.9375 7.5167508,2.9375 7.125,2.5317581 7.125,2.03125 7.125,1.5307419 7.5167508,1.125 8,1.125 c 0.4832492,0 0.875,0.4057419 0.875,0.90625 z M 5.8484195,2.6358993 C 6.0986735,3.069352 5.9622783,3.6166102 5.5437722,3.8582348 5.1252661,4.0998594 4.583129,3.944352 4.332875,3.5108993 4.082621,3.0774465 4.2190162,2.5301884 4.6375222,2.2885638 5.0560283,2.0469392 5.5981654,2.2024466 5.8484195,2.6358993 z M 3.5296488,4.6728304 C 3.9631015,4.9230844 4.1186089,5.4652215 3.8769843,5.8837276 3.6353597,6.3022337 3.0881015,6.4386289 2.6546488,6.1883748 2.221196,5.9381208 2.0656886,5.3959837 2.3073132,4.9774776 2.5489379,4.5589715 3.096196,4.4225763 3.5296488,4.6728304 z m -0.989649,2.9234201 c 0.5005081,0 0.90625,0.3917508 0.90625,0.875 0,0.4832492 -0.4057419,0.875 -0.90625,0.875 -0.5005081,0 -0.90625,-0.3917508 -0.90625,-0.875 0,-0.4832492 0.4057419,-0.875 0.90625,-0.875 z M 3.144649,10.622831 c 0.4334527,-0.250254 0.9807109,-0.113859 1.2223355,0.304647 0.2416246,0.418506 0.086117,0.960643 -0.3473355,1.210897 C 3.5861963,12.388629 3.0389381,12.252234 2.7973135,11.833728 2.5556889,11.415222 2.7111963,10.873085 3.144649,10.622831 z m 2.036931,2.31877 c 0.2502541,-0.433452 0.7923912,-0.58896 1.2108973,-0.347335 0.4185061,0.241624 0.5549012,0.788883 0.3046472,1.222335 -0.2502541,0.433453 -0.7923912,0.58896 -1.2108972,0.347336 C 5.0677212,13.922312 4.931326,13.375054 5.18158,12.941601 z m 2.9234201,0.989649 c 0,-0.500508 0.3917508,-0.90625 0.875,-0.90625 0.4832492,0 0.875,0.405742 0.875,0.90625 0,0.500509 -0.3917508,0.90625 -0.875,0.90625 -0.4832492,0 -0.875,-0.405741 -0.875,-0.90625 z M 11.13158,13.326601 c -0.250254,-0.433453 -0.113859,-0.980711 0.304647,-1.222335 0.418507,-0.241625 0.960644,-0.08612 1.210898,0.347335 0.250254,0.433453 0.113859,0.980711 -0.304648,1.222336 -0.418506,0.241624 -0.960643,0.08612 -1.210897,-0.347336 z m 2.318771,-2.036931 c -0.433453,-0.250254 -0.58896,-0.792391 -0.347335,-1.210897 0.241624,-0.4185064 0.788882,-0.5549016 1.222335,-0.3046476 0.433453,0.2502536 0.58896,0.7923916 0.347336,1.2108976 -0.241625,0.418506 -0.788883,0.554901 -1.222336,0.304647 z M 14.44,8.36625 c -0.500508,0 -0.90625,-0.3917508 -0.90625,-0.875 0,-0.4832492 0.405742,-0.875 0.90625,-0.875 0.500508,0 0.90625,0.3917508 0.90625,0.875 0,0.4832492 -0.405742,0.875 -0.90625,0.875 z M 13.835351,5.3396697 C 13.401898,5.5899238 12.85464,5.4535286 12.613016,5.0350225 12.371391,4.6165164 12.526898,4.0743793 12.960351,3.8241252 c 0.433453,-0.250254 0.980711,-0.1138588 1.222336,0.3046473 0.241624,0.4185061 0.08612,0.9606432 -0.347336,1.2108972 z M 11.79842,3.0208989 C 11.548166,3.4543516 11.006029,3.609859 10.587523,3.3682344 10.169017,3.1266098 10.032621,2.5793516 10.282875,2.1458989 10.533129,1.7124461 11.075267,1.5569388 11.493773,1.7985634 11.912279,2.040188 12.048674,2.5874462 11.79842,3.0208989 z"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 7.875,2.8017767 0,5.25"
+       id="path4436"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 7.7781746,7.4629419 10.783378,7.6397186"
+       id="path4438"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shine"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#radialGradient4440);fill-opacity:1;stroke:none"
+       id="path4353"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.3686199"
+       sodipodi:ry="7.4368792"
+       d="m 15.41196,8.1334372 a 7.3686199,7.4368792 0 1 1 -14.73724019,0 7.3686199,7.4368792 0 1 1 14.73724019,0 z"
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)" />
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/src/qt/res/src/clock2.svg
@@ -0,0 +1,262 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16px"
+   height="16px"
+   id="svg2987"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="clock0.svg">
+  <defs
+     id="defs2989">
+    <linearGradient
+       id="linearGradient4465">
+      <stop
+         id="stop4467"
+         offset="0"
+         style="stop-color:#c1c1c1;stop-opacity:1;" />
+      <stop
+         id="stop4469"
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4424">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4426" />
+      <stop
+         style="stop-color:#b3b3b3;stop-opacity:1;"
+         offset="1"
+         id="stop4428" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4357">
+      <stop
+         id="stop4359"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ff848d;stop-opacity:0.49803922;"
+         offset="0.36363637"
+         id="stop4473" />
+      <stop
+         id="stop4361"
+         offset="1"
+         style="stop-color:#ff0a1b;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4347">
+      <stop
+         id="stop4349"
+         offset="0"
+         style="stop-color:#909090;stop-opacity:1;" />
+      <stop
+         id="stop4351"
+         offset="1"
+         style="stop-color:#3c3c3c;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3767">
+      <stop
+         style="stop-color:#ffae82;stop-opacity:1;"
+         offset="0"
+         id="stop3769" />
+      <stop
+         style="stop-color:#ff6a19;stop-opacity:1;"
+         offset="1"
+         id="stop3771" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4347"
+       id="linearGradient3779"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter4339">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.3240906"
+         id="feGaussianBlur4341" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3767"
+       id="linearGradient4345"
+       gradientUnits="userSpaceOnUse"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4424"
+       id="linearGradient4430"
+       x1="10.740074"
+       y1="16.148634"
+       x2="6.3055735"
+       y2="-1.2798394"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4357"
+       id="radialGradient4440"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5712985,0.01074232,-0.01353758,1.9801676,-4.5655476,-0.68355868)"
+       cx="8.1975746"
+       cy="-0.080271922"
+       fx="8.1975746"
+       fy="-0.080271922"
+       r="7.7781744" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4465"
+       id="linearGradient4471"
+       gradientUnits="userSpaceOnUse"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="10.569917"
+     inkscape:cy="10.828475"
+     inkscape:current-layer="layer5"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1127"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:guide-bbox="true" />
+  <metadata
+     id="metadata2992">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Shadow"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3779);fill-opacity:1;stroke:none;display:inline;filter:url(#filter4339)"
+       id="path2997"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.7781744"
+       sodipodi:ry="7.7781744"
+       d="m 15.821514,8.1334372 a 7.7781744,7.7781744 0 1 1 -15.55634867,0 7.7781744,7.7781744 0 1 1 15.55634867,0 z"
+       transform="translate(0,-0.08838835)" />
+  </g>
+  <g
+     id="layer1"
+     inkscape:label="Clock"
+     inkscape:groupmode="layer"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)"
+       d="m 15.821514,8.1334372 a 7.7781744,7.7781744 0 1 1 -15.55634867,0 7.7781744,7.7781744 0 1 1 15.55634867,0 z"
+       sodipodi:ry="7.7781744"
+       sodipodi:rx="7.7781744"
+       sodipodi:cy="8.1334372"
+       sodipodi:cx="8.0433397"
+       id="path4343"
+       style="fill:url(#linearGradient4345);fill-opacity:1;stroke:none"
+       sodipodi:type="arc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Block"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient4471);fill-opacity:1;stroke:none;display:inline"
+       id="path4462"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.7781744"
+       sodipodi:ry="7.7781744"
+       d="M 15.197954,11.184912 A 7.7781744,7.7781744 0 1 1 8.0707322,0.35531099 L 8.0433397,8.1334372 z"
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)"
+       sodipodi:start="0.4031442"
+       sodipodi:end="4.7159107" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Ticks"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       id="use4309"
+       transform="matrix(0.77323696,-0.44642857,0.44642857,0.77323696,-1.9715899,5.5529328)"
+       style="fill:url(#linearGradient4430);fill-opacity:1;stroke:none"
+       d="M 8.875,2.03125 C 8.875,2.5317581 8.4832492,2.9375 8,2.9375 7.5167508,2.9375 7.125,2.5317581 7.125,2.03125 7.125,1.5307419 7.5167508,1.125 8,1.125 c 0.4832492,0 0.875,0.4057419 0.875,0.90625 z M 5.8484195,2.6358993 C 6.0986735,3.069352 5.9622783,3.6166102 5.5437722,3.8582348 5.1252661,4.0998594 4.583129,3.944352 4.332875,3.5108993 4.082621,3.0774465 4.2190162,2.5301884 4.6375222,2.2885638 5.0560283,2.0469392 5.5981654,2.2024466 5.8484195,2.6358993 z M 3.5296488,4.6728304 C 3.9631015,4.9230844 4.1186089,5.4652215 3.8769843,5.8837276 3.6353597,6.3022337 3.0881015,6.4386289 2.6546488,6.1883748 2.221196,5.9381208 2.0656886,5.3959837 2.3073132,4.9774776 2.5489379,4.5589715 3.096196,4.4225763 3.5296488,4.6728304 z m -0.989649,2.9234201 c 0.5005081,0 0.90625,0.3917508 0.90625,0.875 0,0.4832492 -0.4057419,0.875 -0.90625,0.875 -0.5005081,0 -0.90625,-0.3917508 -0.90625,-0.875 0,-0.4832492 0.4057419,-0.875 0.90625,-0.875 z M 3.144649,10.622831 c 0.4334527,-0.250254 0.9807109,-0.113859 1.2223355,0.304647 0.2416246,0.418506 0.086117,0.960643 -0.3473355,1.210897 C 3.5861963,12.388629 3.0389381,12.252234 2.7973135,11.833728 2.5556889,11.415222 2.7111963,10.873085 3.144649,10.622831 z m 2.036931,2.31877 c 0.2502541,-0.433452 0.7923912,-0.58896 1.2108973,-0.347335 0.4185061,0.241624 0.5549012,0.788883 0.3046472,1.222335 -0.2502541,0.433453 -0.7923912,0.58896 -1.2108972,0.347336 C 5.0677212,13.922312 4.931326,13.375054 5.18158,12.941601 z m 2.9234201,0.989649 c 0,-0.500508 0.3917508,-0.90625 0.875,-0.90625 0.4832492,0 0.875,0.405742 0.875,0.90625 0,0.500509 -0.3917508,0.90625 -0.875,0.90625 -0.4832492,0 -0.875,-0.405741 -0.875,-0.90625 z M 11.13158,13.326601 c -0.250254,-0.433453 -0.113859,-0.980711 0.304647,-1.222335 0.418507,-0.241625 0.960644,-0.08612 1.210898,0.347335 0.250254,0.433453 0.113859,0.980711 -0.304648,1.222336 -0.418506,0.241624 -0.960643,0.08612 -1.210897,-0.347336 z m 2.318771,-2.036931 c -0.433453,-0.250254 -0.58896,-0.792391 -0.347335,-1.210897 0.241624,-0.4185064 0.788882,-0.5549016 1.222335,-0.3046476 0.433453,0.2502536 0.58896,0.7923916 0.347336,1.2108976 -0.241625,0.418506 -0.788883,0.554901 -1.222336,0.304647 z M 14.44,8.36625 c -0.500508,0 -0.90625,-0.3917508 -0.90625,-0.875 0,-0.4832492 0.405742,-0.875 0.90625,-0.875 0.500508,0 0.90625,0.3917508 0.90625,0.875 0,0.4832492 -0.405742,0.875 -0.90625,0.875 z M 13.835351,5.3396697 C 13.401898,5.5899238 12.85464,5.4535286 12.613016,5.0350225 12.371391,4.6165164 12.526898,4.0743793 12.960351,3.8241252 c 0.433453,-0.250254 0.980711,-0.1138588 1.222336,0.3046473 0.241624,0.4185061 0.08612,0.9606432 -0.347336,1.2108972 z M 11.79842,3.0208989 C 11.548166,3.4543516 11.006029,3.609859 10.587523,3.3682344 10.169017,3.1266098 10.032621,2.5793516 10.282875,2.1458989 10.533129,1.7124461 11.075267,1.5569388 11.493773,1.7985634 11.912279,2.040188 12.048674,2.5874462 11.79842,3.0208989 z"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 7.875,2.8017767 0,5.25"
+       id="path4436"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 7.7781746,7.4629419 10.783378,7.6397186"
+       id="path4438"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shine"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#radialGradient4440);fill-opacity:1;stroke:none"
+       id="path4353"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.3686199"
+       sodipodi:ry="7.4368792"
+       d="m 15.41196,8.1334372 a 7.3686199,7.4368792 0 1 1 -14.73724019,0 7.3686199,7.4368792 0 1 1 14.73724019,0 z"
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)" />
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/src/qt/res/src/clock3.svg
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16px"
+   height="16px"
+   id="svg2987"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="clock1.svg">
+  <defs
+     id="defs2989">
+    <linearGradient
+       id="linearGradient4465">
+      <stop
+         id="stop4467"
+         offset="0"
+         style="stop-color:#c1c1c1;stop-opacity:1;" />
+      <stop
+         id="stop4469"
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4424">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4426" />
+      <stop
+         style="stop-color:#b3b3b3;stop-opacity:1;"
+         offset="1"
+         id="stop4428" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4357">
+      <stop
+         id="stop4359"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffa184;stop-opacity:0.49803922;"
+         offset="0.36363637"
+         id="stop4473" />
+      <stop
+         id="stop4361"
+         offset="1"
+         style="stop-color:#ff440a;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4347">
+      <stop
+         id="stop4349"
+         offset="0"
+         style="stop-color:#909090;stop-opacity:1;" />
+      <stop
+         id="stop4351"
+         offset="1"
+         style="stop-color:#3c3c3c;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3767">
+      <stop
+         style="stop-color:#ffda82;stop-opacity:1;"
+         offset="0"
+         id="stop3769" />
+      <stop
+         style="stop-color:#ffbb19;stop-opacity:1;"
+         offset="1"
+         id="stop3771" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4347"
+       id="linearGradient3779"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter4339">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.3240906"
+         id="feGaussianBlur4341" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3767"
+       id="linearGradient4345"
+       gradientUnits="userSpaceOnUse"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4424"
+       id="linearGradient4430"
+       x1="10.740074"
+       y1="16.148634"
+       x2="6.3055735"
+       y2="-1.2798394"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4357"
+       id="radialGradient4440"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5712985,0.01074232,-0.01353758,1.9801676,-4.5655476,-0.68355868)"
+       cx="8.1975746"
+       cy="-0.080271922"
+       fx="8.1975746"
+       fy="-0.080271922"
+       r="7.7781744" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4465"
+       id="linearGradient4471"
+       gradientUnits="userSpaceOnUse"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="23.894737"
+     inkscape:cx="16"
+     inkscape:cy="-1"
+     inkscape:current-layer="layer5"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1127"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:guide-bbox="true" />
+  <metadata
+     id="metadata2992">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Shadow"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3779);fill-opacity:1;stroke:none;display:inline;filter:url(#filter4339)"
+       id="path2997"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.7781744"
+       sodipodi:ry="7.7781744"
+       d="m 15.821514,8.1334372 a 7.7781744,7.7781744 0 1 1 -15.55634867,0 7.7781744,7.7781744 0 1 1 15.55634867,0 z"
+       transform="translate(0,-0.08838835)" />
+  </g>
+  <g
+     id="layer1"
+     inkscape:label="Clock"
+     inkscape:groupmode="layer"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)"
+       d="m 15.821514,8.1334372 a 7.7781744,7.7781744 0 1 1 -15.55634867,0 7.7781744,7.7781744 0 1 1 15.55634867,0 z"
+       sodipodi:ry="7.7781744"
+       sodipodi:rx="7.7781744"
+       sodipodi:cy="8.1334372"
+       sodipodi:cx="8.0433397"
+       id="path4343"
+       style="fill:url(#linearGradient4345);fill-opacity:1;stroke:none"
+       sodipodi:type="arc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Block"
+     style="display:inline">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient4471);fill-opacity:1;stroke:none;display:inline"
+       id="path4462"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.7781744"
+       sodipodi:ry="7.7781744"
+       d="M 8.2135533,15.909749 A 7.7781744,7.7781744 0 1 1 8.0707322,0.35531099 L 8.0433397,8.1334372 z"
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)"
+       sodipodi:start="1.5489111"
+       sodipodi:end="4.7159107" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Ticks"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       id="use4309"
+       transform="matrix(0.77323696,-0.44642857,0.44642857,0.77323696,-1.9715899,5.5529328)"
+       style="fill:url(#linearGradient4430);fill-opacity:1;stroke:none"
+       d="M 8.875,2.03125 C 8.875,2.5317581 8.4832492,2.9375 8,2.9375 7.5167508,2.9375 7.125,2.5317581 7.125,2.03125 7.125,1.5307419 7.5167508,1.125 8,1.125 c 0.4832492,0 0.875,0.4057419 0.875,0.90625 z M 5.8484195,2.6358993 C 6.0986735,3.069352 5.9622783,3.6166102 5.5437722,3.8582348 5.1252661,4.0998594 4.583129,3.944352 4.332875,3.5108993 4.082621,3.0774465 4.2190162,2.5301884 4.6375222,2.2885638 5.0560283,2.0469392 5.5981654,2.2024466 5.8484195,2.6358993 z M 3.5296488,4.6728304 C 3.9631015,4.9230844 4.1186089,5.4652215 3.8769843,5.8837276 3.6353597,6.3022337 3.0881015,6.4386289 2.6546488,6.1883748 2.221196,5.9381208 2.0656886,5.3959837 2.3073132,4.9774776 2.5489379,4.5589715 3.096196,4.4225763 3.5296488,4.6728304 z m -0.989649,2.9234201 c 0.5005081,0 0.90625,0.3917508 0.90625,0.875 0,0.4832492 -0.4057419,0.875 -0.90625,0.875 -0.5005081,0 -0.90625,-0.3917508 -0.90625,-0.875 0,-0.4832492 0.4057419,-0.875 0.90625,-0.875 z M 3.144649,10.622831 c 0.4334527,-0.250254 0.9807109,-0.113859 1.2223355,0.304647 0.2416246,0.418506 0.086117,0.960643 -0.3473355,1.210897 C 3.5861963,12.388629 3.0389381,12.252234 2.7973135,11.833728 2.5556889,11.415222 2.7111963,10.873085 3.144649,10.622831 z m 2.036931,2.31877 c 0.2502541,-0.433452 0.7923912,-0.58896 1.2108973,-0.347335 0.4185061,0.241624 0.5549012,0.788883 0.3046472,1.222335 -0.2502541,0.433453 -0.7923912,0.58896 -1.2108972,0.347336 C 5.0677212,13.922312 4.931326,13.375054 5.18158,12.941601 z m 2.9234201,0.989649 c 0,-0.500508 0.3917508,-0.90625 0.875,-0.90625 0.4832492,0 0.875,0.405742 0.875,0.90625 0,0.500509 -0.3917508,0.90625 -0.875,0.90625 -0.4832492,0 -0.875,-0.405741 -0.875,-0.90625 z M 11.13158,13.326601 c -0.250254,-0.433453 -0.113859,-0.980711 0.304647,-1.222335 0.418507,-0.241625 0.960644,-0.08612 1.210898,0.347335 0.250254,0.433453 0.113859,0.980711 -0.304648,1.222336 -0.418506,0.241624 -0.960643,0.08612 -1.210897,-0.347336 z m 2.318771,-2.036931 c -0.433453,-0.250254 -0.58896,-0.792391 -0.347335,-1.210897 0.241624,-0.4185064 0.788882,-0.5549016 1.222335,-0.3046476 0.433453,0.2502536 0.58896,0.7923916 0.347336,1.2108976 -0.241625,0.418506 -0.788883,0.554901 -1.222336,0.304647 z M 14.44,8.36625 c -0.500508,0 -0.90625,-0.3917508 -0.90625,-0.875 0,-0.4832492 0.405742,-0.875 0.90625,-0.875 0.500508,0 0.90625,0.3917508 0.90625,0.875 0,0.4832492 -0.405742,0.875 -0.90625,0.875 z M 13.835351,5.3396697 C 13.401898,5.5899238 12.85464,5.4535286 12.613016,5.0350225 12.371391,4.6165164 12.526898,4.0743793 12.960351,3.8241252 c 0.433453,-0.250254 0.980711,-0.1138588 1.222336,0.3046473 0.241624,0.4185061 0.08612,0.9606432 -0.347336,1.2108972 z M 11.79842,3.0208989 C 11.548166,3.4543516 11.006029,3.609859 10.587523,3.3682344 10.169017,3.1266098 10.032621,2.5793516 10.282875,2.1458989 10.533129,1.7124461 11.075267,1.5569388 11.493773,1.7985634 11.912279,2.040188 12.048674,2.5874462 11.79842,3.0208989 z"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 7.875,2.8017767 0,5.25"
+       id="path4436"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 7.7781746,7.4629419 10.783378,7.6397186"
+       id="path4438"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shine"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#radialGradient4440);fill-opacity:1;stroke:none"
+       id="path4353"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.3686199"
+       sodipodi:ry="7.4368792"
+       d="m 15.41196,8.1334372 a 7.3686199,7.4368792 0 1 1 -14.73724019,0 7.3686199,7.4368792 0 1 1 14.73724019,0 z"
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)" />
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/src/qt/res/src/clock4.svg
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16px"
+   height="16px"
+   id="svg2987"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="clock2.svg">
+  <defs
+     id="defs2989">
+    <linearGradient
+       id="linearGradient4465">
+      <stop
+         id="stop4467"
+         offset="0"
+         style="stop-color:#c1c1c1;stop-opacity:1;" />
+      <stop
+         id="stop4469"
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4424">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4426" />
+      <stop
+         style="stop-color:#b3b3b3;stop-opacity:1;"
+         offset="1"
+         id="stop4428" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4357">
+      <stop
+         id="stop4359"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffcc84;stop-opacity:0.49803922;"
+         offset="0.36363637"
+         id="stop4473" />
+      <stop
+         id="stop4361"
+         offset="1"
+         style="stop-color:#ff9a0a;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4347">
+      <stop
+         id="stop4349"
+         offset="0"
+         style="stop-color:#909090;stop-opacity:1;" />
+      <stop
+         id="stop4351"
+         offset="1"
+         style="stop-color:#3c3c3c;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3767">
+      <stop
+         style="stop-color:#f8ff82;stop-opacity:1;"
+         offset="0"
+         id="stop3769" />
+      <stop
+         style="stop-color:#f1ff19;stop-opacity:1;"
+         offset="1"
+         id="stop3771" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4347"
+       id="linearGradient3779"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter4339">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.3240906"
+         id="feGaussianBlur4341" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3767"
+       id="linearGradient4345"
+       gradientUnits="userSpaceOnUse"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4424"
+       id="linearGradient4430"
+       x1="10.740074"
+       y1="16.148634"
+       x2="6.3055735"
+       y2="-1.2798394"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4357"
+       id="radialGradient4440"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5712985,0.01074232,-0.01353758,1.9801676,-4.5655476,-0.68355868)"
+       cx="8.1975746"
+       cy="-0.080271922"
+       fx="8.1975746"
+       fy="-0.080271922"
+       r="7.7781744" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4465"
+       id="linearGradient4471"
+       gradientUnits="userSpaceOnUse"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16"
+     inkscape:cx="8.6111742"
+     inkscape:cy="6.6684704"
+     inkscape:current-layer="layer5"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1127"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:guide-bbox="true" />
+  <metadata
+     id="metadata2992">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Shadow"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3779);fill-opacity:1;stroke:none;display:inline;filter:url(#filter4339)"
+       id="path2997"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.7781744"
+       sodipodi:ry="7.7781744"
+       d="m 15.821514,8.1334372 a 7.7781744,7.7781744 0 1 1 -15.55634867,0 7.7781744,7.7781744 0 1 1 15.55634867,0 z"
+       transform="translate(0,-0.08838835)" />
+  </g>
+  <g
+     id="layer1"
+     inkscape:label="Clock"
+     inkscape:groupmode="layer"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)"
+       d="m 15.821514,8.1334372 a 7.7781744,7.7781744 0 1 1 -15.55634867,0 7.7781744,7.7781744 0 1 1 15.55634867,0 z"
+       sodipodi:ry="7.7781744"
+       sodipodi:rx="7.7781744"
+       sodipodi:cy="8.1334372"
+       sodipodi:cx="8.0433397"
+       id="path4343"
+       style="fill:url(#linearGradient4345);fill-opacity:1;stroke:none"
+       sodipodi:type="arc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Block"
+     style="display:inline">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient4471);fill-opacity:1;stroke:none;display:inline"
+       id="path4462"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.7781744"
+       sodipodi:ry="7.7781744"
+       d="M 1.7005474,12.635546 A 7.7781744,7.7781744 0 0 1 8.0707322,0.35531099 L 8.0433397,8.1334372 z"
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)"
+       sodipodi:start="2.5243203"
+       sodipodi:end="4.7159107" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Ticks"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       id="use4309"
+       transform="matrix(0.77323696,-0.44642857,0.44642857,0.77323696,-1.9715899,5.5529328)"
+       style="fill:url(#linearGradient4430);fill-opacity:1;stroke:none"
+       d="M 8.875,2.03125 C 8.875,2.5317581 8.4832492,2.9375 8,2.9375 7.5167508,2.9375 7.125,2.5317581 7.125,2.03125 7.125,1.5307419 7.5167508,1.125 8,1.125 c 0.4832492,0 0.875,0.4057419 0.875,0.90625 z M 5.8484195,2.6358993 C 6.0986735,3.069352 5.9622783,3.6166102 5.5437722,3.8582348 5.1252661,4.0998594 4.583129,3.944352 4.332875,3.5108993 4.082621,3.0774465 4.2190162,2.5301884 4.6375222,2.2885638 5.0560283,2.0469392 5.5981654,2.2024466 5.8484195,2.6358993 z M 3.5296488,4.6728304 C 3.9631015,4.9230844 4.1186089,5.4652215 3.8769843,5.8837276 3.6353597,6.3022337 3.0881015,6.4386289 2.6546488,6.1883748 2.221196,5.9381208 2.0656886,5.3959837 2.3073132,4.9774776 2.5489379,4.5589715 3.096196,4.4225763 3.5296488,4.6728304 z m -0.989649,2.9234201 c 0.5005081,0 0.90625,0.3917508 0.90625,0.875 0,0.4832492 -0.4057419,0.875 -0.90625,0.875 -0.5005081,0 -0.90625,-0.3917508 -0.90625,-0.875 0,-0.4832492 0.4057419,-0.875 0.90625,-0.875 z M 3.144649,10.622831 c 0.4334527,-0.250254 0.9807109,-0.113859 1.2223355,0.304647 0.2416246,0.418506 0.086117,0.960643 -0.3473355,1.210897 C 3.5861963,12.388629 3.0389381,12.252234 2.7973135,11.833728 2.5556889,11.415222 2.7111963,10.873085 3.144649,10.622831 z m 2.036931,2.31877 c 0.2502541,-0.433452 0.7923912,-0.58896 1.2108973,-0.347335 0.4185061,0.241624 0.5549012,0.788883 0.3046472,1.222335 -0.2502541,0.433453 -0.7923912,0.58896 -1.2108972,0.347336 C 5.0677212,13.922312 4.931326,13.375054 5.18158,12.941601 z m 2.9234201,0.989649 c 0,-0.500508 0.3917508,-0.90625 0.875,-0.90625 0.4832492,0 0.875,0.405742 0.875,0.90625 0,0.500509 -0.3917508,0.90625 -0.875,0.90625 -0.4832492,0 -0.875,-0.405741 -0.875,-0.90625 z M 11.13158,13.326601 c -0.250254,-0.433453 -0.113859,-0.980711 0.304647,-1.222335 0.418507,-0.241625 0.960644,-0.08612 1.210898,0.347335 0.250254,0.433453 0.113859,0.980711 -0.304648,1.222336 -0.418506,0.241624 -0.960643,0.08612 -1.210897,-0.347336 z m 2.318771,-2.036931 c -0.433453,-0.250254 -0.58896,-0.792391 -0.347335,-1.210897 0.241624,-0.4185064 0.788882,-0.5549016 1.222335,-0.3046476 0.433453,0.2502536 0.58896,0.7923916 0.347336,1.2108976 -0.241625,0.418506 -0.788883,0.554901 -1.222336,0.304647 z M 14.44,8.36625 c -0.500508,0 -0.90625,-0.3917508 -0.90625,-0.875 0,-0.4832492 0.405742,-0.875 0.90625,-0.875 0.500508,0 0.90625,0.3917508 0.90625,0.875 0,0.4832492 -0.405742,0.875 -0.90625,0.875 z M 13.835351,5.3396697 C 13.401898,5.5899238 12.85464,5.4535286 12.613016,5.0350225 12.371391,4.6165164 12.526898,4.0743793 12.960351,3.8241252 c 0.433453,-0.250254 0.980711,-0.1138588 1.222336,0.3046473 0.241624,0.4185061 0.08612,0.9606432 -0.347336,1.2108972 z M 11.79842,3.0208989 C 11.548166,3.4543516 11.006029,3.609859 10.587523,3.3682344 10.169017,3.1266098 10.032621,2.5793516 10.282875,2.1458989 10.533129,1.7124461 11.075267,1.5569388 11.493773,1.7985634 11.912279,2.040188 12.048674,2.5874462 11.79842,3.0208989 z"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 7.875,2.8017767 0,5.25"
+       id="path4436"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 7.7781746,7.4629419 10.783378,7.6397186"
+       id="path4438"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shine"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#radialGradient4440);fill-opacity:1;stroke:none"
+       id="path4353"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.3686199"
+       sodipodi:ry="7.4368792"
+       d="m 15.41196,8.1334372 a 7.3686199,7.4368792 0 1 1 -14.73724019,0 7.3686199,7.4368792 0 1 1 14.73724019,0 z"
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)" />
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/src/qt/res/src/clock5.svg
@@ -0,0 +1,262 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16px"
+   height="16px"
+   id="svg2987"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="clock3.svg">
+  <defs
+     id="defs2989">
+    <linearGradient
+       id="linearGradient4465">
+      <stop
+         id="stop4467"
+         offset="0"
+         style="stop-color:#c1c1c1;stop-opacity:1;" />
+      <stop
+         id="stop4469"
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4424">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4426" />
+      <stop
+         style="stop-color:#b3b3b3;stop-opacity:1;"
+         offset="1"
+         id="stop4428" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4357">
+      <stop
+         id="stop4359"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         style="stop-color:#fff884;stop-opacity:0.49803922;"
+         offset="0.36363637"
+         id="stop4473" />
+      <stop
+         id="stop4361"
+         offset="1"
+         style="stop-color:#fff10a;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4347">
+      <stop
+         id="stop4349"
+         offset="0"
+         style="stop-color:#909090;stop-opacity:1;" />
+      <stop
+         id="stop4351"
+         offset="1"
+         style="stop-color:#3c3c3c;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3767">
+      <stop
+         style="stop-color:#ccff82;stop-opacity:1;"
+         offset="0"
+         id="stop3769" />
+      <stop
+         style="stop-color:#a0ff19;stop-opacity:1;"
+         offset="1"
+         id="stop3771" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4347"
+       id="linearGradient3779"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter4339">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.3240906"
+         id="feGaussianBlur4341" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3767"
+       id="linearGradient4345"
+       gradientUnits="userSpaceOnUse"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4424"
+       id="linearGradient4430"
+       x1="10.740074"
+       y1="16.148634"
+       x2="6.3055735"
+       y2="-1.2798394"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4357"
+       id="radialGradient4440"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5712985,0.01074232,-0.01353758,1.9801676,-4.5655476,-0.68355868)"
+       cx="8.1975746"
+       cy="-0.080271922"
+       fx="8.1975746"
+       fy="-0.080271922"
+       r="7.7781744" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4465"
+       id="linearGradient4471"
+       gradientUnits="userSpaceOnUse"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16"
+     inkscape:cx="8.6111742"
+     inkscape:cy="6.6684704"
+     inkscape:current-layer="layer3"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1127"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:guide-bbox="true" />
+  <metadata
+     id="metadata2992">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Shadow"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3779);fill-opacity:1;stroke:none;display:inline;filter:url(#filter4339)"
+       id="path2997"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.7781744"
+       sodipodi:ry="7.7781744"
+       d="m 15.821514,8.1334372 a 7.7781744,7.7781744 0 1 1 -15.55634867,0 7.7781744,7.7781744 0 1 1 15.55634867,0 z"
+       transform="translate(0,-0.08838835)" />
+  </g>
+  <g
+     id="layer1"
+     inkscape:label="Clock"
+     inkscape:groupmode="layer"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)"
+       d="m 15.821514,8.1334372 a 7.7781744,7.7781744 0 1 1 -15.55634867,0 7.7781744,7.7781744 0 1 1 15.55634867,0 z"
+       sodipodi:ry="7.7781744"
+       sodipodi:rx="7.7781744"
+       sodipodi:cy="8.1334372"
+       sodipodi:cx="8.0433397"
+       id="path4343"
+       style="fill:url(#linearGradient4345);fill-opacity:1;stroke:none"
+       sodipodi:type="arc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Block"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient4471);fill-opacity:1;stroke:none;display:inline"
+       id="path4462"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.7781744"
+       sodipodi:ry="7.7781744"
+       d="M 1.0968082,4.6340519 A 7.7781744,7.7781744 0 0 1 8.0707322,0.35531099 L 8.0433397,8.1334372 z"
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)"
+       sodipodi:start="3.6082438"
+       sodipodi:end="4.7159107" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Ticks"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       id="use4309"
+       transform="matrix(0.77323696,-0.44642857,0.44642857,0.77323696,-1.9715899,5.5529328)"
+       style="fill:url(#linearGradient4430);fill-opacity:1;stroke:none"
+       d="M 8.875,2.03125 C 8.875,2.5317581 8.4832492,2.9375 8,2.9375 7.5167508,2.9375 7.125,2.5317581 7.125,2.03125 7.125,1.5307419 7.5167508,1.125 8,1.125 c 0.4832492,0 0.875,0.4057419 0.875,0.90625 z M 5.8484195,2.6358993 C 6.0986735,3.069352 5.9622783,3.6166102 5.5437722,3.8582348 5.1252661,4.0998594 4.583129,3.944352 4.332875,3.5108993 4.082621,3.0774465 4.2190162,2.5301884 4.6375222,2.2885638 5.0560283,2.0469392 5.5981654,2.2024466 5.8484195,2.6358993 z M 3.5296488,4.6728304 C 3.9631015,4.9230844 4.1186089,5.4652215 3.8769843,5.8837276 3.6353597,6.3022337 3.0881015,6.4386289 2.6546488,6.1883748 2.221196,5.9381208 2.0656886,5.3959837 2.3073132,4.9774776 2.5489379,4.5589715 3.096196,4.4225763 3.5296488,4.6728304 z m -0.989649,2.9234201 c 0.5005081,0 0.90625,0.3917508 0.90625,0.875 0,0.4832492 -0.4057419,0.875 -0.90625,0.875 -0.5005081,0 -0.90625,-0.3917508 -0.90625,-0.875 0,-0.4832492 0.4057419,-0.875 0.90625,-0.875 z M 3.144649,10.622831 c 0.4334527,-0.250254 0.9807109,-0.113859 1.2223355,0.304647 0.2416246,0.418506 0.086117,0.960643 -0.3473355,1.210897 C 3.5861963,12.388629 3.0389381,12.252234 2.7973135,11.833728 2.5556889,11.415222 2.7111963,10.873085 3.144649,10.622831 z m 2.036931,2.31877 c 0.2502541,-0.433452 0.7923912,-0.58896 1.2108973,-0.347335 0.4185061,0.241624 0.5549012,0.788883 0.3046472,1.222335 -0.2502541,0.433453 -0.7923912,0.58896 -1.2108972,0.347336 C 5.0677212,13.922312 4.931326,13.375054 5.18158,12.941601 z m 2.9234201,0.989649 c 0,-0.500508 0.3917508,-0.90625 0.875,-0.90625 0.4832492,0 0.875,0.405742 0.875,0.90625 0,0.500509 -0.3917508,0.90625 -0.875,0.90625 -0.4832492,0 -0.875,-0.405741 -0.875,-0.90625 z M 11.13158,13.326601 c -0.250254,-0.433453 -0.113859,-0.980711 0.304647,-1.222335 0.418507,-0.241625 0.960644,-0.08612 1.210898,0.347335 0.250254,0.433453 0.113859,0.980711 -0.304648,1.222336 -0.418506,0.241624 -0.960643,0.08612 -1.210897,-0.347336 z m 2.318771,-2.036931 c -0.433453,-0.250254 -0.58896,-0.792391 -0.347335,-1.210897 0.241624,-0.4185064 0.788882,-0.5549016 1.222335,-0.3046476 0.433453,0.2502536 0.58896,0.7923916 0.347336,1.2108976 -0.241625,0.418506 -0.788883,0.554901 -1.222336,0.304647 z M 14.44,8.36625 c -0.500508,0 -0.90625,-0.3917508 -0.90625,-0.875 0,-0.4832492 0.405742,-0.875 0.90625,-0.875 0.500508,0 0.90625,0.3917508 0.90625,0.875 0,0.4832492 -0.405742,0.875 -0.90625,0.875 z M 13.835351,5.3396697 C 13.401898,5.5899238 12.85464,5.4535286 12.613016,5.0350225 12.371391,4.6165164 12.526898,4.0743793 12.960351,3.8241252 c 0.433453,-0.250254 0.980711,-0.1138588 1.222336,0.3046473 0.241624,0.4185061 0.08612,0.9606432 -0.347336,1.2108972 z M 11.79842,3.0208989 C 11.548166,3.4543516 11.006029,3.609859 10.587523,3.3682344 10.169017,3.1266098 10.032621,2.5793516 10.282875,2.1458989 10.533129,1.7124461 11.075267,1.5569388 11.493773,1.7985634 11.912279,2.040188 12.048674,2.5874462 11.79842,3.0208989 z"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 7.875,2.8017767 0,5.25"
+       id="path4436"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 7.7781746,7.4629419 10.783378,7.6397186"
+       id="path4438"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shine"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#radialGradient4440);fill-opacity:1;stroke:none"
+       id="path4353"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.3686199"
+       sodipodi:ry="7.4368792"
+       d="m 15.41196,8.1334372 a 7.3686199,7.4368792 0 1 1 -14.73724019,0 7.3686199,7.4368792 0 1 1 14.73724019,0 z"
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)" />
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/src/qt/res/src/clock_green.svg
@@ -0,0 +1,262 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16px"
+   height="16px"
+   id="svg2987"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="clock_green.svg">
+  <defs
+     id="defs2989">
+    <linearGradient
+       id="linearGradient4465">
+      <stop
+         id="stop4467"
+         offset="0"
+         style="stop-color:#c1c1c1;stop-opacity:1;" />
+      <stop
+         id="stop4469"
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4424">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4426" />
+      <stop
+         style="stop-color:#b3b3b3;stop-opacity:1;"
+         offset="1"
+         id="stop4428" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4357">
+      <stop
+         id="stop4359"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         style="stop-color:#baff84;stop-opacity:0.49803922;"
+         offset="0.36363637"
+         id="stop4473" />
+      <stop
+         id="stop4361"
+         offset="1"
+         style="stop-color:#76ff0a;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4347">
+      <stop
+         id="stop4349"
+         offset="0"
+         style="stop-color:#c1c1c1;stop-opacity:1;" />
+      <stop
+         id="stop4351"
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3767">
+      <stop
+         style="stop-color:#82ff82;stop-opacity:1;"
+         offset="0"
+         id="stop3769" />
+      <stop
+         style="stop-color:#19ff19;stop-opacity:1;"
+         offset="1"
+         id="stop3771" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4347"
+       id="linearGradient3779"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter4339">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.3240906"
+         id="feGaussianBlur4341" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3767"
+       id="linearGradient4345"
+       gradientUnits="userSpaceOnUse"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4424"
+       id="linearGradient4430"
+       x1="10.740074"
+       y1="16.148634"
+       x2="6.3055735"
+       y2="-1.2798394"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4357"
+       id="radialGradient4440"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5712985,0.01074232,-0.01353758,1.9801676,-4.5655476,-0.68355868)"
+       cx="8.1975746"
+       cy="-0.080271922"
+       fx="8.1975746"
+       fy="-0.080271922"
+       r="7.7781744" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4465"
+       id="linearGradient4471"
+       gradientUnits="userSpaceOnUse"
+       x1="2.224874"
+       y1="2.8301363"
+       x2="14.038582"
+       y2="13.171574" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="8"
+     inkscape:cx="9.1870806"
+     inkscape:cy="14.089546"
+     inkscape:current-layer="layer3"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1127"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:guide-bbox="true" />
+  <metadata
+     id="metadata2992">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Shadow"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3779);fill-opacity:1;stroke:none;display:inline;filter:url(#filter4339)"
+       id="path2997"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.7781744"
+       sodipodi:ry="7.7781744"
+       d="m 15.821514,8.1334372 a 7.7781744,7.7781744 0 1 1 -15.55634867,0 7.7781744,7.7781744 0 1 1 15.55634867,0 z"
+       transform="translate(0,-0.08838835)" />
+  </g>
+  <g
+     id="layer1"
+     inkscape:label="Clock"
+     inkscape:groupmode="layer"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)"
+       d="m 15.821514,8.1334372 a 7.7781744,7.7781744 0 1 1 -15.55634867,0 7.7781744,7.7781744 0 1 1 15.55634867,0 z"
+       sodipodi:ry="7.7781744"
+       sodipodi:rx="7.7781744"
+       sodipodi:cy="8.1334372"
+       sodipodi:cx="8.0433397"
+       id="path4343"
+       style="fill:url(#linearGradient4345);fill-opacity:1;stroke:none"
+       sodipodi:type="arc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Block"
+     sodipodi:insensitive="true"
+     style="display:inline">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient4471);fill-opacity:1;stroke:none;display:inline"
+       id="path4462"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.7781744"
+       sodipodi:ry="7.7781744"
+       d="M 14.4287,3.6919089 A 7.7781744,7.7781744 0 1 1 8.0707322,0.35531099 L 8.0433397,8.1334372 z"
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)"
+       sodipodi:start="5.675432"
+       sodipodi:end="10.999096" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Ticks"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       id="use4309"
+       transform="matrix(0.77323696,-0.44642857,0.44642857,0.77323696,-1.9715899,5.5529328)"
+       style="fill:url(#linearGradient4430);fill-opacity:1;stroke:none"
+       d="M 8.875,2.03125 C 8.875,2.5317581 8.4832492,2.9375 8,2.9375 7.5167508,2.9375 7.125,2.5317581 7.125,2.03125 7.125,1.5307419 7.5167508,1.125 8,1.125 c 0.4832492,0 0.875,0.4057419 0.875,0.90625 z M 5.8484195,2.6358993 C 6.0986735,3.069352 5.9622783,3.6166102 5.5437722,3.8582348 5.1252661,4.0998594 4.583129,3.944352 4.332875,3.5108993 4.082621,3.0774465 4.2190162,2.5301884 4.6375222,2.2885638 5.0560283,2.0469392 5.5981654,2.2024466 5.8484195,2.6358993 z M 3.5296488,4.6728304 C 3.9631015,4.9230844 4.1186089,5.4652215 3.8769843,5.8837276 3.6353597,6.3022337 3.0881015,6.4386289 2.6546488,6.1883748 2.221196,5.9381208 2.0656886,5.3959837 2.3073132,4.9774776 2.5489379,4.5589715 3.096196,4.4225763 3.5296488,4.6728304 z m -0.989649,2.9234201 c 0.5005081,0 0.90625,0.3917508 0.90625,0.875 0,0.4832492 -0.4057419,0.875 -0.90625,0.875 -0.5005081,0 -0.90625,-0.3917508 -0.90625,-0.875 0,-0.4832492 0.4057419,-0.875 0.90625,-0.875 z M 3.144649,10.622831 c 0.4334527,-0.250254 0.9807109,-0.113859 1.2223355,0.304647 0.2416246,0.418506 0.086117,0.960643 -0.3473355,1.210897 C 3.5861963,12.388629 3.0389381,12.252234 2.7973135,11.833728 2.5556889,11.415222 2.7111963,10.873085 3.144649,10.622831 z m 2.036931,2.31877 c 0.2502541,-0.433452 0.7923912,-0.58896 1.2108973,-0.347335 0.4185061,0.241624 0.5549012,0.788883 0.3046472,1.222335 -0.2502541,0.433453 -0.7923912,0.58896 -1.2108972,0.347336 C 5.0677212,13.922312 4.931326,13.375054 5.18158,12.941601 z m 2.9234201,0.989649 c 0,-0.500508 0.3917508,-0.90625 0.875,-0.90625 0.4832492,0 0.875,0.405742 0.875,0.90625 0,0.500509 -0.3917508,0.90625 -0.875,0.90625 -0.4832492,0 -0.875,-0.405741 -0.875,-0.90625 z M 11.13158,13.326601 c -0.250254,-0.433453 -0.113859,-0.980711 0.304647,-1.222335 0.418507,-0.241625 0.960644,-0.08612 1.210898,0.347335 0.250254,0.433453 0.113859,0.980711 -0.304648,1.222336 -0.418506,0.241624 -0.960643,0.08612 -1.210897,-0.347336 z m 2.318771,-2.036931 c -0.433453,-0.250254 -0.58896,-0.792391 -0.347335,-1.210897 0.241624,-0.4185064 0.788882,-0.5549016 1.222335,-0.3046476 0.433453,0.2502536 0.58896,0.7923916 0.347336,1.2108976 -0.241625,0.418506 -0.788883,0.554901 -1.222336,0.304647 z M 14.44,8.36625 c -0.500508,0 -0.90625,-0.3917508 -0.90625,-0.875 0,-0.4832492 0.405742,-0.875 0.90625,-0.875 0.500508,0 0.90625,0.3917508 0.90625,0.875 0,0.4832492 -0.405742,0.875 -0.90625,0.875 z M 13.835351,5.3396697 C 13.401898,5.5899238 12.85464,5.4535286 12.613016,5.0350225 12.371391,4.6165164 12.526898,4.0743793 12.960351,3.8241252 c 0.433453,-0.250254 0.980711,-0.1138588 1.222336,0.3046473 0.241624,0.4185061 0.08612,0.9606432 -0.347336,1.2108972 z M 11.79842,3.0208989 C 11.548166,3.4543516 11.006029,3.609859 10.587523,3.3682344 10.169017,3.1266098 10.032621,2.5793516 10.282875,2.1458989 10.533129,1.7124461 11.075267,1.5569388 11.493773,1.7985634 11.912279,2.040188 12.048674,2.5874462 11.79842,3.0208989 z"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 7.875,2.8017767 0,5.25"
+       id="path4436"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 7.7781746,7.4629419 10.783378,7.6397186"
+       id="path4438"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shine"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#radialGradient4440);fill-opacity:1;stroke:none"
+       id="path4353"
+       sodipodi:cx="8.0433397"
+       sodipodi:cy="8.1334372"
+       sodipodi:rx="7.3686199"
+       sodipodi:ry="7.4368792"
+       d="m 15.41196,8.1334372 a 7.3686199,7.4368792 0 1 1 -14.73724019,0 7.3686199,7.4368792 0 1 1 14.73724019,0 z"
+       transform="matrix(0.91562931,0,0,0.91562931,0.64737218,0.56658541)" />
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/src/qt/res/src/inout.svg
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg3039"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   width="120"
+   height="120"
+   sodipodi:docname="inout3.svg"
+   inkscape:export-filename="/home/orion/projects2/bitcoin/tx_mined.png"
+   inkscape:export-xdpi="12"
+   inkscape:export-ydpi="12"
+   style="display:inline">
+  <metadata
+     id="metadata3045">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs3043" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1127"
+     id="namedview3041"
+     showgrid="false"
+     inkscape:zoom="1"
+     inkscape:cx="87.12655"
+     inkscape:cy="67.287943"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer7" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="base"
+     style="display:none">
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#afafaf;fill-opacity:1;stroke:none;stroke-width:7;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+       d="m 45.375,17 c -13.984022,0.241082 -24.968241,3.28976 -37.4375,9.59375 -8.9920665,21.871558 -6.680947,46.393002 -1.96875,69 26.190925,13.15317 55.594909,12.97748 81.75,-0.21875 3.852144,-9.729509 1.599587,-12.800015 2.375,-23.15625 C 83.917272,72.423868 77.129905,67.688094 74.1875,75.25 72.702487,79.722025 76.119709,82.645519 69.15625,83.34375 53.023957,88.536726 37.721719,89.140031 21.875,82.28125 19.715285,68.367979 18.599566,53.65725 22.5,40 c 16.868164,-6.642068 33.121079,-6.120062 50.03125,-0.15625 1.285344,5.854815 1.574746,5.763255 2.375,11.6875 C 80.46378,51.970623 89.644961,53.334736 91.3125,46 91.85305,36.007959 89.372312,31.625095 87.1875,25.6875 73.709743,21.03478 59.804255,16.698888 45.375,17 z"
+       id="path3053"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="arrow_out"
+     style="display:none">
+    <path
+       style="fill:#6e6e6e;fill-opacity:1;stroke:none;display:inline"
+       d="m 63.983409,65.48134 0.267857,-9.514444 36.161424,-0.194173 -7.414458,-8.757971 3.798312,-7.572721 c 0,0 23.437946,20.796656 22.500436,21.185 -0.93751,0.388345 -23.170094,22.73838 -23.170094,22.73838 l -3.128654,-8.931927 7.548388,-8.5638 z"
+       id="path3844"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccscccc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="arrow_in"
+     style="display:none">
+    <path
+       inkscape:connector-curvature="0"
+       id="path4080"
+       d="m 99.28763,65.48134 -0.26786,-9.514444 -36.161422,-0.194173 7.768009,-6.283097 -4.151865,-9.279828 c 0,0 -23.43795,20.028889 -22.500436,20.417233 0.937514,0.388345 23.170094,20.970613 23.170094,20.970613 l 3.482207,-9.639034 -7.901936,-6.088926 z"
+       style="fill:#6e6e6e;fill-opacity:1;stroke:none;display:inline"
+       sodipodi:nodetypes="cccccscccc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer7"
+     inkscape:label="mined"
+     style="display:inline">
+    <path
+       style="fill:#a9a9a9;fill-opacity:1;stroke:none;display:inline"
+       d="M 9.4375,99.758169 78.14665,33.110294 73.680556,28.300653 67.153187,8.375 l 18.55147,6.527369 4.80964,3.779003 4.809641,-4.80964 11.680552,12.367647 -6.18382,4.80964 13.74183,14.085377 -12.71119,14.42892 -14.77247,-16.14665 -65.273693,70.770424 z"
+       id="path4103"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccc" />
+    <path
+       sodipodi:nodetypes="cccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path4619"
+       d="M 114.5625,99.758169 45.85335,33.110294 50.319444,28.300653 56.846813,8.375 l -18.55147,6.527369 -4.80964,3.779003 -4.809641,-4.80964 -11.680556,12.367647 6.183825,4.80964 L 9.4375,45.134396 22.148693,59.563316 36.92116,43.416666 102.19485,114.18709 z"
+       style="fill:#a9a9a9;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       style="fill:#6e6e6e;fill-opacity:1;stroke:none"
+       d="M 10.960155,44.693128 38.53732,16.408856 54.093669,10.752002 48.436815,28.076118 22.273864,56.713943 z"
+       id="path5256"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="fill:#6e6e6e;fill-opacity:1;stroke:none"
+       d="M 69.296465,10.398449 85.559921,17.115963 111.72287,45.046681 102.17693,56.713943 74.953319,27.722565 z"
+       id="path5258"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/src/qt/res/src/questionmark.svg
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16px"
+   height="16px"
+   id="svg2993"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="questionmark.svg"
+   inkscape:export-filename="/store/orion/projects/bitcoin/questionmark.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs2995">
+    <linearGradient
+       id="linearGradient3808">
+      <stop
+         style="stop-color:#c8c8c8;stop-opacity:1;"
+         offset="0"
+         id="stop3810" />
+      <stop
+         style="stop-color:#959595;stop-opacity:1"
+         offset="1"
+         id="stop3812" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3804"
+       x="-0.2510722"
+       width="1.5021444"
+       y="-0.13164773"
+       height="1.2632955">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.73280473"
+         id="feGaussianBlur3806" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3808"
+       id="linearGradient3844"
+       x1="8.4916801"
+       y1="1.4395804"
+       x2="8.6022711"
+       y2="14.211697"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter3889"
+       x="-0.13954329"
+       width="1.2790866"
+       y="-0.073168421"
+       height="1.1463368">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.40728516"
+         id="feGaussianBlur3891" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       id="filter3897"
+       x="-0.17178624"
+       width="1.3435725"
+       y="-0.090074761"
+       height="1.1801495">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.50139271"
+         id="feGaussianBlur3899" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="10.789648"
+     inkscape:cy="7.6382159"
+     inkscape:current-layer="layer2"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1127"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata2998">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Below"
+     style="display:inline">
+    <text
+       sodipodi:linespacing="125%"
+       id="text3006"
+       y="14.748394"
+       x="4.1060953"
+       style="font-size:18px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;filter:url(#filter3897)"
+       xml:space="preserve"><tspan
+         y="14.748394"
+         x="4.1060953"
+         id="tspan3008"
+         sodipodi:role="line">?</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;filter:url(#filter3889)"
+       x="4.1060953"
+       y="14.748394"
+       id="text3824"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3826"
+         x="4.1060953"
+         y="14.748394">?</tspan></text>
+  </g>
+  <g
+     id="layer1"
+     inkscape:label="QuestionMark"
+     inkscape:groupmode="layer"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <text
+       xml:space="preserve"
+       style="font-size:18px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:url(#linearGradient3844);fill-opacity:1;stroke:none;font-family:Sans"
+       x="4.1060953"
+       y="14.748394"
+       id="text3001"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3003"
+         x="4.1060953"
+         y="14.748394"
+         style="fill:url(#linearGradient3844);fill-opacity:1">?</tspan></text>
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/src/qt/sendcoinsdialog.cpp
@@ -0,0 +1,243 @@
+#include "sendcoinsdialog.h"
+#include "ui_sendcoinsdialog.h"
+#include "walletmodel.h"
+#include "bitcoinunits.h"
+#include "addressbookpage.h"
+#include "optionsmodel.h"
+#include "sendcoinsentry.h"
+#include "guiutil.h"
+#include "askpassphrasedialog.h"
+
+#include <QMessageBox>
+#include <QLocale>
+#include <QTextDocument>
+
+SendCoinsDialog::SendCoinsDialog(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::SendCoinsDialog),
+    model(0)
+{
+    ui->setupUi(this);
+
+    addEntry();
+
+    connect(ui->addButton, SIGNAL(clicked()), this, SLOT(addEntry()));
+}
+
+void SendCoinsDialog::setModel(WalletModel *model)
+{
+    this->model = model;
+
+    for(int i = 0; i < ui->entries->count(); ++i)
+    {
+        SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(i)->widget());
+        if(entry)
+        {
+            entry->setModel(model);
+        }
+    }
+}
+
+SendCoinsDialog::~SendCoinsDialog()
+{
+    delete ui;
+}
+
+void SendCoinsDialog::on_sendButton_clicked()
+{
+    QList<SendCoinsRecipient> recipients;
+    bool valid = true;
+    for(int i = 0; i < ui->entries->count(); ++i)
+    {
+        SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(i)->widget());
+        if(entry)
+        {
+            if(entry->validate())
+            {
+                recipients.append(entry->getValue());
+            }
+            else
+            {
+                valid = false;
+            }
+        }
+    }
+
+    if(!valid || recipients.isEmpty())
+    {
+        return;
+    }
+
+    // Format confirmation message
+    QStringList formatted;
+    foreach(const SendCoinsRecipient &rcp, recipients)
+    {
+        formatted.append(tr("<b>%1</b> to %2 (%3)").arg(BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, rcp.amount), Qt::escape(rcp.label), rcp.address));
+    }
+
+    QMessageBox::StandardButton retval = QMessageBox::question(this, tr("Confirm send coins"),
+                          tr("Are you sure you want to send %1?").arg(formatted.join(tr(" and "))),
+          QMessageBox::Yes|QMessageBox::Cancel,
+          QMessageBox::Cancel);
+
+    if(retval != QMessageBox::Yes)
+    {
+        return;
+    }
+
+    WalletModel::UnlockContext ctx(model->requestUnlock());
+    if(!ctx.isValid())
+    {
+        // Unlock wallet was cancelled
+        return;
+    }
+
+    WalletModel::SendCoinsReturn sendstatus = model->sendCoins(recipients);
+    switch(sendstatus.status)
+    {
+    case WalletModel::InvalidAddress:
+        QMessageBox::warning(this, tr("Send Coins"),
+            tr("The recepient address is not valid, please recheck."),
+            QMessageBox::Ok, QMessageBox::Ok);
+        break;
+    case WalletModel::InvalidAmount:
+        QMessageBox::warning(this, tr("Send Coins"),
+            tr("The amount to pay must be larger than 0."),
+            QMessageBox::Ok, QMessageBox::Ok);
+        break;
+    case WalletModel::AmountExceedsBalance:
+        QMessageBox::warning(this, tr("Send Coins"),
+            tr("Amount exceeds your balance"),
+            QMessageBox::Ok, QMessageBox::Ok);
+        break;
+    case WalletModel::AmountWithFeeExceedsBalance:
+        QMessageBox::warning(this, tr("Send Coins"),
+            tr("Total exceeds your balance when the %1 transaction fee is included").
+            arg(BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, sendstatus.fee)),
+            QMessageBox::Ok, QMessageBox::Ok);
+        break;
+    case WalletModel::DuplicateAddress:
+        QMessageBox::warning(this, tr("Send Coins"),
+            tr("Duplicate address found, can only send to each address once in one send operation"),
+            QMessageBox::Ok, QMessageBox::Ok);
+        break;
+    case WalletModel::TransactionCreationFailed:
+        QMessageBox::warning(this, tr("Send Coins"),
+            tr("Error: Transaction creation failed  "),
+            QMessageBox::Ok, QMessageBox::Ok);
+        break;
+    case WalletModel::TransactionCommitFailed:
+        QMessageBox::warning(this, tr("Send Coins"),
+            tr("Error: The transaction was rejected.  This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here."),
+            QMessageBox::Ok, QMessageBox::Ok);
+        break;
+    case WalletModel::OK:
+        accept();
+        break;
+    }
+}
+
+void SendCoinsDialog::clear()
+{
+    // Remove entries until only one left
+    while(ui->entries->count())
+    {
+        delete ui->entries->takeAt(0)->widget();
+    }
+    addEntry();
+
+    updateRemoveEnabled();
+
+    ui->sendButton->setDefault(true);
+}
+
+void SendCoinsDialog::reject()
+{
+    clear();
+}
+
+void SendCoinsDialog::accept()
+{
+    clear();
+}
+
+SendCoinsEntry *SendCoinsDialog::addEntry()
+{
+    SendCoinsEntry *entry = new SendCoinsEntry(this);
+    entry->setModel(model);
+    ui->entries->addWidget(entry);
+    connect(entry, SIGNAL(removeEntry(SendCoinsEntry*)), this, SLOT(removeEntry(SendCoinsEntry*)));
+
+    updateRemoveEnabled();
+
+    // Focus the field, so that entry can start immediately
+    entry->clear();
+    return entry;
+}
+
+void SendCoinsDialog::updateRemoveEnabled()
+{
+    // Remove buttons are enabled as soon as there is more than one send-entry
+    bool enabled = (ui->entries->count() > 1);
+    for(int i = 0; i < ui->entries->count(); ++i)
+    {
+        SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(i)->widget());
+        if(entry)
+        {
+            entry->setRemoveEnabled(enabled);
+        }
+    }
+    setupTabChain(0);
+}
+
+void SendCoinsDialog::removeEntry(SendCoinsEntry* entry)
+{
+    delete entry;
+    updateRemoveEnabled();
+}
+
+QWidget *SendCoinsDialog::setupTabChain(QWidget *prev)
+{
+    for(int i = 0; i < ui->entries->count(); ++i)
+    {
+        SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(i)->widget());
+        if(entry)
+        {
+            prev = entry->setupTabChain(prev);
+        }
+    }
+    QWidget::setTabOrder(prev, ui->addButton);
+    QWidget::setTabOrder(ui->addButton, ui->sendButton);
+    return ui->sendButton;
+}
+
+void SendCoinsDialog::pasteEntry(const SendCoinsRecipient &rv)
+{
+    SendCoinsEntry *entry = 0;
+    // Replace the first entry if it is still unused
+    if(ui->entries->count() == 1)
+    {
+        SendCoinsEntry *first = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(0)->widget());
+        if(first->isClear())
+        {
+            entry = first;
+        }
+    }
+    if(!entry)
+    {
+        entry = addEntry();
+    }
+
+    entry->setValue(rv);
+}
+
+
+void SendCoinsDialog::handleURL(const QUrl *url)
+{
+    SendCoinsRecipient rv;
+    if(!GUIUtil::parseBitcoinURL(url, &rv))
+    {
+        return;
+    }
+    pasteEntry(rv);
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/sendcoinsdialog.h
@@ -0,0 +1,51 @@
+#ifndef SENDCOINSDIALOG_H
+#define SENDCOINSDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+    class SendCoinsDialog;
+}
+class WalletModel;
+class SendCoinsEntry;
+class SendCoinsRecipient;
+
+QT_BEGIN_NAMESPACE
+class QUrl;
+QT_END_NAMESPACE
+
+class SendCoinsDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit SendCoinsDialog(QWidget *parent = 0);
+    ~SendCoinsDialog();
+
+    void setModel(WalletModel *model);
+
+    // Qt messes up the tab chain by default in some cases (issue http://bugreports.qt.nokia.com/browse/QTBUG-10907)
+    // Hence we have to set it up manually
+    QWidget *setupTabChain(QWidget *prev);
+
+    void pasteEntry(const SendCoinsRecipient &rv);
+    void handleURL(const QUrl *url);
+
+public slots:
+    void clear();
+    void reject();
+    void accept();
+    SendCoinsEntry *addEntry();
+    void updateRemoveEnabled();
+
+private:
+    Ui::SendCoinsDialog *ui;
+    WalletModel *model;
+
+private slots:
+    void on_sendButton_clicked();
+
+    void removeEntry(SendCoinsEntry* entry);
+};
+
+#endif // SENDCOINSDIALOG_H
new file mode 100644
--- /dev/null
+++ b/src/qt/sendcoinsentry.cpp
@@ -0,0 +1,145 @@
+#include "sendcoinsentry.h"
+#include "ui_sendcoinsentry.h"
+#include "guiutil.h"
+#include "bitcoinunits.h"
+#include "addressbookpage.h"
+#include "walletmodel.h"
+#include "optionsmodel.h"
+#include "addresstablemodel.h"
+
+#include <QApplication>
+#include <QClipboard>
+
+SendCoinsEntry::SendCoinsEntry(QWidget *parent) :
+    QFrame(parent),
+    ui(new Ui::SendCoinsEntry),
+    model(0)
+{
+    ui->setupUi(this);
+
+#if QT_VERSION >= 0x040700
+    ui->payTo->setPlaceholderText(tr("Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)"));
+    ui->addAsLabel->setPlaceholderText(tr("Enter a label for this address to add it to your address book"));
+#endif
+    setFocusPolicy(Qt::TabFocus);
+    setFocusProxy(ui->payTo);
+
+    GUIUtil::setupAddressWidget(ui->payTo, this);
+}
+
+SendCoinsEntry::~SendCoinsEntry()
+{
+    delete ui;
+}
+
+void SendCoinsEntry::on_pasteButton_clicked()
+{
+    // Paste text from clipboard into recipient field
+    ui->payTo->setText(QApplication::clipboard()->text());
+}
+
+void SendCoinsEntry::on_addressBookButton_clicked()
+{
+    AddressBookPage dlg(AddressBookPage::ForSending, AddressBookPage::SendingTab, this);
+    dlg.setModel(model->getAddressTableModel());
+    if(dlg.exec())
+    {
+        ui->payTo->setText(dlg.getReturnValue());
+        ui->payAmount->setFocus();
+    }
+}
+
+void SendCoinsEntry::on_payTo_textChanged(const QString &address)
+{
+    ui->addAsLabel->setText(model->getAddressTableModel()->labelForAddress(address));
+}
+
+void SendCoinsEntry::setModel(WalletModel *model)
+{
+    this->model = model;
+}
+
+void SendCoinsEntry::setRemoveEnabled(bool enabled)
+{
+    ui->deleteButton->setEnabled(enabled);
+}
+
+void SendCoinsEntry::clear()
+{
+    ui->payTo->clear();
+    ui->addAsLabel->clear();
+    ui->payAmount->clear();
+    ui->payTo->setFocus();
+    if(model)
+    {
+        ui->payAmount->setDisplayUnit(model->getOptionsModel()->getDisplayUnit());
+    }
+}
+
+void SendCoinsEntry::on_deleteButton_clicked()
+{
+    emit removeEntry(this);
+}
+
+bool SendCoinsEntry::validate()
+{
+    // Check input validity
+    bool retval = true;
+
+    if(!ui->payAmount->validate())
+    {
+        retval = false;
+    }
+    else
+    {
+        if(ui->payAmount->value() <= 0)
+        {
+            // Cannot send 0 coins or less
+            ui->payAmount->setValid(false);
+            retval = false;
+        }
+    }
+
+    if(!ui->payTo->hasAcceptableInput() ||
+       (model && !model->validateAddress(ui->payTo->text())))
+    {
+        ui->payTo->setValid(false);
+        retval = false;
+    }
+
+    return retval;
+}
+
+SendCoinsRecipient SendCoinsEntry::getValue()
+{
+    SendCoinsRecipient rv;
+
+    rv.address = ui->payTo->text();
+    rv.label = ui->addAsLabel->text();
+    rv.amount = ui->payAmount->value();
+
+    return rv;
+}
+
+QWidget *SendCoinsEntry::setupTabChain(QWidget *prev)
+{
+    QWidget::setTabOrder(prev, ui->payTo);
+    QWidget::setTabOrder(ui->payTo, ui->addressBookButton);
+    QWidget::setTabOrder(ui->addressBookButton, ui->pasteButton);
+    QWidget::setTabOrder(ui->pasteButton, ui->deleteButton);
+    QWidget::setTabOrder(ui->deleteButton, ui->addAsLabel);
+    return ui->payAmount->setupTabChain(ui->addAsLabel);
+}
+
+void SendCoinsEntry::setValue(const SendCoinsRecipient &value)
+{
+    ui->payTo->setText(value.address);
+    ui->addAsLabel->setText(value.label);
+    ui->payAmount->setValue(value.amount);
+}
+
+bool SendCoinsEntry::isClear()
+{
+    return ui->payTo->text().isEmpty();
+}
+
new file mode 100644
--- /dev/null
+++ b/src/qt/sendcoinsentry.h
@@ -0,0 +1,51 @@
+#ifndef SENDCOINSENTRY_H
+#define SENDCOINSENTRY_H
+
+#include <QFrame>
+
+namespace Ui {
+    class SendCoinsEntry;
+}
+class WalletModel;
+class SendCoinsRecipient;
+
+class SendCoinsEntry : public QFrame
+{
+    Q_OBJECT
+
+public:
+    explicit SendCoinsEntry(QWidget *parent = 0);
+    ~SendCoinsEntry();
+
+    void setModel(WalletModel *model);
+    bool validate();
+    SendCoinsRecipient getValue();
+
+    // Return true if the entry is still empty and unedited
+    bool isClear();
+
+    void setValue(const SendCoinsRecipient &value);
+
+    // Qt messes up the tab chain by default in some cases (issue http://bugreports.qt.nokia.com/browse/QTBUG-10907)
+    // Hence we have to set it up manually
+    QWidget *setupTabChain(QWidget *prev);
+
+public slots:
+    void setRemoveEnabled(bool enabled);
+    void clear();
+
+signals:
+    void removeEntry(SendCoinsEntry *entry);
+
+private slots:
+    void on_deleteButton_clicked();
+    void on_payTo_textChanged(const QString &address);
+    void on_addressBookButton_clicked();
+    void on_pasteButton_clicked();
+
+private:
+    Ui::SendCoinsEntry *ui;
+    WalletModel *model;
+};
+
+#endif // SENDCOINSENTRY_H
new file mode 100644
--- /dev/null
+++ b/src/qt/transactiondesc.cpp
@@ -0,0 +1,292 @@
+#include <transactiondesc.h>
+
+#include "guiutil.h"
+#include "bitcoinunits.h"
+
+#include "headers.h"
+#include "qtui.h"
+
+#include <QString>
+#include <QTextDocument> // For Qt::escape
+
+using namespace std;
+
+QString TransactionDesc::HtmlEscape(const QString& str, bool fMultiLine)
+{
+    QString escaped = Qt::escape(str);
+    if(fMultiLine)
+    {
+        escaped = escaped.replace("\n", "<br>\n");
+    }
+    return escaped;
+}
+
+QString TransactionDesc::HtmlEscape(const std::string& str, bool fMultiLine)
+{
+    return HtmlEscape(QString::fromStdString(str), fMultiLine);
+}
+
+QString TransactionDesc::FormatTxStatus(const CWalletTx& wtx)
+{
+    if (!wtx.IsFinal())
+    {
+        if (wtx.nLockTime < LOCKTIME_THRESHOLD)
+            return tr("Open for %1 blocks").arg(nBestHeight - wtx.nLockTime);
+        else
+            return tr("Open until %1").arg(GUIUtil::dateTimeStr(wtx.nLockTime));
+    }
+    else
+    {
+        int nDepth = wtx.GetDepthInMainChain();
+        if (GetAdjustedTime() - wtx.nTimeReceived > 2 * 60 && wtx.GetRequestCount() == 0)
+            return tr("%1/offline?").arg(nDepth);
+        else if (nDepth < 6)
+            return tr("%1/unconfirmed").arg(nDepth);
+        else
+            return tr("%1 confirmations").arg(nDepth);
+    }
+}
+
+QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
+{
+    QString strHTML;
+    CRITICAL_BLOCK(wallet->cs_wallet)
+    {
+        strHTML.reserve(4000);
+        strHTML += "<html><font face='verdana, arial, helvetica, sans-serif'>";
+
+        int64 nTime = wtx.GetTxTime();
+        int64 nCredit = wtx.GetCredit();
+        int64 nDebit = wtx.GetDebit();
+        int64 nNet = nCredit - nDebit;
+
+        strHTML += tr("<b>Status:</b> ") + FormatTxStatus(wtx);
+        int nRequests = wtx.GetRequestCount();
+        if (nRequests != -1)
+        {
+            if (nRequests == 0)
+                strHTML += tr(", has not been successfully broadcast yet");
+            else if (nRequests == 1)
+                strHTML += tr(", broadcast through %1 node").arg(nRequests);
+            else
+                strHTML += tr(", broadcast through %1 nodes").arg(nRequests);
+        }
+        strHTML += "<br>";
+
+        strHTML += tr("<b>Date:</b> ") + (nTime ? GUIUtil::dateTimeStr(nTime) : QString("")) + "<br>";
+
+        //
+        // From
+        //
+        if (wtx.IsCoinBase())
+        {
+            strHTML += tr("<b>Source:</b> Generated<br>");
+        }
+        else if (!wtx.mapValue["from"].empty())
+        {
+            // Online transaction
+            if (!wtx.mapValue["from"].empty())
+                strHTML += tr("<b>From:</b> ") + HtmlEscape(wtx.mapValue["from"]) + "<br>";
+        }
+        else
+        {
+            // Offline transaction
+            if (nNet > 0)
+            {
+                // Credit
+                BOOST_FOREACH(const CTxOut& txout, wtx.vout)
+                {
+                    if (wallet->IsMine(txout))
+                    {
+                        CBitcoinAddress address;
+                        if (ExtractAddress(txout.scriptPubKey, wallet, address))
+                        {
+                            if (wallet->mapAddressBook.count(address))
+                            {
+                                strHTML += tr("<b>From:</b> ") + tr("unknown") + "<br>";
+                                strHTML += tr("<b>To:</b> ");
+                                strHTML += HtmlEscape(address.ToString());
+                                if (!wallet->mapAddressBook[address].empty())
+                                    strHTML += tr(" (yours, label: ") + HtmlEscape(wallet->mapAddressBook[address]) + ")";
+                                else
+                                    strHTML += tr(" (yours)");
+                                strHTML += "<br>";
+                            }
+                        }
+                        break;
+                    }
+                }
+            }
+        }
+
+        //
+        // To
+        //
+        string strAddress;
+        if (!wtx.mapValue["to"].empty())
+        {
+            // Online transaction
+            strAddress = wtx.mapValue["to"];
+            strHTML += tr("<b>To:</b> ");
+            if (wallet->mapAddressBook.count(strAddress) && !wallet->mapAddressBook[strAddress].empty())
+                strHTML += HtmlEscape(wallet->mapAddressBook[strAddress]) + " ";
+            strHTML += HtmlEscape(strAddress) + "<br>";
+        }
+
+        //
+        // Amount
+        //
+        if (wtx.IsCoinBase() && nCredit == 0)
+        {
+            //
+            // Coinbase
+            //
+            int64 nUnmatured = 0;
+            BOOST_FOREACH(const CTxOut& txout, wtx.vout)
+                nUnmatured += wallet->GetCredit(txout);
+            strHTML += tr("<b>Credit:</b> ");
+            if (wtx.IsInMainChain())
+                strHTML += tr("(%1 matures in %2 more blocks)")
+                        .arg(BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nUnmatured))
+                        .arg(wtx.GetBlocksToMaturity());
+            else
+                strHTML += tr("(not accepted)");
+            strHTML += "<br>";
+        }
+        else if (nNet > 0)
+        {
+            //
+            // Credit
+            //
+            strHTML += tr("<b>Credit:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nNet) + "<br>";
+        }
+        else
+        {
+            bool fAllFromMe = true;
+            BOOST_FOREACH(const CTxIn& txin, wtx.vin)
+                fAllFromMe = fAllFromMe && wallet->IsMine(txin);
+
+            bool fAllToMe = true;
+            BOOST_FOREACH(const CTxOut& txout, wtx.vout)
+                fAllToMe = fAllToMe && wallet->IsMine(txout);
+
+            if (fAllFromMe)
+            {
+                //
+                // Debit
+                //
+                BOOST_FOREACH(const CTxOut& txout, wtx.vout)
+                {
+                    if (wallet->IsMine(txout))
+                        continue;
+
+                    if (wtx.mapValue["to"].empty())
+                    {
+                        // Offline transaction
+                        CBitcoinAddress address;
+                        if (ExtractAddress(txout.scriptPubKey, 0, address))
+                        {
+                            strHTML += tr("<b>To:</b> ");
+                            if (wallet->mapAddressBook.count(address) && !wallet->mapAddressBook[address].empty())
+                                strHTML += HtmlEscape(wallet->mapAddressBook[address]) + " ";
+                            strHTML += HtmlEscape(address.ToString());
+                            strHTML += "<br>";
+                        }
+                    }
+
+                    strHTML += tr("<b>Debit:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, -txout.nValue) + "<br>";
+                }
+
+                if (fAllToMe)
+                {
+                    // Payment to self
+                    int64 nChange = wtx.GetChange();
+                    int64 nValue = nCredit - nChange;
+                    strHTML += tr("<b>Debit:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, -nValue) + "<br>";
+                    strHTML += tr("<b>Credit:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nValue) + "<br>";
+                }
+
+                int64 nTxFee = nDebit - wtx.GetValueOut();
+                if (nTxFee > 0)
+                    strHTML += tr("<b>Transaction fee:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,-nTxFee) + "<br>";
+            }
+            else
+            {
+                //
+                // Mixed debit transaction
+                //
+                BOOST_FOREACH(const CTxIn& txin, wtx.vin)
+                    if (wallet->IsMine(txin))
+                        strHTML += tr("<b>Debit:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,-wallet->GetDebit(txin)) + "<br>";
+                BOOST_FOREACH(const CTxOut& txout, wtx.vout)
+                    if (wallet->IsMine(txout))
+                        strHTML += tr("<b>Credit:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,wallet->GetCredit(txout)) + "<br>";
+            }
+        }
+
+        strHTML += tr("<b>Net amount:</b> ") + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,nNet, true) + "<br>";
+
+        //
+        // Message
+        //
+        if (!wtx.mapValue["message"].empty())
+            strHTML += QString("<br><b>") + tr("Message:") + "</b><br>" + HtmlEscape(wtx.mapValue["message"], true) + "<br>";
+        if (!wtx.mapValue["comment"].empty())
+            strHTML += QString("<br><b>") + tr("Comment:") + "</b><br>" + HtmlEscape(wtx.mapValue["comment"], true) + "<br>";
+
+        if (wtx.IsCoinBase())
+            strHTML += QString("<br>") + tr("Generated coins must wait 120 blocks before they can be spent.  When you generated this block, it was broadcast to the network to be added to the block chain.  If it fails to get into the chain, it will change to \"not accepted\" and not be spendable.  This may occasionally happen if another node generates a block within a few seconds of yours.") + "<br>";
+
+        //
+        // Debug view
+        //
+        if (fDebug)
+        {
+            strHTML += "<hr><br>Debug information<br><br>";
+            BOOST_FOREACH(const CTxIn& txin, wtx.vin)
+                if(wallet->IsMine(txin))
+                    strHTML += "<b>Debit:</b> " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,-wallet->GetDebit(txin)) + "<br>";
+            BOOST_FOREACH(const CTxOut& txout, wtx.vout)
+                if(wallet->IsMine(txout))
+                    strHTML += "<b>Credit:</b> " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,wallet->GetCredit(txout)) + "<br>";
+
+            strHTML += "<br><b>Transaction:</b><br>";
+            strHTML += HtmlEscape(wtx.ToString(), true);
+
+            CTxDB txdb("r"); // To fetch source txouts
+
+            strHTML += "<br><b>Inputs:</b>";
+            strHTML += "<ul>";
+            CRITICAL_BLOCK(wallet->cs_wallet)
+            {
+                BOOST_FOREACH(const CTxIn& txin, wtx.vin)
+                {
+                    COutPoint prevout = txin.prevout;
+
+                    CTransaction prev;
+                    if(txdb.ReadDiskTx(prevout.hash, prev))
+                    {
+                        if (prevout.n < prev.vout.size())
+                        {
+                            strHTML += "<li>";
+                            const CTxOut &vout = prev.vout[prevout.n];
+                            CBitcoinAddress address;
+                            if (ExtractAddress(vout.scriptPubKey, 0, address))
+                            {
+                                if (wallet->mapAddressBook.count(address) && !wallet->mapAddressBook[address].empty())
+                                    strHTML += HtmlEscape(wallet->mapAddressBook[address]) + " ";
+                                strHTML += QString::fromStdString(address.ToString());
+                            }
+                            strHTML = strHTML + " Amount=" + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,vout.nValue);
+                            strHTML = strHTML + " IsMine=" + (wallet->IsMine(vout) ? "true" : "false") + "</li>";
+                        }
+                    }
+                }
+            }
+            strHTML += "</ul>";
+        }
+
+        strHTML += "</font></html>";
+    }
+    return strHTML;
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/transactiondesc.h
@@ -0,0 +1,24 @@
+#ifndef TRANSACTIONDESC_H
+#define TRANSACTIONDESC_H
+
+#include <QString>
+#include <QObject>
+#include <string>
+
+class CWallet;
+class CWalletTx;
+
+class TransactionDesc: public QObject
+{
+public:
+    // Provide human-readable extended HTML description of a transaction
+    static QString toHTML(CWallet *wallet, CWalletTx &wtx);
+private:
+    TransactionDesc() {}
+
+    static QString HtmlEscape(const QString& str, bool fMultiLine=false);
+    static QString HtmlEscape(const std::string &str, bool fMultiLine=false);
+    static QString FormatTxStatus(const CWalletTx& wtx);
+};
+
+#endif // TRANSACTIONDESC_H
new file mode 100644
--- /dev/null
+++ b/src/qt/transactiondescdialog.cpp
@@ -0,0 +1,20 @@
+#include "transactiondescdialog.h"
+#include "ui_transactiondescdialog.h"
+
+#include "transactiontablemodel.h"
+
+#include <QModelIndex>
+
+TransactionDescDialog::TransactionDescDialog(const QModelIndex &idx, QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::TransactionDescDialog)
+{
+    ui->setupUi(this);
+    QString desc = idx.data(TransactionTableModel::LongDescriptionRole).toString();
+    ui->detailText->setHtml(desc);
+}
+
+TransactionDescDialog::~TransactionDescDialog()
+{
+    delete ui;
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/transactiondescdialog.h
@@ -0,0 +1,25 @@
+#ifndef TRANSACTIONDESCDIALOG_H
+#define TRANSACTIONDESCDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+    class TransactionDescDialog;
+}
+QT_BEGIN_NAMESPACE
+class QModelIndex;
+QT_END_NAMESPACE
+
+class TransactionDescDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit TransactionDescDialog(const QModelIndex &idx, QWidget *parent = 0);
+    ~TransactionDescDialog();
+
+private:
+    Ui::TransactionDescDialog *ui;
+};
+
+#endif // TRANSACTIONDESCDIALOG_H
new file mode 100644
--- /dev/null
+++ b/src/qt/transactionfilterproxy.cpp
@@ -0,0 +1,86 @@
+#include "transactionfilterproxy.h"
+#include "transactiontablemodel.h"
+
+#include <QDateTime>
+
+#include <cstdlib>
+
+// Earliest date that can be represented (far in the past)
+const QDateTime TransactionFilterProxy::MIN_DATE = QDateTime::fromTime_t(0);
+// Last date that can be represented (far in the future)
+const QDateTime TransactionFilterProxy::MAX_DATE = QDateTime::fromTime_t(0xFFFFFFFF);
+
+TransactionFilterProxy::TransactionFilterProxy(QObject *parent) :
+    QSortFilterProxyModel(parent),
+    dateFrom(MIN_DATE),
+    dateTo(MAX_DATE),
+    addrPrefix(),
+    typeFilter(ALL_TYPES),
+    minAmount(0),
+    limitRows(-1)
+{
+}
+
+bool TransactionFilterProxy::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
+{
+    QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
+
+    int type = index.data(TransactionTableModel::TypeRole).toInt();
+    QDateTime datetime = index.data(TransactionTableModel::DateRole).toDateTime();
+    QString address = index.data(TransactionTableModel::AddressRole).toString();
+    QString label = index.data(TransactionTableModel::LabelRole).toString();
+    qint64 amount = llabs(index.data(TransactionTableModel::AmountRole).toLongLong());
+
+    if(!(TYPE(type) & typeFilter))
+        return false;
+    if(datetime < dateFrom || datetime > dateTo)
+        return false;
+    if(!address.startsWith(addrPrefix) && !label.startsWith(addrPrefix))
+        return false;
+    if(amount < minAmount)
+        return false;
+
+    return true;
+}
+
+void TransactionFilterProxy::setDateRange(const QDateTime &from, const QDateTime &to)
+{
+    this->dateFrom = from;
+    this->dateTo = to;
+    invalidateFilter();
+}
+
+void TransactionFilterProxy::setAddressPrefix(const QString &addrPrefix)
+{
+    this->addrPrefix = addrPrefix;
+    invalidateFilter();
+}
+
+void TransactionFilterProxy::setTypeFilter(quint32 modes)
+{
+    this->typeFilter = modes;
+    invalidateFilter();
+}
+
+void TransactionFilterProxy::setMinAmount(qint64 minimum)
+{
+    this->minAmount = minimum;
+    invalidateFilter();
+}
+
+void TransactionFilterProxy::setLimit(int limit)
+{
+    this->limitRows = limit;
+}
+
+int TransactionFilterProxy::rowCount(const QModelIndex &parent) const
+{
+    if(limitRows != -1)
+    {
+        return std::min(QSortFilterProxyModel::rowCount(parent), limitRows);
+    }
+    else
+    {
+        return QSortFilterProxyModel::rowCount(parent);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/transactionfilterproxy.h
@@ -0,0 +1,50 @@
+#ifndef TRANSACTIONFILTERPROXY_H
+#define TRANSACTIONFILTERPROXY_H
+
+#include <QSortFilterProxyModel>
+#include <QDateTime>
+
+// Filter transaction list according to pre-specified rules
+class TransactionFilterProxy : public QSortFilterProxyModel
+{
+    Q_OBJECT
+public:
+    explicit TransactionFilterProxy(QObject *parent = 0);
+
+    // Earliest date that can be represented (far in the past)
+    static const QDateTime MIN_DATE;
+    // Last date that can be represented (far in the future)
+    static const QDateTime MAX_DATE;
+    // Type filter bit field (all types)
+    static const quint32 ALL_TYPES = 0xFFFFFFFF;
+
+    static quint32 TYPE(int type) { return 1<<type; }
+
+    void setDateRange(const QDateTime &from, const QDateTime &to);
+    void setAddressPrefix(const QString &addrPrefix);
+    // Type filter takes a bitfield created with TYPE() or ALL_TYPES
+    void setTypeFilter(quint32 modes);
+    void setMinAmount(qint64 minimum);
+
+    // Set maximum number of rows returned, -1 if unlimited
+    void setLimit(int limit);
+
+    int	rowCount(const QModelIndex &parent = QModelIndex()) const;
+protected:
+    bool filterAcceptsRow(int source_row, const QModelIndex & source_parent) const;
+
+private:
+    QDateTime dateFrom;
+    QDateTime dateTo;
+    QString addrPrefix;
+    quint32 typeFilter;
+    qint64 minAmount;
+    int limitRows;
+
+signals:
+
+public slots:
+
+};
+
+#endif // TRANSACTIONFILTERPROXY_H
new file mode 100644
--- /dev/null
+++ b/src/qt/transactionrecord.cpp
@@ -0,0 +1,264 @@
+#include "transactionrecord.h"
+
+#include "headers.h"
+
+/* Return positive answer if transaction should be shown in list.
+ */
+bool TransactionRecord::showTransaction(const CWalletTx &wtx)
+{
+    if (wtx.IsCoinBase())
+    {
+        // Don't show generated coin until confirmed by at least one block after it
+        // so we don't get the user's hopes up until it looks like it's probably accepted.
+        //
+        // It is not an error when generated blocks are not accepted.  By design,
+        // some percentage of blocks, like 10% or more, will end up not accepted.
+        // This is the normal mechanism by which the network copes with latency.
+        //
+        // We display regular transactions right away before any confirmation
+        // because they can always get into some block eventually.  Generated coins
+        // are special because if their block is not accepted, they are not valid.
+        //
+        if (wtx.GetDepthInMainChain() < 2)
+        {
+            return false;
+        }
+    }
+    return true;
+}
+
+/*
+ * Decompose CWallet transaction to model transaction records.
+ */
+QList<TransactionRecord> TransactionRecord::decomposeTransaction(const CWallet *wallet, const CWalletTx &wtx)
+{
+    QList<TransactionRecord> parts;
+    int64 nTime = wtx.nTimeDisplayed = wtx.GetTxTime();
+    int64 nCredit = wtx.GetCredit(true);
+    int64 nDebit = wtx.GetDebit();
+    int64 nNet = nCredit - nDebit;
+    uint256 hash = wtx.GetHash();
+    std::map<std::string, std::string> mapValue = wtx.mapValue;
+
+    if (showTransaction(wtx))
+    {
+        if (nNet > 0 || wtx.IsCoinBase())
+        {
+            //
+            // Credit
+            //
+            TransactionRecord sub(hash, nTime);
+
+            sub.credit = nNet;
+
+            if (wtx.IsCoinBase())
+            {
+                // Generated
+                sub.type = TransactionRecord::Generated;
+
+                if (nCredit == 0)
+                {
+                    int64 nUnmatured = 0;
+                    BOOST_FOREACH(const CTxOut& txout, wtx.vout)
+                        nUnmatured += wallet->GetCredit(txout);
+                    sub.credit = nUnmatured;
+                }
+            }
+            else if (!mapValue["from"].empty() || !mapValue["message"].empty())
+            {
+                // Received by IP connection
+                sub.type = TransactionRecord::RecvFromIP;
+                if (!mapValue["from"].empty())
+                    sub.address = mapValue["from"];
+            }
+            else
+            {
+                // Received by Bitcoin Address
+                sub.type = TransactionRecord::RecvWithAddress;
+                BOOST_FOREACH(const CTxOut& txout, wtx.vout)
+                {
+                    if(wallet->IsMine(txout))
+                    {
+                        CBitcoinAddress address;
+                        if (ExtractAddress(txout.scriptPubKey, wallet, address))
+                        {
+                            sub.address = address.ToString();
+                        }
+                        break;
+                    }
+                }
+            }
+            parts.append(sub);
+        }
+        else
+        {
+            bool fAllFromMe = true;
+            BOOST_FOREACH(const CTxIn& txin, wtx.vin)
+                fAllFromMe = fAllFromMe && wallet->IsMine(txin);
+
+            bool fAllToMe = true;
+            BOOST_FOREACH(const CTxOut& txout, wtx.vout)
+                fAllToMe = fAllToMe && wallet->IsMine(txout);
+
+            if (fAllFromMe && fAllToMe)
+            {
+                // Payment to self
+                int64 nChange = wtx.GetChange();
+
+                parts.append(TransactionRecord(hash, nTime, TransactionRecord::SendToSelf, "",
+                                -(nDebit - nChange), nCredit - nChange));
+            }
+            else if (fAllFromMe)
+            {
+                //
+                // Debit
+                //
+                int64 nTxFee = nDebit - wtx.GetValueOut();
+
+                for (int nOut = 0; nOut < wtx.vout.size(); nOut++)
+                {
+                    const CTxOut& txout = wtx.vout[nOut];
+                    TransactionRecord sub(hash, nTime);
+                    sub.idx = parts.size();
+
+                    if(wallet->IsMine(txout))
+                    {
+                        // Ignore parts sent to self, as this is usually the change
+                        // from a transaction sent back to our own address.
+                        continue;
+                    }
+                    else if(!mapValue["to"].empty())
+                    {
+                        // Sent to IP
+                        sub.type = TransactionRecord::SendToIP;
+                        sub.address = mapValue["to"];
+                    }
+                    else
+                    {
+                        // Sent to Bitcoin Address
+                        sub.type = TransactionRecord::SendToAddress;
+                        CBitcoinAddress address;
+                        if (ExtractAddress(txout.scriptPubKey, 0, address))
+                        {
+                            sub.address = address.ToString();
+                        }
+                    }
+
+                    int64 nValue = txout.nValue;
+                    /* Add fee to first output */
+                    if (nTxFee > 0)
+                    {
+                        nValue += nTxFee;
+                        nTxFee = 0;
+                    }
+                    sub.debit = -nValue;
+
+                    parts.append(sub);
+                }
+            }
+            else
+            {
+                //
+                // Mixed debit transaction, can't break down payees
+                //
+                bool fAllMine = true;
+                BOOST_FOREACH(const CTxOut& txout, wtx.vout)
+                    fAllMine = fAllMine && wallet->IsMine(txout);
+                BOOST_FOREACH(const CTxIn& txin, wtx.vin)
+                    fAllMine = fAllMine && wallet->IsMine(txin);
+
+                parts.append(TransactionRecord(hash, nTime, TransactionRecord::Other, "", nNet, 0));
+            }
+        }
+    }
+
+    return parts;
+}
+
+void TransactionRecord::updateStatus(const CWalletTx &wtx)
+{
+    // Determine transaction status
+
+    // Find the block the tx is in
+    CBlockIndex* pindex = NULL;
+    std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(wtx.hashBlock);
+    if (mi != mapBlockIndex.end())
+        pindex = (*mi).second;
+
+    // Sort order, unrecorded transactions sort to the top
+    status.sortKey = strprintf("%010d-%01d-%010u-%03d",
+        (pindex ? pindex->nHeight : INT_MAX),
+        (wtx.IsCoinBase() ? 1 : 0),
+        wtx.nTimeReceived,
+        idx);
+    status.confirmed = wtx.IsConfirmed();
+    status.depth = wtx.GetDepthInMainChain();
+    status.cur_num_blocks = nBestHeight;
+
+    if (!wtx.IsFinal())
+    {
+        if (wtx.nLockTime < LOCKTIME_THRESHOLD)
+        {
+            status.status = TransactionStatus::OpenUntilBlock;
+            status.open_for = nBestHeight - wtx.nLockTime;
+        }
+        else
+        {
+            status.status = TransactionStatus::OpenUntilDate;
+            status.open_for = wtx.nLockTime;
+        }
+    }
+    else
+    {
+        if (GetAdjustedTime() - wtx.nTimeReceived > 2 * 60 && wtx.GetRequestCount() == 0)
+        {
+            status.status = TransactionStatus::Offline;
+        }
+        else if (status.depth < NumConfirmations)
+        {
+            status.status = TransactionStatus::Unconfirmed;
+        }
+        else
+        {
+            status.status = TransactionStatus::HaveConfirmations;
+        }
+    }
+
+    // For generated transactions, determine maturity
+    if(type == TransactionRecord::Generated)
+    {
+        int64 nCredit = wtx.GetCredit(true);
+        if (nCredit == 0)
+        {
+            status.maturity = TransactionStatus::Immature;
+
+            if (wtx.IsInMainChain())
+            {
+                status.matures_in = wtx.GetBlocksToMaturity();
+
+                // Check if the block was requested by anyone
+                if (GetAdjustedTime() - wtx.nTimeReceived > 2 * 60 && wtx.GetRequestCount() == 0)
+                    status.maturity = TransactionStatus::MaturesWarning;
+            }
+            else
+            {
+                status.maturity = TransactionStatus::NotAccepted;
+            }
+        }
+        else
+        {
+            status.maturity = TransactionStatus::Mature;
+        }
+    }
+}
+
+bool TransactionRecord::statusUpdateNeeded()
+{
+    return status.cur_num_blocks != nBestHeight;
+}
+
+std::string TransactionRecord::getTxID()
+{
+    return hash.ToString() + strprintf("-%03d", idx);
+}
+
new file mode 100644
--- /dev/null
+++ b/src/qt/transactionrecord.h
@@ -0,0 +1,118 @@
+#ifndef TRANSACTIONRECORD_H
+#define TRANSACTIONRECORD_H
+
+#include "uint256.h"
+
+#include <QList>
+
+class CWallet;
+class CWalletTx;
+
+class TransactionStatus
+{
+public:
+    TransactionStatus():
+            confirmed(false), sortKey(""), maturity(Mature),
+            matures_in(0), status(Offline), depth(0), open_for(0), cur_num_blocks(-1)
+    { }
+
+    enum Maturity
+    {
+        Immature,
+        Mature,
+        MaturesWarning, /* Will likely not mature because no nodes have confirmed */
+        NotAccepted
+    };
+
+    enum Status {
+        OpenUntilDate,
+        OpenUntilBlock,
+        Offline,
+        Unconfirmed,
+        HaveConfirmations
+    };
+
+    bool confirmed;
+    std::string sortKey;
+
+    /* For "Generated" transactions */
+    Maturity maturity;
+    int matures_in;
+
+    /* Reported status */
+    Status status;
+    int64 depth;
+    int64 open_for; /* Timestamp if status==OpenUntilDate, otherwise number of blocks */
+
+    /* Current number of blocks (to know whether cached status is still valid. */
+    int cur_num_blocks;
+};
+
+class TransactionRecord
+{
+public:
+    enum Type
+    {
+        Other,
+        Generated,
+        SendToAddress,
+        SendToIP,
+        RecvWithAddress,
+        RecvFromIP,
+        SendToSelf
+    };
+
+    /* Number of confirmation needed for transaction */
+    static const int NumConfirmations = 6;
+
+    TransactionRecord():
+            hash(), time(0), type(Other), address(""), debit(0), credit(0), idx(0)
+    {
+    }
+
+    TransactionRecord(uint256 hash, int64 time):
+            hash(hash), time(time), type(Other), address(""), debit(0),
+            credit(0), idx(0)
+    {
+    }
+
+    TransactionRecord(uint256 hash, int64 time,
+                Type type, const std::string &address,
+                int64 debit, int64 credit):
+            hash(hash), time(time), type(type), address(address), debit(debit), credit(credit),
+            idx(0)
+    {
+    }
+
+    /* Decompose CWallet transaction to model transaction records.
+     */
+    static bool showTransaction(const CWalletTx &wtx);
+    static QList<TransactionRecord> decomposeTransaction(const CWallet *wallet, const CWalletTx &wtx);
+
+    /* Fixed */
+    uint256 hash;
+    int64 time;
+    Type type;
+    std::string address;
+    int64 debit;
+    int64 credit;
+
+    /* Subtransaction index, for sort key */
+    int idx;
+
+    /* Status: can change with block chain update */
+    TransactionStatus status;
+
+    /* Return the unique identifier for this transaction (part) */
+    std::string getTxID();
+
+    /* Update status from wallet tx.
+     */
+    void updateStatus(const CWalletTx &wtx);
+
+    /* Is a status update needed?
+     */
+    bool statusUpdateNeeded();
+};
+
+#endif // TRANSACTIONRECORD_H
new file mode 100644
--- /dev/null
+++ b/src/qt/transactiontablemodel.cpp
@@ -0,0 +1,622 @@
+#include "transactiontablemodel.h"
+#include "guiutil.h"
+#include "transactionrecord.h"
+#include "guiconstants.h"
+#include "transactiondesc.h"
+#include "walletmodel.h"
+#include "optionsmodel.h"
+#include "addresstablemodel.h"
+#include "bitcoinunits.h"
+
+#include "headers.h"
+
+#include <QLocale>
+#include <QList>
+#include <QColor>
+#include <QTimer>
+#include <QIcon>
+#include <QDateTime>
+#include <QtAlgorithms>
+
+// Amount column is right-aligned it contains numbers
+static int column_alignments[] = {
+        Qt::AlignLeft|Qt::AlignVCenter,
+        Qt::AlignLeft|Qt::AlignVCenter,
+        Qt::AlignLeft|Qt::AlignVCenter,
+        Qt::AlignLeft|Qt::AlignVCenter,
+        Qt::AlignRight|Qt::AlignVCenter
+    };
+
+// Comparison operator for sort/binary search of model tx list
+struct TxLessThan
+{
+    bool operator()(const TransactionRecord &a, const TransactionRecord &b) const
+    {
+        return a.hash < b.hash;
+    }
+    bool operator()(const TransactionRecord &a, const uint256 &b) const
+    {
+        return a.hash < b;
+    }
+    bool operator()(const uint256 &a, const TransactionRecord &b) const
+    {
+        return a < b.hash;
+    }
+};
+
+// Private implementation
+struct TransactionTablePriv
+{
+    TransactionTablePriv(CWallet *wallet, TransactionTableModel *parent):
+            wallet(wallet),
+            parent(parent)
+    {
+    }
+    CWallet *wallet;
+    TransactionTableModel *parent;
+
+    /* Local cache of wallet.
+     * As it is in the same order as the CWallet, by definition
+     * this is sorted by sha256.
+     */
+    QList<TransactionRecord> cachedWallet;
+
+    /* Query entire wallet anew from core.
+     */
+    void refreshWallet()
+    {
+#ifdef WALLET_UPDATE_DEBUG
+        qDebug() << "refreshWallet";
+#endif
+        cachedWallet.clear();
+        CRITICAL_BLOCK(wallet->cs_wallet)
+        {
+            for(std::map<uint256, CWalletTx>::iterator it = wallet->mapWallet.begin(); it != wallet->mapWallet.end(); ++it)
+            {
+                cachedWallet.append(TransactionRecord::decomposeTransaction(wallet, it->second));
+            }
+        }
+    }
+
+    /* Update our model of the wallet incrementally, to synchronize our model of the wallet
+       with that of the core.
+
+       Call with list of hashes of transactions that were added, removed or changed.
+     */
+    void updateWallet(const QList<uint256> &updated)
+    {
+        // Walk through updated transactions, update model as needed.
+#ifdef WALLET_UPDATE_DEBUG
+        qDebug() << "updateWallet";
+#endif
+        // Sort update list, and iterate through it in reverse, so that model updates
+        //  can be emitted from end to beginning (so that earlier updates will not influence
+        // the indices of latter ones).
+        QList<uint256> updated_sorted = updated;
+        qSort(updated_sorted);
+
+        CRITICAL_BLOCK(wallet->cs_wallet)
+        {
+            for(int update_idx = updated_sorted.size()-1; update_idx >= 0; --update_idx)
+            {
+                const uint256 &hash = updated_sorted.at(update_idx);
+                // Find transaction in wallet
+                std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(hash);
+                bool inWallet = mi != wallet->mapWallet.end();
+                // Find bounds of this transaction in model
+                QList<TransactionRecord>::iterator lower = qLowerBound(
+                    cachedWallet.begin(), cachedWallet.end(), hash, TxLessThan());
+                QList<TransactionRecord>::iterator upper = qUpperBound(
+                    cachedWallet.begin(), cachedWallet.end(), hash, TxLessThan());
+                int lowerIndex = (lower - cachedWallet.begin());
+                int upperIndex = (upper - cachedWallet.begin());
+
+                // Determine if transaction is in model already
+                bool inModel = false;
+                if(lower != upper)
+                {
+                    inModel = true;
+                }
+
+#ifdef WALLET_UPDATE_DEBUG
+                qDebug() << "  " << QString::fromStdString(hash.ToString()) << inWallet << " " << inModel
+                        << lowerIndex << "-" << upperIndex;
+#endif
+
+                if(inWallet && !inModel)
+                {
+                    // Added -- insert at the right position
+                    QList<TransactionRecord> toInsert =
+                            TransactionRecord::decomposeTransaction(wallet, mi->second);
+                    if(!toInsert.isEmpty()) /* only if something to insert */
+                    {
+                        parent->beginInsertRows(QModelIndex(), lowerIndex, lowerIndex+toInsert.size()-1);
+                        int insert_idx = lowerIndex;
+                        foreach(const TransactionRecord &rec, toInsert)
+                        {
+                            cachedWallet.insert(insert_idx, rec);
+                            insert_idx += 1;
+                        }
+                        parent->endInsertRows();
+                    }
+                }
+                else if(!inWallet && inModel)
+                {
+                    // Removed -- remove entire transaction from table
+                    parent->beginRemoveRows(QModelIndex(), lowerIndex, upperIndex-1);
+                    cachedWallet.erase(lower, upper);
+                    parent->endRemoveRows();
+                }
+                else if(inWallet && inModel)
+                {
+                    // Updated -- nothing to do, status update will take care of this
+                }
+            }
+        }
+    }
+
+    int size()
+    {
+        return cachedWallet.size();
+    }
+
+    TransactionRecord *index(int idx)
+    {
+        if(idx >= 0 && idx < cachedWallet.size())
+        {
+            TransactionRecord *rec = &cachedWallet[idx];
+
+            // If a status update is needed (blocks came in since last check),
+            //  update the status of this transaction from the wallet. Otherwise,
+            // simply re-use the cached status.
+            if(rec->statusUpdateNeeded())
+            {
+                CRITICAL_BLOCK(wallet->cs_wallet)
+                {
+                    std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(rec->hash);
+
+                    if(mi != wallet->mapWallet.end())
+                    {
+                        rec->updateStatus(mi->second);
+                    }
+                }
+            }
+            return rec;
+        }
+        else
+        {
+            return 0;
+        }
+    }
+
+    QString describe(TransactionRecord *rec)
+    {
+        CRITICAL_BLOCK(wallet->cs_wallet)
+        {
+            std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(rec->hash);
+            if(mi != wallet->mapWallet.end())
+            {
+                return TransactionDesc::toHTML(wallet, mi->second);
+            }
+        }
+        return QString("");
+    }
+
+};
+
+TransactionTableModel::TransactionTableModel(CWallet* wallet, WalletModel *parent):
+        QAbstractTableModel(parent),
+        wallet(wallet),
+        walletModel(parent),
+        priv(new TransactionTablePriv(wallet, this))
+{
+    columns << QString() << tr("Date") << tr("Type") << tr("Address") << tr("Amount");
+
+    priv->refreshWallet();
+
+    QTimer *timer = new QTimer(this);
+    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
+    timer->start(MODEL_UPDATE_DELAY);
+}
+
+TransactionTableModel::~TransactionTableModel()
+{
+    delete priv;
+}
+
+void TransactionTableModel::update()
+{
+    QList<uint256> updated;
+
+    // Check if there are changes to wallet map
+    TRY_CRITICAL_BLOCK(wallet->cs_wallet)
+    {
+        if(!wallet->vWalletUpdated.empty())
+        {
+            BOOST_FOREACH(uint256 hash, wallet->vWalletUpdated)
+            {
+                updated.append(hash);
+            }
+            wallet->vWalletUpdated.clear();
+        }
+    }
+
+    if(!updated.empty())
+    {
+        priv->updateWallet(updated);
+
+        // Status (number of confirmations) and (possibly) description
+        //  columns changed for all rows.
+        emit dataChanged(index(0, Status), index(priv->size()-1, Status));
+        emit dataChanged(index(0, ToAddress), index(priv->size()-1, ToAddress));
+    }
+}
+
+int TransactionTableModel::rowCount(const QModelIndex &parent) const
+{
+    Q_UNUSED(parent);
+    return priv->size();
+}
+
+int TransactionTableModel::columnCount(const QModelIndex &parent) const
+{
+    Q_UNUSED(parent);
+    return columns.length();
+}
+
+QString TransactionTableModel::formatTxStatus(const TransactionRecord *wtx) const
+{
+    QString status;
+
+    switch(wtx->status.status)
+    {
+    case TransactionStatus::OpenUntilBlock:
+        status = tr("Open for %n block(s)","",wtx->status.open_for);
+        break;
+    case TransactionStatus::OpenUntilDate:
+        status = tr("Open until %1").arg(GUIUtil::dateTimeStr(wtx->status.open_for));
+        break;
+    case TransactionStatus::Offline:
+        status = tr("Offline (%1 confirmations)").arg(wtx->status.depth);
+        break;
+    case TransactionStatus::Unconfirmed:
+        status = tr("Unconfirmed (%1 of %2 confirmations)").arg(wtx->status.depth).arg(TransactionRecord::NumConfirmations);
+        break;
+    case TransactionStatus::HaveConfirmations:
+        status = tr("Confirmed (%1 confirmations)").arg(wtx->status.depth);
+        break;
+    }
+    if(wtx->type == TransactionRecord::Generated)
+    {
+        status += "\n";
+        switch(wtx->status.maturity)
+        {
+        case TransactionStatus::Immature:
+            status += tr("Mined balance will be available in %n more blocks", "",
+                           wtx->status.matures_in);
+            break;
+        case TransactionStatus::Mature:
+            break;
+        case TransactionStatus::MaturesWarning:
+            status += tr("This block was not received by any other nodes and will probably not be accepted!");
+            break;
+        case TransactionStatus::NotAccepted:
+            status += tr("Generated but not accepted");
+            break;
+        }
+    }
+
+    return status;
+}
+
+QString TransactionTableModel::formatTxDate(const TransactionRecord *wtx) const
+{
+    if(wtx->time)
+    {
+        return GUIUtil::dateTimeStr(wtx->time);
+    }
+    else
+    {
+        return QString();
+    }
+}
+
+/* Look up address in address book, if found return label (address)
+   otherwise just return (address)
+ */
+QString TransactionTableModel::lookupAddress(const std::string &address, bool tooltip) const
+{
+    QString label = walletModel->getAddressTableModel()->labelForAddress(QString::fromStdString(address));
+    QString description;
+    if(!label.isEmpty())
+    {
+        description += label + QString(" ");
+    }
+    if(label.isEmpty() || walletModel->getOptionsModel()->getDisplayAddresses() || tooltip)
+    {
+        description += QString("(") + QString::fromStdString(address) + QString(")");
+    }
+    return description;
+}
+
+QString TransactionTableModel::formatTxType(const TransactionRecord *wtx) const
+{
+    switch(wtx->type)
+    {
+    case TransactionRecord::RecvWithAddress:
+        return tr("Received with");
+    case TransactionRecord::RecvFromIP:
+        return tr("Received from IP");
+    case TransactionRecord::SendToAddress:
+        return tr("Sent to");
+    case TransactionRecord::SendToIP:
+        return tr("Sent to IP");
+    case TransactionRecord::SendToSelf:
+        return tr("Payment to yourself");
+    case TransactionRecord::Generated:
+        return tr("Mined");
+    default:
+        return QString();
+    }
+}
+
+QVariant TransactionTableModel::txAddressDecoration(const TransactionRecord *wtx) const
+{
+    switch(wtx->type)
+    {
+    case TransactionRecord::Generated:
+        return QIcon(":/icons/tx_mined");
+    case TransactionRecord::RecvWithAddress:
+    case TransactionRecord::RecvFromIP:
+        return QIcon(":/icons/tx_input");
+    case TransactionRecord::SendToAddress:
+    case TransactionRecord::SendToIP:
+        return QIcon(":/icons/tx_output");
+    default:
+        return QIcon(":/icons/tx_inout");
+    }
+    return QVariant();
+}
+
+QString TransactionTableModel::formatTxToAddress(const TransactionRecord *wtx, bool tooltip) const
+{
+    switch(wtx->type)
+    {
+    case TransactionRecord::RecvFromIP:
+        return QString::fromStdString(wtx->address);
+    case TransactionRecord::RecvWithAddress:
+    case TransactionRecord::SendToAddress:
+        return lookupAddress(wtx->address, tooltip);
+    case TransactionRecord::SendToIP:
+        return QString::fromStdString(wtx->address);
+    case TransactionRecord::SendToSelf:
+    case TransactionRecord::Generated:
+    default:
+        return tr("(n/a)");
+    }
+}
+
+QVariant TransactionTableModel::addressColor(const TransactionRecord *wtx) const
+{
+    // Show addresses without label in a less visible color
+    switch(wtx->type)
+    {
+    case TransactionRecord::RecvWithAddress:
+    case TransactionRecord::SendToAddress:
+        {
+        QString label = walletModel->getAddressTableModel()->labelForAddress(QString::fromStdString(wtx->address));
+        if(label.isEmpty())
+            return COLOR_BAREADDRESS;
+        } break;
+    case TransactionRecord::SendToSelf:
+    case TransactionRecord::Generated:
+        return COLOR_BAREADDRESS;
+    default:
+        break;
+    }
+    return QVariant();
+}
+
+QString TransactionTableModel::formatTxAmount(const TransactionRecord *wtx, bool showUnconfirmed) const
+{
+    QString str = BitcoinUnits::format(walletModel->getOptionsModel()->getDisplayUnit(), wtx->credit + wtx->debit);
+    if(showUnconfirmed)
+    {
+        if(!wtx->status.confirmed || wtx->status.maturity != TransactionStatus::Mature)
+        {
+            str = QString("[") + str + QString("]");
+        }
+    }
+    return QString(str);
+}
+
+QVariant TransactionTableModel::txStatusDecoration(const TransactionRecord *wtx) const
+{
+    if(wtx->type == TransactionRecord::Generated)
+    {
+        switch(wtx->status.maturity)
+        {
+        case TransactionStatus::Immature: {
+            int total = wtx->status.depth + wtx->status.matures_in;
+            int part = (wtx->status.depth * 4 / total) + 1;
+            return QIcon(QString(":/icons/transaction_%1").arg(part));
+            }
+        case TransactionStatus::Mature:
+            return QIcon(":/icons/transaction_confirmed");
+        case TransactionStatus::MaturesWarning:
+        case TransactionStatus::NotAccepted:
+            return QIcon(":/icons/transaction_0");
+        }
+    }
+    else
+    {
+        switch(wtx->status.status)
+        {
+        case TransactionStatus::OpenUntilBlock:
+        case TransactionStatus::OpenUntilDate:
+            return QColor(64,64,255);
+            break;
+        case TransactionStatus::Offline:
+            return QColor(192,192,192);
+        case TransactionStatus::Unconfirmed:
+            switch(wtx->status.depth)
+            {
+            case 0: return QIcon(":/icons/transaction_0");
+            case 1: return QIcon(":/icons/transaction_1");
+            case 2: return QIcon(":/icons/transaction_2");
+            case 3: return QIcon(":/icons/transaction_3");
+            case 4: return QIcon(":/icons/transaction_4");
+            default: return QIcon(":/icons/transaction_5");
+            };
+        case TransactionStatus::HaveConfirmations:
+            return QIcon(":/icons/transaction_confirmed");
+        }
+    }
+    return QColor(0,0,0);
+}
+
+QString TransactionTableModel::formatTooltip(const TransactionRecord *rec) const
+{
+    QString tooltip = formatTxStatus(rec) + QString("\n") + formatTxType(rec);
+    if(rec->type==TransactionRecord::RecvFromIP || rec->type==TransactionRecord::SendToIP ||
+       rec->type==TransactionRecord::SendToAddress || rec->type==TransactionRecord::RecvWithAddress)
+    {
+        tooltip += QString(" ") + formatTxToAddress(rec, true);
+    }
+    return tooltip;
+}
+
+QVariant TransactionTableModel::data(const QModelIndex &index, int role) const
+{
+    if(!index.isValid())
+        return QVariant();
+    TransactionRecord *rec = static_cast<TransactionRecord*>(index.internalPointer());
+
+    switch(role)
+    {
+    case Qt::DecorationRole:
+        switch(index.column())
+        {
+        case Status:
+            return txStatusDecoration(rec);
+        case ToAddress:
+            return txAddressDecoration(rec);
+        }
+        break;
+    case Qt::DisplayRole:
+        switch(index.column())
+        {
+        case Date:
+            return formatTxDate(rec);
+        case Type:
+            return formatTxType(rec);
+        case ToAddress:
+            return formatTxToAddress(rec, false);
+        case Amount:
+            return formatTxAmount(rec);
+        }
+        break;
+    case Qt::EditRole:
+        // Edit role is used for sorting, so return the unformatted values
+        switch(index.column())
+        {
+        case Status:
+            return QString::fromStdString(rec->status.sortKey);
+        case Date:
+            return rec->time;
+        case Type:
+            return formatTxType(rec);
+        case ToAddress:
+            return formatTxToAddress(rec, true);
+        case Amount:
+            return rec->credit + rec->debit;
+        }
+        break;
+    case Qt::ToolTipRole:
+        return formatTooltip(rec);
+    case Qt::TextAlignmentRole:
+        return column_alignments[index.column()];
+    case Qt::ForegroundRole:
+        // Non-confirmed transactions are grey
+        if(!rec->status.confirmed)
+        {
+            return COLOR_UNCONFIRMED;
+        }
+        if(index.column() == Amount && (rec->credit+rec->debit) < 0)
+        {
+            return COLOR_NEGATIVE;
+        }
+        if(index.column() == ToAddress)
+        {
+            return addressColor(rec);
+        }
+        break;
+    case TypeRole:
+        return rec->type;
+    case DateRole:
+        return QDateTime::fromTime_t(static_cast<uint>(rec->time));
+    case LongDescriptionRole:
+        return priv->describe(rec);
+    case AddressRole:
+        return QString::fromStdString(rec->address);
+    case LabelRole:
+        return walletModel->getAddressTableModel()->labelForAddress(QString::fromStdString(rec->address));
+    case AmountRole:
+        return rec->credit + rec->debit;
+    case TxIDRole:
+        return QString::fromStdString(rec->getTxID());
+    case ConfirmedRole:
+        // Return True if transaction counts for balance
+        return rec->status.confirmed && !(rec->type == TransactionRecord::Generated &&
+                                          rec->status.maturity != TransactionStatus::Mature);
+    case FormattedAmountRole:
+        return formatTxAmount(rec, false);
+    }
+    return QVariant();
+}
+
+QVariant TransactionTableModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+    if(orientation == Qt::Horizontal)
+    {
+        if(role == Qt::DisplayRole)
+        {
+            return columns[section];
+        }
+        else if (role == Qt::TextAlignmentRole)
+        {
+            return column_alignments[section];
+        } else if (role == Qt::ToolTipRole)
+        {
+            switch(section)
+            {
+            case Status:
+                return tr("Transaction status. Hover over this field to show number of confirmations.");
+            case Date:
+                return tr("Date and time that the transaction was received.");
+            case Type:
+                return tr("Type of transaction.");
+            case ToAddress:
+                return tr("Destination address of transaction.");
+            case Amount:
+                return tr("Amount removed from or added to balance.");
+            }
+        }
+    }
+    return QVariant();
+}
+
+QModelIndex TransactionTableModel::index(int row, int column, const QModelIndex &parent) const
+{
+    Q_UNUSED(parent);
+    TransactionRecord *data = priv->index(row);
+    if(data)
+    {
+        return createIndex(row, column, priv->index(row));
+    }
+    else
+    {
+        return QModelIndex();
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/src/qt/transactiontablemodel.h
@@ -0,0 +1,79 @@
+#ifndef TRANSACTIONTABLEMODEL_H
+#define TRANSACTIONTABLEMODEL_H
+
+#include <QAbstractTableModel>
+#include <QStringList>
+
+class CWallet;
+class TransactionTablePriv;
+class TransactionRecord;
+class WalletModel;
+
+class TransactionTableModel : public QAbstractTableModel
+{
+    Q_OBJECT
+public:
+    explicit TransactionTableModel(CWallet* wallet, WalletModel *parent = 0);
+    ~TransactionTableModel();
+
+    enum {
+        Status = 0,
+        Date = 1,
+        Type = 2,
+        ToAddress = 3,
+        Amount = 4
+    } ColumnIndex;
+
+    // Roles to get specific information from a transaction row
+    // These are independent of column
+    enum {
+        // Type of transaction
+        TypeRole = Qt::UserRole,
+        // Date and time this transaction was created
+        DateRole,
+        // Long description (HTML format)
+        LongDescriptionRole,
+        // Address of transaction
+        AddressRole,
+        // Label of address related to transaction
+        LabelRole,
+        // Net amount of transaction
+        AmountRole,
+        // Unique identifier
+        TxIDRole,
+        // Is transaction confirmed?
+        ConfirmedRole,
+        // Formatted amount, without brackets when unconfirmed
+        FormattedAmountRole
+    } RoleIndex;
+
+    int rowCount(const QModelIndex &parent) const;
+    int columnCount(const QModelIndex &parent) const;
+    QVariant data(const QModelIndex &index, int role) const;
+    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+    QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const;
+private:
+    CWallet* wallet;
+    WalletModel *walletModel;
+    QStringList columns;
+    TransactionTablePriv *priv;
+
+    QString lookupAddress(const std::string &address, bool tooltip) const;
+    QVariant addressColor(const TransactionRecord *wtx) const;
+    QString formatTxStatus(const TransactionRecord *wtx) const;
+    QString formatTxDate(const TransactionRecord *wtx) const;
+    QString formatTxType(const TransactionRecord *wtx) const;
+    QString formatTxToAddress(const TransactionRecord *wtx, bool tooltip) const;
+    QString formatTxAmount(const TransactionRecord *wtx, bool showUnconfirmed=true) const;
+    QString formatTooltip(const TransactionRecord *rec) const;
+    QVariant txStatusDecoration(const TransactionRecord *wtx) const;
+    QVariant txAddressDecoration(const TransactionRecord *wtx) const;
+
+private slots:
+    void update();
+
+    friend class TransactionTablePriv;
+};
+
+#endif
+
new file mode 100644
--- /dev/null
+++ b/src/qt/transactionview.cpp
@@ -0,0 +1,385 @@
+#include "transactionview.h"
+
+#include "transactionfilterproxy.h"
+#include "transactionrecord.h"
+#include "walletmodel.h"
+#include "addresstablemodel.h"
+#include "transactiontablemodel.h"
+#include "bitcoinunits.h"
+#include "csvmodelwriter.h"
+#include "transactiondescdialog.h"
+#include "editaddressdialog.h"
+#include "optionsmodel.h"
+
+#include <QScrollBar>
+#include <QComboBox>
+#include <QDoubleValidator>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QLineEdit>
+#include <QTableView>
+#include <QHeaderView>
+#include <QPushButton>
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QPoint>
+#include <QMenu>
+#include <QApplication>
+#include <QClipboard>
+#include <QLabel>
+#include <QDateTimeEdit>
+
+TransactionView::TransactionView(QWidget *parent) :
+    QWidget(parent), model(0), transactionProxyModel(0),
+    transactionView(0)
+{
+    // Build filter row
+    setContentsMargins(0,0,0,0);
+
+    QHBoxLayout *hlayout = new QHBoxLayout();
+    hlayout->setContentsMargins(0,0,0,0);
+    hlayout->setSpacing(0);
+
+    hlayout->addSpacing(23);
+
+    dateWidget = new QComboBox(this);
+    dateWidget->setMaximumWidth(120);
+    dateWidget->setMinimumWidth(120);
+    dateWidget->addItem(tr("All"), All);
+    dateWidget->addItem(tr("Today"), Today);
+    dateWidget->addItem(tr("This week"), ThisWeek);
+    dateWidget->addItem(tr("This month"), ThisMonth);
+    dateWidget->addItem(tr("Last month"), LastMonth);
+    dateWidget->addItem(tr("This year"), ThisYear);
+    dateWidget->addItem(tr("Range..."), Range);
+    hlayout->addWidget(dateWidget);
+
+    typeWidget = new QComboBox(this);
+    typeWidget->setMaximumWidth(120);
+    typeWidget->setMinimumWidth(120);
+
+    typeWidget->addItem(tr("All"), TransactionFilterProxy::ALL_TYPES);
+    typeWidget->addItem(tr("Received with"), TransactionFilterProxy::TYPE(TransactionRecord::RecvWithAddress) |
+                                        TransactionFilterProxy::TYPE(TransactionRecord::RecvFromIP));
+    typeWidget->addItem(tr("Sent to"), TransactionFilterProxy::TYPE(TransactionRecord::SendToAddress) |
+                                  TransactionFilterProxy::TYPE(TransactionRecord::SendToIP));
+    typeWidget->addItem(tr("To yourself"), TransactionFilterProxy::TYPE(TransactionRecord::SendToSelf));
+    typeWidget->addItem(tr("Mined"), TransactionFilterProxy::TYPE(TransactionRecord::Generated));
+    typeWidget->addItem(tr("Other"), TransactionFilterProxy::TYPE(TransactionRecord::Other));
+
+    hlayout->addWidget(typeWidget);
+
+    addressWidget = new QLineEdit(this);
+#if QT_VERSION >= 0x040700
+    addressWidget->setPlaceholderText(tr("Enter address or label to search"));
+#endif
+    hlayout->addWidget(addressWidget);
+
+    amountWidget = new QLineEdit(this);
+#if QT_VERSION >= 0x040700
+    amountWidget->setPlaceholderText(tr("Min amount"));
+#endif
+    amountWidget->setMaximumWidth(100);
+    amountWidget->setMinimumWidth(100);
+    amountWidget->setValidator(new QDoubleValidator(0, 1e20, 8, this));
+    hlayout->addWidget(amountWidget);
+
+    QVBoxLayout *vlayout = new QVBoxLayout(this);
+    vlayout->setContentsMargins(0,0,0,0);
+    vlayout->setSpacing(0);
+    //vlayout->addLayout(hlayout2);
+
+    QTableView *view = new QTableView(this);
+    vlayout->addLayout(hlayout);
+    vlayout->addWidget(createDateRangeWidget());
+    vlayout->addWidget(view);
+    vlayout->setSpacing(0);
+    int width = view->verticalScrollBar()->sizeHint().width();
+    // Cover scroll bar width with spacing
+    hlayout->addSpacing(width);
+    // Always show scroll bar
+    view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+    view->setTabKeyNavigation(false);
+    view->setContextMenuPolicy(Qt::CustomContextMenu);
+
+    transactionView = view;
+
+    // Actions
+    QAction *copyAddressAction = new QAction(tr("Copy address"), this);
+    QAction *copyLabelAction = new QAction(tr("Copy label"), this);
+    QAction *editLabelAction = new QAction(tr("Edit label"), this);
+    QAction *showDetailsAction = new QAction(tr("Show details..."), this);
+
+    contextMenu = new QMenu();
+    contextMenu->addAction(copyAddressAction);
+    contextMenu->addAction(copyLabelAction);
+    contextMenu->addAction(editLabelAction);
+    contextMenu->addAction(showDetailsAction);
+
+    // Connect actions
+    connect(dateWidget, SIGNAL(activated(int)), this, SLOT(chooseDate(int)));
+    connect(typeWidget, SIGNAL(activated(int)), this, SLOT(chooseType(int)));
+    connect(addressWidget, SIGNAL(textChanged(QString)), this, SLOT(changedPrefix(QString)));
+    connect(amountWidget, SIGNAL(textChanged(QString)), this, SLOT(changedAmount(QString)));
+
+    connect(view, SIGNAL(doubleClicked(QModelIndex)), this, SIGNAL(doubleClicked(QModelIndex)));
+
+    connect(view,
+            SIGNAL(customContextMenuRequested(QPoint)),
+            this,
+            SLOT(contextualMenu(QPoint)));
+
+    connect(copyAddressAction, SIGNAL(triggered()), this, SLOT(copyAddress()));
+    connect(copyLabelAction, SIGNAL(triggered()), this, SLOT(copyLabel()));
+    connect(editLabelAction, SIGNAL(triggered()), this, SLOT(editLabel()));
+    connect(showDetailsAction, SIGNAL(triggered()), this, SLOT(showDetails()));
+}
+
+void TransactionView::setModel(WalletModel *model)
+{
+    this->model = model;
+
+    transactionProxyModel = new TransactionFilterProxy(this);
+    transactionProxyModel->setSourceModel(model->getTransactionTableModel());
+    transactionProxyModel->setDynamicSortFilter(true);
+
+    transactionProxyModel->setSortRole(Qt::EditRole);
+
+    transactionView->setModel(transactionProxyModel);
+    transactionView->setAlternatingRowColors(true);
+    transactionView->setSelectionBehavior(QAbstractItemView::SelectRows);
+    transactionView->setSelectionMode(QAbstractItemView::ExtendedSelection);
+    transactionView->setSortingEnabled(true);
+    transactionView->sortByColumn(TransactionTableModel::Status, Qt::DescendingOrder);
+    transactionView->verticalHeader()->hide();
+
+    transactionView->horizontalHeader()->resizeSection(
+            TransactionTableModel::Status, 23);
+    transactionView->horizontalHeader()->resizeSection(
+            TransactionTableModel::Date, 120);
+    transactionView->horizontalHeader()->resizeSection(
+            TransactionTableModel::Type, 120);
+    transactionView->horizontalHeader()->setResizeMode(
+            TransactionTableModel::ToAddress, QHeaderView::Stretch);
+    transactionView->horizontalHeader()->resizeSection(
+            TransactionTableModel::Amount, 100);
+
+}
+
+void TransactionView::chooseDate(int idx)
+{
+    QDate current = QDate::currentDate();
+    dateRangeWidget->setVisible(false);
+    switch(dateWidget->itemData(idx).toInt())
+    {
+    case All:
+        transactionProxyModel->setDateRange(
+                TransactionFilterProxy::MIN_DATE,
+                TransactionFilterProxy::MAX_DATE);
+        break;
+    case Today:
+        transactionProxyModel->setDateRange(
+                QDateTime(current),
+                TransactionFilterProxy::MAX_DATE);
+        break;
+    case ThisWeek: {
+        // Find last monday
+        QDate startOfWeek = current.addDays(-(current.dayOfWeek()-1));
+        transactionProxyModel->setDateRange(
+                QDateTime(startOfWeek),
+                TransactionFilterProxy::MAX_DATE);
+
+        } break;
+    case ThisMonth:
+        transactionProxyModel->setDateRange(
+                QDateTime(QDate(current.year(), current.month(), 1)),
+                TransactionFilterProxy::MAX_DATE);
+        break;
+    case LastMonth:
+        transactionProxyModel->setDateRange(
+                QDateTime(QDate(current.year(), current.month()-1, 1)),
+                QDateTime(QDate(current.year(), current.month(), 1)));
+        break;
+    case ThisYear:
+        transactionProxyModel->setDateRange(
+                QDateTime(QDate(current.year(), 1, 1)),
+                TransactionFilterProxy::MAX_DATE);
+        break;
+    case Range:
+        dateRangeWidget->setVisible(true);
+        dateRangeChanged();
+        break;
+    }
+}
+
+void TransactionView::chooseType(int idx)
+{
+    transactionProxyModel->setTypeFilter(
+        typeWidget->itemData(idx).toInt());
+}
+
+void TransactionView::changedPrefix(const QString &prefix)
+{
+    transactionProxyModel->setAddressPrefix(prefix);
+}
+
+void TransactionView::changedAmount(const QString &amount)
+{
+    qint64 amount_parsed = 0;
+    if(BitcoinUnits::parse(model->getOptionsModel()->getDisplayUnit(), amount, &amount_parsed))
+    {
+        transactionProxyModel->setMinAmount(amount_parsed);
+    }
+    else
+    {
+        transactionProxyModel->setMinAmount(0);
+    }
+}
+
+void TransactionView::exportClicked()
+{
+    // CSV is currently the only supported format
+    QString filename = QFileDialog::getSaveFileName(
+            this,
+            tr("Export Transaction Data"),
+            QDir::currentPath(),
+            tr("Comma separated file (*.csv)"));
+
+    if (filename.isNull()) return;
+
+    CSVModelWriter writer(filename);
+
+    // name, column, role
+    writer.setModel(transactionProxyModel);
+    writer.addColumn(tr("Confirmed"), 0, TransactionTableModel::ConfirmedRole);
+    writer.addColumn(tr("Date"), 0, TransactionTableModel::DateRole);
+    writer.addColumn(tr("Type"), TransactionTableModel::Type, Qt::EditRole);
+    writer.addColumn(tr("Label"), 0, TransactionTableModel::LabelRole);
+    writer.addColumn(tr("Address"), 0, TransactionTableModel::AddressRole);
+    writer.addColumn(tr("Amount"), 0, TransactionTableModel::FormattedAmountRole);
+    writer.addColumn(tr("ID"), 0, TransactionTableModel::TxIDRole);
+
+    if(!writer.write())
+    {
+        QMessageBox::critical(this, tr("Error exporting"), tr("Could not write to file %1.").arg(filename),
+                              QMessageBox::Abort, QMessageBox::Abort);
+    }
+}
+
+void TransactionView::contextualMenu(const QPoint &point)
+{
+    QModelIndex index = transactionView->indexAt(point);
+    if(index.isValid())
+    {
+        contextMenu->exec(QCursor::pos());
+    }
+}
+
+void TransactionView::copyAddress()
+{
+    QModelIndexList selection = transactionView->selectionModel()->selectedRows();
+    if(!selection.isEmpty())
+    {
+        QApplication::clipboard()->setText(selection.at(0).data(TransactionTableModel::AddressRole).toString());
+    }
+}
+
+void TransactionView::copyLabel()
+{
+    QModelIndexList selection = transactionView->selectionModel()->selectedRows();
+    if(!selection.isEmpty())
+    {
+        QApplication::clipboard()->setText(selection.at(0).data(TransactionTableModel::LabelRole).toString());
+    }
+}
+
+void TransactionView::editLabel()
+{
+    QModelIndexList selection = transactionView->selectionModel()->selectedRows();
+    if(!selection.isEmpty())
+    {
+        AddressTableModel *addressBook = model->getAddressTableModel();
+        QString address = selection.at(0).data(TransactionTableModel::AddressRole).toString();
+        if(address.isEmpty())
+        {
+            // If this transaction has no associated address, exit
+            return;
+        }
+        int idx = addressBook->lookupAddress(address);
+        if(idx != -1)
+        {
+            // Edit sending / receiving address
+            QModelIndex modelIdx = addressBook->index(idx, 0, QModelIndex());
+            // Determine type of address, launch appropriate editor dialog type
+            QString type = modelIdx.data(AddressTableModel::TypeRole).toString();
+
+            EditAddressDialog dlg(type==AddressTableModel::Receive
+                                         ? EditAddressDialog::EditReceivingAddress
+                                         : EditAddressDialog::EditSendingAddress,
+                                  this);
+            dlg.setModel(addressBook);
+            dlg.loadRow(idx);
+            dlg.exec();
+        }
+        else
+        {
+            // Add sending address
+            EditAddressDialog dlg(EditAddressDialog::NewSendingAddress,
+                                  this);
+            dlg.exec();
+        }
+    }
+}
+
+void TransactionView::showDetails()
+{
+    QModelIndexList selection = transactionView->selectionModel()->selectedRows();
+    if(!selection.isEmpty())
+    {
+        TransactionDescDialog dlg(selection.at(0));
+        dlg.exec();
+    }
+}
+
+QWidget *TransactionView::createDateRangeWidget()
+{
+    dateRangeWidget = new QFrame();
+    dateRangeWidget->setFrameStyle(QFrame::Panel | QFrame::Raised);
+    dateRangeWidget->setContentsMargins(1,1,1,1);
+    QHBoxLayout *layout = new QHBoxLayout(dateRangeWidget);
+    layout->setContentsMargins(0,0,0,0);
+    layout->addSpacing(23);
+    layout->addWidget(new QLabel(tr("Range:")));
+
+    dateFrom = new QDateTimeEdit(this);
+    dateFrom->setDisplayFormat("dd/MM/yy");
+    dateFrom->setCalendarPopup(true);
+    dateFrom->setMinimumWidth(100);
+    dateFrom->setDate(QDate::currentDate().addDays(-7));
+    layout->addWidget(dateFrom);
+    layout->addWidget(new QLabel(tr("to")));
+
+    dateTo = new QDateTimeEdit(this);
+    dateTo->setDisplayFormat("dd/MM/yy");
+    dateTo->setCalendarPopup(true);
+    dateTo->setMinimumWidth(100);
+    dateTo->setDate(QDate::currentDate());
+    layout->addWidget(dateTo);
+    layout->addStretch();
+
+    // Hide by default
+    dateRangeWidget->setVisible(false);
+
+    // Notify on change
+    connect(dateFrom, SIGNAL(dateChanged(QDate)), this, SLOT(dateRangeChanged()));
+    connect(dateTo, SIGNAL(dateChanged(QDate)), this, SLOT(dateRangeChanged()));
+
+    return dateRangeWidget;
+}
+
+void TransactionView::dateRangeChanged()
+{
+    transactionProxyModel->setDateRange(
+            QDateTime(dateFrom->date()),
+            QDateTime(dateTo->date()).addDays(1));
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/transactionview.h
@@ -0,0 +1,77 @@
+#ifndef TRANSACTIONVIEW_H
+#define TRANSACTIONVIEW_H
+
+#include <QWidget>
+
+class WalletModel;
+class TransactionFilterProxy;
+
+QT_BEGIN_NAMESPACE
+class QTableView;
+class QComboBox;
+class QLineEdit;
+class QModelIndex;
+class QMenu;
+class QFrame;
+class QDateTimeEdit;
+QT_END_NAMESPACE
+
+class TransactionView : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit TransactionView(QWidget *parent = 0);
+
+    void setModel(WalletModel *model);
+
+    // Date ranges for filter
+    enum DateEnum
+    {
+        All,
+        Today,
+        ThisWeek,
+        ThisMonth,
+        LastMonth,
+        ThisYear,
+        Range
+    };
+
+private:
+    WalletModel *model;
+    TransactionFilterProxy *transactionProxyModel;
+    QTableView *transactionView;
+
+    QComboBox *dateWidget;
+    QComboBox *typeWidget;
+    QLineEdit *addressWidget;
+    QLineEdit *amountWidget;
+
+    QMenu *contextMenu;
+
+    QFrame *dateRangeWidget;
+    QDateTimeEdit *dateFrom;
+    QDateTimeEdit *dateTo;
+
+    QWidget *createDateRangeWidget();
+
+private slots:
+    void contextualMenu(const QPoint &);
+    void dateRangeChanged();
+
+signals:
+    void doubleClicked(const QModelIndex&);
+
+public slots:
+    void chooseDate(int idx);
+    void chooseType(int idx);
+    void changedPrefix(const QString &prefix);
+    void changedAmount(const QString &amount);
+    void exportClicked();
+    void showDetails();
+    void copyAddress();
+    void editLabel();
+    void copyLabel();
+
+};
+
+#endif // TRANSACTIONVIEW_H
new file mode 100644
--- /dev/null
+++ b/src/qt/walletmodel.cpp
@@ -0,0 +1,277 @@
+#include "walletmodel.h"
+#include "guiconstants.h"
+#include "optionsmodel.h"
+#include "addresstablemodel.h"
+#include "transactiontablemodel.h"
+
+#include "headers.h"
+
+#include <QTimer>
+#include <QSet>
+
+WalletModel::WalletModel(CWallet *wallet, OptionsModel *optionsModel, QObject *parent) :
+    QObject(parent), wallet(wallet), optionsModel(optionsModel), addressTableModel(0),
+    transactionTableModel(0),
+    cachedBalance(0), cachedUnconfirmedBalance(0), cachedNumTransactions(0),
+    cachedEncryptionStatus(Unencrypted)
+{
+    // Until signal notifications is built into the bitcoin core,
+    //  simply update everything after polling using a timer.
+    QTimer *timer = new QTimer(this);
+    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
+    timer->start(MODEL_UPDATE_DELAY);
+
+    addressTableModel = new AddressTableModel(wallet, this);
+    transactionTableModel = new TransactionTableModel(wallet, this);
+}
+
+qint64 WalletModel::getBalance() const
+{
+    return wallet->GetBalance();
+}
+
+qint64 WalletModel::getUnconfirmedBalance() const
+{
+    return wallet->GetUnconfirmedBalance();
+}
+
+int WalletModel::getNumTransactions() const
+{
+    int numTransactions = 0;
+    CRITICAL_BLOCK(wallet->cs_wallet)
+    {
+        numTransactions = wallet->mapWallet.size();
+    }
+    return numTransactions;
+}
+
+void WalletModel::update()
+{
+    qint64 newBalance = getBalance();
+    qint64 newUnconfirmedBalance = getUnconfirmedBalance();
+    int newNumTransactions = getNumTransactions();
+    EncryptionStatus newEncryptionStatus = getEncryptionStatus();
+
+    if(cachedBalance != newBalance || cachedUnconfirmedBalance != newUnconfirmedBalance)
+        emit balanceChanged(newBalance, newUnconfirmedBalance);
+
+    if(cachedNumTransactions != newNumTransactions)
+        emit numTransactionsChanged(newNumTransactions);
+
+    if(cachedEncryptionStatus != newEncryptionStatus)
+        emit encryptionStatusChanged(newEncryptionStatus);
+
+    cachedBalance = newBalance;
+    cachedUnconfirmedBalance = newUnconfirmedBalance;
+    cachedNumTransactions = newNumTransactions;
+
+    addressTableModel->update();
+}
+
+bool WalletModel::validateAddress(const QString &address)
+{
+    CBitcoinAddress addressParsed(address.toStdString());
+    return addressParsed.IsValid();
+}
+
+WalletModel::SendCoinsReturn WalletModel::sendCoins(const QList<SendCoinsRecipient> &recipients)
+{
+    qint64 total = 0;
+    QSet<QString> setAddress;
+    QString hex;
+
+    if(recipients.empty())
+    {
+        return OK;
+    }
+
+    // Pre-check input data for validity
+    foreach(const SendCoinsRecipient &rcp, recipients)
+    {
+        if(!validateAddress(rcp.address))
+        {
+            return InvalidAddress;
+        }
+        setAddress.insert(rcp.address);
+
+        if(rcp.amount <= 0)
+        {
+            return InvalidAmount;
+        }
+        total += rcp.amount;
+    }
+
+    if(recipients.size() > setAddress.size())
+    {
+        return DuplicateAddress;
+    }
+
+    if(total > getBalance())
+    {
+        return AmountExceedsBalance;
+    }
+
+    if((total + nTransactionFee) > getBalance())
+    {
+        return SendCoinsReturn(AmountWithFeeExceedsBalance, nTransactionFee);
+    }
+
+    CRITICAL_BLOCK(cs_main)
+    CRITICAL_BLOCK(wallet->cs_wallet)
+    {
+        // Sendmany
+        std::vector<std::pair<CScript, int64> > vecSend;
+        foreach(const SendCoinsRecipient &rcp, recipients)
+        {
+            CScript scriptPubKey;
+            scriptPubKey.SetBitcoinAddress(rcp.address.toStdString());
+            vecSend.push_back(make_pair(scriptPubKey, rcp.amount));
+        }
+
+        CWalletTx wtx;
+        CReserveKey keyChange(wallet);
+        int64 nFeeRequired = 0;
+        bool fCreated = wallet->CreateTransaction(vecSend, wtx, keyChange, nFeeRequired);
+
+        if(!fCreated)
+        {
+            if((total + nFeeRequired) > wallet->GetBalance())
+            {
+                return SendCoinsReturn(AmountWithFeeExceedsBalance, nFeeRequired);
+            }
+            return TransactionCreationFailed;
+        }
+        if(!ThreadSafeAskFee(nFeeRequired, tr("Sending...").toStdString(), NULL))
+        {
+            return Aborted;
+        }
+        if(!wallet->CommitTransaction(wtx, keyChange))
+        {
+            return TransactionCommitFailed;
+        }
+        hex = QString::fromStdString(wtx.GetHash().GetHex());
+    }
+
+    // Add addresses that we've sent to to the address book
+    foreach(const SendCoinsRecipient &rcp, recipients)
+    {
+        std::string strAddress = rcp.address.toStdString();
+        CRITICAL_BLOCK(wallet->cs_wallet)
+        {
+            if (!wallet->mapAddressBook.count(strAddress))
+                wallet->SetAddressBookName(strAddress, rcp.label.toStdString());
+        }
+    }
+
+    // Update our model of the address table
+    addressTableModel->updateList();
+
+    return SendCoinsReturn(OK, 0, hex);
+}
+
+OptionsModel *WalletModel::getOptionsModel()
+{
+    return optionsModel;
+}
+
+AddressTableModel *WalletModel::getAddressTableModel()
+{
+    return addressTableModel;
+}
+
+TransactionTableModel *WalletModel::getTransactionTableModel()
+{
+    return transactionTableModel;
+}
+
+WalletModel::EncryptionStatus WalletModel::getEncryptionStatus() const
+{
+    if(!wallet->IsCrypted())
+    {
+        return Unencrypted;
+    }
+    else if(wallet->IsLocked())
+    {
+        return Locked;
+    }
+    else
+    {
+        return Unlocked;
+    }
+}
+
+bool WalletModel::setWalletEncrypted(bool encrypted, const std::string &passphrase)
+{
+    if(encrypted)
+    {
+        // Encrypt
+        return wallet->EncryptWallet(passphrase);
+    }
+    else
+    {
+        // Decrypt -- TODO; not supported yet
+        return false;
+    }
+}
+
+bool WalletModel::setWalletLocked(bool locked, const std::string &passPhrase)
+{
+    if(locked)
+    {
+        // Lock
+        return wallet->Lock();
+    }
+    else
+    {
+        // Unlock
+        return wallet->Unlock(passPhrase);
+    }
+}
+
+bool WalletModel::changePassphrase(const std::string &oldPass, const std::string &newPass)
+{
+    bool retval;
+    CRITICAL_BLOCK(wallet->cs_wallet)
+    {
+        wallet->Lock(); // Make sure wallet is locked before attempting pass change
+        retval = wallet->ChangeWalletPassphrase(oldPass, newPass);
+    }
+    return retval;
+}
+
+// WalletModel::UnlockContext implementation
+WalletModel::UnlockContext WalletModel::requestUnlock()
+{
+    bool was_locked = getEncryptionStatus() == Locked;
+    if(was_locked)
+    {
+        // Request UI to unlock wallet
+        emit requireUnlock();
+    }
+    // If wallet is still locked, unlock was failed or cancelled, mark context as invalid
+    bool valid = getEncryptionStatus() != Locked;
+
+    return UnlockContext(this, valid, was_locked);
+}
+
+WalletModel::UnlockContext::UnlockContext(WalletModel *wallet, bool valid, bool relock):
+        wallet(wallet),
+        valid(valid),
+        relock(relock)
+{
+}
+
+WalletModel::UnlockContext::~UnlockContext()
+{
+    if(valid && relock)
+    {
+        wallet->setWalletLocked(true);
+    }
+}
+
+void WalletModel::UnlockContext::CopyFrom(const UnlockContext& rhs)
+{
+    // Transfer context; old object no longer relocks wallet
+    *this = rhs;
+    rhs.relock = false;
+}
new file mode 100644
--- /dev/null
+++ b/src/qt/walletmodel.h
@@ -0,0 +1,143 @@
+#ifndef WALLETMODEL_H
+#define WALLETMODEL_H
+
+#include <QObject>
+#include <string>
+
+class OptionsModel;
+class AddressTableModel;
+class TransactionTableModel;
+class CWallet;
+
+struct SendCoinsRecipient
+{
+    QString address;
+    QString label;
+    qint64 amount;
+};
+
+// Interface to Bitcoin wallet from Qt view code
+class WalletModel : public QObject
+{
+    Q_OBJECT
+public:
+    explicit WalletModel(CWallet *wallet, OptionsModel *optionsModel, QObject *parent = 0);
+
+    enum StatusCode // Returned by sendCoins
+    {
+        OK,
+        InvalidAmount,
+        InvalidAddress,
+        AmountExceedsBalance,
+        AmountWithFeeExceedsBalance,
+        DuplicateAddress,
+        TransactionCreationFailed, // Error returned when wallet is still locked
+        TransactionCommitFailed,
+        Aborted,
+        MiscError
+    };
+
+    enum EncryptionStatus
+    {
+        Unencrypted,  // !wallet->IsCrypted()
+        Locked,       // wallet->IsCrypted() && wallet->IsLocked()
+        Unlocked      // wallet->IsCrypted() && !wallet->IsLocked()
+    };
+
+    OptionsModel *getOptionsModel();
+    AddressTableModel *getAddressTableModel();
+    TransactionTableModel *getTransactionTableModel();
+
+    qint64 getBalance() const;
+    qint64 getUnconfirmedBalance() const;
+    int getNumTransactions() const;
+    EncryptionStatus getEncryptionStatus() const;
+
+    // Check address for validity
+    bool validateAddress(const QString &address);
+
+    // Return status record for SendCoins, contains error id + information
+    struct SendCoinsReturn
+    {
+        SendCoinsReturn(StatusCode status,
+                         qint64 fee=0,
+                         QString hex=QString()):
+            status(status), fee(fee), hex(hex) {}
+        StatusCode status;
+        qint64 fee; // is used in case status is "AmountWithFeeExceedsBalance"
+        QString hex; // is filled with the transaction hash if status is "OK"
+    };
+
+    // Send coins to a list of recipients
+    SendCoinsReturn sendCoins(const QList<SendCoinsRecipient> &recipients);
+
+    // Wallet encryption
+    bool setWalletEncrypted(bool encrypted, const std::string &passphrase);
+    // Passphrase only needed when unlocking
+    bool setWalletLocked(bool locked, const std::string &passPhrase=std::string());
+    bool changePassphrase(const std::string &oldPass, const std::string &newPass);
+
+    // RAI object for unlocking wallet, returned by requestUnlock()
+    class UnlockContext
+    {
+    public:
+        UnlockContext(WalletModel *wallet, bool valid, bool relock);
+        ~UnlockContext();
+
+        bool isValid() const { return valid; }
+
+        // Copy operator and constructor transfer the context
+        UnlockContext(const UnlockContext& obj) { CopyFrom(obj); }
+        UnlockContext& operator=(const UnlockContext& rhs) { CopyFrom(rhs); return *this; }
+    private:
+        WalletModel *wallet;
+        bool valid;
+        mutable bool relock; // mutable, as it can be set to false by copying
+
+        void CopyFrom(const UnlockContext& rhs);
+    };
+
+    UnlockContext requestUnlock();
+
+private:
+    CWallet *wallet;
+
+    // Wallet has an options model for wallet-specific options
+    // (transaction fee, for example)
+    OptionsModel *optionsModel;
+
+    AddressTableModel *addressTableModel;
+    TransactionTableModel *transactionTableModel;
+
+    // Cache some values to be able to detect changes
+    qint64 cachedBalance;
+    qint64 cachedUnconfirmedBalance;
+    qint64 cachedNumTransactions;
+    EncryptionStatus cachedEncryptionStatus;
+
+signals:
+    // Signal that balance in wallet changed
+    void balanceChanged(qint64 balance, qint64 unconfirmedBalance);
+
+    // Number of transactions in wallet changed
+    void numTransactionsChanged(int count);
+
+    // Encryption status of wallet changed
+    void encryptionStatusChanged(int status);
+
+    // Signal emitted when wallet needs to be unlocked
+    // It is valid behaviour for listeners to keep the wallet locked after this signal;
+    // this means that the unlocking failed or was cancelled.
+    void requireUnlock();
+
+    // Asynchronous error notification
+    void error(const QString &title, const QString &message);
+
+public slots:
+
+private slots:
+    void update();
+};
+
+
+#endif // WALLETMODEL_H
new file mode 100644
--- /dev/null
+++ b/src/qtui.h
@@ -0,0 +1,49 @@
+// Copyright (c) 2010 Satoshi Nakamoto
+// Distributed under the MIT/X11 software license, see the accompanying
+// file license.txt or http://www.opensource.org/licenses/mit-license.php.
+#ifndef BITCOIN_EXTERNUI_H
+#define BITCOIN_EXTERNUI_H
+
+#include <string>
+#include <boost/function/function0.hpp>
+#include "wallet.h"
+
+typedef void wxWindow;
+#define wxYES                   0x00000002
+#define wxOK                    0x00000004
+#define wxNO                    0x00000008
+#define wxYES_NO                (wxYES|wxNO)
+#define wxCANCEL                0x00000010
+#define wxAPPLY                 0x00000020
+#define wxCLOSE                 0x00000040
+#define wxOK_DEFAULT            0x00000000
+#define wxYES_DEFAULT           0x00000000
+#define wxNO_DEFAULT            0x00000080
+#define wxCANCEL_DEFAULT        0x80000000
+#define wxICON_EXCLAMATION      0x00000100
+#define wxICON_HAND             0x00000200
+#define wxICON_WARNING          wxICON_EXCLAMATION
+#define wxICON_ERROR            wxICON_HAND
+#define wxICON_QUESTION         0x00000400
+#define wxICON_INFORMATION      0x00000800
+#define wxICON_STOP             wxICON_HAND
+#define wxICON_ASTERISK         wxICON_INFORMATION
+#define wxICON_MASK             (0x00000100|0x00000200|0x00000400|0x00000800)
+#define wxFORWARD               0x00001000
+#define wxBACKWARD              0x00002000
+#define wxRESET                 0x00004000
+#define wxHELP                  0x00008000
+#define wxMORE                  0x00010000
+#define wxSETUP                 0x00020000
+
+extern int MyMessageBox(const std::string& message, const std::string& caption="Message", int style=wxOK, wxWindow* parent=NULL, int x=-1, int y=-1);
+#define wxMessageBox  MyMessageBox
+extern int ThreadSafeMessageBox(const std::string& message, const std::string& caption, int style=wxOK, wxWindow* parent=NULL, int x=-1, int y=-1);
+extern bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption, wxWindow* parent);
+extern void CalledSetStatusBar(const std::string& strText, int nField);
+extern void UIThreadCall(boost::function0<void> fn);
+extern void MainFrameRepaint();
+extern void InitMessage(const std::string &message);
+extern std::string _(const char* psz);
+
+#endif
deleted file mode 100644
--- a/src/rpc.cpp
+++ /dev/null
@@ -1,2405 +0,0 @@
-// Copyright (c) 2010 Satoshi Nakamoto
-// Copyright (c) 2011 The Bitcoin developers
-// Distributed under the MIT/X11 software license, see the accompanying
-// file license.txt or http://www.opensource.org/licenses/mit-license.php.
-
-#include "headers.h"
-#include "cryptopp/sha.h"
-#include "db.h"
-#include "net.h"
-#include "init.h"
-#undef printf
-#include <boost/asio.hpp>
-#include <boost/iostreams/concepts.hpp>
-#include <boost/iostreams/stream.hpp>
-#include <boost/algorithm/string.hpp>
-#ifdef USE_SSL
-#include <boost/asio/ssl.hpp> 
-#include <boost/filesystem.hpp>
-#include <boost/filesystem/fstream.hpp>
-typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> SSLStream;
-#endif
-#include "json/json_spirit_reader_template.h"
-#include "json/json_spirit_writer_template.h"
-#include "json/json_spirit_utils.h"
-#define printf OutputDebugStringF
-// MinGW 3.4.5 gets "fatal error: had to relocate PCH" if the json headers are
-// precompiled in headers.h.  The problem might be when the pch file goes over
-// a certain size around 145MB.  If we need access to json_spirit outside this
-// file, we could use the compiled json_spirit option.
-
-using namespace std;
-using namespace boost;
-using namespace boost::asio;
-using namespace json_spirit;
-
-void ThreadRPCServer2(void* parg);
-typedef Value(*rpcfn_type)(const Array& params, bool fHelp);
-extern map<string, rpcfn_type> mapCallTable;
-
-static int64 nWalletUnlockTime;
-static CCriticalSection cs_nWalletUnlockTime;
-
-
-Object JSONRPCError(int code, const string& message)
-{
-    Object error;
-    error.push_back(Pair("code", code));
-    error.push_back(Pair("message", message));
-    return error;
-}
-
-
-void PrintConsole(const char* format, ...)
-{
-    char buffer[50000];
-    int limit = sizeof(buffer);
-    va_list arg_ptr;
-    va_start(arg_ptr, format);
-    int ret = _vsnprintf(buffer, limit, format, arg_ptr);
-    va_end(arg_ptr);
-    if (ret < 0 || ret >= limit)
-    {
-        ret = limit - 1;
-        buffer[limit-1] = 0;
-    }
-    printf("%s", buffer);
-#if defined(__WXMSW__) && defined(GUI)
-    MyMessageBox(buffer, "Bitcoin", wxOK | wxICON_EXCLAMATION);
-#else
-    fprintf(stdout, "%s", buffer);
-#endif
-}
-
-
-int64 AmountFromValue(const Value& value)
-{
-    double dAmount = value.get_real();
-    if (dAmount <= 0.0 || dAmount > 21000000.0)
-        throw JSONRPCError(-3, "Invalid amount");
-    int64 nAmount = roundint64(dAmount * COIN);
-    if (!MoneyRange(nAmount))
-        throw JSONRPCError(-3, "Invalid amount");
-    return nAmount;
-}
-
-Value ValueFromAmount(int64 amount)
-{
-    return (double)amount / (double)COIN;
-}
-
-void WalletTxToJSON(const CWalletTx& wtx, Object& entry)
-{
-    entry.push_back(Pair("confirmations", wtx.GetDepthInMainChain()));
-    entry.push_back(Pair("txid", wtx.GetHash().GetHex()));
-    entry.push_back(Pair("time", (boost::int64_t)wtx.GetTxTime()));
-    BOOST_FOREACH(const PAIRTYPE(string,string)& item, wtx.mapValue)
-        entry.push_back(Pair(item.first, item.second));
-}
-
-string AccountFromValue(const Value& value)
-{
-    string strAccount = value.get_str();
-    if (strAccount == "*")
-        throw JSONRPCError(-11, "Invalid account name");
-    return strAccount;
-}
-
-
-
-///
-/// Note: This interface may still be subject to change.
-///
-
-
-Value help(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() > 1)
-        throw runtime_error(
-            "help [command]\n"
-            "List commands, or get help for a command.");
-
-    string strCommand;
-    if (params.size() > 0)
-        strCommand = params[0].get_str();
-
-    string strRet;
-    set<rpcfn_type> setDone;
-    for (map<string, rpcfn_type>::iterator mi = mapCallTable.begin(); mi != mapCallTable.end(); ++mi)
-    {
-        string strMethod = (*mi).first;
-        // We already filter duplicates, but these deprecated screw up the sort order
-        if (strMethod == "getamountreceived" ||
-            strMethod == "getallreceived" ||
-            (strMethod.find("label") != string::npos))
-            continue;
-        if (strCommand != "" && strMethod != strCommand)
-            continue;
-        try
-        {
-            Array params;
-            rpcfn_type pfn = (*mi).second;
-            if (setDone.insert(pfn).second)
-                (*pfn)(params, true);
-        }
-        catch (std::exception& e)
-        {
-            // Help text is returned in an exception
-            string strHelp = string(e.what());
-            if (strCommand == "")
-                if (strHelp.find('\n') != -1)
-                    strHelp = strHelp.substr(0, strHelp.find('\n'));
-            strRet += strHelp + "\n";
-        }
-    }
-    if (strRet == "")
-        strRet = strprintf("help: unknown command: %s\n", strCommand.c_str());
-    strRet = strRet.substr(0,strRet.size()-1);
-    return strRet;
-}
-
-
-Value stop(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() != 0)
-        throw runtime_error(
-            "stop\n"
-            "Stop bitcoin server.");
-
-    // Shutdown will take long enough that the response should get back
-    CreateThread(Shutdown, NULL);
-    return "bitcoin server stopping";
-}
-
-
-Value getblockcount(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() != 0)
-        throw runtime_error(
-            "getblockcount\n"
-            "Returns the number of blocks in the longest block chain.");
-
-    return nBestHeight;
-}
-
-
-Value getblocknumber(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() != 0)
-        throw runtime_error(
-            "getblocknumber\n"
-            "Returns the block number of the latest block in the longest block chain.");
-
-    return nBestHeight;
-}
-
-
-Value getconnectioncount(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() != 0)
-        throw runtime_error(
-            "getconnectioncount\n"
-            "Returns the number of connections to other nodes.");
-
-    return (int)vNodes.size();
-}
-
-
-double GetDifficulty()
-{
-    // Floating point number that is a multiple of the minimum difficulty,
-    // minimum difficulty = 1.0.
-
-    if (pindexBest == NULL)
-        return 1.0;
-    int nShift = (pindexBest->nBits >> 24) & 0xff;
-
-    double dDiff =
-        (double)0x0000ffff / (double)(pindexBest->nBits & 0x00ffffff);
-
-    while (nShift < 29)
-    {
-        dDiff *= 256.0;
-        nShift++;
-    }
-    while (nShift > 29)
-    {
-        dDiff /= 256.0;
-        nShift--;
-    }
-
-    return dDiff;
-}
-
-Value getdifficulty(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() != 0)
-        throw runtime_error(
-            "getdifficulty\n"
-            "Returns the proof-of-work difficulty as a multiple of the minimum difficulty.");
-
-    return GetDifficulty();
-}
-
-
-Value getgenerate(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() != 0)
-        throw runtime_error(
-            "getgenerate\n"
-            "Returns true or false.");
-
-    return (bool)fGenerateBitcoins;
-}
-
-
-Value setgenerate(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() < 1 || params.size() > 2)
-        throw runtime_error(
-            "setgenerate <generate> [genproclimit]\n"
-            "<generate> is true or false to turn generation on or off.\n"
-            "Generation is limited to [genproclimit] processors, -1 is unlimited.");
-
-    bool fGenerate = true;
-    if (params.size() > 0)
-        fGenerate = params[0].get_bool();
-
-    if (params.size() > 1)
-    {
-        int nGenProcLimit = params[1].get_int();
-        fLimitProcessors = (nGenProcLimit != -1);
-        WriteSetting("fLimitProcessors", fLimitProcessors);
-        if (nGenProcLimit != -1)
-            WriteSetting("nLimitProcessors", nLimitProcessors = nGenProcLimit);
-        if (nGenProcLimit == 0)
-            fGenerate = false;
-    }
-
-    GenerateBitcoins(fGenerate, pwalletMain);
-    return Value::null;
-}
-
-
-Value gethashespersec(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() != 0)
-        throw runtime_error(
-            "gethashespersec\n"
-            "Returns a recent hashes per second performance measurement while generating.");
-
-    if (GetTimeMillis() - nHPSTimerStart > 8000)
-        return (boost::int64_t)0;
-    return (boost::int64_t)dHashesPerSec;
-}
-
-
-Value getinfo(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() != 0)
-        throw runtime_error(
-            "getinfo\n"
-            "Returns an object containing various state info.");
-
-    Object obj;
-    obj.push_back(Pair("version",       (int)VERSION));
-    obj.push_back(Pair("balance",       ValueFromAmount(pwalletMain->GetBalance())));
-    obj.push_back(Pair("blocks",        (int)nBestHeight));
-    obj.push_back(Pair("connections",   (int)vNodes.size()));
-    obj.push_back(Pair("proxy",         (fUseProxy ? addrProxy.ToStringIPPort() : string())));
-    obj.push_back(Pair("generate",      (bool)fGenerateBitcoins));
-    obj.push_back(Pair("genproclimit",  (int)(fLimitProcessors ? nLimitProcessors : -1)));
-    obj.push_back(Pair("difficulty",    (double)GetDifficulty()));
-    obj.push_back(Pair("hashespersec",  gethashespersec(params, false)));
-    obj.push_back(Pair("testnet",       fTestNet));
-    obj.push_back(Pair("keypoololdest", (boost::int64_t)pwalletMain->GetOldestKeyPoolTime()));
-    obj.push_back(Pair("keypoolsize",   pwalletMain->GetKeyPoolSize()));
-    obj.push_back(Pair("paytxfee",      ValueFromAmount(nTransactionFee)));
-    if (pwalletMain->IsCrypted())
-        obj.push_back(Pair("unlocked_until", (boost::int64_t)nWalletUnlockTime));
-    obj.push_back(Pair("errors",        GetWarnings("statusbar")));
-    return obj;
-}
-
-
-Value getnewaddress(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() > 1)
-        throw runtime_error(
-            "getnewaddress [account]\n"
-            "Returns a new bitcoin address for receiving payments.  "
-            "If [account] is specified (recommended), it is added to the address book "
-            "so payments received with the address will be credited to [account].");
-
-    // Parse the account first so we don't generate a key if there's an error
-    string strAccount;
-    if (params.size() > 0)
-        strAccount = AccountFromValue(params[0]);
-
-    if (!pwalletMain->IsLocked())
-        pwalletMain->TopUpKeyPool();
-
-    // Generate a new key that is added to wallet
-    std::vector<unsigned char> newKey;
-    if (!pwalletMain->GetKeyFromPool(newKey, false))
-        throw JSONRPCError(-12, "Error: Keypool ran out, please call keypoolrefill first");
-    CBitcoinAddress address(newKey);
-
-    pwalletMain->SetAddressBookName(address, strAccount);
-
-    return address.ToString();
-}
-
-
-CBitcoinAddress GetAccountAddress(string strAccount, bool bForceNew=false)
-{
-    CWalletDB walletdb(pwalletMain->strWalletFile);
-
-    CAccount account;
-    walletdb.ReadAccount(strAccount, account);
-
-    bool bKeyUsed = false;
-
-    // Check if the current key has been used
-    if (!account.vchPubKey.empty())
-    {
-        CScript scriptPubKey;
-        scriptPubKey.SetBitcoinAddress(account.vchPubKey);
-        for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin();
-             it != pwalletMain->mapWallet.end() && !account.vchPubKey.empty();
-             ++it)
-        {
-            const CWalletTx& wtx = (*it).second;
-            BOOST_FOREACH(const CTxOut& txout, wtx.vout)
-                if (txout.scriptPubKey == scriptPubKey)
-                    bKeyUsed = true;
-        }
-    }
-
-    // Generate a new key
-    if (account.vchPubKey.empty() || bForceNew || bKeyUsed)
-    {
-        if (!pwalletMain->GetKeyFromPool(account.vchPubKey, false))
-            throw JSONRPCError(-12, "Error: Keypool ran out, please call keypoolrefill first");
-
-        pwalletMain->SetAddressBookName(CBitcoinAddress(account.vchPubKey), strAccount);
-        walletdb.WriteAccount(strAccount, account);
-    }
-
-    return CBitcoinAddress(account.vchPubKey);
-}
-
-Value getaccountaddress(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() != 1)
-        throw runtime_error(
-            "getaccountaddress <account>\n"
-            "Returns the current bitcoin address for receiving payments to this account.");
-
-    // Parse the account first so we don't generate a key if there's an error
-    string strAccount = AccountFromValue(params[0]);
-
-    Value ret;
-
-    ret = GetAccountAddress(strAccount).ToString();
-
-    return ret;
-}
-
-
-
-Value setaccount(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() < 1 || params.size() > 2)
-        throw runtime_error(
-            "setaccount <bitcoinaddress> <account>\n"
-            "Sets the account associated with the given address.");
-
-    CBitcoinAddress address(params[0].get_str());
-    if (!address.IsValid())
-        throw JSONRPCError(-5, "Invalid bitcoin address");
-
-
-    string strAccount;
-    if (params.size() > 1)
-        strAccount = AccountFromValue(params[1]);
-
-    // Detect when changing the account of an address that is the 'unused current key' of another account:
-    if (pwalletMain->mapAddressBook.count(address))
-    {
-        string strOldAccount = pwalletMain->mapAddressBook[address];
-        if (address == GetAccountAddress(strOldAccount))
-            GetAccountAddress(strOldAccount, true);
-    }
-
-    pwalletMain->SetAddressBookName(address, strAccount);
-
-    return Value::null;
-}
-
-
-Value getaccount(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() != 1)
-        throw runtime_error(
-            "getaccount <bitcoinaddress>\n"
-            "Returns the account associated with the given address.");
-
-    CBitcoinAddress address(params[0].get_str());
-    if (!address.IsValid())
-        throw JSONRPCError(-5, "Invalid bitcoin address");
-
-    string strAccount;
-    map<CBitcoinAddress, string>::iterator mi = pwalletMain->mapAddressBook.find(address);
-    if (mi != pwalletMain->mapAddressBook.end() && !(*mi).second.empty())
-        strAccount = (*mi).second;
-    return strAccount;
-}
-
-
-Value getaddressesbyaccount(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() != 1)
-        throw runtime_error(
-            "getaddressesbyaccount <account>\n"
-            "Returns the list of addresses for the given account.");
-
-    string strAccount = AccountFromValue(params[0]);
-
-    // Find all addresses that have the given account
-    Array ret;
-    BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, string)& item, pwalletMain->mapAddressBook)
-    {
-        const CBitcoinAddress& address = item.first;
-        const string& strName = item.second;
-        if (strName == strAccount)
-            ret.push_back(address.ToString());
-    }
-    return ret;
-}
-
-Value settxfee(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() < 1 || params.size() > 1)
-        throw runtime_error(
-            "settxfee <amount>\n"
-            "<amount> is a real and is rounded to the nearest 0.00000001");
-
-    // Amount
-    int64 nAmount = 0;
-    if (params[0].get_real() != 0.0)
-        nAmount = AmountFromValue(params[0]);        // rejects 0.0 amounts
-
-    nTransactionFee = nAmount;
-    return true;
-}
-
-Value sendtoaddress(const Array& params, bool fHelp)
-{
-    if (pwalletMain->IsCrypted() && (fHelp || params.size() < 2 || params.size() > 4))
-        throw runtime_error(
-            "sendtoaddress <bitcoinaddress> <amount> [comment] [comment-to]\n"
-            "<amount> is a real and is rounded to the nearest 0.00000001\n"
-            "requires wallet passphrase to be set with walletpassphrase first");
-    if (!pwalletMain->IsCrypted() && (fHelp || params.size() < 2 || params.size() > 4))
-        throw runtime_error(
-            "sendtoaddress <bitcoinaddress> <amount> [comment] [comment-to]\n"
-            "<amount> is a real and is rounded to the nearest 0.00000001");
-
-    CBitcoinAddress address(params[0].get_str());
-    if (!address.IsValid())
-        throw JSONRPCError(-5, "Invalid bitcoin address");
-
-    // Amount
-    int64 nAmount = AmountFromValue(params[1]);
-
-    // Wallet comments
-    CWalletTx wtx;
-    if (params.size() > 2 && params[2].type() != null_type && !params[2].get_str().empty())
-        wtx.mapValue["comment"] = params[2].get_str();
-    if (params.size() > 3 && params[3].type() != null_type && !params[3].get_str().empty())
-        wtx.mapValue["to"]      = params[3].get_str();
-
-    if (pwalletMain->IsLocked())
-        throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.");
-
-    string strError = pwalletMain->SendMoneyToBitcoinAddress(address, nAmount, wtx);
-    if (strError != "")
-        throw JSONRPCError(-4, strError);
-
-    return wtx.GetHash().GetHex();
-}
-
-
-Value getreceivedbyaddress(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() < 1 || params.size() > 2)
-        throw runtime_error(
-            "getreceivedbyaddress <bitcoinaddress> [minconf=1]\n"
-            "Returns the total amount received by <bitcoinaddress> in transactions with at least [minconf] confirmations.");
-
-    // Bitcoin address
-    CBitcoinAddress address = CBitcoinAddress(params[0].get_str());
-    CScript scriptPubKey;
-    if (!address.IsValid())
-        throw JSONRPCError(-5, "Invalid bitcoin address");
-    scriptPubKey.SetBitcoinAddress(address);
-    if (!IsMine(*pwalletMain,scriptPubKey))
-        return (double)0.0;
-
-    // Minimum confirmations
-    int nMinDepth = 1;
-    if (params.size() > 1)
-        nMinDepth = params[1].get_int();
-
-    // Tally
-    int64 nAmount = 0;
-    for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
-    {
-        const CWalletTx& wtx = (*it).second;
-        if (wtx.IsCoinBase() || !wtx.IsFinal())
-            continue;
-
-        BOOST_FOREACH(const CTxOut& txout, wtx.vout)
-            if (txout.scriptPubKey == scriptPubKey)
-                if (wtx.GetDepthInMainChain() >= nMinDepth)
-                    nAmount += txout.nValue;
-    }
-
-    return  ValueFromAmount(nAmount);
-}
-
-
-void GetAccountAddresses(string strAccount, set<CBitcoinAddress>& setAddress)
-{
-    BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, string)& item, pwalletMain->mapAddressBook)
-    {
-        const CBitcoinAddress& address = item.first;
-        const string& strName = item.second;
-        if (strName == strAccount)
-            setAddress.insert(address);
-    }
-}
-
-
-Value getreceivedbyaccount(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() < 1 || params.size() > 2)
-        throw runtime_error(
-            "getreceivedbyaccount <account> [minconf=1]\n"
-            "Returns the total amount received by addresses with <account> in transactions with at least [minconf] confirmations.");
-
-    // Minimum confirmations
-    int nMinDepth = 1;
-    if (params.size() > 1)
-        nMinDepth = params[1].get_int();
-
-    // Get the set of pub keys that have the label
-    string strAccount = AccountFromValue(params[0]);
-    set<CBitcoinAddress> setAddress;
-    GetAccountAddresses(strAccount, setAddress);
-
-    // Tally
-    int64 nAmount = 0;
-    for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
-    {
-        const CWalletTx& wtx = (*it).second;
-        if (wtx.IsCoinBase() || !wtx.IsFinal())
-            continue;
-
-        BOOST_FOREACH(const CTxOut& txout, wtx.vout)
-        {
-            CBitcoinAddress address;
-            if (ExtractAddress(txout.scriptPubKey, pwalletMain, address) && setAddress.count(address))
-                if (wtx.GetDepthInMainChain() >= nMinDepth)
-                    nAmount += txout.nValue;
-        }
-    }
-
-    return (double)nAmount / (double)COIN;
-}
-
-
-int64 GetAccountBalance(CWalletDB& walletdb, const string& strAccount, int nMinDepth)
-{
-    int64 nBalance = 0;
-
-    // Tally wallet transactions
-    for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
-    {
-        const CWalletTx& wtx = (*it).second;
-        if (!wtx.IsFinal())
-            continue;
-
-        int64 nGenerated, nReceived, nSent, nFee;
-        wtx.GetAccountAmounts(strAccount, nGenerated, nReceived, nSent, nFee);
-
-        if (nReceived != 0 && wtx.GetDepthInMainChain() >= nMinDepth)
-            nBalance += nReceived;
-        nBalance += nGenerated - nSent - nFee;
-    }
-
-    // Tally internal accounting entries
-    nBalance += walletdb.GetAccountCreditDebit(strAccount);
-
-    return nBalance;
-}
-
-int64 GetAccountBalance(const string& strAccount, int nMinDepth)
-{
-    CWalletDB walletdb(pwalletMain->strWalletFile);
-    return GetAccountBalance(walletdb, strAccount, nMinDepth);
-}
-
-
-Value getbalance(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() > 2)
-        throw runtime_error(
-            "getbalance [account] [minconf=1]\n"
-            "If [account] is not specified, returns the server's total available balance.\n"
-            "If [account] is specified, returns the balance in the account.");
-
-    if (params.size() == 0)
-        return  ValueFromAmount(pwalletMain->GetBalance());
-
-    int nMinDepth = 1;
-    if (params.size() > 1)
-        nMinDepth = params[1].get_int();
-
-    if (params[0].get_str() == "*") {
-        // Calculate total balance a different way from GetBalance()
-        // (GetBalance() sums up all unspent TxOuts)
-        // getbalance and getbalance '*' should always return the same number.
-        int64 nBalance = 0;
-        for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
-        {
-            const CWalletTx& wtx = (*it).second;
-            if (!wtx.IsFinal())
-                continue;
-
-            int64 allGeneratedImmature, allGeneratedMature, allFee;
-            allGeneratedImmature = allGeneratedMature = allFee = 0;
-            string strSentAccount;
-            list<pair<CBitcoinAddress, int64> > listReceived;
-            list<pair<CBitcoinAddress, int64> > listSent;
-            wtx.GetAmounts(allGeneratedImmature, allGeneratedMature, listReceived, listSent, allFee, strSentAccount);
-            if (wtx.GetDepthInMainChain() >= nMinDepth)
-                BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress,int64)& r, listReceived)
-                    nBalance += r.second;
-            BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress,int64)& r, listSent)
-                nBalance -= r.second;
-            nBalance -= allFee;
-            nBalance += allGeneratedMature;
-        }
-        return  ValueFromAmount(nBalance);
-    }
-
-    string strAccount = AccountFromValue(params[0]);
-
-    int64 nBalance = GetAccountBalance(strAccount, nMinDepth);
-
-    return ValueFromAmount(nBalance);
-}
-
-
-Value movecmd(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() < 3 || params.size() > 5)
-        throw runtime_error(
-            "move <fromaccount> <toaccount> <amount> [minconf=1] [comment]\n"
-            "Move from one account in your wallet to another.");
-
-    string strFrom = AccountFromValue(params[0]);
-    string strTo = AccountFromValue(params[1]);
-    int64 nAmount = AmountFromValue(params[2]);
-    if (params.size() > 3)
-        // unused parameter, used to be nMinDepth, keep type-checking it though
-        (void)params[3].get_int();
-    string strComment;
-    if (params.size() > 4)
-        strComment = params[4].get_str();
-
-    CWalletDB walletdb(pwalletMain->strWalletFile);
-    walletdb.TxnBegin();
-
-    int64 nNow = GetAdjustedTime();
-
-    // Debit
-    CAccountingEntry debit;
-    debit.strAccount = strFrom;
-    debit.nCreditDebit = -nAmount;
-    debit.nTime = nNow;
-    debit.strOtherAccount = strTo;
-    debit.strComment = strComment;
-    walletdb.WriteAccountingEntry(debit);
-
-    // Credit
-    CAccountingEntry credit;
-    credit.strAccount = strTo;
-    credit.nCreditDebit = nAmount;
-    credit.nTime = nNow;
-    credit.strOtherAccount = strFrom;
-    credit.strComment = strComment;
-    walletdb.WriteAccountingEntry(credit);
-
-    walletdb.TxnCommit();
-
-    return true;
-}
-
-
-Value sendfrom(const Array& params, bool fHelp)
-{
-    if (pwalletMain->IsCrypted() && (fHelp || params.size() < 3 || params.size() > 6))
-        throw runtime_error(
-            "sendfrom <fromaccount> <tobitcoinaddress> <amount> [minconf=1] [comment] [comment-to]\n"
-            "<amount> is a real and is rounded to the nearest 0.00000001\n"
-            "requires wallet passphrase to be set with walletpassphrase first");
-    if (!pwalletMain->IsCrypted() && (fHelp || params.size() < 3 || params.size() > 6))
-        throw runtime_error(
-            "sendfrom <fromaccount> <tobitcoinaddress> <amount> [minconf=1] [comment] [comment-to]\n"
-            "<amount> is a real and is rounded to the nearest 0.00000001");
-
-    string strAccount = AccountFromValue(params[0]);
-    CBitcoinAddress address(params[1].get_str());
-    if (!address.IsValid())
-        throw JSONRPCError(-5, "Invalid bitcoin address");
-    int64 nAmount = AmountFromValue(params[2]);
-    int nMinDepth = 1;
-    if (params.size() > 3)
-        nMinDepth = params[3].get_int();
-
-    CWalletTx wtx;
-    wtx.strFromAccount = strAccount;
-    if (params.size() > 4 && params[4].type() != null_type && !params[4].get_str().empty())
-        wtx.mapValue["comment"] = params[4].get_str();
-    if (params.size() > 5 && params[5].type() != null_type && !params[5].get_str().empty())
-        wtx.mapValue["to"]      = params[5].get_str();
-
-    if (pwalletMain->IsLocked())
-        throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.");
-
-    // Check funds
-    int64 nBalance = GetAccountBalance(strAccount, nMinDepth);
-    if (nAmount > nBalance)
-        throw JSONRPCError(-6, "Account has insufficient funds");
-
-    // Send
-    string strError = pwalletMain->SendMoneyToBitcoinAddress(address, nAmount, wtx);
-    if (strError != "")
-        throw JSONRPCError(-4, strError);
-
-    return wtx.GetHash().GetHex();
-}
-
-
-Value sendmany(const Array& params, bool fHelp)
-{
-    if (pwalletMain->IsCrypted() && (fHelp || params.size() < 2 || params.size() > 4))
-        throw runtime_error(
-            "sendmany <fromaccount> {address:amount,...} [minconf=1] [comment]\n"
-            "amounts are double-precision floating point numbers\n"
-            "requires wallet passphrase to be set with walletpassphrase first");
-    if (!pwalletMain->IsCrypted() && (fHelp || params.size() < 2 || params.size() > 4))
-        throw runtime_error(
-            "sendmany <fromaccount> {address:amount,...} [minconf=1] [comment]\n"
-            "amounts are double-precision floating point numbers");
-
-    string strAccount = AccountFromValue(params[0]);
-    Object sendTo = params[1].get_obj();
-    int nMinDepth = 1;
-    if (params.size() > 2)
-        nMinDepth = params[2].get_int();
-
-    CWalletTx wtx;
-    wtx.strFromAccount = strAccount;
-    if (params.size() > 3 && params[3].type() != null_type && !params[3].get_str().empty())
-        wtx.mapValue["comment"] = params[3].get_str();
-
-    set<CBitcoinAddress> setAddress;
-    vector<pair<CScript, int64> > vecSend;
-
-    int64 totalAmount = 0;
-    BOOST_FOREACH(const Pair& s, sendTo)
-    {
-        CBitcoinAddress address(s.name_);
-        if (!address.IsValid())
-            throw JSONRPCError(-5, string("Invalid bitcoin address:")+s.name_);
-
-        if (setAddress.count(address))
-            throw JSONRPCError(-8, string("Invalid parameter, duplicated address: ")+s.name_);
-        setAddress.insert(address);
-
-        CScript scriptPubKey;
-        scriptPubKey.SetBitcoinAddress(address);
-        int64 nAmount = AmountFromValue(s.value_); 
-        totalAmount += nAmount;
-
-        vecSend.push_back(make_pair(scriptPubKey, nAmount));
-    }
-
-    if (pwalletMain->IsLocked())
-        throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.");
-
-    // Check funds
-    int64 nBalance = GetAccountBalance(strAccount, nMinDepth);
-    if (totalAmount > nBalance)
-        throw JSONRPCError(-6, "Account has insufficient funds");
-
-    // Send
-    CReserveKey keyChange(pwalletMain);
-    int64 nFeeRequired = 0;
-    bool fCreated = pwalletMain->CreateTransaction(vecSend, wtx, keyChange, nFeeRequired);
-    if (!fCreated)
-    {
-        if (totalAmount + nFeeRequired > pwalletMain->GetBalance())
-            throw JSONRPCError(-6, "Insufficient funds");
-        throw JSONRPCError(-4, "Transaction creation failed");
-    }
-    if (!pwalletMain->CommitTransaction(wtx, keyChange))
-        throw JSONRPCError(-4, "Transaction commit failed");
-
-    return wtx.GetHash().GetHex();
-}
-
-
-struct tallyitem
-{
-    int64 nAmount;
-    int nConf;
-    tallyitem()
-    {
-        nAmount = 0;
-        nConf = INT_MAX;
-    }
-};
-
-Value ListReceived(const Array& params, bool fByAccounts)
-{
-    // Minimum confirmations
-    int nMinDepth = 1;
-    if (params.size() > 0)
-        nMinDepth = params[0].get_int();
-
-    // Whether to include empty accounts
-    bool fIncludeEmpty = false;
-    if (params.size() > 1)
-        fIncludeEmpty = params[1].get_bool();
-
-    // Tally
-    map<CBitcoinAddress, tallyitem> mapTally;
-    for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
-    {
-        const CWalletTx& wtx = (*it).second;
-        if (wtx.IsCoinBase() || !wtx.IsFinal())
-            continue;
-
-        int nDepth = wtx.GetDepthInMainChain();
-        if (nDepth < nMinDepth)
-            continue;
-
-        BOOST_FOREACH(const CTxOut& txout, wtx.vout)
-        {
-            CBitcoinAddress address;
-            if (!ExtractAddress(txout.scriptPubKey, pwalletMain, address) || !address.IsValid())
-                continue;
-
-            tallyitem& item = mapTally[address];
-            item.nAmount += txout.nValue;
-            item.nConf = min(item.nConf, nDepth);
-        }
-    }
-
-    // Reply
-    Array ret;
-    map<string, tallyitem> mapAccountTally;
-    BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, string)& item, pwalletMain->mapAddressBook)
-    {
-        const CBitcoinAddress& address = item.first;
-        const string& strAccount = item.second;
-        map<CBitcoinAddress, tallyitem>::iterator it = mapTally.find(address);
-        if (it == mapTally.end() && !fIncludeEmpty)
-            continue;
-
-        int64 nAmount = 0;
-        int nConf = INT_MAX;
-        if (it != mapTally.end())
-        {
-            nAmount = (*it).second.nAmount;
-            nConf = (*it).second.nConf;
-        }
-
-        if (fByAccounts)
-        {
-            tallyitem& item = mapAccountTally[strAccount];
-            item.nAmount += nAmount;
-            item.nConf = min(item.nConf, nConf);
-        }
-        else
-        {
-            Object obj;
-            obj.push_back(Pair("address",       address.ToString()));
-            obj.push_back(Pair("account",       strAccount));
-            obj.push_back(Pair("label",         strAccount)); // deprecated
-            obj.push_back(Pair("amount",        ValueFromAmount(nAmount)));
-            obj.push_back(Pair("confirmations", (nConf == INT_MAX ? 0 : nConf)));
-            ret.push_back(obj);
-        }
-    }
-
-    if (fByAccounts)
-    {
-        for (map<string, tallyitem>::iterator it = mapAccountTally.begin(); it != mapAccountTally.end(); ++it)
-        {
-            int64 nAmount = (*it).second.nAmount;
-            int nConf = (*it).second.nConf;
-            Object obj;
-            obj.push_back(Pair("account",       (*it).first));
-            obj.push_back(Pair("label",         (*it).first)); // deprecated
-            obj.push_back(Pair("amount",        ValueFromAmount(nAmount)));
-            obj.push_back(Pair("confirmations", (nConf == INT_MAX ? 0 : nConf)));
-            ret.push_back(obj);
-        }
-    }
-
-    return ret;
-}
-
-Value listreceivedbyaddress(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() > 2)
-        throw runtime_error(
-            "listreceivedbyaddress [minconf=1] [includeempty=false]\n"
-            "[minconf] is the minimum number of confirmations before payments are included.\n"
-            "[includeempty] whether to include addresses that haven't received any payments.\n"
-            "Returns an array of objects containing:\n"
-            "  \"address\" : receiving address\n"
-            "  \"account\" : the account of the receiving address\n"
-            "  \"amount\" : total amount received by the address\n"
-            "  \"confirmations\" : number of confirmations of the most recent transaction included");
-
-    return ListReceived(params, false);
-}
-
-Value listreceivedbyaccount(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() > 2)
-        throw runtime_error(
-            "listreceivedbyaccount [minconf=1] [includeempty=false]\n"
-            "[minconf] is the minimum number of confirmations before payments are included.\n"
-            "[includeempty] whether to include accounts that haven't received any payments.\n"
-            "Returns an array of objects containing:\n"
-            "  \"account\" : the account of the receiving addresses\n"
-            "  \"amount\" : total amount received by addresses with this account\n"
-            "  \"confirmations\" : number of confirmations of the most recent transaction included");
-
-    return ListReceived(params, true);
-}
-
-void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDepth, bool fLong, Array& ret)
-{
-    int64 nGeneratedImmature, nGeneratedMature, nFee;
-    string strSentAccount;
-    list<pair<CBitcoinAddress, int64> > listReceived;
-    list<pair<CBitcoinAddress, int64> > listSent;
-    wtx.GetAmounts(nGeneratedImmature, nGeneratedMature, listReceived, listSent, nFee, strSentAccount);
-
-    bool fAllAccounts = (strAccount == string("*"));
-
-    // Generated blocks assigned to account ""
-    if ((nGeneratedMature+nGeneratedImmature) != 0 && (fAllAccounts || strAccount == ""))
-    {
-        Object entry;
-        entry.push_back(Pair("account", string("")));
-        if (nGeneratedImmature)
-        {
-            entry.push_back(Pair("category", wtx.GetDepthInMainChain() ? "immature" : "orphan"));
-            entry.push_back(Pair("amount", ValueFromAmount(nGeneratedImmature)));
-        }
-        else
-        {
-            entry.push_back(Pair("category", "generate"));
-            entry.push_back(Pair("amount", ValueFromAmount(nGeneratedMature)));
-        }
-        if (fLong)
-            WalletTxToJSON(wtx, entry);
-        ret.push_back(entry);
-    }
-
-    // Sent
-    if ((!listSent.empty() || nFee != 0) && (fAllAccounts || strAccount == strSentAccount))
-    {
-        BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64)& s, listSent)
-        {
-            Object entry;
-            entry.push_back(Pair("account", strSentAccount));
-            entry.push_back(Pair("address", s.first.ToString()));
-            entry.push_back(Pair("category", "send"));
-            entry.push_back(Pair("amount", ValueFromAmount(-s.second)));
-            entry.push_back(Pair("fee", ValueFromAmount(-nFee)));
-            if (fLong)
-                WalletTxToJSON(wtx, entry);
-            ret.push_back(entry);
-        }
-    }
-
-    // Received
-    if (listReceived.size() > 0 && wtx.GetDepthInMainChain() >= nMinDepth)
-        BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64)& r, listReceived)
-        {
-            string account;
-            if (pwalletMain->mapAddressBook.count(r.first))
-                account = pwalletMain->mapAddressBook[r.first];
-            if (fAllAccounts || (account == strAccount))
-            {
-                Object entry;
-                entry.push_back(Pair("account", account));
-                entry.push_back(Pair("address", r.first.ToString()));
-                entry.push_back(Pair("category", "receive"));
-                entry.push_back(Pair("amount", ValueFromAmount(r.second)));
-                if (fLong)
-                    WalletTxToJSON(wtx, entry);
-                ret.push_back(entry);
-            }
-        }
-}
-
-void AcentryToJSON(const CAccountingEntry& acentry, const string& strAccount, Array& ret)
-{
-    bool fAllAccounts = (strAccount == string("*"));
-
-    if (fAllAccounts || acentry.strAccount == strAccount)
-    {
-        Object entry;
-        entry.push_back(Pair("account", acentry.strAccount));
-        entry.push_back(Pair("category", "move"));
-        entry.push_back(Pair("time", (boost::int64_t)acentry.nTime));
-        entry.push_back(Pair("amount", ValueFromAmount(acentry.nCreditDebit)));
-        entry.push_back(Pair("otheraccount", acentry.strOtherAccount));
-        entry.push_back(Pair("comment", acentry.strComment));
-        ret.push_back(entry);
-    }
-}
-
-Value listtransactions(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() > 3)
-        throw runtime_error(
-            "listtransactions [account] [count=10] [from=0]\n"
-            "Returns up to [count] most recent transactions skipping the first [from] transactions for account [account].");
-
-    string strAccount = "*";
-    if (params.size() > 0)
-        strAccount = params[0].get_str();
-    int nCount = 10;
-    if (params.size() > 1)
-        nCount = params[1].get_int();
-    int nFrom = 0;
-    if (params.size() > 2)
-        nFrom = params[2].get_int();
-
-    Array ret;
-    CWalletDB walletdb(pwalletMain->strWalletFile);
-
-    // Firs: get all CWalletTx and CAccountingEntry into a sorted-by-time multimap:
-    typedef pair<CWalletTx*, CAccountingEntry*> TxPair;
-    typedef multimap<int64, TxPair > TxItems;
-    TxItems txByTime;
-
-    for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
-    {
-        CWalletTx* wtx = &((*it).second);
-        txByTime.insert(make_pair(wtx->GetTxTime(), TxPair(wtx, (CAccountingEntry*)0)));
-    }
-    list<CAccountingEntry> acentries;
-    walletdb.ListAccountCreditDebit(strAccount, acentries);
-    BOOST_FOREACH(CAccountingEntry& entry, acentries)
-    {
-        txByTime.insert(make_pair(entry.nTime, TxPair((CWalletTx*)0, &entry)));
-    }
-
-    // Now: iterate backwards until we have nCount items to return:
-    TxItems::reverse_iterator it = txByTime.rbegin();
-    if (txByTime.size() > nFrom) std::advance(it, nFrom);
-    for (; it != txByTime.rend(); ++it)
-    {
-        CWalletTx *const pwtx = (*it).second.first;
-        if (pwtx != 0)
-            ListTransactions(*pwtx, strAccount, 0, true, ret);
-        CAccountingEntry *const pacentry = (*it).second.second;
-        if (pacentry != 0)
-            AcentryToJSON(*pacentry, strAccount, ret);
-
-        if (ret.size() >= nCount) break;
-    }
-    // ret is now newest to oldest
-    
-    // Make sure we return only last nCount items (sends-to-self might give us an extra):
-    if (ret.size() > nCount)
-    {
-        Array::iterator last = ret.begin();
-        std::advance(last, nCount);
-        ret.erase(last, ret.end());
-    }
-    std::reverse(ret.begin(), ret.end()); // oldest to newest
-
-    return ret;
-}
-
-Value listaccounts(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() > 1)
-        throw runtime_error(
-            "listaccounts [minconf=1]\n"
-            "Returns Object that has account names as keys, account balances as values.");
-
-    int nMinDepth = 1;
-    if (params.size() > 0)
-        nMinDepth = params[0].get_int();
-
-    map<string, int64> mapAccountBalances;
-    BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, string)& entry, pwalletMain->mapAddressBook) {
-        if (pwalletMain->HaveKey(entry.first)) // This address belongs to me
-            mapAccountBalances[entry.second] = 0;
-    }
-
-    for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
-    {
-        const CWalletTx& wtx = (*it).second;
-        int64 nGeneratedImmature, nGeneratedMature, nFee;
-        string strSentAccount;
-        list<pair<CBitcoinAddress, int64> > listReceived;
-        list<pair<CBitcoinAddress, int64> > listSent;
-        wtx.GetAmounts(nGeneratedImmature, nGeneratedMature, listReceived, listSent, nFee, strSentAccount);
-        mapAccountBalances[strSentAccount] -= nFee;
-        BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64)& s, listSent)
-            mapAccountBalances[strSentAccount] -= s.second;
-        if (wtx.GetDepthInMainChain() >= nMinDepth)
-        {
-            mapAccountBalances[""] += nGeneratedMature;
-            BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64)& r, listReceived)
-                if (pwalletMain->mapAddressBook.count(r.first))
-                    mapAccountBalances[pwalletMain->mapAddressBook[r.first]] += r.second;
-                else
-                    mapAccountBalances[""] += r.second;
-        }
-    }
-
-    list<CAccountingEntry> acentries;
-    CWalletDB(pwalletMain->strWalletFile).ListAccountCreditDebit("*", acentries);
-    BOOST_FOREACH(const CAccountingEntry& entry, acentries)
-        mapAccountBalances[entry.strAccount] += entry.nCreditDebit;
-
-    Object ret;
-    BOOST_FOREACH(const PAIRTYPE(string, int64)& accountBalance, mapAccountBalances) {
-        ret.push_back(Pair(accountBalance.first, ValueFromAmount(accountBalance.second)));
-    }
-    return ret;
-}
-
-Value gettransaction(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() != 1)
-        throw runtime_error(
-            "gettransaction <txid>\n"
-            "Get detailed information about <txid>");
-
-    uint256 hash;
-    hash.SetHex(params[0].get_str());
-
-    Object entry;
-
-    if (!pwalletMain->mapWallet.count(hash))
-        throw JSONRPCError(-5, "Invalid or non-wallet transaction id");
-    const CWalletTx& wtx = pwalletMain->mapWallet[hash];
-
-    int64 nCredit = wtx.GetCredit();
-    int64 nDebit = wtx.GetDebit();
-    int64 nNet = nCredit - nDebit;
-    int64 nFee = (wtx.IsFromMe() ? wtx.GetValueOut() - nDebit : 0);
-
-    entry.push_back(Pair("amount", ValueFromAmount(nNet - nFee)));
-    if (wtx.IsFromMe())
-        entry.push_back(Pair("fee", ValueFromAmount(nFee)));
-
-    WalletTxToJSON(pwalletMain->mapWallet[hash], entry);
-
-    Array details;
-    ListTransactions(pwalletMain->mapWallet[hash], "*", 0, false, details);
-    entry.push_back(Pair("details", details));
-
-    return entry;
-}
-
-
-Value backupwallet(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() != 1)
-        throw runtime_error(
-            "backupwallet <destination>\n"
-            "Safely copies wallet.dat to destination, which can be a directory or a path with filename.");
-
-    string strDest = params[0].get_str();
-    BackupWallet(*pwalletMain, strDest);
-
-    return Value::null;
-}
-
-
-Value keypoolrefill(const Array& params, bool fHelp)
-{
-    if (pwalletMain->IsCrypted() && (fHelp || params.size() > 0))
-        throw runtime_error(
-            "keypoolrefill\n"
-            "Fills the keypool, requires wallet passphrase to be set.");
-    if (!pwalletMain->IsCrypted() && (fHelp || params.size() > 0))
-        throw runtime_error(
-            "keypoolrefill\n"
-            "Fills the keypool.");
-
-    if (pwalletMain->IsLocked())
-        throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.");
-
-    pwalletMain->TopUpKeyPool();
-
-    if (pwalletMain->GetKeyPoolSize() < GetArg("-keypool", 100))
-        throw JSONRPCError(-4, "Error refreshing keypool.");
-
-    return Value::null;
-}
-
-
-void ThreadTopUpKeyPool(void* parg)
-{
-    pwalletMain->TopUpKeyPool();
-}
-
-void ThreadCleanWalletPassphrase(void* parg)
-{
-    int64 nMyWakeTime = GetTime() + *((int*)parg);
-
-    if (nWalletUnlockTime == 0)
-    {
-        CRITICAL_BLOCK(cs_nWalletUnlockTime)
-        {
-            nWalletUnlockTime = nMyWakeTime;
-        }
-
-        while (GetTime() < nWalletUnlockTime)
-            Sleep(GetTime() - nWalletUnlockTime);
-
-        CRITICAL_BLOCK(cs_nWalletUnlockTime)
-        {
-            nWalletUnlockTime = 0;
-        }
-    }
-    else
-    {
-        CRITICAL_BLOCK(cs_nWalletUnlockTime)
-        {
-            if (nWalletUnlockTime < nMyWakeTime)
-                nWalletUnlockTime = nMyWakeTime;
-        }
-        free(parg);
-        return;
-    }
-
-    pwalletMain->Lock();
-
-    delete (int*)parg;
-}
-
-Value walletpassphrase(const Array& params, bool fHelp)
-{
-    if (pwalletMain->IsCrypted() && (fHelp || params.size() != 2))
-        throw runtime_error(
-            "walletpassphrase <passphrase> <timeout>\n"
-            "Stores the wallet decryption key in memory for <timeout> seconds.");
-    if (fHelp)
-        return true;
-    if (!pwalletMain->IsCrypted())
-        throw JSONRPCError(-15, "Error: running with an unencrypted wallet, but walletpassphrase was called.");
-
-    if (!pwalletMain->IsLocked())
-        throw JSONRPCError(-17, "Error: Wallet is already unlocked.");
-
-    // Note that the walletpassphrase is stored in params[0] which is not mlock()ed
-    string strWalletPass;
-    strWalletPass.reserve(100);
-    mlock(&strWalletPass[0], strWalletPass.capacity());
-    strWalletPass = params[0].get_str();
-
-    if (strWalletPass.length() > 0)
-    {
-        if (!pwalletMain->Unlock(strWalletPass))
-        {
-            fill(strWalletPass.begin(), strWalletPass.end(), '\0');
-            munlock(&strWalletPass[0], strWalletPass.capacity());
-            throw JSONRPCError(-14, "Error: The wallet passphrase entered was incorrect.");
-        }
-        fill(strWalletPass.begin(), strWalletPass.end(), '\0');
-        munlock(&strWalletPass[0], strWalletPass.capacity());
-    }
-    else
-        throw runtime_error(
-            "walletpassphrase <passphrase> <timeout>\n"
-            "Stores the wallet decryption key in memory for <timeout> seconds.");
-
-    CreateThread(ThreadTopUpKeyPool, NULL);
-    int* pnSleepTime = new int(params[1].get_int());
-    CreateThread(ThreadCleanWalletPassphrase, pnSleepTime);
-
-    return Value::null;
-}
-
-
-Value walletpassphrasechange(const Array& params, bool fHelp)
-{
-    if (pwalletMain->IsCrypted() && (fHelp || params.size() != 2))
-        throw runtime_error(
-            "walletpassphrasechange <oldpassphrase> <newpassphrase>\n"
-            "Changes the wallet passphrase from <oldpassphrase> to <newpassphrase>.");
-    if (fHelp)
-        return true;
-    if (!pwalletMain->IsCrypted())
-        throw JSONRPCError(-15, "Error: running with an unencrypted wallet, but walletpassphrasechange was called.");
-
-    string strOldWalletPass;
-    strOldWalletPass.reserve(100);
-    mlock(&strOldWalletPass[0], strOldWalletPass.capacity());
-    strOldWalletPass = params[0].get_str();
-
-    string strNewWalletPass;
-    strNewWalletPass.reserve(100);
-    mlock(&strNewWalletPass[0], strNewWalletPass.capacity());
-    strNewWalletPass = params[1].get_str();
-
-    if (strOldWalletPass.length() < 1 || strNewWalletPass.length() < 1)
-        throw runtime_error(
-            "walletpassphrasechange <oldpassphrase> <newpassphrase>\n"
-            "Changes the wallet passphrase from <oldpassphrase> to <newpassphrase>.");
-
-    if (!pwalletMain->ChangeWalletPassphrase(strOldWalletPass, strNewWalletPass))
-    {
-        fill(strOldWalletPass.begin(), strOldWalletPass.end(), '\0');
-        fill(strNewWalletPass.begin(), strNewWalletPass.end(), '\0');
-        munlock(&strOldWalletPass[0], strOldWalletPass.capacity());
-        munlock(&strNewWalletPass[0], strNewWalletPass.capacity());
-        throw JSONRPCError(-14, "Error: The wallet passphrase entered was incorrect.");
-    }
-    fill(strNewWalletPass.begin(), strNewWalletPass.end(), '\0');
-    fill(strOldWalletPass.begin(), strOldWalletPass.end(), '\0');
-    munlock(&strOldWalletPass[0], strOldWalletPass.capacity());
-    munlock(&strNewWalletPass[0], strNewWalletPass.capacity());
-
-    return Value::null;
-}
-
-
-Value walletlock(const Array& params, bool fHelp)
-{
-    if (pwalletMain->IsCrypted() && (fHelp || params.size() != 0))
-        throw runtime_error(
-            "walletlock\n"
-            "Removes the wallet encryption key from memory, locking the wallet.\n"
-            "After calling this method, you will need to call walletpassphrase again\n"
-            "before being able to call any methods which require the wallet to be unlocked.");
-    if (fHelp)
-        return true;
-    if (!pwalletMain->IsCrypted())
-        throw JSONRPCError(-15, "Error: running with an unencrypted wallet, but walletlock was called.");
-
-    pwalletMain->Lock();
-    CRITICAL_BLOCK(cs_nWalletUnlockTime)
-    {
-        nWalletUnlockTime = 0;
-    }
-
-    return Value::null;
-}
-
-
-Value encryptwallet(const Array& params, bool fHelp)
-{
-    if (!pwalletMain->IsCrypted() && (fHelp || params.size() != 1))
-        throw runtime_error(
-            "encryptwallet <passphrase>\n"
-            "Encrypts the wallet with <passphrase>.");
-    if (fHelp)
-        return true;
-    if (pwalletMain->IsCrypted())
-        throw JSONRPCError(-15, "Error: running with an encrypted wallet, but encryptwallet was called.");
-
-    string strWalletPass;
-    strWalletPass.reserve(100);
-    mlock(&strWalletPass[0], strWalletPass.capacity());
-    strWalletPass = params[0].get_str();
-
-    if (strWalletPass.length() < 1)
-        throw runtime_error(
-            "encryptwallet <passphrase>\n"
-            "Encrypts the wallet with <passphrase>.");
-
-    if (!pwalletMain->EncryptWallet(strWalletPass))
-    {
-        fill(strWalletPass.begin(), strWalletPass.end(), '\0');
-        munlock(&strWalletPass[0], strWalletPass.capacity());
-        throw JSONRPCError(-16, "Error: Failed to encrypt the wallet.");
-    }
-    fill(strWalletPass.begin(), strWalletPass.end(), '\0');
-    munlock(&strWalletPass[0], strWalletPass.capacity());
-
-    return Value::null;
-}
-
-
-Value validateaddress(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() != 1)
-        throw runtime_error(
-            "validateaddress <bitcoinaddress>\n"
-            "Return information about <bitcoinaddress>.");
-
-    CBitcoinAddress address(params[0].get_str());
-    bool isValid = address.IsValid();
-
-    Object ret;
-    ret.push_back(Pair("isvalid", isValid));
-    if (isValid)
-    {
-        // Call Hash160ToAddress() so we always return current ADDRESSVERSION
-        // version of the address:
-        string currentAddress = address.ToString();
-        ret.push_back(Pair("address", currentAddress));
-        ret.push_back(Pair("ismine", (pwalletMain->HaveKey(address) > 0)));
-        if (pwalletMain->mapAddressBook.count(address))
-            ret.push_back(Pair("account", pwalletMain->mapAddressBook[address]));
-    }
-    return ret;
-}
-
-
-Value getwork(const Array& params, bool fHelp)
-{
-    if (fHelp || params.size() > 1)
-        throw runtime_error(
-            "getwork [data]\n"
-            "If [data] is not specified, returns formatted hash data to work on:\n"
-            "  \"midstate\" : precomputed hash state after hashing the first half of the data\n"
-            "  \"data\" : block data\n"
-            "  \"hash1\" : formatted hash buffer for second hash\n"
-            "  \"target\" : little endian hash target\n"
-            "If [data] is specified, tries to solve the block and returns true if it was successful.");
-
-    if (vNodes.empty())
-        throw JSONRPCError(-9, "Bitcoin is not connected!");
-
-    if (IsInitialBlockDownload())
-        throw JSONRPCError(-10, "Bitcoin is downloading blocks...");
-
-    typedef map<uint256, pair<CBlock*, CScript> > mapNewBlock_t;
-    static mapNewBlock_t mapNewBlock;
-    static vector<CBlock*> vNewBlock;
-    static CReserveKey reservekey(pwalletMain);
-
-    if (params.size() == 0)
-    {
-        // Update block
-        static unsigned int nTransactionsUpdatedLast;
-        static CBlockIndex* pindexPrev;
-        static int64 nStart;
-        static CBlock* pblock;
-        if (pindexPrev != pindexBest ||
-            (nTransactionsUpdated != nTransactionsUpdatedLast && GetTime() - nStart > 60))
-        {
-            if (pindexPrev != pindexBest)
-            {
-                // Deallocate old blocks since they're obsolete now
-                mapNewBlock.clear();
-                BOOST_FOREACH(CBlock* pblock, vNewBlock)
-                    delete pblock;
-                vNewBlock.clear();
-            }
-            nTransactionsUpdatedLast = nTransactionsUpdated;
-            pindexPrev = pindexBest;
-            nStart = GetTime();
-
-            // Create new block
-            pblock = CreateNewBlock(reservekey);
-            if (!pblock)
-                throw JSONRPCError(-7, "Out of memory");
-            vNewBlock.push_back(pblock);
-        }
-
-        // Update nTime
-        pblock->nTime = max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime());
-        pblock->nNonce = 0;
-
-        // Update nExtraNonce
-        static unsigned int nExtraNonce = 0;
-        IncrementExtraNonce(pblock, pindexPrev, nExtraNonce);
-
-        // Save
-        mapNewBlock[pblock->hashMerkleRoot] = make_pair(pblock, pblock->vtx[0].vin[0].scriptSig);
-
-        // Prebuild hash buffers
-        char pmidstate[32];
-        char pdata[128];
-        char phash1[64];
-        FormatHashBuffers(pblock, pmidstate, pdata, phash1);
-
-        uint256 hashTarget = CBigNum().SetCompact(pblock->nBits).getuint256();
-
-        Object result;
-        result.push_back(Pair("midstate", HexStr(BEGIN(pmidstate), END(pmidstate))));
-        result.push_back(Pair("data",     HexStr(BEGIN(pdata), END(pdata))));
-        result.push_back(Pair("hash1",    HexStr(BEGIN(phash1), END(phash1))));
-        result.push_back(Pair("target",   HexStr(BEGIN(hashTarget), END(hashTarget))));
-        return result;
-    }
-    else
-    {
-        // Parse parameters
-        vector<unsigned char> vchData = ParseHex(params[0].get_str());
-        if (vchData.size() != 128)
-            throw JSONRPCError(-8, "Invalid parameter");
-        CBlock* pdata = (CBlock*)&vchData[0];
-
-        // Byte reverse
-        for (int i = 0; i < 128/4; i++)
-            ((unsigned int*)pdata)[i] = CryptoPP::ByteReverse(((unsigned int*)pdata)[i]);
-
-        // Get saved block
-        if (!mapNewBlock.count(pdata->hashMerkleRoot))
-            return false;
-        CBlock* pblock = mapNewBlock[pdata->hashMerkleRoot].first;
-
-        pblock->nTime = pdata->nTime;
-        pblock->nNonce = pdata->nNonce;
-        pblock->vtx[0].vin[0].scriptSig = mapNewBlock[pdata->hashMerkleRoot].second;
-        pblock->hashMerkleRoot = pblock->BuildMerkleTree();
-
-        return CheckWork(pblock, *pwalletMain, reservekey);
-    }
-}
-
-
-
-
-
-
-
-
-
-
-
-//
-// Call Table
-//
-
-pair<string, rpcfn_type> pCallTable[] =
-{
-    make_pair("help",                   &help),
-    make_pair("stop",                   &stop),
-    make_pair("getblockcount",          &getblockcount),
-    make_pair("getblocknumber",         &getblocknumber),
-    make_pair("getconnectioncount",     &getconnectioncount),
-    make_pair("getdifficulty",          &getdifficulty),
-    make_pair("getgenerate",            &getgenerate),
-    make_pair("setgenerate",            &setgenerate),
-    make_pair("gethashespersec",        &gethashespersec),
-    make_pair("getinfo",                &getinfo),
-    make_pair("getnewaddress",          &getnewaddress),
-    make_pair("getaccountaddress",      &getaccountaddress),
-    make_pair("setaccount",             &setaccount),
-    make_pair("setlabel",               &setaccount), // deprecated
-    make_pair("getaccount",             &getaccount),
-    make_pair("getlabel",               &getaccount), // deprecated
-    make_pair("getaddressesbyaccount",  &getaddressesbyaccount),
-    make_pair("getaddressesbylabel",    &getaddressesbyaccount), // deprecated
-    make_pair("sendtoaddress",          &sendtoaddress),
-    make_pair("getamountreceived",      &getreceivedbyaddress), // deprecated, renamed to getreceivedbyaddress
-    make_pair("getallreceived",         &listreceivedbyaddress), // deprecated, renamed to listreceivedbyaddress
-    make_pair("getreceivedbyaddress",   &getreceivedbyaddress),
-    make_pair("getreceivedbyaccount",   &getreceivedbyaccount),
-    make_pair("getreceivedbylabel",     &getreceivedbyaccount), // deprecated
-    make_pair("listreceivedbyaddress",  &listreceivedbyaddress),
-    make_pair("listreceivedbyaccount",  &listreceivedbyaccount),
-    make_pair("listreceivedbylabel",    &listreceivedbyaccount), // deprecated
-    make_pair("backupwallet",           &backupwallet),
-    make_pair("keypoolrefill",          &keypoolrefill),
-    make_pair("walletpassphrase",       &walletpassphrase),
-    make_pair("walletpassphrasechange", &walletpassphrasechange),
-    make_pair("walletlock",             &walletlock),
-    make_pair("encryptwallet",          &encryptwallet),
-    make_pair("validateaddress",        &validateaddress),
-    make_pair("getbalance",             &getbalance),
-    make_pair("move",                   &movecmd),
-    make_pair("sendfrom",               &sendfrom),
-    make_pair("sendmany",               &sendmany),
-    make_pair("gettransaction",         &gettransaction),
-    make_pair("listtransactions",       &listtransactions),
-    make_pair("getwork",                &getwork),
-    make_pair("listaccounts",           &listaccounts),
-    make_pair("settxfee",               &settxfee),
-};
-map<string, rpcfn_type> mapCallTable(pCallTable, pCallTable + sizeof(pCallTable)/sizeof(pCallTable[0]));
-
-string pAllowInSafeMode[] =
-{
-    "help",
-    "stop",
-    "getblockcount",
-    "getblocknumber",
-    "getconnectioncount",
-    "getdifficulty",
-    "getgenerate",
-    "setgenerate",
-    "gethashespersec",
-    "getinfo",
-    "getnewaddress",
-    "getaccountaddress",
-    "setlabel", // deprecated
-    "getaccount",
-    "getlabel", // deprecated
-    "getaddressesbyaccount",
-    "getaddressesbylabel", // deprecated
-    "backupwallet",
-    "keypoolrefill",
-    "walletpassphrase",
-    "walletlock",
-    "validateaddress",
-    "getwork",
-};
-set<string> setAllowInSafeMode(pAllowInSafeMode, pAllowInSafeMode + sizeof(pAllowInSafeMode)/sizeof(pAllowInSafeMode[0]));
-
-
-
-
-//
-// HTTP protocol
-//
-// This ain't Apache.  We're just using HTTP header for the length field
-// and to be compatible with other JSON-RPC implementations.
-//
-
-string HTTPPost(const string& strMsg, const map<string,string>& mapRequestHeaders)
-{
-    ostringstream s;
-    s << "POST / HTTP/1.1\r\n"
-      << "User-Agent: bitcoin-json-rpc/" << FormatFullVersion() << "\r\n"
-      << "Host: 127.0.0.1\r\n"
-      << "Content-Type: application/json\r\n"
-      << "Content-Length: " << strMsg.size() << "\r\n"
-      << "Accept: application/json\r\n";
-    BOOST_FOREACH(const PAIRTYPE(string, string)& item, mapRequestHeaders)
-        s << item.first << ": " << item.second << "\r\n";
-    s << "\r\n" << strMsg;
-
-    return s.str();
-}
-
-string rfc1123Time()
-{
-    char buffer[64];
-    time_t now;
-    time(&now);
-    struct tm* now_gmt = gmtime(&now);
-    string locale(setlocale(LC_TIME, NULL));
-    setlocale(LC_TIME, "C"); // we want posix (aka "C") weekday/month strings
-    strftime(buffer, sizeof(buffer), "%a, %d %b %Y %H:%M:%S +0000", now_gmt);
-    setlocale(LC_TIME, locale.c_str());
-    return string(buffer);
-}
-
-static string HTTPReply(int nStatus, const string& strMsg)
-{
-    if (nStatus == 401)
-        return strprintf("HTTP/1.0 401 Authorization Required\r\n"
-            "Date: %s\r\n"
-            "Server: bitcoin-json-rpc/%s\r\n"
-            "WWW-Authenticate: Basic realm=\"jsonrpc\"\r\n"
-            "Content-Type: text/html\r\n"
-            "Content-Length: 296\r\n"
-            "\r\n"
-            "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\r\n"
-            "\"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd\">\r\n"
-            "<HTML>\r\n"
-            "<HEAD>\r\n"
-            "<TITLE>Error</TITLE>\r\n"
-            "<META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=ISO-8859-1'>\r\n"
-            "</HEAD>\r\n"
-            "<BODY><H1>401 Unauthorized.</H1></BODY>\r\n"
-            "</HTML>\r\n", rfc1123Time().c_str(), FormatFullVersion().c_str());
-    string strStatus;
-         if (nStatus == 200) strStatus = "OK";
-    else if (nStatus == 400) strStatus = "Bad Request";
-    else if (nStatus == 403) strStatus = "Forbidden";
-    else if (nStatus == 404) strStatus = "Not Found";
-    else if (nStatus == 500) strStatus = "Internal Server Error";
-    return strprintf(
-            "HTTP/1.1 %d %s\r\n"
-            "Date: %s\r\n"
-            "Connection: close\r\n"
-            "Content-Length: %d\r\n"
-            "Content-Type: application/json\r\n"
-            "Server: bitcoin-json-rpc/%s\r\n"
-            "\r\n"
-            "%s",
-        nStatus,
-        strStatus.c_str(),
-        rfc1123Time().c_str(),
-        strMsg.size(),
-        FormatFullVersion().c_str(),
-        strMsg.c_str());
-}
-
-int ReadHTTPStatus(std::basic_istream<char>& stream)
-{
-    string str;
-    getline(stream, str);
-    vector<string> vWords;
-    boost::split(vWords, str, boost::is_any_of(" "));
-    if (vWords.size() < 2)
-        return 500;
-    return atoi(vWords[1].c_str());
-}
-
-int ReadHTTPHeader(std::basic_istream<char>& stream, map<string, string>& mapHeadersRet)
-{
-    int nLen = 0;
-    loop
-    {
-        string str;
-        std::getline(stream, str);
-        if (str.empty() || str == "\r")
-            break;
-        string::size_type nColon = str.find(":");
-        if (nColon != string::npos)
-        {
-            string strHeader = str.substr(0, nColon);
-            boost::trim(strHeader);
-            boost::to_lower(strHeader);
-            string strValue = str.substr(nColon+1);
-            boost::trim(strValue);
-            mapHeadersRet[strHeader] = strValue;
-            if (strHeader == "content-length")
-                nLen = atoi(strValue.c_str());
-        }
-    }
-    return nLen;
-}
-
-int ReadHTTP(std::basic_istream<char>& stream, map<string, string>& mapHeadersRet, string& strMessageRet)
-{
-    mapHeadersRet.clear();
-    strMessageRet = "";
-
-    // Read status
-    int nStatus = ReadHTTPStatus(stream);
-
-    // Read header
-    int nLen = ReadHTTPHeader(stream, mapHeadersRet);
-    if (nLen < 0 || nLen > MAX_SIZE)
-        return 500;
-
-    // Read message
-    if (nLen > 0)
-    {
-        vector<char> vch(nLen);
-        stream.read(&vch[0], nLen);
-        strMessageRet = string(vch.begin(), vch.end());
-    }
-
-    return nStatus;
-}
-
-string EncodeBase64(string s)
-{
-    BIO *b64, *bmem;
-    BUF_MEM *bptr;
-
-    b64 = BIO_new(BIO_f_base64());
-    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
-    bmem = BIO_new(BIO_s_mem());
-    b64 = BIO_push(b64, bmem);
-    BIO_write(b64, s.c_str(), s.size());
-    BIO_flush(b64);
-    BIO_get_mem_ptr(b64, &bptr);
-
-    string result(bptr->data, bptr->length);
-    BIO_free_all(b64);
-
-    return result;
-}
-
-string DecodeBase64(string s)
-{
-    BIO *b64, *bmem;
-
-    char* buffer = static_cast<char*>(calloc(s.size(), sizeof(char)));
-
-    b64 = BIO_new(BIO_f_base64());
-    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
-    bmem = BIO_new_mem_buf(const_cast<char*>(s.c_str()), s.size());
-    bmem = BIO_push(b64, bmem);
-    BIO_read(bmem, buffer, s.size());
-    BIO_free_all(bmem);
-
-    string result(buffer);
-    free(buffer);
-    return result;
-}
-
-bool HTTPAuthorized(map<string, string>& mapHeaders)
-{
-    string strAuth = mapHeaders["authorization"];
-    if (strAuth.substr(0,6) != "Basic ")
-        return false;
-    string strUserPass64 = strAuth.substr(6); boost::trim(strUserPass64);
-    string strUserPass = DecodeBase64(strUserPass64);
-    string::size_type nColon = strUserPass.find(":");
-    if (nColon == string::npos)
-        return false;
-    string strUser = strUserPass.substr(0, nColon);
-    string strPassword = strUserPass.substr(nColon+1);
-    return (strUser == mapArgs["-rpcuser"] && strPassword == mapArgs["-rpcpassword"]);
-}
-
-//
-// JSON-RPC protocol.  Bitcoin speaks version 1.0 for maximum compatibility,
-// but uses JSON-RPC 1.1/2.0 standards for parts of the 1.0 standard that were
-// unspecified (HTTP errors and contents of 'error').
-//
-// 1.0 spec: http://json-rpc.org/wiki/specification
-// 1.2 spec: http://groups.google.com/group/json-rpc/web/json-rpc-over-http
-// http://www.codeproject.com/KB/recipes/JSON_Spirit.aspx
-//
-
-string JSONRPCRequest(const string& strMethod, const Array& params, const Value& id)
-{
-    Object request;
-    request.push_back(Pair("method", strMethod));
-    request.push_back(Pair("params", params));
-    request.push_back(Pair("id", id));
-    return write_string(Value(request), false) + "\n";
-}
-
-string JSONRPCReply(const Value& result, const Value& error, const Value& id)
-{
-    Object reply;
-    if (error.type() != null_type)
-        reply.push_back(Pair("result", Value::null));
-    else
-        reply.push_back(Pair("result", result));
-    reply.push_back(Pair("error", error));
-    reply.push_back(Pair("id", id));
-    return write_string(Value(reply), false) + "\n";
-}
-
-void ErrorReply(std::ostream& stream, const Object& objError, const Value& id)
-{
-    // Send error reply from json-rpc error object
-    int nStatus = 500;
-    int code = find_value(objError, "code").get_int();
-    if (code == -32600) nStatus = 400;
-    else if (code == -32601) nStatus = 404;
-    string strReply = JSONRPCReply(Value::null, objError, id);
-    stream << HTTPReply(nStatus, strReply) << std::flush;
-}
-
-bool ClientAllowed(const string& strAddress)
-{
-    if (strAddress == asio::ip::address_v4::loopback().to_string())
-        return true;
-    const vector<string>& vAllow = mapMultiArgs["-rpcallowip"];
-    BOOST_FOREACH(string strAllow, vAllow)
-        if (WildcardMatch(strAddress, strAllow))
-            return true;
-    return false;
-}
-
-#ifdef USE_SSL
-//
-// IOStream device that speaks SSL but can also speak non-SSL
-//
-class SSLIOStreamDevice : public iostreams::device<iostreams::bidirectional> {
-public:
-    SSLIOStreamDevice(SSLStream &streamIn, bool fUseSSLIn) : stream(streamIn)
-    {
-        fUseSSL = fUseSSLIn;
-        fNeedHandshake = fUseSSLIn;
-    }
-
-    void handshake(ssl::stream_base::handshake_type role)
-    {
-        if (!fNeedHandshake) return;
-        fNeedHandshake = false;
-        stream.handshake(role);
-    }
-    std::streamsize read(char* s, std::streamsize n)
-    {
-        handshake(ssl::stream_base::server); // HTTPS servers read first
-        if (fUseSSL) return stream.read_some(asio::buffer(s, n));
-        return stream.next_layer().read_some(asio::buffer(s, n));
-    }
-    std::streamsize write(const char* s, std::streamsize n)
-    {
-        handshake(ssl::stream_base::client); // HTTPS clients write first
-        if (fUseSSL) return asio::write(stream, asio::buffer(s, n));
-        return asio::write(stream.next_layer(), asio::buffer(s, n));
-    }
-    bool connect(const std::string& server, const std::string& port)
-    {
-        ip::tcp::resolver resolver(stream.get_io_service());
-        ip::tcp::resolver::query query(server.c_str(), port.c_str());
-        ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
-        ip::tcp::resolver::iterator end;
-        boost::system::error_code error = asio::error::host_not_found;
-        while (error && endpoint_iterator != end)
-        {
-            stream.lowest_layer().close();
-            stream.lowest_layer().connect(*endpoint_iterator++, error);
-        }
-        if (error)
-            return false;
-        return true;
-    }
-
-private:
-    bool fNeedHandshake;
-    bool fUseSSL;
-    SSLStream& stream;
-};
-#endif
-
-void ThreadRPCServer(void* parg)
-{
-    IMPLEMENT_RANDOMIZE_STACK(ThreadRPCServer(parg));
-    try
-    {
-        vnThreadsRunning[4]++;
-        ThreadRPCServer2(parg);
-        vnThreadsRunning[4]--;
-    }
-    catch (std::exception& e) {
-        vnThreadsRunning[4]--;
-        PrintException(&e, "ThreadRPCServer()");
-    } catch (...) {
-        vnThreadsRunning[4]--;
-        PrintException(NULL, "ThreadRPCServer()");
-    }
-    printf("ThreadRPCServer exiting\n");
-}
-
-void ThreadRPCServer2(void* parg)
-{
-    printf("ThreadRPCServer started\n");
-
-    if (mapArgs["-rpcuser"] == "" && mapArgs["-rpcpassword"] == "")
-    {
-        string strWhatAmI = "To use bitcoind";
-        if (mapArgs.count("-server"))
-            strWhatAmI = strprintf(_("To use the %s option"), "\"-server\"");
-        else if (mapArgs.count("-daemon"))
-            strWhatAmI = strprintf(_("To use the %s option"), "\"-daemon\"");
-        PrintConsole(
-            _("Warning: %s, you must set rpcpassword=<password>\nin the configuration file: %s\n"
-              "If the file does not exist, create it with owner-readable-only file permissions.\n"),
-                strWhatAmI.c_str(),
-                GetConfigFile().c_str());
-        CreateThread(Shutdown, NULL);
-        return;
-    }
-
-    bool fUseSSL = GetBoolArg("-rpcssl");
-    asio::ip::address bindAddress = mapArgs.count("-rpcallowip") ? asio::ip::address_v4::any() : asio::ip::address_v4::loopback();
-
-    asio::io_service io_service;
-    ip::tcp::endpoint endpoint(bindAddress, GetArg("-rpcport", 8332));
-    ip::tcp::acceptor acceptor(io_service, endpoint);
-
-    acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
-
-#ifdef USE_SSL
-    ssl::context context(io_service, ssl::context::sslv23);
-    if (fUseSSL)
-    {
-        context.set_options(ssl::context::no_sslv2);
-        filesystem::path certfile = GetArg("-rpcsslcertificatechainfile", "server.cert");
-        if (!certfile.is_complete()) certfile = filesystem::path(GetDataDir()) / certfile;
-        if (filesystem::exists(certfile)) context.use_certificate_chain_file(certfile.string().c_str());
-        else printf("ThreadRPCServer ERROR: missing server certificate file %s\n", certfile.string().c_str());
-        filesystem::path pkfile = GetArg("-rpcsslprivatekeyfile", "server.pem");
-        if (!pkfile.is_complete()) pkfile = filesystem::path(GetDataDir()) / pkfile;
-        if (filesystem::exists(pkfile)) context.use_private_key_file(pkfile.string().c_str(), ssl::context::pem);
-        else printf("ThreadRPCServer ERROR: missing server private key file %s\n", pkfile.string().c_str());
-
-        string ciphers = GetArg("-rpcsslciphers",
-                                         "TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH");
-        SSL_CTX_set_cipher_list(context.impl(), ciphers.c_str());
-    }
-#else
-    if (fUseSSL)
-        throw runtime_error("-rpcssl=1, but bitcoin compiled without full openssl libraries.");
-#endif
-
-    loop
-    {
-        // Accept connection
-#ifdef USE_SSL
-        SSLStream sslStream(io_service, context);
-        SSLIOStreamDevice d(sslStream, fUseSSL);
-        iostreams::stream<SSLIOStreamDevice> stream(d);
-#else
-        ip::tcp::iostream stream;
-#endif
-
-        ip::tcp::endpoint peer;
-        vnThreadsRunning[4]--;
-#ifdef USE_SSL
-        acceptor.accept(sslStream.lowest_layer(), peer);
-#else
-        acceptor.accept(*stream.rdbuf(), peer);
-#endif
-        vnThreadsRunning[4]++;
-        if (fShutdown)
-            return;
-
-        // Restrict callers by IP
-        if (!ClientAllowed(peer.address().to_string()))
-        {
-            // Only send a 403 if we're not using SSL to prevent a DoS during the SSL handshake.
-            if (!fUseSSL)
-                stream << HTTPReply(403, "") << std::flush;
-            continue;
-        }
-
-        map<string, string> mapHeaders;
-        string strRequest;
-
-        boost::thread api_caller(ReadHTTP, boost::ref(stream), boost::ref(mapHeaders), boost::ref(strRequest));
-        if (!api_caller.timed_join(boost::posix_time::seconds(GetArg("-rpctimeout", 30))))
-        {   // Timed out:
-            acceptor.cancel();
-            printf("ThreadRPCServer ReadHTTP timeout\n");
-            continue;
-        }
-
-        // Check authorization
-        if (mapHeaders.count("authorization") == 0)
-        {
-            stream << HTTPReply(401, "") << std::flush;
-            continue;
-        }
-        if (!HTTPAuthorized(mapHeaders))
-        {
-            // Deter brute-forcing short passwords
-            if (mapArgs["-rpcpassword"].size() < 15)
-                Sleep(50);
-
-            stream << HTTPReply(401, "") << std::flush;
-            printf("ThreadRPCServer incorrect password attempt\n");
-            continue;
-        }
-
-        Value id = Value::null;
-        try
-        {
-            // Parse request
-            Value valRequest;
-            if (!read_string(strRequest, valRequest) || valRequest.type() != obj_type)
-                throw JSONRPCError(-32700, "Parse error");
-            const Object& request = valRequest.get_obj();
-
-            // Parse id now so errors from here on will have the id
-            id = find_value(request, "id");
-
-            // Parse method
-            Value valMethod = find_value(request, "method");
-            if (valMethod.type() == null_type)
-                throw JSONRPCError(-32600, "Missing method");
-            if (valMethod.type() != str_type)
-                throw JSONRPCError(-32600, "Method must be a string");
-            string strMethod = valMethod.get_str();
-            if (strMethod != "getwork")
-                printf("ThreadRPCServer method=%s\n", strMethod.c_str());
-
-            // Parse params
-            Value valParams = find_value(request, "params");
-            Array params;
-            if (valParams.type() == array_type)
-                params = valParams.get_array();
-            else if (valParams.type() == null_type)
-                params = Array();
-            else
-                throw JSONRPCError(-32600, "Params must be an array");
-
-            // Find method
-            map<string, rpcfn_type>::iterator mi = mapCallTable.find(strMethod);
-            if (mi == mapCallTable.end())
-                throw JSONRPCError(-32601, "Method not found");
-
-            // Observe safe mode
-            string strWarning = GetWarnings("rpc");
-            if (strWarning != "" && !GetBoolArg("-disablesafemode") && !setAllowInSafeMode.count(strMethod))
-                throw JSONRPCError(-2, string("Safe mode: ") + strWarning);
-
-            try
-            {
-                // Execute
-                Value result;
-                CRITICAL_BLOCK(cs_main)
-                CRITICAL_BLOCK(pwalletMain->cs_wallet)
-                    result = (*(*mi).second)(params, false);
-
-                // Send reply
-                string strReply = JSONRPCReply(result, Value::null, id);
-                stream << HTTPReply(200, strReply) << std::flush;
-            }
-            catch (std::exception& e)
-            {
-                ErrorReply(stream, JSONRPCError(-1, e.what()), id);
-            }
-        }
-        catch (Object& objError)
-        {
-            ErrorReply(stream, objError, id);
-        }
-        catch (std::exception& e)
-        {
-            ErrorReply(stream, JSONRPCError(-32700, e.what()), id);
-        }
-    }
-}
-
-
-
-
-Object CallRPC(const string& strMethod, const Array& params)
-{
-    if (mapArgs["-rpcuser"] == "" && mapArgs["-rpcpassword"] == "")
-        throw runtime_error(strprintf(
-            _("You must set rpcpassword=<password> in the configuration file:\n%s\n"
-              "If the file does not exist, create it with owner-readable-only file permissions."),
-                GetConfigFile().c_str()));
-
-    // Connect to localhost
-    bool fUseSSL = GetBoolArg("-rpcssl");
-#ifdef USE_SSL
-    asio::io_service io_service;
-    ssl::context context(io_service, ssl::context::sslv23);
-    context.set_options(ssl::context::no_sslv2);
-    SSLStream sslStream(io_service, context);
-    SSLIOStreamDevice d(sslStream, fUseSSL);
-    iostreams::stream<SSLIOStreamDevice> stream(d);
-    if (!d.connect(GetArg("-rpcconnect", "127.0.0.1"), GetArg("-rpcport", "8332")))
-        throw runtime_error("couldn't connect to server");
-#else
-    if (fUseSSL)
-        throw runtime_error("-rpcssl=1, but bitcoin compiled without full openssl libraries.");
-
-    ip::tcp::iostream stream(GetArg("-rpcconnect", "127.0.0.1"), GetArg("-rpcport", "8332"));
-    if (stream.fail())
-        throw runtime_error("couldn't connect to server");
-#endif
-
-
-    // HTTP basic authentication
-    string strUserPass64 = EncodeBase64(mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"]);
-    map<string, string> mapRequestHeaders;
-    mapRequestHeaders["Authorization"] = string("Basic ") + strUserPass64;
-
-    // Send request
-    string strRequest = JSONRPCRequest(strMethod, params, 1);
-    string strPost = HTTPPost(strRequest, mapRequestHeaders);
-    stream << strPost << std::flush;
-
-    // Receive reply
-    map<string, string> mapHeaders;
-    string strReply;
-    int nStatus = ReadHTTP(stream, mapHeaders, strReply);
-    if (nStatus == 401)
-        throw runtime_error("incorrect rpcuser or rpcpassword (authorization failed)");
-    else if (nStatus >= 400 && nStatus != 400 && nStatus != 404 && nStatus != 500)
-        throw runtime_error(strprintf("server returned HTTP error %d", nStatus));
-    else if (strReply.empty())
-        throw runtime_error("no response from server");
-
-    // Parse reply
-    Value valReply;
-    if (!read_string(strReply, valReply))
-        throw runtime_error("couldn't parse reply from server");
-    const Object& reply = valReply.get_obj();
-    if (reply.empty())
-        throw runtime_error("expected reply to have result, error and id properties");
-
-    return reply;
-}
-
-
-
-
-template<typename T>
-void ConvertTo(Value& value)
-{
-    if (value.type() == str_type)
-    {
-        // reinterpret string as unquoted json value
-        Value value2;
-        if (!read_string(value.get_str(), value2))
-            throw runtime_error("type mismatch");
-        value = value2.get_value<T>();
-    }
-    else
-    {
-        value = value.get_value<T>();
-    }
-}
-
-int CommandLineRPC(int argc, char *argv[])
-{
-    string strPrint;
-    int nRet = 0;
-    try
-    {
-        // Skip switches
-        while (argc > 1 && IsSwitchChar(argv[1][0]))
-        {
-            argc--;
-            argv++;
-        }
-
-        // Method
-        if (argc < 2)
-            throw runtime_error("too few parameters");
-        string strMethod = argv[1];
-
-        // Parameters default to strings
-        Array params;
-        for (int i = 2; i < argc; i++)
-            params.push_back(argv[i]);
-        int n = params.size();
-
-        //
-        // Special case non-string parameter types
-        //
-        if (strMethod == "setgenerate"            && n > 0) ConvertTo<bool>(params[0]);
-        if (strMethod == "setgenerate"            && n > 1) ConvertTo<boost::int64_t>(params[1]);
-        if (strMethod == "sendtoaddress"          && n > 1) ConvertTo<double>(params[1]);
-        if (strMethod == "settxfee"               && n > 0) ConvertTo<double>(params[0]);
-        if (strMethod == "getamountreceived"      && n > 1) ConvertTo<boost::int64_t>(params[1]); // deprecated
-        if (strMethod == "getreceivedbyaddress"   && n > 1) ConvertTo<boost::int64_t>(params[1]);
-        if (strMethod == "getreceivedbyaccount"   && n > 1) ConvertTo<boost::int64_t>(params[1]);
-        if (strMethod == "getreceivedbylabel"     && n > 1) ConvertTo<boost::int64_t>(params[1]); // deprecated
-        if (strMethod == "getallreceived"         && n > 0) ConvertTo<boost::int64_t>(params[0]); // deprecated
-        if (strMethod == "getallreceived"         && n > 1) ConvertTo<bool>(params[1]); // deprecated
-        if (strMethod == "listreceivedbyaddress"  && n > 0) ConvertTo<boost::int64_t>(params[0]);
-        if (strMethod == "listreceivedbyaddress"  && n > 1) ConvertTo<bool>(params[1]);
-        if (strMethod == "listreceivedbyaccount"  && n > 0) ConvertTo<boost::int64_t>(params[0]);
-        if (strMethod == "listreceivedbyaccount"  && n > 1) ConvertTo<bool>(params[1]);
-        if (strMethod == "listreceivedbylabel"    && n > 0) ConvertTo<boost::int64_t>(params[0]); // deprecated
-        if (strMethod == "listreceivedbylabel"    && n > 1) ConvertTo<bool>(params[1]); // deprecated
-        if (strMethod == "getbalance"             && n > 1) ConvertTo<boost::int64_t>(params[1]);
-        if (strMethod == "move"                   && n > 2) ConvertTo<double>(params[2]);
-        if (strMethod == "move"                   && n > 3) ConvertTo<boost::int64_t>(params[3]);
-        if (strMethod == "sendfrom"               && n > 2) ConvertTo<double>(params[2]);
-        if (strMethod == "sendfrom"               && n > 3) ConvertTo<boost::int64_t>(params[3]);
-        if (strMethod == "listtransactions"       && n > 1) ConvertTo<boost::int64_t>(params[1]);
-        if (strMethod == "listtransactions"       && n > 2) ConvertTo<boost::int64_t>(params[2]);
-        if (strMethod == "listaccounts"           && n > 0) ConvertTo<boost::int64_t>(params[0]);
-        if (strMethod == "walletpassphrase"       && n > 1) ConvertTo<boost::int64_t>(params[1]);
-        if (strMethod == "sendmany"               && n > 1)
-        {
-            string s = params[1].get_str();
-            Value v;
-            if (!read_string(s, v) || v.type() != obj_type)
-                throw runtime_error("type mismatch");
-            params[1] = v.get_obj();
-        }
-        if (strMethod == "sendmany"                && n > 2) ConvertTo<boost::int64_t>(params[2]);
-
-        // Execute
-        Object reply = CallRPC(strMethod, params);
-
-        // Parse reply
-        const Value& result = find_value(reply, "result");
-        const Value& error  = find_value(reply, "error");
-
-        if (error.type() != null_type)
-        {
-            // Error
-            strPrint = "error: " + write_string(error, false);
-            int code = find_value(error.get_obj(), "code").get_int();
-            nRet = abs(code);
-        }
-        else
-        {
-            // Result
-            if (result.type() == null_type)
-                strPrint = "";
-            else if (result.type() == str_type)
-                strPrint = result.get_str();
-            else
-                strPrint = write_string(result, true);
-        }
-    }
-    catch (std::exception& e)
-    {
-        strPrint = string("error: ") + e.what();
-        nRet = 87;
-    }
-    catch (...)
-    {
-        PrintException(NULL, "CommandLineRPC()");
-    }
-
-    if (strPrint != "")
-    {
-#if defined(__WXMSW__) && defined(GUI)
-        // Windows GUI apps can't print to command line,
-        // so settle for a message box yuck
-        MyMessageBox(strPrint, "Bitcoin", wxOK);
-#else
-        fprintf((nRet == 0 ? stdout : stderr), "%s\n", strPrint.c_str());
-#endif
-    }
-    return nRet;
-}
-
-
-
-
-#ifdef TEST
-int main(int argc, char *argv[])
-{
-#ifdef _MSC_VER
-    // Turn off microsoft heap dump noise
-    _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
-    _CrtSetReportFile(_CRT_WARN, CreateFile("NUL", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0));
-#endif
-    setbuf(stdin, NULL);
-    setbuf(stdout, NULL);
-    setbuf(stderr, NULL);
-
-    try
-    {
-        if (argc >= 2 && string(argv[1]) == "-server")
-        {
-            printf("server ready\n");
-            ThreadRPCServer(NULL);
-        }
-        else
-        {
-            return CommandLineRPC(argc, argv);
-        }
-    }
-    catch (std::exception& e) {
-        PrintException(&e, "main()");
-    } catch (...) {
-        PrintException(NULL, "main()");
-    }
-    return 0;
-}
-#endif
deleted file mode 100644
--- a/src/rpc.h
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright (c) 2010 Satoshi Nakamoto
-// Copyright (c) 2011 The Bitcoin developers
-// Distributed under the MIT/X11 software license, see the accompanying
-// file license.txt or http://www.opensource.org/licenses/mit-license.php.
-
-void ThreadRPCServer(void* parg);
-int CommandLineRPC(int argc, char *argv[]);
--- a/src/script.cpp
+++ b/src/script.cpp
@@ -1132,6 +1132,7 @@
         if (keystore == NULL || keystore->HaveKey(addressRet))
             return true;
     }
+
     return false;
 }
 
--- a/src/serialize.h
+++ b/src/serialize.h
@@ -31,6 +31,7 @@
 #endif
 
 #ifdef __WXMSW__
+#include <windows.h>
 // This is used to attempt to keep keying material out of swap
 // Note that VirtualLock does not provide this as a guarantee on Windows,
 // but, in practice, memory that has been VirtualLock'd almost never gets written to
--- a/src/ui.h
+++ b/src/ui.h
@@ -24,7 +24,9 @@
 void MainFrameRepaint();
 void CreateMainWindow();
 void SetStartOnSystemStartup(bool fAutoStart);
-
+inline void InitMessage(const std::string &message)
+{
+}
 
 
 
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -264,8 +264,7 @@
     return ret;
 }
 
-
-string strprintf(const char* format, ...)
+string strprintf(const std::string &format, ...)
 {
     char buffer[50000];
     char* p = buffer;
@@ -275,7 +274,7 @@
     {
         va_list arg_ptr;
         va_start(arg_ptr, format);
-        ret = _vsnprintf(p, limit, format, arg_ptr);
+        ret = _vsnprintf(p, limit, format.c_str(), arg_ptr);
         va_end(arg_ptr);
         if (ret >= 0 && ret < limit)
             break;
@@ -292,14 +291,13 @@
     return str;
 }
 
-
-bool error(const char* format, ...)
+bool error(const std::string &format, ...)
 {
     char buffer[50000];
     int limit = sizeof(buffer);
     va_list arg_ptr;
     va_start(arg_ptr, format);
-    int ret = _vsnprintf(buffer, limit, format, arg_ptr);
+    int ret = _vsnprintf(buffer, limit, format.c_str(), arg_ptr);
     va_end(arg_ptr);
     if (ret < 0 || ret >= limit)
     {
--- a/src/util.h
+++ b/src/util.h
@@ -65,7 +65,7 @@
 #endif
 
 // This is needed because the foreach macro can't get over the comma in pair<t1, t2>
-#define PAIRTYPE(t1, t2)    pair<t1, t2>
+#define PAIRTYPE(t1, t2)    std::pair<t1, t2>
 
 // Align by increasing pointer, must have extra space at end of buffer
 template <size_t nBytes, typename T>
@@ -132,8 +132,7 @@
     return ret;
 }
 #define closesocket(s)      myclosesocket(s)
-
-#ifndef GUI
+#if !defined(QT_GUI) && !defined(GUI)
 inline const char* _(const char* psz)
 {
     return psz;
@@ -148,7 +147,6 @@
 
 
 
-
 extern std::map<std::string, std::string> mapArgs;
 extern std::map<std::string, std::vector<std::string> > mapMultiArgs;
 extern bool fDebug;
@@ -169,8 +167,8 @@
 void RandAddSeedPerfmon();
 int OutputDebugStringF(const char* pszFormat, ...);
 int my_snprintf(char* buffer, size_t limit, const char* format, ...);
-std::string strprintf(const char* format, ...);
-bool error(const char* format, ...);
+std::string strprintf(const std::string &format, ...);
+bool error(const std::string &format, ...);
 void LogException(std::exception* pex, const char* pszThread);
 void PrintException(std::exception* pex, const char* pszThread);
 void PrintExceptionContinue(std::exception* pex, const char* pszThread);
--- a/src/wallet.cpp
+++ b/src/wallet.cpp
@@ -260,7 +260,7 @@
         if (fInsertedNew || fUpdated)
             if (!wtx.WriteToDisk())
                 return false;
-
+#ifndef QT_GUI
         // If default receiving address gets used, replace it with a new one
         CScript scriptDefaultKey;
         scriptDefaultKey.SetBitcoinAddress(vchDefaultKey);
@@ -276,7 +276,7 @@
                 }
             }
         }
-
+#endif
         // Notify UI
         vWalletUpdated.push_back(hash);
 
@@ -728,6 +728,21 @@
     return nTotal;
 }
 
+int64 CWallet::GetUnconfirmedBalance() const
+{
+    int64 nTotal = 0;
+    CRITICAL_BLOCK(cs_wallet)
+    {
+        for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
+        {
+            const CWalletTx* pcoin = &(*it).second;
+            if (pcoin->IsFinal() && pcoin->IsConfirmed())
+                continue;
+            nTotal += pcoin->GetAvailableCredit();
+        }
+    }
+    return nTotal;
+}
 
 bool CWallet::SelectCoinsMinConf(int64 nTargetValue, int nConfMine, int nConfTheirs, set<pair<const CWalletTx*,unsigned int> >& setCoinsRet, int64& nValueRet) const
 {
--- a/src/wallet.h
+++ b/src/wallet.h
@@ -74,6 +74,7 @@
     void ReacceptWalletTransactions();
     void ResendWalletTransactions();
     int64 GetBalance() const;
+    int64 GetUnconfirmedBalance() const;
     bool CreateTransaction(const std::vector<std::pair<CScript, int64> >& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet);
     bool CreateTransaction(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet);
     bool CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey);