From 505835b87b897fae46ee82597d5a8439454a0de6 Mon Sep 17 00:00:00 2001 From: SlowRiot Date: Fri, 20 Aug 2021 00:20:27 +0100 Subject: [PATCH 001/144] fix broken URLs to the bitgesell repo --- build_msvc/BGL_config.h | 2 +- build_msvc/README.md | 4 ++-- contrib/gitian-build.py | 4 ++-- contrib/gitian-descriptors/gitian-linux.yml | 2 +- contrib/gitian-descriptors/gitian-osx.yml | 2 +- contrib/gitian-descriptors/gitian-win.yml | 2 +- debian.minimal/copyright | 2 +- doc/README_doxygen.md | 2 +- doc/build-netbsd.md | 2 +- doc/build-openbsd.md | 2 +- doc/build-osx.md | 2 +- doc/build-unix.md | 2 +- doc/developer-notes.md | 2 +- doc/release-notes.md | 2 +- doc/release-notes/release-notes-0.10.0.md | 4 ++-- doc/release-notes/release-notes-0.10.1.md | 2 +- doc/release-notes/release-notes-0.10.2.md | 2 +- doc/release-notes/release-notes-0.10.3.md | 2 +- doc/release-notes/release-notes-0.10.4.md | 2 +- doc/release-notes/release-notes-0.11.0.md | 2 +- doc/release-notes/release-notes-0.11.2.md | 2 +- doc/release-notes/release-notes-0.12.0.md | 4 ++-- doc/release-notes/release-notes-0.12.1.md | 2 +- doc/release-notes/release-notes-0.13.0.md | 2 +- doc/release-notes/release-notes-0.13.1.md | 2 +- doc/release-notes/release-notes-0.13.2.md | 2 +- doc/release-notes/release-notes-0.14.0.md | 4 ++-- doc/release-notes/release-notes-0.14.1.md | 2 +- doc/release-notes/release-notes-0.14.2.md | 2 +- doc/release-notes/release-notes-0.14.3.md | 2 +- doc/release-notes/release-notes-0.15.0.1.md | 2 +- doc/release-notes/release-notes-0.15.0.md | 2 +- doc/release-notes/release-notes-0.15.1.md | 2 +- doc/release-notes/release-notes-0.15.2.md | 2 +- doc/release-notes/release-notes-0.16.0.md | 2 +- doc/release-notes/release-notes-0.16.1.md | 2 +- doc/release-notes/release-notes-0.16.2.md | 2 +- doc/release-notes/release-notes-0.16.3.md | 2 +- doc/release-notes/release-notes-0.17.0.1.md | 2 +- doc/release-notes/release-notes-0.17.0.md | 2 +- doc/release-notes/release-notes-0.17.1.md | 2 +- doc/release-notes/release-notes-0.18.0.md | 2 +- doc/release-notes/release-notes-0.18.1.md | 2 +- doc/release-notes/release-notes-0.19.0.1.md | 2 +- doc/release-notes/release-notes-0.3.20.md | 4 ++-- doc/release-notes/release-notes-0.4.3.md | 2 +- doc/release-notes/release-notes-0.4.4.md | 2 +- doc/release-notes/release-notes-0.5.0.md | 2 +- doc/release-notes/release-notes-0.5.1.md | 2 +- doc/release-notes/release-notes-0.5.2.md | 2 +- doc/release-notes/release-notes-0.5.3.md | 2 +- doc/release-notes/release-notes-0.5.4.md | 2 +- doc/release-notes/release-notes-0.6.0.md | 2 +- doc/release-notes/release-notes-0.6.2.md | 2 +- doc/release-notes/release-notes-0.6.3.md | 2 +- doc/release-notes/release-notes-0.7.0.md | 2 +- doc/release-notes/release-notes-0.7.1.md | 2 +- doc/release-notes/release-notes-0.7.2.md | 2 +- doc/release-notes/release-notes-0.8.0.md | 2 +- doc/release-notes/release-notes-0.8.1.md | 2 +- doc/release-notes/release-notes-0.8.2.md | 2 +- doc/release-notes/release-notes-0.8.3.md | 2 +- doc/release-notes/release-notes-0.8.4.md | 2 +- doc/release-notes/release-notes-0.8.5.md | 2 +- doc/release-notes/release-notes-0.8.6.md | 2 +- doc/release-notes/release-notes-0.9.0.md | 2 +- doc/release-notes/release-notes-0.9.1.md | 2 +- doc/release-notes/release-notes-0.9.2.1.md | 2 +- doc/release-notes/release-notes-0.9.2.md | 2 +- doc/release-notes/release-notes-0.9.3.md | 2 +- doc/release-notes/release-notes-0.9.4.md | 2 +- doc/release-notes/release-notes-0.9.5.md | 2 +- doc/release-process.md | 4 ++-- 73 files changed, 80 insertions(+), 80 deletions(-) diff --git a/build_msvc/BGL_config.h b/build_msvc/BGL_config.h index 62af3f804e..73f32f9862 100644 --- a/build_msvc/BGL_config.h +++ b/build_msvc/BGL_config.h @@ -244,7 +244,7 @@ #define LT_OBJDIR ".libs/" /* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "https://github.com/BGL/BGL/issues" +#define PACKAGE_BUGREPORT "https://github.com/BitgesellOfficial/bitgesell/issues" /* Define to the full name of this package. */ #define PACKAGE_NAME "BGL Core" diff --git a/build_msvc/README.md b/build_msvc/README.md index 0b5a1c073e..b2e9191f4b 100644 --- a/build_msvc/README.md +++ b/build_msvc/README.md @@ -5,7 +5,7 @@ Introduction --------------------- Solution and project files to build the BGL Core applications `msbuild` or Visual Studio can be found in the build_msvc directory. The build has been tested with Visual Studio 2017 and 2019. -Building with Visual Studio is an alternative to the Linux based [cross-compiler build](https://github.com/BGL/BGL/blob/master/doc/build-windows.md). +Building with Visual Studio is an alternative to the Linux based [cross-compiler build](https://github.com/BitgesellOfficial/bitgesell/blob/master/doc/build-windows.md). Quick Start --------------------- @@ -19,7 +19,7 @@ msbuild /m BGL.sln /p:Platform=x64 /p:Configuration=Release /t:build Dependencies --------------------- -A number of [open source libraries](https://github.com/BGL/BGL/blob/master/doc/dependencies.md) are required in order to be able to build BGL Core. +A number of [open source libraries](https://github.com/BitgesellOfficial/bitgesell/blob/master/doc/dependencies.md) are required in order to be able to build BGL Core. Options for installing the dependencies in a Visual Studio compatible manner are: diff --git a/contrib/gitian-build.py b/contrib/gitian-build.py index 3a43a8a8b9..6864ac4121 100755 --- a/contrib/gitian-build.py +++ b/contrib/gitian-build.py @@ -33,7 +33,7 @@ def setup(): if not os.path.isdir('gitian-builder'): subprocess.check_call(['git', 'clone', 'https://github.com/devrandom/gitian-builder.git']) if not os.path.isdir('BGL'): - subprocess.check_call(['git', 'clone', 'https://github.com/BGL/BGL.git']) + subprocess.check_call(['git', 'clone', 'https://github.com/BitgesellOfficial/bitgesell.git']) os.chdir('gitian-builder') make_image_prog = ['bin/make-base-vm', '--suite', 'focal', '--arch', 'amd64'] if args.docker: @@ -157,7 +157,7 @@ def main(): parser = argparse.ArgumentParser(description='Script for running full Gitian builds.') parser.add_argument('-c', '--commit', action='store_true', dest='commit', help='Indicate that the version argument is for a commit or branch') parser.add_argument('-p', '--pull', action='store_true', dest='pull', help='Indicate that the version argument is the number of a github repository pull request') - parser.add_argument('-u', '--url', dest='url', default='https://github.com/BGL/BGL', help='Specify the URL of the repository. Default is %(default)s') + parser.add_argument('-u', '--url', dest='url', default='https://github.com/BitgesellOfficial/bitgesell', help='Specify the URL of the repository. Default is %(default)s') parser.add_argument('-v', '--verify', action='store_true', dest='verify', help='Verify the Gitian build') parser.add_argument('-b', '--build', action='store_true', dest='build', help='Do a Gitian build') parser.add_argument('-s', '--sign', action='store_true', dest='sign', help='Make signed binaries for Windows and MacOS') diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 3c1572fd22..27b0a261f3 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -41,7 +41,7 @@ packages: - "binutils-riscv64-linux-gnu" - "g++-8-riscv64-linux-gnu" remotes: -- "url": "https://github.com/BGL/BGL.git" +- "url": "https://github.com/BitgesellOfficial/bitgesell.git" "dir": "BGL" files: [] script: | diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml index e8aafcea5c..b4ebec2019 100644 --- a/contrib/gitian-descriptors/gitian-osx.yml +++ b/contrib/gitian-descriptors/gitian-osx.yml @@ -28,7 +28,7 @@ packages: - "xorriso" - "libtinfo5" remotes: -- "url": "https://github.com/BGL/BGL.git" +- "url": "https://github.com/BitgesellOfficial/bitgesell.git" "dir": "BGL" files: - "Xcode-11.3.1-11C505-extracted-SDK-with-libcxx-headers.tar.gz" diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml index b0da9aed16..dc81d4d235 100644 --- a/contrib/gitian-descriptors/gitian-win.yml +++ b/contrib/gitian-descriptors/gitian-win.yml @@ -23,7 +23,7 @@ packages: - "ca-certificates" - "python3" remotes: -- "url": "https://github.com/BGL/BGL.git" +- "url": "https://github.com/BitgesellOfficial/bitgesell.git" "dir": "BGL" files: [] script: | diff --git a/debian.minimal/copyright b/debian.minimal/copyright index 81ed2ad05e..36cd059ff9 100644 --- a/debian.minimal/copyright +++ b/debian.minimal/copyright @@ -1722,7 +1722,7 @@ Copyright: 2009-2019 The Bitcoin Core developers License: __UNKNOWN__ Please contribute if you find BGL Core useful. Visit for further information about the software. - The source code is available from . + The source code is available from . . This is experimental software. Distributed under the MIT software license, see the accompanying file COPYING diff --git a/doc/README_doxygen.md b/doc/README_doxygen.md index 1d0d9975d6..a6b1e81ef9 100644 --- a/doc/README_doxygen.md +++ b/doc/README_doxygen.md @@ -8,7 +8,7 @@ with no central authority: managing transactions and issuing money are carried o The software is a community-driven open source project, released under the MIT license. -See https://github.com/BGL/BGL and https://BGLcore.org/ for further information about the project. +See https://github.com/BitgesellOfficial/bitgesell and https://BGLcore.org/ for further information about the project. \section Navigation Use Modules, Namespaces, Classes, or Files at the top of the page to start navigating the code. diff --git a/doc/build-netbsd.md b/doc/build-netbsd.md index fa6a96f707..0306751654 100644 --- a/doc/build-netbsd.md +++ b/doc/build-netbsd.md @@ -22,7 +22,7 @@ libtool pkg-config python37 -git clone https://github.com/BGL/BGL.git +git clone https://github.com/BitgesellOfficial/bitgesell.git ``` See [dependencies.md](dependencies.md) for a complete overview. diff --git a/doc/build-openbsd.md b/doc/build-openbsd.md index fffad88a72..3736706658 100644 --- a/doc/build-openbsd.md +++ b/doc/build-openbsd.md @@ -18,7 +18,7 @@ pkg_add automake # (select highest version, e.g. 1.16) pkg_add python # (select highest version, e.g. 3.8) pkg_add bash -git clone https://github.com/BGL/BGL.git +git clone https://github.com/BitgesellOfficial/bitgesell.git ``` See [dependencies.md](dependencies.md) for a complete overview. diff --git a/doc/build-osx.md b/doc/build-osx.md index 56e40fb600..575c54e3d2 100644 --- a/doc/build-osx.md +++ b/doc/build-osx.md @@ -71,7 +71,7 @@ brew install berkeley-db4 1. Clone the BGL Core source code: ```shell - git clone https://github.com/BGL/BGL + git clone https://github.com/BitgesellOfficial/bitgesell cd BGL ``` diff --git a/doc/build-unix.md b/doc/build-unix.md index ed3c08b822..4671235675 100644 --- a/doc/build-unix.md +++ b/doc/build-unix.md @@ -302,7 +302,7 @@ Setup and Build Example: Arch Linux This example lists the steps necessary to setup and build a command line only, non-wallet distribution of the latest changes on Arch Linux: pacman -S git base-devel boost libevent python - git clone https://github.com/BGL/BGL.git + git clone https://github.com/BitgesellOfficial/bitgesell.git cd BGL/ ./autogen.sh ./configure --disable-wallet --without-gui --without-miniupnpc diff --git a/doc/developer-notes.md b/doc/developer-notes.md index 743f609fff..b0fff9615e 100644 --- a/doc/developer-notes.md +++ b/doc/developer-notes.md @@ -313,7 +313,7 @@ other input. Valgrind is a programming tool for memory debugging, memory leak detection, and profiling. The repo contains a Valgrind suppressions file -([`valgrind.supp`](https://github.com/BGL/BGL/blob/master/contrib/valgrind.supp)) +([`valgrind.supp`](https://github.com/BitgesellOfficial/bitgesell/blob/master/contrib/valgrind.supp)) which includes known Valgrind warnings in our dependencies that cannot be fixed in-tree. Example use: diff --git a/doc/release-notes.md b/doc/release-notes.md index 93f3386090..12ff082707 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -24,7 +24,7 @@ improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.10.0.md b/doc/release-notes/release-notes-0.10.0.md index c131772de0..85ea0f0731 100644 --- a/doc/release-notes/release-notes-0.10.0.md +++ b/doc/release-notes/release-notes-0.10.0.md @@ -7,7 +7,7 @@ bug fixes. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues Upgrading and downgrading ========================= @@ -230,7 +230,7 @@ bindings such as [python-BGLlib](https://pypi.python.org/pypi/python-BGLlib) or alternative node implementations. This library is called `libBGLconsensus.so` (or, `.dll` for Windows). -Its interface is defined in the C header [BGLconsensus.h](https://github.com/BGL/BGL/blob/0.10/src/script/BGLconsensus.h). +Its interface is defined in the C header [BGLconsensus.h](https://github.com/BitgesellOfficial/bitgesell/blob/master/src/script/BGLconsensus.h). In its initial version the API includes two functions: diff --git a/doc/release-notes/release-notes-0.10.1.md b/doc/release-notes/release-notes-0.10.1.md index 5961b8d49e..8c28320f33 100644 --- a/doc/release-notes/release-notes-0.10.1.md +++ b/doc/release-notes/release-notes-0.10.1.md @@ -7,7 +7,7 @@ updates. It is recommended to upgrade to this version. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= diff --git a/doc/release-notes/release-notes-0.10.2.md b/doc/release-notes/release-notes-0.10.2.md index f29385d92e..b4fee60a9f 100644 --- a/doc/release-notes/release-notes-0.10.2.md +++ b/doc/release-notes/release-notes-0.10.2.md @@ -7,7 +7,7 @@ updates. It is recommended to upgrade to this version. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= diff --git a/doc/release-notes/release-notes-0.10.3.md b/doc/release-notes/release-notes-0.10.3.md index 2c54cf418e..c8cc2319e8 100644 --- a/doc/release-notes/release-notes-0.10.3.md +++ b/doc/release-notes/release-notes-0.10.3.md @@ -7,7 +7,7 @@ updates. It is recommended to upgrade to this version as soon as possible. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= diff --git a/doc/release-notes/release-notes-0.10.4.md b/doc/release-notes/release-notes-0.10.4.md index 36cdd3d74a..e3dff3ca4c 100644 --- a/doc/release-notes/release-notes-0.10.4.md +++ b/doc/release-notes/release-notes-0.10.4.md @@ -8,7 +8,7 @@ recommended to upgrade to this version as soon as possible. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= diff --git a/doc/release-notes/release-notes-0.11.0.md b/doc/release-notes/release-notes-0.11.0.md index 0a6dd955a6..b2756aa40a 100644 --- a/doc/release-notes/release-notes-0.11.0.md +++ b/doc/release-notes/release-notes-0.11.0.md @@ -7,7 +7,7 @@ bug fixes. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= diff --git a/doc/release-notes/release-notes-0.11.2.md b/doc/release-notes/release-notes-0.11.2.md index a1b2199cbc..993be89890 100644 --- a/doc/release-notes/release-notes-0.11.2.md +++ b/doc/release-notes/release-notes-0.11.2.md @@ -8,7 +8,7 @@ recommended to upgrade to this version as soon as possible. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= diff --git a/doc/release-notes/release-notes-0.12.0.md b/doc/release-notes/release-notes-0.12.0.md index 0822636d83..8ec9e83599 100644 --- a/doc/release-notes/release-notes-0.12.0.md +++ b/doc/release-notes/release-notes-0.12.0.md @@ -6,7 +6,7 @@ This is a new major version release, bringing new features and other improvement Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= @@ -331,7 +331,7 @@ practice. In future releases, a higher value may also help the network as a whole: stored blocks could be served to other nodes. For further information about pruning, you may also consult the [release -notes of v0.11.0](https://github.com/BGL/BGL/blob/v0.11.0/doc/release-notes.md#block-file-pruning). +notes of v0.11.0](https://github.com/BitgesellOfficial/bitgesell/blob/master/doc/release-notes.md#block-file-pruning). `NODE_BLOOM` service bit ------------------------ diff --git a/doc/release-notes/release-notes-0.12.1.md b/doc/release-notes/release-notes-0.12.1.md index 83d3b08a45..12ffd01bc1 100644 --- a/doc/release-notes/release-notes-0.12.1.md +++ b/doc/release-notes/release-notes-0.12.1.md @@ -7,7 +7,7 @@ softfork, various bugfixes and updated translations. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= diff --git a/doc/release-notes/release-notes-0.13.0.md b/doc/release-notes/release-notes-0.13.0.md index 0bd58b395a..d398261560 100644 --- a/doc/release-notes/release-notes-0.13.0.md +++ b/doc/release-notes/release-notes-0.13.0.md @@ -7,7 +7,7 @@ and performance improvements, as well as updated translations. Please report bugs using the issue tracker at github: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.13.1.md b/doc/release-notes/release-notes-0.13.1.md index 6c300d510d..5fba8a694a 100644 --- a/doc/release-notes/release-notes-0.13.1.md +++ b/doc/release-notes/release-notes-0.13.1.md @@ -8,7 +8,7 @@ updated translations. Please report bugs using the issue tracker at github: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.13.2.md b/doc/release-notes/release-notes-0.13.2.md index f8d9cb0bd1..94665cd34e 100644 --- a/doc/release-notes/release-notes-0.13.2.md +++ b/doc/release-notes/release-notes-0.13.2.md @@ -7,7 +7,7 @@ performance improvements, as well as updated translations. Please report bugs using the issue tracker at github: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.14.0.md b/doc/release-notes/release-notes-0.14.0.md index 6155cd5be2..8769e2b9eb 100644 --- a/doc/release-notes/release-notes-0.14.0.md +++ b/doc/release-notes/release-notes-0.14.0.md @@ -7,7 +7,7 @@ and performance improvements, as well as updated translations. Please report bugs using the issue tracker at github: - + To receive security and update notifications, please subscribe to: @@ -96,7 +96,7 @@ ZMQ On Windows Previously the ZeroMQ notification system was unavailable on Windows due to various issues with ZMQ. These have been fixed upstream and -now ZMQ can be used on Windows. Please see [this document](https://github.com/BGL/BGL/blob/master/doc/zmq.md) for +now ZMQ can be used on Windows. Please see [this document](https://github.com/BitgesellOfficial/bitgesell/blob/master/doc/zmq.md) for help with using ZMQ in general. Nested RPC Commands in Debug Console diff --git a/doc/release-notes/release-notes-0.14.1.md b/doc/release-notes/release-notes-0.14.1.md index 2b69c32e14..cfe32b947e 100644 --- a/doc/release-notes/release-notes-0.14.1.md +++ b/doc/release-notes/release-notes-0.14.1.md @@ -7,7 +7,7 @@ performance improvements, as well as updated translations. Please report bugs using the issue tracker at github: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.14.2.md b/doc/release-notes/release-notes-0.14.2.md index a36318eba2..a4edd585ae 100644 --- a/doc/release-notes/release-notes-0.14.2.md +++ b/doc/release-notes/release-notes-0.14.2.md @@ -7,7 +7,7 @@ performance improvements, as well as updated translations. Please report bugs using the issue tracker at github: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.14.3.md b/doc/release-notes/release-notes-0.14.3.md index 56ed5f6d24..639e6ac424 100644 --- a/doc/release-notes/release-notes-0.14.3.md +++ b/doc/release-notes/release-notes-0.14.3.md @@ -7,7 +7,7 @@ performance improvements. Please report bugs using the issue tracker at github: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.15.0.1.md b/doc/release-notes/release-notes-0.15.0.1.md index 49bb29c870..178f8d5537 100644 --- a/doc/release-notes/release-notes-0.15.0.1.md +++ b/doc/release-notes/release-notes-0.15.0.1.md @@ -10,7 +10,7 @@ This is a minor bug fix for 0.15.0. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.15.0.md b/doc/release-notes/release-notes-0.15.0.md index f2a00aab3b..aaeda737e7 100644 --- a/doc/release-notes/release-notes-0.15.0.md +++ b/doc/release-notes/release-notes-0.15.0.md @@ -7,7 +7,7 @@ and performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.15.1.md b/doc/release-notes/release-notes-0.15.1.md index 61a8a5834c..336020c786 100644 --- a/doc/release-notes/release-notes-0.15.1.md +++ b/doc/release-notes/release-notes-0.15.1.md @@ -11,7 +11,7 @@ performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.15.2.md b/doc/release-notes/release-notes-0.15.2.md index 8403de41f5..549de22a62 100644 --- a/doc/release-notes/release-notes-0.15.2.md +++ b/doc/release-notes/release-notes-0.15.2.md @@ -7,7 +7,7 @@ performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.16.0.md b/doc/release-notes/release-notes-0.16.0.md index c3119714c1..9ca20a72df 100644 --- a/doc/release-notes/release-notes-0.16.0.md +++ b/doc/release-notes/release-notes-0.16.0.md @@ -7,7 +7,7 @@ and performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.16.1.md b/doc/release-notes/release-notes-0.16.1.md index 58a730cca5..4c855835d7 100644 --- a/doc/release-notes/release-notes-0.16.1.md +++ b/doc/release-notes/release-notes-0.16.1.md @@ -7,7 +7,7 @@ as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.16.2.md b/doc/release-notes/release-notes-0.16.2.md index c20f8a1ce4..ee18ff1d14 100644 --- a/doc/release-notes/release-notes-0.16.2.md +++ b/doc/release-notes/release-notes-0.16.2.md @@ -7,7 +7,7 @@ as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.16.3.md b/doc/release-notes/release-notes-0.16.3.md index 1f8486bab8..12e63f3348 100644 --- a/doc/release-notes/release-notes-0.16.3.md +++ b/doc/release-notes/release-notes-0.16.3.md @@ -6,7 +6,7 @@ This is a new minor version release, with various bugfixes. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.17.0.1.md b/doc/release-notes/release-notes-0.17.0.1.md index 5dcb3dbbc3..1b5645a309 100644 --- a/doc/release-notes/release-notes-0.17.0.1.md +++ b/doc/release-notes/release-notes-0.17.0.1.md @@ -6,7 +6,7 @@ This release provides a minor bug fix for 0.17.0. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.17.0.md b/doc/release-notes/release-notes-0.17.0.md index 52ffad45ab..ebf156a1ec 100644 --- a/doc/release-notes/release-notes-0.17.0.md +++ b/doc/release-notes/release-notes-0.17.0.md @@ -7,7 +7,7 @@ and performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.17.1.md b/doc/release-notes/release-notes-0.17.1.md index dce454480e..b428d6c633 100644 --- a/doc/release-notes/release-notes-0.17.1.md +++ b/doc/release-notes/release-notes-0.17.1.md @@ -11,7 +11,7 @@ and performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.18.0.md b/doc/release-notes/release-notes-0.18.0.md index 00f3e83ab4..8acee23111 100644 --- a/doc/release-notes/release-notes-0.18.0.md +++ b/doc/release-notes/release-notes-0.18.0.md @@ -7,7 +7,7 @@ fixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.18.1.md b/doc/release-notes/release-notes-0.18.1.md index bd8b0fadfc..7d45db39d8 100644 --- a/doc/release-notes/release-notes-0.18.1.md +++ b/doc/release-notes/release-notes-0.18.1.md @@ -7,7 +7,7 @@ fixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.19.0.1.md b/doc/release-notes/release-notes-0.19.0.1.md index cc88a3657f..800de83da3 100644 --- a/doc/release-notes/release-notes-0.19.0.1.md +++ b/doc/release-notes/release-notes-0.19.0.1.md @@ -7,7 +7,7 @@ improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: diff --git a/doc/release-notes/release-notes-0.3.20.md b/doc/release-notes/release-notes-0.3.20.md index 12855a5aec..5faaeba131 100644 --- a/doc/release-notes/release-notes-0.3.20.md +++ b/doc/release-notes/release-notes-0.3.20.md @@ -1,6 +1,6 @@ Please checkout the git integration branch from: -https://github.com/BGL/BGL +https://github.com/BitgesellOfficial/bitgesell ... and help test. The new features that need testing are: @@ -19,4 +19,4 @@ Bug fixes that also need testing: This needs more testing on Windows! Please drop me a quick private message, email, or IRC message if you are able to do some testing. If you find bugs, please open an issue at: -https://github.com/BGL/BGL/issues +https://github.com/BitgesellOfficial/bitgesell/issues diff --git a/doc/release-notes/release-notes-0.4.3.md b/doc/release-notes/release-notes-0.4.3.md index b3fb4eca5d..81005a2d5d 100644 --- a/doc/release-notes/release-notes-0.4.3.md +++ b/doc/release-notes/release-notes-0.4.3.md @@ -6,7 +6,7 @@ This is a bugfix-only release based on 0.4.0. Please note that the wxBGL GUI client is no longer maintained nor supported. If someone would like to step up to maintain this, they should contact Luke-Jr. Please report bugs for the daemon only using the issue tracker at github: -https://github.com/BGL/BGL/issues +https://github.com/BitgesellOfficial/bitgesell/issues Stable source code is hosted at Gitorious: http://gitorious.org/BGL/BGLd-stable/archive-tarball/v0.4.3#.tar.gz diff --git a/doc/release-notes/release-notes-0.4.4.md b/doc/release-notes/release-notes-0.4.4.md index 3203de8cec..ec4d184e20 100644 --- a/doc/release-notes/release-notes-0.4.4.md +++ b/doc/release-notes/release-notes-0.4.4.md @@ -6,7 +6,7 @@ This is a bugfix-only release based on 0.4.0. Please note that the wxBGL GUI client is no longer maintained nor supported. If someone would like to step up to maintain this, they should contact Luke-Jr. Please report bugs for the daemon only using the issue tracker at github: -https://github.com/BGL/BGL/issues +https://github.com/BitgesellOfficial/bitgesell/issues Stable source code is hosted at Gitorious: http://gitorious.org/BGL/BGLd-stable/archive-tarball/v0.4.4#.tar.gz diff --git a/doc/release-notes/release-notes-0.5.0.md b/doc/release-notes/release-notes-0.5.0.md index 8cdf33f2a8..2c42f08f70 100644 --- a/doc/release-notes/release-notes-0.5.0.md +++ b/doc/release-notes/release-notes-0.5.0.md @@ -7,7 +7,7 @@ This release include German, Spanish, Spanish-Castilian, Norwegian and Dutch tra https://www.transifex.net/projects/p/BGL/ Please report bugs using the issue tracker at github: -https://github.com/BGL/BGL/issues +https://github.com/BitgesellOfficial/bitgesell/issues For Ubuntu users, there is a new ppa maintained by Matt Corallo which you can add to your system so that it will automatically keep BGL up-to-date. Just type "sudo apt-add-repository ppa:BGL/BGL" in your terminal, then install the BGL-qt package. diff --git a/doc/release-notes/release-notes-0.5.1.md b/doc/release-notes/release-notes-0.5.1.md index 061c135877..ac996c226d 100644 --- a/doc/release-notes/release-notes-0.5.1.md +++ b/doc/release-notes/release-notes-0.5.1.md @@ -9,7 +9,7 @@ More translations are welcome; join the project at Transifex if you can help: https://www.transifex.net/projects/p/BGL/ Please report bugs using the issue tracker at github: -https://github.com/BGL/BGL/issues +https://github.com/BitgesellOfficial/bitgesell/issues Project source code is hosted at github; we are no longer distributing .tar.gz files here, you can get them diff --git a/doc/release-notes/release-notes-0.5.2.md b/doc/release-notes/release-notes-0.5.2.md index 83bc73da6a..eed88b00d8 100644 --- a/doc/release-notes/release-notes-0.5.2.md +++ b/doc/release-notes/release-notes-0.5.2.md @@ -4,7 +4,7 @@ http://sourceforge.net/projects/BGL/files/BGL/BGL-0.5.2/ This is a bugfix-only release based on 0.5.1. Please report bugs using the issue tracker at github: -https://github.com/BGL/BGL/issues +https://github.com/BitgesellOfficial/bitgesell/issues Stable source code is hosted at Gitorious: http://gitorious.org/BGL/BGLd-stable/archive-tarball/v0.5.2#.tar.gz diff --git a/doc/release-notes/release-notes-0.5.3.md b/doc/release-notes/release-notes-0.5.3.md index c5b647fbd1..2d693b49aa 100644 --- a/doc/release-notes/release-notes-0.5.3.md +++ b/doc/release-notes/release-notes-0.5.3.md @@ -5,7 +5,7 @@ This is a bugfix-only release based on 0.5.1. It also includes a few protocol updates. Please report bugs using the issue tracker at github: -https://github.com/BGL/BGL/issues +https://github.com/BitgesellOfficial/bitgesell/issues Stable source code is hosted at Gitorious: http://gitorious.org/BGL/BGLd-stable/archive-tarball/v0.5.3#.tar.gz diff --git a/doc/release-notes/release-notes-0.5.4.md b/doc/release-notes/release-notes-0.5.4.md index 7c60ce7366..0c73f6ec05 100644 --- a/doc/release-notes/release-notes-0.5.4.md +++ b/doc/release-notes/release-notes-0.5.4.md @@ -5,7 +5,7 @@ NOTE: 0.5.4rc3 is being renamed to 0.5.4 final with no changes. This is a bugfix-only release in the 0.5.x series, plus a few protocol updates. Please report bugs using the issue tracker at github: -https://github.com/BGL/BGL/issues +https://github.com/BitgesellOfficial/bitgesell/issues Stable source code is hosted at Gitorious: http://gitorious.org/BGL/BGLd-stable/archive-tarball/v0.5.4#.tar.gz diff --git a/doc/release-notes/release-notes-0.6.0.md b/doc/release-notes/release-notes-0.6.0.md index 96795f6751..21431ddad1 100644 --- a/doc/release-notes/release-notes-0.6.0.md +++ b/doc/release-notes/release-notes-0.6.0.md @@ -7,7 +7,7 @@ project at Transifex to help: https://www.transifex.net/projects/p/BGL/ Please report bugs using the issue tracker at github: -https://github.com/BGL/BGL/issues +https://github.com/BitgesellOfficial/bitgesell/issues Project source code is hosted at github; we are no longer distributing .tar.gz files here, you can get them diff --git a/doc/release-notes/release-notes-0.6.2.md b/doc/release-notes/release-notes-0.6.2.md index 16165ec699..cf87d63761 100644 --- a/doc/release-notes/release-notes-0.6.2.md +++ b/doc/release-notes/release-notes-0.6.2.md @@ -4,7 +4,7 @@ http://sourceforge.net/projects/BGL/files/BGL/BGL-0.6.2/ This is a bug-fix and code-cleanup release, with no major new features. Please report bugs using the github issue tracker at: -https://github.com/BGL/BGL/issues +https://github.com/BitgesellOfficial/bitgesell/issues NOTABLE CHANGES diff --git a/doc/release-notes/release-notes-0.6.3.md b/doc/release-notes/release-notes-0.6.3.md index 2ba112e04d..30f441fc99 100644 --- a/doc/release-notes/release-notes-0.6.3.md +++ b/doc/release-notes/release-notes-0.6.3.md @@ -4,7 +4,7 @@ BGL version 0.6.3 is now available for download at: This is a bug-fix release, with no new features. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues CHANGE SUMMARY diff --git a/doc/release-notes/release-notes-0.7.0.md b/doc/release-notes/release-notes-0.7.0.md index e3a76ead9d..c34e3f16f4 100644 --- a/doc/release-notes/release-notes-0.7.0.md +++ b/doc/release-notes/release-notes-0.7.0.md @@ -5,7 +5,7 @@ We recommend that everybody running prior versions of BGLd/BGL-Qt upgrade to this release, except for users running Mac OSX 10.5. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues Project source code is hosted at github; you can get source-only tarballs/zipballs directly from there: diff --git a/doc/release-notes/release-notes-0.7.1.md b/doc/release-notes/release-notes-0.7.1.md index e482b90cf5..b17784700a 100644 --- a/doc/release-notes/release-notes-0.7.1.md +++ b/doc/release-notes/release-notes-0.7.1.md @@ -4,7 +4,7 @@ BGL version 0.7.1 is now available from: This is a bug-fix minor release. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues Project source code is hosted at github; you can get source-only tarballs/zipballs directly from there: diff --git a/doc/release-notes/release-notes-0.7.2.md b/doc/release-notes/release-notes-0.7.2.md index 7b029a08d5..b7cfc53dca 100644 --- a/doc/release-notes/release-notes-0.7.2.md +++ b/doc/release-notes/release-notes-0.7.2.md @@ -4,7 +4,7 @@ BGL version 0.7.2 is now available from: This is a bug-fix minor release. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues How to Upgrade -------------- diff --git a/doc/release-notes/release-notes-0.8.0.md b/doc/release-notes/release-notes-0.8.0.md index 548a1905fb..15c3a74647 100644 --- a/doc/release-notes/release-notes-0.8.0.md +++ b/doc/release-notes/release-notes-0.8.0.md @@ -5,7 +5,7 @@ This is a major release designed to improve performance and handle the increasing volume of transactions on the network. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues How to Upgrade -------------- diff --git a/doc/release-notes/release-notes-0.8.1.md b/doc/release-notes/release-notes-0.8.1.md index e24ac5721a..3e47c8a8a7 100644 --- a/doc/release-notes/release-notes-0.8.1.md +++ b/doc/release-notes/release-notes-0.8.1.md @@ -5,7 +5,7 @@ This is a maintenance release that adds a new network rule to avoid a chain-forking incompatibility with versions 0.7.2 and earlier. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues How to Upgrade diff --git a/doc/release-notes/release-notes-0.8.2.md b/doc/release-notes/release-notes-0.8.2.md index 4e483d40be..a99fea1348 100644 --- a/doc/release-notes/release-notes-0.8.2.md +++ b/doc/release-notes/release-notes-0.8.2.md @@ -5,7 +5,7 @@ This is a maintenance release that fixes many bugs and includes a few small new features. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues How to Upgrade diff --git a/doc/release-notes/release-notes-0.8.3.md b/doc/release-notes/release-notes-0.8.3.md index deed4cc27e..507d8ba097 100644 --- a/doc/release-notes/release-notes-0.8.3.md +++ b/doc/release-notes/release-notes-0.8.3.md @@ -5,7 +5,7 @@ This is a maintenance release to fix a denial-of-service attack that can cause nodes to crash. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues 0.8.3 Release notes diff --git a/doc/release-notes/release-notes-0.8.4.md b/doc/release-notes/release-notes-0.8.4.md index 0bc6fae23a..3611be7fc7 100644 --- a/doc/release-notes/release-notes-0.8.4.md +++ b/doc/release-notes/release-notes-0.8.4.md @@ -5,7 +5,7 @@ This is a maintenance release to fix a critical bug and three security issues; we urge all users to upgrade. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues How to Upgrade diff --git a/doc/release-notes/release-notes-0.8.5.md b/doc/release-notes/release-notes-0.8.5.md index a9b4026507..c9aa1db5dd 100644 --- a/doc/release-notes/release-notes-0.8.5.md +++ b/doc/release-notes/release-notes-0.8.5.md @@ -5,7 +5,7 @@ This is a maintenance release to fix a critical bug; we urge all users to upgrade. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues How to Upgrade diff --git a/doc/release-notes/release-notes-0.8.6.md b/doc/release-notes/release-notes-0.8.6.md index 33fcf0ecd2..d7ffe47ee6 100644 --- a/doc/release-notes/release-notes-0.8.6.md +++ b/doc/release-notes/release-notes-0.8.6.md @@ -6,7 +6,7 @@ This is a maintenance release to fix a critical bug; we urge all users to upgrad Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues How to Upgrade -------------- diff --git a/doc/release-notes/release-notes-0.9.0.md b/doc/release-notes/release-notes-0.9.0.md index a30af2958d..10d6201091 100644 --- a/doc/release-notes/release-notes-0.9.0.md +++ b/doc/release-notes/release-notes-0.9.0.md @@ -7,7 +7,7 @@ bug fixes. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues How to Upgrade -------------- diff --git a/doc/release-notes/release-notes-0.9.1.md b/doc/release-notes/release-notes-0.9.1.md index c78c15416f..54d3570249 100644 --- a/doc/release-notes/release-notes-0.9.1.md +++ b/doc/release-notes/release-notes-0.9.1.md @@ -13,7 +13,7 @@ hostile hosts. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues How to Upgrade -------------- diff --git a/doc/release-notes/release-notes-0.9.2.1.md b/doc/release-notes/release-notes-0.9.2.1.md index bf35e87442..65630d2014 100644 --- a/doc/release-notes/release-notes-0.9.2.1.md +++ b/doc/release-notes/release-notes-0.9.2.1.md @@ -8,7 +8,7 @@ Upgrading to this release is recommended. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues How to Upgrade -------------- diff --git a/doc/release-notes/release-notes-0.9.2.md b/doc/release-notes/release-notes-0.9.2.md index 83e66166be..fafb398994 100644 --- a/doc/release-notes/release-notes-0.9.2.md +++ b/doc/release-notes/release-notes-0.9.2.md @@ -8,7 +8,7 @@ Upgrading to this release is recommended. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues How to Upgrade -------------- diff --git a/doc/release-notes/release-notes-0.9.3.md b/doc/release-notes/release-notes-0.9.3.md index ac6b333013..92e7551a36 100644 --- a/doc/release-notes/release-notes-0.9.3.md +++ b/doc/release-notes/release-notes-0.9.3.md @@ -7,7 +7,7 @@ translations. Upgrading to this release is recommended. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues Upgrading and downgrading ========================== diff --git a/doc/release-notes/release-notes-0.9.4.md b/doc/release-notes/release-notes-0.9.4.md index 3450fe0db1..b109f5b1bf 100644 --- a/doc/release-notes/release-notes-0.9.4.md +++ b/doc/release-notes/release-notes-0.9.4.md @@ -7,7 +7,7 @@ translations. Upgrading to this release is recommended. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues How to Upgrade =============== diff --git a/doc/release-notes/release-notes-0.9.5.md b/doc/release-notes/release-notes-0.9.5.md index 8584ef4276..64f6851ea1 100644 --- a/doc/release-notes/release-notes-0.9.5.md +++ b/doc/release-notes/release-notes-0.9.5.md @@ -8,7 +8,7 @@ recommended. Please report bugs using the issue tracker at github: - https://github.com/BGL/BGL/issues + https://github.com/BitgesellOfficial/bitgesell/issues How to Upgrade =============== diff --git a/doc/release-process.md b/doc/release-process.md index 077668d85d..d7f2a889b6 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -72,7 +72,7 @@ Check out the source code in the following directory hierarchy. git clone https://github.com/BGL-core/gitian.sigs.git git clone https://github.com/BGL-core/BGL-detached-sigs.git git clone https://github.com/devrandom/gitian-builder.git - git clone https://github.com/BGL/BGL.git + git clone https://github.com/BitgesellOfficial/bitgesell.git ### Write the release notes @@ -365,7 +365,7 @@ BGL.org (see below for BGL.org update instructions). - Archive the release notes for the new version to `doc/release-notes/` (branch `master` and branch of the release) - - Create a [new GitHub release](https://github.com/BGL/BGL/releases/new) with a link to the archived release notes + - Create a [new GitHub release](https://github.com/BitgesellOfficial/bitgesell/releases/new) with a link to the archived release notes - Announce the release: From 94666b2ee25b78da7fa3762c6d12125199b4405f Mon Sep 17 00:00:00 2001 From: SlowRiot Date: Fri, 20 Aug 2021 00:22:02 +0100 Subject: [PATCH 002/144] reverting Bitcoin pre-fork release notes to their original content - the over-zealous "bitcoin" -> "BGL" search-replace has resulted in these making no sense, and containing many broken links --- doc/release-notes/release-notes-0.10.0.md | 90 +++++------ doc/release-notes/release-notes-0.10.1.md | 16 +- doc/release-notes/release-notes-0.10.2.md | 18 +-- doc/release-notes/release-notes-0.10.3.md | 30 ++-- doc/release-notes/release-notes-0.10.4.md | 34 ++-- doc/release-notes/release-notes-0.11.0.md | 42 ++--- doc/release-notes/release-notes-0.11.1.md | 32 ++-- doc/release-notes/release-notes-0.11.2.md | 38 ++--- doc/release-notes/release-notes-0.12.0.md | 102 ++++++------ doc/release-notes/release-notes-0.12.1.md | 40 ++--- doc/release-notes/release-notes-0.13.0.md | 80 +++++----- doc/release-notes/release-notes-0.13.1.md | 82 +++++----- doc/release-notes/release-notes-0.13.2.md | 20 +-- doc/release-notes/release-notes-0.14.0.md | 60 +++---- doc/release-notes/release-notes-0.14.1.md | 18 +-- doc/release-notes/release-notes-0.14.2.md | 20 +-- doc/release-notes/release-notes-0.14.3.md | 18 +-- doc/release-notes/release-notes-0.15.0.1.md | 20 +-- doc/release-notes/release-notes-0.15.0.md | 128 +++++++-------- doc/release-notes/release-notes-0.15.1.md | 32 ++-- doc/release-notes/release-notes-0.15.2.md | 22 +-- doc/release-notes/release-notes-0.16.0.md | 52 +++---- doc/release-notes/release-notes-0.16.1.md | 22 +-- doc/release-notes/release-notes-0.16.2.md | 18 +-- doc/release-notes/release-notes-0.16.3.md | 20 +-- doc/release-notes/release-notes-0.17.0.1.md | 8 +- doc/release-notes/release-notes-0.17.0.md | 102 ++++++------ doc/release-notes/release-notes-0.17.1.md | 24 +-- doc/release-notes/release-notes-0.18.0.md | 164 ++++++++++---------- doc/release-notes/release-notes-0.18.1.md | 22 +-- doc/release-notes/release-notes-0.19.0.1.md | 106 ++++++------- doc/release-notes/release-notes-0.20.0.md | 6 +- doc/release-notes/release-notes-0.20.1.md | 2 +- doc/release-notes/release-notes-0.21.0.md | 2 +- doc/release-notes/release-notes-0.3.12.md | 4 +- doc/release-notes/release-notes-0.3.13.md | 6 +- doc/release-notes/release-notes-0.3.14.md | 2 +- doc/release-notes/release-notes-0.3.15.md | 2 +- doc/release-notes/release-notes-0.3.18.md | 2 +- doc/release-notes/release-notes-0.3.20.2.md | 8 +- doc/release-notes/release-notes-0.3.20.md | 16 +- doc/release-notes/release-notes-0.3.21.md | 16 +- doc/release-notes/release-notes-0.3.22.md | 4 +- doc/release-notes/release-notes-0.3.23.md | 6 +- doc/release-notes/release-notes-0.3.24.md | 10 +- doc/release-notes/release-notes-0.4.0.md | 48 +++--- doc/release-notes/release-notes-0.4.1.md | 30 ++-- doc/release-notes/release-notes-0.4.3.md | 10 +- doc/release-notes/release-notes-0.4.4.md | 10 +- doc/release-notes/release-notes-0.4.6.md | 22 +-- doc/release-notes/release-notes-0.5.0.md | 38 ++--- doc/release-notes/release-notes-0.5.1.md | 22 +-- doc/release-notes/release-notes-0.5.2.md | 8 +- doc/release-notes/release-notes-0.5.3.md | 20 +-- doc/release-notes/release-notes-0.5.4.md | 12 +- doc/release-notes/release-notes-0.5.5.md | 22 +-- doc/release-notes/release-notes-0.6.0.md | 42 ++--- doc/release-notes/release-notes-0.6.2.md | 6 +- doc/release-notes/release-notes-0.6.3.md | 12 +- doc/release-notes/release-notes-0.7.0.md | 34 ++-- doc/release-notes/release-notes-0.7.1.md | 18 +-- doc/release-notes/release-notes-0.7.2.md | 8 +- doc/release-notes/release-notes-0.8.0.md | 10 +- doc/release-notes/release-notes-0.8.1.md | 6 +- doc/release-notes/release-notes-0.8.2.md | 14 +- doc/release-notes/release-notes-0.8.3.md | 4 +- doc/release-notes/release-notes-0.8.4.md | 14 +- doc/release-notes/release-notes-0.8.5.md | 6 +- doc/release-notes/release-notes-0.8.6.md | 10 +- doc/release-notes/release-notes-0.9.0.md | 48 +++--- doc/release-notes/release-notes-0.9.1.md | 12 +- doc/release-notes/release-notes-0.9.2.1.md | 10 +- doc/release-notes/release-notes-0.9.2.md | 10 +- doc/release-notes/release-notes-0.9.3.md | 12 +- doc/release-notes/release-notes-0.9.4.md | 20 +-- doc/release-notes/release-notes-0.9.5.md | 14 +- 76 files changed, 1059 insertions(+), 1059 deletions(-) diff --git a/doc/release-notes/release-notes-0.10.0.md b/doc/release-notes/release-notes-0.10.0.md index 85ea0f0731..5cb4c09c8f 100644 --- a/doc/release-notes/release-notes-0.10.0.md +++ b/doc/release-notes/release-notes-0.10.0.md @@ -1,6 +1,6 @@ -BGL Core version 0.10.0 is now available from: +Bitcoin Core version 0.10.0 is now available from: - https://BGL.org/bin/0.10.0/ + https://bitcoin.org/bin/0.10.0/ This is a new major version release, bringing both new features and bug fixes. @@ -17,15 +17,15 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). Downgrading warning --------------------- Because release 0.10.0 makes use of headers-first synchronization and parallel block download (see further), the block files and databases are not -backwards-compatible with older versions of BGL Core or other software: +backwards-compatible with older versions of Bitcoin Core or other software: * Blocks will be stored on disk out of order (in the order they are received, really), which makes it incompatible with some tools or @@ -50,7 +50,7 @@ Notable changes Faster synchronization ---------------------- -BGL Core now uses 'headers-first synchronization'. This means that we first +Bitcoin Core now uses 'headers-first synchronization'. This means that we first ask peers for block headers (a total of 27 megabytes, as of December 2014) and validate those. In a second stage, when the headers have been discovered, we download the blocks. However, as we already know about the whole chain in @@ -172,7 +172,7 @@ improved by making the signatures constant time and deterministic. This change is a result of switching signing to use libsecp256k1 instead of OpenSSL. Libsecp256k1 is a cryptographic library -optimized for the curve BGL uses which was created by BGL +optimized for the curve Bitcoin uses which was created by Bitcoin Core developer Pieter Wuille. There exist attacks[1] against most ECC implementations where an @@ -187,7 +187,7 @@ long time, but this functionality has still not made its way into a released version of OpenSSL. Libsecp256k1 achieves significantly stronger protection: As far as we're aware this is the only deployed implementation of constant time signing for -the curve BGL uses and we have reason to believe that +the curve Bitcoin uses and we have reason to believe that libsecp256k1 is better tested and more thoroughly reviewed than the implementation in OpenSSL. @@ -222,21 +222,21 @@ addresses need to added to the wallet before the payment, though. Consensus library ----------------- -Starting from 0.10.0, the BGL Core distribution includes a consensus library. +Starting from 0.10.0, the Bitcoin Core distribution includes a consensus library. The purpose of this library is to make the verification functionality that is -critical to BGL's consensus available to other applications, e.g. to language -bindings such as [python-BGLlib](https://pypi.python.org/pypi/python-BGLlib) or +critical to Bitcoin's consensus available to other applications, e.g. to language +bindings such as [python-bitcoinlib](https://pypi.python.org/pypi/python-bitcoinlib) or alternative node implementations. -This library is called `libBGLconsensus.so` (or, `.dll` for Windows). -Its interface is defined in the C header [BGLconsensus.h](https://github.com/BitgesellOfficial/bitgesell/blob/master/src/script/BGLconsensus.h). +This library is called `libbitcoinconsensus.so` (or, `.dll` for Windows). +Its interface is defined in the C header [bitcoinconsensus.h](https://github.com/bitcoin/bitcoin/blob/0.10/src/script/bitcoinconsensus.h). In its initial version the API includes two functions: -- `BGLconsensus_verify_script` verifies a script. It returns whether the indicated input of the provided serialized transaction +- `bitcoinconsensus_verify_script` verifies a script. It returns whether the indicated input of the provided serialized transaction correctly spends the passed scriptPubKey under additional constraints indicated by flags -- `BGLconsensus_version` returns the API version, currently at an experimental `0` +- `bitcoinconsensus_version` returns the API version, currently at an experimental `0` The functionality is planned to be extended to e.g. UTXO management in upcoming releases, but the interface for existing methods should remain stable. @@ -247,25 +247,25 @@ Standard script rules relaxed for P2SH addresses The IsStandard() rules have been almost completely removed for P2SH redemption scripts, allowing applications to make use of any valid script type, such as "n-of-m OR y", hash-locked oracle addresses, etc. -While the BGL protocol has always supported these types of script, +While the Bitcoin protocol has always supported these types of script, actually using them on mainnet has been previously inconvenient as -standard BGL Core nodes wouldn't relay them to miners, nor would +standard Bitcoin Core nodes wouldn't relay them to miners, nor would most miners include them in blocks they mined. -BGL-tx +bitcoin-tx ---------- -It has been observed that many of the RPC functions offered by BGLd are -"pure functions", and operate independently of the BGLd wallet. This +It has been observed that many of the RPC functions offered by bitcoind are +"pure functions", and operate independently of the bitcoind wallet. This included many of the RPC "raw transaction" API functions, such as createrawtransaction. -BGL-tx is a newly introduced command line utility designed to enable easy -manipulation of BGL transactions. A summary of its operation may be -obtained via "BGL-tx --help" Transactions may be created or signed in a +bitcoin-tx is a newly introduced command line utility designed to enable easy +manipulation of bitcoin transactions. A summary of its operation may be +obtained via "bitcoin-tx --help" Transactions may be created or signed in a manner similar to the RPC raw tx API. Transactions may be updated, deleting inputs or outputs, or appending new inputs and outputs. Custom scripts may be -easily composed using a simple text notation, borrowed from the BGL test +easily composed using a simple text notation, borrowed from the bitcoin test suite. This tool may be used for experimenting with new transaction types, signing @@ -273,16 +273,16 @@ multi-party transactions, and many other uses. Long term, the goal is to deprecate and remove "pure function" RPC API calls, as those do not require a server round-trip to execute. -Other utilities "BGL-key" and "BGL-script" have been proposed, making +Other utilities "bitcoin-key" and "bitcoin-script" have been proposed, making key and script operations easily accessible via command line. Mining and relay policy enhancements ------------------------------------ -BGL Core's block templates are now for version 3 blocks only, and any mining +Bitcoin Core's block templates are now for version 3 blocks only, and any mining software relying on its `getblocktemplate` must be updated in parallel to use libblkmaker either version 0.4.2 or any version from 0.5.1 onward. -If you are solo mining, this will affect you the moment you upgrade BGL +If you are solo mining, this will affect you the moment you upgrade Bitcoin Core, which must be done prior to BIP66 achieving its 951/1001 status. If you are mining with the stratum mining protocol: this does not affect you. If you are mining with the getblocktemplate protocol to a pool: this will affect @@ -292,10 +292,10 @@ achieving its 951/1001 status. The `prioritisetransaction` RPC method has been added to enable miners to manipulate the priority of transactions on an individual basis. -BGL Core now supports BIP 22 long polling, so mining software can be +Bitcoin Core now supports BIP 22 long polling, so mining software can be notified immediately of new templates rather than having to poll periodically. -Support for BIP 23 block proposals is now available in BGL Core's +Support for BIP 23 block proposals is now available in Bitcoin Core's `getblocktemplate` method. This enables miners to check the basic validity of their next block before expending work on it, reducing risks of accidental hardforks or mining invalid blocks. @@ -313,9 +313,9 @@ AllowFreeThreshold(), in which case they are relayed subject to the rate limiter BIP 66: strict DER encoding for signatures ------------------------------------------ -BGL Core 0.10 implements BIP 66, which introduces block version 3, and a new +Bitcoin Core 0.10 implements BIP 66, which introduces block version 3, and a new consensus rule, which prohibits non-DER signatures. Such transactions have been -non-standard since BGL v0.8.0 (released in February 2013), but were +non-standard since Bitcoin v0.8.0 (released in February 2013), but were technically still permitted inside blocks. This change breaks the dependency on OpenSSL's signature parsing, and is @@ -337,10 +337,10 @@ Detailed release notes follow. This overview includes changes that affect extern behavior, not code moves, refactors or string updates. RPC: -- `f923c07` Support IPv6 lookup in BGL-cli even when IPv6 only bound on localhost +- `f923c07` Support IPv6 lookup in bitcoin-cli even when IPv6 only bound on localhost - `b641c9c` Fix addnode "onetry": Connect with OpenNetworkConnection - `171ca77` estimatefee / estimatepriority RPC methods -- `b750cf1` Remove cli functionality from BGLd +- `b750cf1` Remove cli functionality from bitcoind - `f6984e8` Add "chain" to getmininginfo, improve help in getblockchaininfo - `99ddc6c` Add nLocalServices info to RPC getinfo - `cf0c47b` Remove getwork() RPC call @@ -391,7 +391,7 @@ Command-line options: - `4278b1d` Clarify error message when invalid -rpcallowip - `6b407e4` -datadir is now allowed in config files - `bdd5b58` Add option `-sysperms` to disable 077 umask (create new files with system default umask) -- `cbe39a3` Add "BGL-tx" command line utility and supporting modules +- `cbe39a3` Add "bitcoin-tx" command line utility and supporting modules - `dbca89b` Trigger -alertnotify if network is upgrading without you - `ad96e7c` Make -reindex cope with out-of-order blocks - `16d5194` Skip reindexed blocks individually @@ -465,7 +465,7 @@ P2P protocol and network code: - `35e408f` Regard connection failures as attempt for addrman - `a3a7317` Introduce 10 minute block download timeout - `3022e7d` Require sufficent priority for relay of free transactions -- `58fda4d` Update seed IPs, based on BGL.sipa.be crawler data +- `58fda4d` Update seed IPs, based on bitcoin.sipa.be crawler data - `18021d0` Remove bitnodes.io from dnsseeds. Validation: @@ -492,13 +492,13 @@ Build system: - `9ce0774` build: Fix windows configure when using --with-qt-libdir - `ea96475` build: Add mention of --disable-wallet to bdb48 error messages - `1dec09b` depends: add shared dependency builder -- `c101c76` build: Add --with-utils (BGL-cli and BGL-tx, default=yes). Help string consistency tweaks. Target sanity check fix +- `c101c76` build: Add --with-utils (bitcoin-cli and bitcoin-tx, default=yes). Help string consistency tweaks. Target sanity check fix - `e432a5f` build: add option for reducing exports (v2) - `6134b43` Fixing condition 'sabotaging' MSVC build - `af0bd5e` osx: fix signing to make Gatekeeper happy (again) - `a7d1f03` build: fix dynamic boost check when --with-boost= is used - `d5fd094` build: fix qt test build when libprotobuf is in a non-standard path -- `2cf5f16` Add libBGLconsensus library +- `2cf5f16` Add libbitcoinconsensus library - `914868a` build: add a deterministic dmg signer - `2d375fe` depends: bump openssl to 1.0.1k - `b7a4ecc` Build: Only check for boost when building code that requires it @@ -522,7 +522,7 @@ Wallet: GUI: - `c21c74b` osx: Fix missing dock menu with qt5 - `b90711c` Fix Transaction details shows wrong To: -- `516053c` Make links in 'About BGL Core' clickable +- `516053c` Make links in 'About Bitcoin Core' clickable - `bdc83e8` Ensure payment request network matches client network - `65f78a1` Add GUI view of peer information - `06a91d9` VerifyDB progress reporting @@ -539,7 +539,7 @@ GUI: - `7007402` Implement SI-style (thin space) thoudands separator - `91cce17` Use fixed-point arithmetic in amount spinbox - `bdba2dd` Remove an obscure option no-one cares about -- `bd0aa10` Replace the temporary file hack currently used to change BGL-Qt's dock icon (OS X) with a buffer-based solution +- `bd0aa10` Replace the temporary file hack currently used to change Bitcoin-Qt's dock icon (OS X) with a buffer-based solution - `94e1b9e` Re-work overviewpage UI - `8bfdc9a` Better looking trayicon - `b197bf3` disable tray interactions when client model set to 0 @@ -585,8 +585,8 @@ Tests: - `4cac5db` script tests: value with trailing 0x00 is true - `89101c6` script test: test case for 5-byte bools - `d2d9dc0` script tests: add tests for CHECKMULTISIG limits -- `d789386` Add "it works" test for BGL-tx -- `df4d61e` Add BGL-tx tests +- `d789386` Add "it works" test for bitcoin-tx +- `df4d61e` Add bitcoin-tx tests - `aa41ac2` Test IsPushOnly() with invalid push - `6022b5d` Make `script_{valid,invalid}.json` validation flags configurable - `8138cbe` Add automatic script test generation, and actual checksig tests @@ -598,7 +598,7 @@ Tests: - `2b62e17` Clearly separate PUSHDATA and numeric argument MINIMALDATA tests - `16d78bd` Add valid invert of invalid every numeric opcode tests - `f635269` tests: enable alertnotify test for Windows -- `7a41614` tests: allow rpc-tests to get filenames for BGLd and BGL-cli from the environment +- `7a41614` tests: allow rpc-tests to get filenames for bitcoind and bitcoin-cli from the environment - `5122ea7` tests: fix forknotify.py on windows - `fa7f8cd` tests: remove old pull-tester scripts - `7667850` tests: replace the old (unused since Travis) tests with new rpc test scripts @@ -624,7 +624,7 @@ Tests: Miscellaneous: - `122549f` Fix incorrect checkpoint data for testnet3 - `5bd02cf` Log used config file to debug.log on startup -- `68ba85f` Updated Debian example BGL.conf with config from wiki + removed some cruft and updated comments +- `68ba85f` Updated Debian example bitcoin.conf with config from wiki + removed some cruft and updated comments - `e5ee8f0` Remove -beta suffix - `38405ac` Add comment regarding experimental-use service bits - `be873f6` Issue warning if collecting RandSeed data failed @@ -635,7 +635,7 @@ Miscellaneous: - `cd01a5e` Enable paranoid corruption checks in LevelDB >= 1.16 - `9365937` Add comment about never updating nTimeOffset past 199 samples - `403c1bf` contrib: remove getwork-based pyminer (as getwork API call has been removed) -- `0c3e101` contrib: Added systemd .service file in order to help distributions integrate BGLd +- `0c3e101` contrib: Added systemd .service file in order to help distributions integrate bitcoind - `0a0878d` doc: Add new DNSseed policy - `2887bff` Update coding style and add .clang-format - `5cbda4f` Changed LevelDB cursors to use scoped pointers to ensure destruction when going out of scope @@ -758,5 +758,5 @@ Thanks to everyone who contributed to this release: - Yoichi Hirai - Zak Wilcox -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.10.1.md b/doc/release-notes/release-notes-0.10.1.md index 8c28320f33..8f59f1f68c 100644 --- a/doc/release-notes/release-notes-0.10.1.md +++ b/doc/release-notes/release-notes-0.10.1.md @@ -1,13 +1,13 @@ -BGL Core version 0.10.1 is now available from: +Bitcoin Core version 0.10.1 is now available from: - + This is a new minor version release, bringing bug fixes and translation updates. It is recommended to upgrade to this version. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= @@ -17,15 +17,15 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). Downgrade warning ------------------ Because release 0.10.0 and later makes use of headers-first synchronization and parallel block download (see further), the block files and databases are not -backwards-compatible with pre-0.10 versions of BGL Core or other software: +backwards-compatible with pre-0.10 versions of Bitcoin Core or other software: * Blocks will be stored on disk out of order (in the order they are received, really), which makes it incompatible with some tools or @@ -48,7 +48,7 @@ Notable changes This is a minor release and hence there are no notable changes. For the notable changes in 0.10, refer to the release notes for the -0.10.0 release at https://github.com/BGL/BGL/blob/v0.10.0/doc/release-notes.md +0.10.0 release at https://github.com/bitcoin/bitcoin/blob/v0.10.0/doc/release-notes.md 0.10.1 Change log ================= @@ -140,4 +140,4 @@ And all those who contributed additional code review and/or security research: - Sergio Demian Lerner - Sharon Goldberg -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.10.2.md b/doc/release-notes/release-notes-0.10.2.md index b4fee60a9f..192ed69d29 100644 --- a/doc/release-notes/release-notes-0.10.2.md +++ b/doc/release-notes/release-notes-0.10.2.md @@ -1,13 +1,13 @@ -BGL Core version 0.10.2 is now available from: +Bitcoin Core version 0.10.2 is now available from: - + This is a new minor version release, bringing minor bug fixes and translation updates. It is recommended to upgrade to this version. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= @@ -17,15 +17,15 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). Downgrade warning ------------------ Because release 0.10.0 and later makes use of headers-first synchronization and parallel block download (see further), the block files and databases are not -backwards-compatible with pre-0.10 versions of BGL Core or other software: +backwards-compatible with pre-0.10 versions of Bitcoin Core or other software: * Blocks will be stored on disk out of order (in the order they are received, really), which makes it incompatible with some tools or @@ -47,12 +47,12 @@ Notable changes =============== This fixes a serious problem on Windows with data directories that have non-ASCII -characters (https://github.com/BGL/BGL/issues/6078). +characters (https://github.com/bitcoin/bitcoin/issues/6078). For other platforms there are no notable changes. For the notable changes in 0.10, refer to the release notes -at https://github.com/BGL/BGL/blob/v0.10.0/doc/release-notes.md +at https://github.com/bitcoin/bitcoin/blob/v0.10.0/doc/release-notes.md 0.10.2 Change log ================= @@ -83,4 +83,4 @@ And all those who contributed additional code review and/or security research: - Pieter Wuille - vayvanne -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.10.3.md b/doc/release-notes/release-notes-0.10.3.md index c8cc2319e8..8a110e562c 100644 --- a/doc/release-notes/release-notes-0.10.3.md +++ b/doc/release-notes/release-notes-0.10.3.md @@ -1,13 +1,13 @@ -BGL Core version 0.10.3 is now available from: +Bitcoin Core version 0.10.3 is now available from: - + This is a new minor version release, bringing security fixes and translation updates. It is recommended to upgrade to this version as soon as possible. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= @@ -17,15 +17,15 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). Downgrade warning ------------------ Because release 0.10.0 and later makes use of headers-first synchronization and parallel block download (see further), the block files and databases are not -backwards-compatible with pre-0.10 versions of BGL Core or other software: +backwards-compatible with pre-0.10 versions of Bitcoin Core or other software: * Blocks will be stored on disk out of order (in the order they are received, really), which makes it incompatible with some tools or @@ -60,7 +60,7 @@ using distribution provided packages. Additionally, upnp has been disabled by default. This may result in a lower number of reachable nodes on IPv4, however this prevents future libupnpc vulnerabilities from being a structural risk to the network -(see https://github.com/BGL/BGL/pull/6795). +(see https://github.com/bitcoin/bitcoin/pull/6795). Test for LowS signatures before relaying ----------------------------------------- @@ -75,26 +75,26 @@ for nuisance malleability on SIGHASH_ALL P2PKH transactions. On the down-side it will block most transactions made by sufficiently out of date software. Unlike the other avenues to change txids on transactions this -one was randomly violated by all deployed BGL software prior to +one was randomly violated by all deployed bitcoin software prior to its discovery. So, while other malleability vectors where made non-standard as soon as they were discovered, this one has remained permitted. Even BIP62 did not propose applying this rule to old version transactions, but conforming implementations have become much more common since BIP62 was initially written. -BGL Core has produced compatible signatures since a28fb70e in +Bitcoin Core has produced compatible signatures since a28fb70e in September 2013, but this didn't make it into a release until 0.9 -in March 2014; BGLj has done so for a similar span of time. -BGLjs and electrum have been more recently updated. +in March 2014; Bitcoinj has done so for a similar span of time. +Bitcoinjs and electrum have been more recently updated. This does not replace the need for BIP62 or similar, as miners can still cooperate to break transactions. Nor does it replace the need for wallet software to handle malleability sanely[1]. This only eliminates the cheap and irritating DOS attack. -[1] On the Malleability of BGL Transactions +[1] On the Malleability of Bitcoin Transactions Marcin Andrychowicz, Stefan Dziembowski, Daniel Malinowski, Łukasz Mazurek -http://fc15.ifca.ai/preproceedings/BGL/paper_9.pdf +http://fc15.ifca.ai/preproceedings/bitcoin/paper_9.pdf Minimum relay fee default increase ----------------------------------- @@ -107,7 +107,7 @@ outrageous memory usage on nodes due to the mempool ballooning. This is a temporary measure, bridging the time until a dynamic method for determining this fee is merged (which will be in 0.12). -(see https://github.com/BGL/BGL/pull/6793, as well as the 0.11.0 +(see https://github.com/bitcoin/bitcoin/pull/6793, as well as the 0.11.0 release notes, in which this value was suggested) 0.10.3 Change log @@ -162,4 +162,4 @@ And all those who contributed additional code review and/or security research: - timothy on IRC for reporting the issue - Vulnerability in miniupnp discovered by Aleksandar Nikolic of Cisco Talos -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.10.4.md b/doc/release-notes/release-notes-0.10.4.md index e3dff3ca4c..38a2c1347d 100644 --- a/doc/release-notes/release-notes-0.10.4.md +++ b/doc/release-notes/release-notes-0.10.4.md @@ -1,6 +1,6 @@ -BGL Core version 0.10.4 is now available from: +Bitcoin Core version 0.10.4 is now available from: - + This is a new minor version release, bringing bug fixes, the BIP65 (CLTV) consensus change, and relay policy preparation for BIP113. It is @@ -8,7 +8,7 @@ recommended to upgrade to this version as soon as possible. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= @@ -18,15 +18,15 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). Downgrade warning ------------------ Because release 0.10.0 and later makes use of headers-first synchronization and parallel block download (see further), the block files and databases are not -backwards-compatible with pre-0.10 versions of BGL Core or other software: +backwards-compatible with pre-0.10 versions of Bitcoin Core or other software: * Blocks will be stored on disk out of order (in the order they are received, really), which makes it incompatible with some tools or @@ -68,24 +68,24 @@ specified point in the future. blocks if they comply with the BIP65 rules for CLTV. For more information about the soft-forking change, please see - + Graphs showing the progress towards block version 4 adoption may be found at the URLs below: - Block versions over the last 50,000 blocks as progress towards BIP65 - consensus enforcement: + consensus enforcement: - Block versions over the last 2,000 blocks showing the days to the - earliest possible BIP65 consensus-enforced block: + earliest possible BIP65 consensus-enforced block: -**Notice to miners:** BGL Core’s block templates are now for +**Notice to miners:** Bitcoin Core’s block templates are now for version 4 blocks only, and any mining software relying on its getblocktemplate must be updated in parallel to use libblkmaker either version FIXME or any version from FIXME onward. - If you are solo mining, this will affect you the moment you upgrade - BGL Core, which must be done prior to BIP65 achieving its 951/1001 + Bitcoin Core, which must be done prior to BIP65 achieving its 951/1001 status. - If you are mining with the stratum mining protocol: this does not @@ -95,19 +95,19 @@ version FIXME or any version from FIXME onward. will affect you at the pool operator’s discretion, which must be no later than BIP65 achieving its 951/1001 status. -[BIP65]: https://github.com/BGL/bips/blob/master/bip-0065.mediawiki +[BIP65]: https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki Windows bug fix for corrupted UTXO database on unclean shutdowns ---------------------------------------------------------------- Several Windows users reported that they often need to reindex the -entire blockchain after an unclean shutdown of BGL Core on Windows +entire blockchain after an unclean shutdown of Bitcoin Core on Windows (or an unclean shutdown of Windows itself). Although unclean shutdowns remain unsafe, this release no longer relies on memory-mapped files for the UTXO database, which significantly reduced the frequency of unclean shutdowns leading to required reindexes during testing. -For more information, see: +For more information, see: Other fixes for database corruption on Windows are expected in the next major release. @@ -129,8 +129,8 @@ git merge commit are mentioned. - #6953 `a2f2fb6` build: disable -Wself-assign - #6953 `cf67d8b` Bugfix: Allow mining on top of old tip blocks for testnet (fixes testnet-in-a-box use case) - #6953 `b3964e3` Drop "with minimal dependencies" from description -- #6953 `43c2789` Split BGL-tx into its own package -- #6953 `dfe0d4d` Include BGL-tx binary on Debian/Ubuntu +- #6953 `43c2789` Split bitcoin-tx into its own package +- #6953 `dfe0d4d` Include bitcoin-tx binary on Debian/Ubuntu - #6953 `612efe8` [Qt] Raise debug window when requested - #6953 `3ad96bd` Fix locking in GetTransaction - #6953 `9c81005` Fix spelling of Qt @@ -169,4 +169,4 @@ Thanks to everyone who directly contributed to this release: And those who contributed additional code review and/or security research. -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.11.0.md b/doc/release-notes/release-notes-0.11.0.md index b2756aa40a..28e49fb7ea 100644 --- a/doc/release-notes/release-notes-0.11.0.md +++ b/doc/release-notes/release-notes-0.11.0.md @@ -1,13 +1,13 @@ -BGL Core version 0.11.0 is now available from: +Bitcoin Core version 0.11.0 is now available from: - + This is a new major version release, bringing both new features and bug fixes. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= @@ -17,15 +17,15 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). Downgrade warning ------------------ Because release 0.10.0 and later makes use of headers-first synchronization and parallel block download (see further), the block files and databases are not -backwards-compatible with pre-0.10 versions of BGL Core or other software: +backwards-compatible with pre-0.10 versions of Bitcoin Core or other software: * Blocks will be stored on disk out of order (in the order they are received, really), which makes it incompatible with some tools or @@ -67,7 +67,7 @@ free transactions (with enough priority) will be accepted. It defaults to 15. Reducing this number reduces the speed at which the mempool can grow due to free transactions. -For example, add the following to `BGL.conf`: +For example, add the following to `bitcoin.conf`: minrelaytxfee=0.00005 limitfreerelay=5 @@ -82,11 +82,11 @@ Block file pruning This release supports running a fully validating node without maintaining a copy of the raw block and undo data on disk. To recap, there are four types of data -related to the blockchain in the BGL system: the raw blocks as received over +related to the blockchain in the bitcoin system: the raw blocks as received over the network (blk???.dat), the undo data (rev???.dat), the block index and the UTXO set (both LevelDB databases). The databases are built from the raw data. -Block pruning allows BGL Core to delete the raw block and undo data once +Block pruning allows Bitcoin Core to delete the raw block and undo data once it's been validated and used to build the databases. At that point, the raw data is used only to relay blocks to other nodes, to handle reorganizations, to look up old transactions (if -txindex is enabled or via the RPC/REST interfaces), or @@ -95,7 +95,7 @@ all blocks in the blockchain. The user specifies how much space to allot for block & undo files. The minimum allowed is 550MB. Note that this is in addition to whatever is required for the -block index and UTXO databases. The minimum was chosen so that BGL Core will +block index and UTXO databases. The minimum was chosen so that Bitcoin Core will be able to maintain at least 288 blocks on disk (two days worth of blocks at 10 minutes per block). In rare instances it is possible that the amount of space used will exceed the pruning target in order to keep the required last 288 @@ -192,7 +192,7 @@ transaction (re)broadcast: One such application is selective Tor usage, where the node runs on the normal internet but transactions are broadcasted over Tor. -For an example script see [BGL-submittx](https://github.com/laanwj/BGL-submittx). +For an example script see [bitcoin-submittx](https://github.com/laanwj/bitcoin-submittx). Privacy: Stream isolation for Tor ---------------------------------- @@ -297,7 +297,7 @@ git merge commit are mentioned. ### Build system - #5501 `c76c9d2` Add mips, mipsel and aarch64 to depends platforms -- #5334 `cf87536` libBGLconsensus: Add pkg-config support +- #5334 `cf87536` libbitcoinconsensus: Add pkg-config support - #5514 `ed11d53` Fix 'make distcheck' - #5505 `a99ef7d` Build winshutdownmonitor.cpp on Windows only - #5582 `e8a6639` Osx toolchain update @@ -309,7 +309,7 @@ git merge commit are mentioned. - #5149 `c7abfa5` Add script to verify all merge commits are signed - #6082 `7abbb7e` qt: disable qt tests when one of the checks for the gui fails - #6244 `0401aa2` configure: Detect (and reject) LibreSSL -- #6269 `95aca44` gitian: Use the new BGL-detached-sigs git repo for OSX signatures +- #6269 `95aca44` gitian: Use the new bitcoin-detached-sigs git repo for OSX signatures - #6285 `ef1d506` Fix scheduler build with some boost versions. - #6280 `25c2216` depends: fix Boost 1.55 build on GCC 5 - #6303 `b711599` gitian: add a gitian-win-signer descriptor @@ -346,8 +346,8 @@ git merge commit are mentioned. - #5626 `ab0d798` Fix icon sizes and column width - #5683 `c7b22aa` add new osx dmg background picture - #5620 `7823598` Payment request expiration bug fix -- #5729 `9c4a5a5` Allow unit changes for read-only BGLAmountField -- #5753 `0f44672` Add BGL logo to about screen +- #5729 `9c4a5a5` Allow unit changes for read-only BitcoinAmountField +- #5753 `0f44672` Add bitcoin logo to about screen - #5629 `a956586` Prevent amount overflow problem with payment requests - #5830 `215475a` Don't save geometry for options and about/help window - #5793 `d26f0b2` Honor current network when creating autostart link @@ -392,11 +392,11 @@ git merge commit are mentioned. - #5366 `47a79bb` No longer check osx compatibility in RenameThread - #5689 `07f4386` openssl: abstract out OPENSSL_cleanse - #5708 `8b298ca` Add list of implemented BIPs -- #5809 `46bfbe7` Add BGL-cli man page +- #5809 `46bfbe7` Add bitcoin-cli man page - #5839 `86eb461` keys: remove libsecp256k1 verification until it's actually supported - #5749 `d734d87` Help messages correctly formatted (79 chars) - #5884 `7077fe6` BUGFIX: Stack around the variable 'rv' was corrupted -- #5849 `41259ca` contrib/init/BGLd.openrc: Compatibility with previous OpenRC init script variables +- #5849 `41259ca` contrib/init/bitcoind.openrc: Compatibility with previous OpenRC init script variables - #5950 `41113e3` Fix locale fallback and guard tests against invalid locale settings - #5965 `7c6bfb1` Add git-subtree-check.sh script - #6033 `1623f6e` FreeBSD, OpenBSD thread renaming @@ -404,9 +404,9 @@ git merge commit are mentioned. - #6104 `3e2559c` Show an init message while activating best chain - #6125 `351f73e` Clean up parsing of bool command line args - #5964 `b4c219b` Lightweight task scheduler -- #6116 `30dc3c1` [OSX] rename BGL-Qt.app to BGL-Core.app +- #6116 `30dc3c1` [OSX] rename Bitcoin-Qt.app to Bitcoin-Core.app - #6168 `b3024f0` contrib/linearize: Support linearization of testnet blocks -- #6098 `7708fcd` Update Windows resource files (and add one for BGL-tx) +- #6098 `7708fcd` Update Windows resource files (and add one for bitcoin-tx) - #6159 `e1412d3` Catch errors on datadir lock and pidfile delete - #6186 `182686c` Fix two problems in CSubnet parsing - #6174 `df992b9` doc: add translation strings policy @@ -427,7 +427,7 @@ Thanks to everyone who directly contributed to this release: - azeteki - Ben Holden-Crowther - bikinibabe -- BGLPRReadingGroup +- BitcoinPRReadingGroup - Blake Jakopovic - BtcDrak - charlescharles @@ -501,5 +501,5 @@ And all those who contributed additional code review and/or security research: - Sergio Demian Lerner -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.11.1.md b/doc/release-notes/release-notes-0.11.1.md index 87d718c1e1..799205691e 100644 --- a/doc/release-notes/release-notes-0.11.1.md +++ b/doc/release-notes/release-notes-0.11.1.md @@ -1,13 +1,13 @@ -BGL Core version 0.11.1 is now available from: +Bitcoin Core version 0.11.1 is now available from: - + This is a new minor version release, bringing security fixes. It is recommended to upgrade to this version as soon as possible. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= @@ -17,15 +17,15 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). Downgrade warning ------------------ Because release 0.10.0 and later makes use of headers-first synchronization and parallel block download (see further), the block files and databases are not -backwards-compatible with pre-0.10 versions of BGL Core or other software: +backwards-compatible with pre-0.10 versions of Bitcoin Core or other software: * Blocks will be stored on disk out of order (in the order they are received, really), which makes it incompatible with some tools or @@ -61,7 +61,7 @@ using distribution provided packages. Additionally, upnp has been disabled by default. This may result in a lower number of reachable nodes on IPv4, however this prevents future libupnpc vulnerabilities from being a structural risk to the network -(see https://github.com/BGL/BGL/pull/6795). +(see https://github.com/bitcoin/bitcoin/pull/6795). Test for LowS signatures before relaying ----------------------------------------- @@ -76,26 +76,26 @@ for nuisance malleability on SIGHASH_ALL P2PKH transactions. On the down-side it will block most transactions made by sufficiently out of date software. Unlike the other avenues to change txids on transactions this -one was randomly violated by all deployed BGL software prior to +one was randomly violated by all deployed bitcoin software prior to its discovery. So, while other malleability vectors where made non-standard as soon as they were discovered, this one has remained permitted. Even BIP62 did not propose applying this rule to old version transactions, but conforming implementations have become much more common since BIP62 was initially written. -BGL Core has produced compatible signatures since a28fb70e in +Bitcoin Core has produced compatible signatures since a28fb70e in September 2013, but this didn't make it into a release until 0.9 -in March 2014; BGLj has done so for a similar span of time. -BGLjs and electrum have been more recently updated. +in March 2014; Bitcoinj has done so for a similar span of time. +Bitcoinjs and electrum have been more recently updated. This does not replace the need for BIP62 or similar, as miners can still cooperate to break transactions. Nor does it replace the need for wallet software to handle malleability sanely[1]. This only eliminates the cheap and irritating DOS attack. -[1] On the Malleability of BGL Transactions +[1] On the Malleability of Bitcoin Transactions Marcin Andrychowicz, Stefan Dziembowski, Daniel Malinowski, Łukasz Mazurek -http://fc15.ifca.ai/preproceedings/BGL/paper_9.pdf +http://fc15.ifca.ai/preproceedings/bitcoin/paper_9.pdf Minimum relay fee default increase ----------------------------------- @@ -108,7 +108,7 @@ outrageous memory usage on nodes due to the mempool ballooning. This is a temporary measure, bridging the time until a dynamic method for determining this fee is merged (which will be in 0.12). -(see https://github.com/BGL/BGL/pull/6793, as well as the 0.11 +(see https://github.com/bitcoin/bitcoin/pull/6793, as well as the 0.11 release notes, in which this value was suggested) 0.11.1 Change log @@ -124,7 +124,7 @@ git merge commit are mentioned. - #6384 `8e5a969` qt: Force TLS1.0+ for SSL connections - #6471 `92401c2` Depends: bump to qt 5.5 - #6224 `93b606a` Be even stricter in processing unrequested blocks -- #6571 `100ac4e` libBGLconsensus: avoid a crash in multi-threaded environments +- #6571 `100ac4e` libbitcoinconsensus: avoid a crash in multi-threaded environments - #6545 `649f5d9` Do not store more than 200 timedata samples. - #6694 `834e299` [QT] fix thin space word wrap line break issue - #6703 `1cd7952` Backport bugfixes to 0.11 @@ -168,5 +168,5 @@ And those who contributed additional code review and/or security research: - timothy on IRC for reporting the issue - Vulnerability in miniupnp discovered by Aleksandar Nikolic of Cisco Talos -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.11.2.md b/doc/release-notes/release-notes-0.11.2.md index 993be89890..2351b80656 100644 --- a/doc/release-notes/release-notes-0.11.2.md +++ b/doc/release-notes/release-notes-0.11.2.md @@ -1,6 +1,6 @@ -BGL Core version 0.11.2 is now available from: +Bitcoin Core version 0.11.2 is now available from: - + This is a new minor version release, bringing bug fixes, the BIP65 (CLTV) consensus change, and relay policy preparation for BIP113. It is @@ -8,7 +8,7 @@ recommended to upgrade to this version as soon as possible. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= @@ -18,15 +18,15 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). Downgrade warning ------------------ Because release 0.10.0 and later makes use of headers-first synchronization and parallel block download (see further), the block files and databases are not -backwards-compatible with pre-0.10 versions of BGL Core or other software: +backwards-compatible with pre-0.10 versions of Bitcoin Core or other software: * Blocks will be stored on disk out of order (in the order they are received, really), which makes it incompatible with some tools or @@ -68,24 +68,24 @@ specified point in the future. blocks if they comply with the BIP65 rules for CLTV. For more information about the soft-forking change, please see - + Graphs showing the progress towards block version 4 adoption may be found at the URLs below: - Block versions over the last 50,000 blocks as progress towards BIP65 - consensus enforcement: + consensus enforcement: - Block versions over the last 2,000 blocks showing the days to the - earliest possible BIP65 consensus-enforced block: + earliest possible BIP65 consensus-enforced block: -**Notice to miners:** BGL Core’s block templates are now for +**Notice to miners:** Bitcoin Core’s block templates are now for version 4 blocks only, and any mining software relying on its getblocktemplate must be updated in parallel to use libblkmaker either version 0.4.3 or any version from 0.5.2 onward. - If you are solo mining, this will affect you the moment you upgrade - BGL Core, which must be done prior to BIP65 achieving its 951/1001 + Bitcoin Core, which must be done prior to BIP65 achieving its 951/1001 status. - If you are mining with the stratum mining protocol: this does not @@ -95,12 +95,12 @@ version 0.4.3 or any version from 0.5.2 onward. will affect you at the pool operator’s discretion, which must be no later than BIP65 achieving its 951/1001 status. -[BIP65]: https://github.com/BGL/bips/blob/master/bip-0065.mediawiki +[BIP65]: https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki BIP113 mempool-only locktime enforcement using GetMedianTimePast() ---------------------------------------------------------------- -BGL transactions currently may specify a locktime indicating when +Bitcoin transactions currently may specify a locktime indicating when they may be added to a valid block. Current consensus rules require that blocks have a block header time greater than the locktime specified in any transaction in that block. @@ -143,19 +143,19 @@ forward. To compensate, subtract one hour (3,600 seconds) from your locktimes to allow those transactions to be included in mempools at approximately the expected time. -[BIP113]: https://github.com/BGL/bips/blob/master/bip-0113.mediawiki +[BIP113]: https://github.com/bitcoin/bips/blob/master/bip-0113.mediawiki Windows bug fix for corrupted UTXO database on unclean shutdowns ---------------------------------------------------------------- Several Windows users reported that they often need to reindex the -entire blockchain after an unclean shutdown of BGL Core on Windows +entire blockchain after an unclean shutdown of Bitcoin Core on Windows (or an unclean shutdown of Windows itself). Although unclean shutdowns remain unsafe, this release no longer relies on memory-mapped files for the UTXO database, which significantly reduced the frequency of unclean shutdowns leading to required reindexes during testing. -For more information, see: +For more information, see: Other fixes for database corruption on Windows are expected in the next major release. @@ -176,8 +176,8 @@ git merge commit are mentioned. - #6351 `6af25b0` Add BIP65 to getblockchaininfo softforks list - #6688 `01878c9` Fix locking in GetTransaction - #6653 `b3eaa30` [Qt] Raise debug window when requested -- #6600 `1e672ae` Debian/Ubuntu: Include BGL-tx binary -- #6600 `2394f4d` Debian/Ubuntu: Split BGL-tx into its own package +- #6600 `1e672ae` Debian/Ubuntu: Include bitcoin-tx binary +- #6600 `2394f4d` Debian/Ubuntu: Split bitcoin-tx into its own package - #5987 `33d6825` Bugfix: Allow mining on top of old tip blocks for testnet - #6852 `21e58b8` build: make sure OpenSSL heeds noexecstack - #6846 `af6edac` alias `-h` for `--help` @@ -214,4 +214,4 @@ Thanks to everyone who directly contributed to this release: And those who contributed additional code review and/or security research. -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.12.0.md b/doc/release-notes/release-notes-0.12.0.md index 8ec9e83599..bc0d5ea3b0 100644 --- a/doc/release-notes/release-notes-0.12.0.md +++ b/doc/release-notes/release-notes-0.12.0.md @@ -1,12 +1,12 @@ -BGL Core version 0.12.0 is now available from: +Bitcoin Core version 0.12.0 is now available from: - + This is a new major version release, bringing new features and other improvements. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= @@ -16,8 +16,8 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). Downgrade warning ----------------- @@ -26,7 +26,7 @@ Downgrade warning Because release 0.10.0 and later makes use of headers-first synchronization and parallel block download (see further), the block files and databases are not -backwards-compatible with pre-0.10 versions of BGL Core or other software: +backwards-compatible with pre-0.10 versions of Bitcoin Core or other software: * Blocks will be stored on disk out of order (in the order they are received, really), which makes it incompatible with some tools or @@ -48,10 +48,10 @@ This does not affect wallet forward or backward compatibility. Because release 0.12.0 and later will obfuscate the chainstate on every fresh sync or reindex, the chainstate is not backwards-compatible with -pre-0.12 versions of BGL Core or other software. +pre-0.12 versions of Bitcoin Core or other software. If you want to downgrade after you have done a reindex with 0.12.0 or later, -you will need to reindex when you first start BGL Core version 0.11 or +you will need to reindex when you first start Bitcoin Core version 0.11 or earlier. Notable changes @@ -60,8 +60,8 @@ Notable changes Signature validation using libsecp256k1 --------------------------------------- -ECDSA signatures inside BGL transactions now use validation using -[libsecp256k1](https://github.com/BGL-core/secp256k1) instead of OpenSSL. +ECDSA signatures inside Bitcoin transactions now use validation using +[libsecp256k1](https://github.com/bitcoin-core/secp256k1) instead of OpenSSL. Depending on the platform, this means a significant speedup for raw signature validation speed. The advantage is largest on x86_64, where validation is over @@ -98,7 +98,7 @@ Direct headers announcement (BIP 130) ------------------------------------- Between compatible peers, [BIP 130] -(https://github.com/BGL/bips/blob/master/bip-0130.mediawiki) +(https://github.com/bitcoin/bips/blob/master/bip-0130.mediawiki) direct headers announcement is used. This means that blocks are advertised by announcing their headers directly, instead of just announcing the hash. In a reorganization, all new headers are sent, instead of just the new tip. This @@ -107,15 +107,15 @@ can often prevent an extra roundtrip before the actual block is downloaded. Memory pool limiting -------------------- -Previous versions of BGL Core had their mempool limited by checking +Previous versions of Bitcoin Core had their mempool limited by checking a transaction's fees against the node's minimum relay fee. There was no upper bound on the size of the mempool and attackers could send a large number of transactions paying just slighly more than the default minimum relay fee to crash nodes with relatively low RAM. A temporary workaround -for previous versions of BGL Core was to raise the default minimum +for previous versions of Bitcoin Core was to raise the default minimum relay fee. -BGL Core 0.12 will have a strict maximum size on the mempool. The +Bitcoin Core 0.12 will have a strict maximum size on the mempool. The default value is 300 MB and can be configured with the `-maxmempool` parameter. Whenever a transaction would cause the mempool to exceed its maximum size, the transaction that (along with in-mempool descendants) has @@ -124,7 +124,7 @@ minimum relay feerate will be increased to match this feerate plus the initial minimum relay feerate. The initial minimum relay feerate is set to 1000 satoshis per kB. -BGL Core 0.12 also introduces new default policy limits on the length and +Bitcoin Core 0.12 also introduces new default policy limits on the length and size of unconfirmed transaction chains that are allowed in the mempool (generally limiting the length of unconfirmed chains to 25 transactions, with a total size of 101 KB). These limits can be overridden using command line @@ -134,11 +134,11 @@ Opt-in Replace-by-fee transactions ---------------------------------- It is now possible to replace transactions in the transaction memory pool of -BGL Core 0.12 nodes. BGL Core will only allow replacement of +Bitcoin Core 0.12 nodes. Bitcoin Core will only allow replacement of transactions which have any of their inputs' `nSequence` number set to less than `0xffffffff - 1`. Moreover, a replacement transaction may only be accepted when it pays sufficient fee, as described in [BIP 125] -(https://github.com/BGL/bips/blob/master/bip-0125.mediawiki). +(https://github.com/bitcoin/bips/blob/master/bip-0125.mediawiki). Transaction replacement can be disabled with a new command line option, `-mempoolreplacement=0`. Transactions signaling replacement under BIP125 will @@ -156,7 +156,7 @@ updated RPC calls `gettransaction` and `listtransactions`, which now have an additional field in the output indicating if a transaction is replaceable under BIP125 ("bip125-replaceable"). -Note that the wallet in BGL Core 0.12 does not yet have support for +Note that the wallet in Bitcoin Core 0.12 does not yet have support for creating transactions that would be replaceable under BIP 125. @@ -173,7 +173,7 @@ overridden with the option `-rpccookiefile`. This is similar to Tor's CookieAuthentication: see https://www.torproject.org/docs/tor-manual.html.en -This allows running BGLd without having to do any manual configuration. +This allows running bitcoind without having to do any manual configuration. Relay: Any sequence of pushdatas in OP_RETURN outputs now allowed ----------------------------------------------------------------- @@ -196,14 +196,14 @@ returned (previously all relevant hashes were returned). Relay and Mining: Priority transactions --------------------------------------- -BGL Core has a heuristic 'priority' based on coin value and age. This +Bitcoin Core has a heuristic 'priority' based on coin value and age. This calculation is used for relaying of transactions which do not pay the minimum relay fee, and can be used as an alternative way of sorting -transactions for mined blocks. BGL Core will relay transactions with +transactions for mined blocks. Bitcoin Core will relay transactions with insufficient fees depending on the setting of `-limitfreerelay=` (default: `r=15` kB per minute) and `-blockprioritysize=`. -In BGL Core 0.12, when mempool limit has been reached a higher minimum +In Bitcoin Core 0.12, when mempool limit has been reached a higher minimum relay fee takes effect to limit memory usage. Transactions which do not meet this higher effective minimum relay fee will not be relayed or mined even if they rank highly according to the priority heuristic. @@ -224,7 +224,7 @@ Note, however, that if mining priority transactions is left disabled, the priority delta will be ignored and only the fee metric will be effective. This internal automatic prioritization handling is being considered for removal -entirely in BGL Core 0.13, and it is at this time undecided whether the +entirely in Bitcoin Core 0.13, and it is at this time undecided whether the more accurate priority calculation for chained unconfirmed transactions will be restored. Community direction on this topic is particularly requested to help set project priorities. @@ -234,15 +234,15 @@ Automatically use Tor hidden services Starting with Tor version 0.2.7.1 it is possible, through Tor's control socket API, to create and destroy 'ephemeral' hidden services programmatically. -BGL Core has been updated to make use of this. +Bitcoin Core has been updated to make use of this. This means that if Tor is running (and proper authorization is available), -BGL Core automatically creates a hidden service to listen on, without -manual configuration. BGL Core will also use Tor automatically to connect +Bitcoin Core automatically creates a hidden service to listen on, without +manual configuration. Bitcoin Core will also use Tor automatically to connect to other .onion nodes if the control socket can be successfully opened. This will positively affect the number of available .onion nodes and their usage. -This new feature is enabled by default if BGL Core is listening, and +This new feature is enabled by default if Bitcoin Core is listening, and a connection to Tor can be made. It can be configured with the `-listenonion`, `-torcontrol` and `-torpassword` settings. To show verbose debugging information, pass `-debug=tor`. @@ -250,7 +250,7 @@ information, pass `-debug=tor`. Notifications through ZMQ ------------------------- -BGLd can now (optionally) asynchronously notify clients through a +Bitcoind can now (optionally) asynchronously notify clients through a ZMQ-based PUB socket of the arrival of new transactions and blocks. This feature requires installation of the ZMQ C API library 4.x and configuring its use through the command line or configuration file. @@ -263,8 +263,8 @@ Various improvements have been made to how the wallet calculates transaction fees. Users can decide to pay a predefined fee rate by setting `-paytxfee=` -(or `settxfee ` rpc during runtime). A value of `n=0` signals BGL -Core to use floating fees. By default, BGL Core will use floating +(or `settxfee ` rpc during runtime). A value of `n=0` signals Bitcoin +Core to use floating fees. By default, Bitcoin Core will use floating fees. Based on past transaction data, floating fees approximate the fees @@ -275,9 +275,9 @@ Sometimes, it is not possible to give good estimates, or an estimate at all. Therefore, a fallback value can be set with `-fallbackfee=` (default: `0.0002` BTC/kB). -At all times, BGL Core will cap fees at `-maxtxfee=` (default: +At all times, Bitcoin Core will cap fees at `-maxtxfee=` (default: 0.10) BTC. -Furthermore, BGL Core will never create transactions paying less than +Furthermore, Bitcoin Core will never create transactions paying less than the current minimum relay fee. Finally, a user can set the minimum fee rate for all transactions with `-mintxfee=`, which defaults to 1000 satoshis per kB. @@ -320,7 +320,7 @@ However, rescans as well as the RPCs `importwallet`, `importaddress`, `importprivkey` are disabled. To enable block pruning set `prune=` on the command line or in -`BGL.conf`, where `N` is the number of MiB to allot for +`bitcoin.conf`, where `N` is the number of MiB to allot for raw block & undo data. A value of 0 disables pruning. The minimal value above 0 is 550. Your @@ -331,13 +331,13 @@ practice. In future releases, a higher value may also help the network as a whole: stored blocks could be served to other nodes. For further information about pruning, you may also consult the [release -notes of v0.11.0](https://github.com/BitgesellOfficial/bitgesell/blob/master/doc/release-notes.md#block-file-pruning). +notes of v0.11.0](https://github.com/bitcoin/bitcoin/blob/v0.11.0/doc/release-notes.md#block-file-pruning). `NODE_BLOOM` service bit ------------------------ Support for the `NODE_BLOOM` service bit, as described in [BIP -111](https://github.com/BGL/bips/blob/master/bip-0111.mediawiki), has been +111](https://github.com/bitcoin/bips/blob/master/bip-0111.mediawiki), has been added to the P2P protocol code. BIP 111 defines a service bit to allow peers to advertise that they support @@ -369,7 +369,7 @@ RPC: Low-level API changes * The `asm` property of each scriptSig now contains the decoded signature hash type for each signature that provides a valid defined hash type. -* OP_NOP2 has been renamed to OP_CHECKLOCKTIMEVERIFY by [BIP 65](https://github.com/BGL/bips/blob/master/bip-0065.mediawiki) +* OP_NOP2 has been renamed to OP_CHECKLOCKTIMEVERIFY by [BIP 65](https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki) The following items contain assembly representations of scriptSig signatures and are affected by this change: @@ -379,7 +379,7 @@ and are affected by this change: - RPC `decodescript` - REST `/rest/tx/` (JSON format) - REST `/rest/block/` (JSON format when including extended tx details) -- `BGL-tx -json` +- `bitcoin-tx -json` For example, the `scriptSig.asm` property of a transaction input that previously showed an assembly representation of: @@ -429,16 +429,16 @@ caching. A sample config for apache2 could look like: SSLCertificateFile /etc/apache2/ssl/server.crt SSLCertificateKeyFile /etc/apache2/ssl/server.key - + ProxyPass http://127.0.0.1:8332/ ProxyPassReverse http://127.0.0.1:8332/ # optional enable digest auth # AuthType Digest # ... - # optional bypass BGLd rpc basic auth + # optional bypass bitcoind rpc basic auth # RequestHeader set Authorization "Basic " - # get the from the shell with: base64 <<< BGLrpc: + # get the from the shell with: base64 <<< bitcoinrpc: # Or, balance the load: @@ -459,7 +459,7 @@ Other P2P Changes ----------------- The list of banned peers is now stored on disk rather than in memory. -Restarting BGLd will no longer clear out the list of banned peers; instead +Restarting bitcoind will no longer clear out the list of banned peers; instead a new RPC call (`clearbanned`) can be used to manually clear the list. The new `setban` RPC call can also be used to manually ban or unban a peer. @@ -637,14 +637,14 @@ git merge commit are mentioned. ### Build system - #6210 `0e4f2a0` build: disable optional use of gmp in internal secp256k1 build (Wladimir J. van der Laan) -- #6214 `87406aa` [OSX] revert renaming of BGL-Qt.app and use CFBundleDisplayName (partial revert of #6116) (Jonas Schnelli) +- #6214 `87406aa` [OSX] revert renaming of Bitcoin-Qt.app and use CFBundleDisplayName (partial revert of #6116) (Jonas Schnelli) - #6218 `9d67b10` build/gitian misc updates (Cory Fields) -- #6269 `d4565b6` gitian: Use the new BGL-detached-sigs git repo for OSX signatures (Cory Fields) +- #6269 `d4565b6` gitian: Use the new bitcoin-detached-sigs git repo for OSX signatures (Cory Fields) - #6418 `d4a910c` Add autogen.sh to source tarball. (randy-waterhouse) - #6373 `1ae3196` depends: non-qt bumps for 0.12 (Cory Fields) - #6434 `059b352` Preserve user-passed CXXFLAGS with --enable-debug (Gavin Andresen) - #6501 `fee6554` Misc build fixes (Cory Fields) -- #6600 `ef4945f` Include BGL-tx binary on Debian/Ubuntu (Zak Wilcox) +- #6600 `ef4945f` Include bitcoin-tx binary on Debian/Ubuntu (Zak Wilcox) - #6619 `4862708` depends: bump miniupnpc and ccache (Michael Ford) - #6801 `ae69a75` [depends] Latest config.guess and config.sub (Michael Ford) - #6938 `193f7b5` build: If both Qt4 and Qt5 are installed, use Qt5 (Wladimir J. van der Laan) @@ -719,7 +719,7 @@ git merge commit are mentioned. - #6337 `0564c5b` Testing infrastructure: mocktime fixes (Gavin Andresen) - #6350 `60abba1` add unit tests for the decodescript rpc (mruddy) - #5881 `3203a08` Fix and improve txn_doublespend.py test (Tom Harding) -- #6390 `6a73d66` tests: Fix BGL-tx signing test case (Wladimir J. van der Laan) +- #6390 `6a73d66` tests: Fix bitcoin-tx signing test case (Wladimir J. van der Laan) - #6368 `7fc25c2` CLTV: Add more tests to improve coverage (Esteban Ordano) - #6414 `5121c68` Fix intermittent test failure, reduce test time (Tom Harding) - #6417 `44fa82d` [QA] fix possible reorg issue in (fund)rawtransaction(s).py RPC test (Jonas Schnelli) @@ -732,7 +732,7 @@ git merge commit are mentioned. - #6509 `bb4faee` Fix race condition on test node shutdown (Casey Rodarmor) - #6523 `561f8af` Add p2p-fullblocktest.py (Casey Rodarmor) - #6590 `981fd92` Fix stale socket rebinding and re-enable python tests for Windows (Cory Fields) -- #6730 `cb4d6d0` build: Remove dependency of BGL-cli on secp256k1 (Wladimir J. van der Laan) +- #6730 `cb4d6d0` build: Remove dependency of bitcoin-cli on secp256k1 (Wladimir J. van der Laan) - #6616 `5ab5dca` Regression Tests: Migrated rpc-tests.sh to all Python rpc-tests.py (Peter Tschipper) - #6720 `d479311` Creates unittests for addrman, makes addrman more testable. (Ethan Heilman) - #6853 `c834f56` Added fPowNoRetargeting field to Consensus::Params (Eric Lombrozo) @@ -750,7 +750,7 @@ git merge commit are mentioned. - #7063 `6abf6eb` [Tests] Add prioritisetransaction RPC test (Suhas Daftuar) - #7137 `16f4a6e` Tests: Explicitly set chain limits in replace-by-fee test (Suhas Daftuar) - #7216 `9572e49` Removed offline testnet DNSSeed 'alexykot.me'. (tnull) -- #7209 `f3ad812` test: don't override BGLD and BGLCLI if they're set (Wladimir J. van der Laan) +- #7209 `f3ad812` test: don't override BITCOIND and BITCOINCLI if they're set (Wladimir J. van der Laan) - #7226 `301f16a` Tests: Add more tests to p2p-fullblocktest (Suhas Daftuar) - #7153 `9ef7c54` [Tests] Add mempool_limit.py test (Jonas Schnelli) - #7170 `453c567` tests: Disable Tor interaction (Wladimir J. van der Laan) @@ -764,9 +764,9 @@ git merge commit are mentioned. - #5975 `1fea667` Consensus: Decouple ContextualCheckBlockHeader from checkpoints (Jorge Timón) - #6061 `eba2f06` Separate Consensus::CheckTxInputs and GetSpendHeight in CheckInputs (Jorge Timón) - #5994 `786ed11` detach wallet from miner (Jonas Schnelli) -- #6387 `11576a5` [BGL-cli] improve error output (Jonas Schnelli) -- #6401 `6db53b4` Add BGLD_SIGTERM_TIMEOUT to OpenRC init scripts (Florian Schmaus) -- #6430 `b01981e` doc: add documentation for shared library libBGLconsensus (Braydon Fuller) +- #6387 `11576a5` [bitcoin-cli] improve error output (Jonas Schnelli) +- #6401 `6db53b4` Add BITCOIND_SIGTERM_TIMEOUT to OpenRC init scripts (Florian Schmaus) +- #6430 `b01981e` doc: add documentation for shared library libbitcoinconsensus (Braydon Fuller) - #6372 `dcc495e` Update Linearize tool to support Windows paths; fix variable scope; update README and example configuration (Paul Georgiou) - #6453 `8fe5cce` Separate core memory usage computation in core_memusage.h (Pieter Wuille) - #6149 `633fe10` Buffer log messages and explicitly open logs (Adam Weiss) @@ -891,4 +891,4 @@ Thanks to everyone who directly contributed to this release: - Zak Wilcox - zathras-crypto -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.12.1.md b/doc/release-notes/release-notes-0.12.1.md index 12ffd01bc1..610cd481de 100644 --- a/doc/release-notes/release-notes-0.12.1.md +++ b/doc/release-notes/release-notes-0.12.1.md @@ -1,13 +1,13 @@ -BGL Core version 0.12.1 is now available from: +Bitcoin Core version 0.12.1 is now available from: - + This is a new minor version release, including the BIP9, BIP68 and BIP112 softfork, various bugfixes and updated translations. Please report bugs using the issue tracker at github: - + Upgrading and downgrading ========================= @@ -17,8 +17,8 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). Downgrade warning ----------------- @@ -27,10 +27,10 @@ Downgrade warning Because release 0.12.0 and later will obfuscate the chainstate on every fresh sync or reindex, the chainstate is not backwards-compatible with -pre-0.12 versions of BGL Core or other software. +pre-0.12 versions of Bitcoin Core or other software. If you want to downgrade after you have done a reindex with 0.12.0 or later, -you will need to reindex when you first start BGL Core version 0.11 or +you will need to reindex when you first start Bitcoin Core version 0.11 or earlier. Notable changes @@ -49,15 +49,15 @@ bits together with setting bit 0 to indicate support for this combined deployment, shown as "csv" in the `getblockchaininfo` RPC call. For more information about the soft forking change, please see - + This specific backport pull-request can be viewed at - + -[BIP9]: https://github.com/BGL/bips/blob/master/bip-0009.mediawiki -[BIP68]: https://github.com/BGL/bips/blob/master/bip-0068.mediawiki -[BIP112]: https://github.com/BGL/bips/blob/master/bip-0112.mediawiki -[BIP113]: https://github.com/BGL/bips/blob/master/bip-0113.mediawiki +[BIP9]: https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki +[BIP68]: https://github.com/bitcoin/bips/blob/master/bip-0068.mediawiki +[BIP112]: https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki +[BIP113]: https://github.com/bitcoin/bips/blob/master/bip-0113.mediawiki BIP68 soft fork to enforce sequence locks for relative locktime --------------------------------------------------------------- @@ -68,27 +68,27 @@ invalid for a defined period of time after confirmation of its corresponding outpoint. For more information about the implementation, see - + BIP112 soft fork to enforce OP_CHECKSEQUENCEVERIFY -------------------------------------------------- [BIP112][] redefines the existing OP_NOP3 as OP_CHECKSEQUENCEVERIFY (CSV) -for a new opcode in the BGL scripting system that in combination with +for a new opcode in the Bitcoin scripting system that in combination with [BIP68][] allows execution pathways of a script to be restricted based on the age of the output being spent. For more information about the implementation, see - + BIP113 locktime enforcement soft fork ------------------------------------- -BGL Core 0.11.2 previously introduced mempool-only locktime +Bitcoin Core 0.11.2 previously introduced mempool-only locktime enforcement using GetMedianTimePast(). This release seeks to consensus enforce the rule. -BGL transactions currently may specify a locktime indicating when +Bitcoin transactions currently may specify a locktime indicating when they may be added to a valid block. Current consensus rules require that blocks have a block header time greater than the locktime specified in any transaction in that block. @@ -132,7 +132,7 @@ locktimes to allow those transactions to be included in mempools at approximately the expected time. For more information about the implementation, see - + Miscellaneous ------------- @@ -194,5 +194,5 @@ Thanks to everyone who directly contributed to this release: - Suhas Daftuar - Wladimir J. van der Laan -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.13.0.md b/doc/release-notes/release-notes-0.13.0.md index d398261560..4c3cb97df3 100644 --- a/doc/release-notes/release-notes-0.13.0.md +++ b/doc/release-notes/release-notes-0.13.0.md @@ -1,28 +1,28 @@ -BGL Core version 0.13.0 is now available from: +Bitcoin Core version 0.13.0 is now available from: - + This is a new major version release, including new features, various bugfixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at github: - + To receive security and update notifications, please subscribe to: - + Compatibility ============== Microsoft ended support for Windows XP on [April 8th, 2014](https://www.microsoft.com/en-us/WindowsForBusiness/end-of-xp-support), an OS initially released in 2001. This means that not even critical security -updates will be released anymore. Without security updates, using a BGL +updates will be released anymore. Without security updates, using a bitcoin wallet on a XP machine is irresponsible at least. -In addition to that, with 0.12.x there have been varied reports of BGL Core -randomly crashing on Windows XP. It is [not clear](https://github.com/BGL/BGL/issues/7681#issuecomment-217439891) +In addition to that, with 0.12.x there have been varied reports of Bitcoin Core +randomly crashing on Windows XP. It is [not clear](https://github.com/bitcoin/bitcoin/issues/7681#issuecomment-217439891) what the source of these crashes is, but it is likely that upstream libraries such as Qt are no longer being tested on XP. @@ -48,21 +48,21 @@ For this reason the default was changed to 300 MiB in this release. For nodes on low-memory systems, the database cache can be changed back to 100 MiB (or to another value) by either: -- Adding `dbcache=100` in BGL.conf +- Adding `dbcache=100` in bitcoin.conf - Changing it in the GUI under `Options → Size of database cache` Note that the database cache setting has the most performance impact during initial sync of a node, and when catching up after downtime. -BGL-cli: arguments privacy +bitcoin-cli: arguments privacy ------------------------------ The RPC command line client gained a new argument, `-stdin` to read extra arguments from standard input, one per line until EOF/Ctrl-D. For example: - $ src/BGL-cli -stdin walletpassphrase + $ src/bitcoin-cli -stdin walletpassphrase mysecretcode 120 ..... press Ctrl-D here to end input @@ -76,7 +76,7 @@ table by any user on the system. C++11 and Python 3 ------------------ -Various code modernizations have been done. The BGL Core code base has +Various code modernizations have been done. The Bitcoin Core code base has started using C++11. This means that a C++11-capable compiler is now needed for building. Effectively this means GCC 4.7 or higher, or Clang 3.3 or higher. @@ -95,9 +95,9 @@ executables. The following extra files can be found in the download directory or torrent: -- `BGL-${VERSION}-arm-linux-gnueabihf.tar.gz`: Linux binaries targeting +- `bitcoin-${VERSION}-arm-linux-gnueabihf.tar.gz`: Linux binaries targeting the 32-bit ARMv7-A architecture. -- `BGL-${VERSION}-aarch64-linux-gnu.tar.gz`: Linux binaries targeting +- `bitcoin-${VERSION}-aarch64-linux-gnu.tar.gz`: Linux binaries targeting the 64-bit ARMv8-A architecture. ARM builds are still experimental. If you have problems on a certain device or @@ -122,7 +122,7 @@ in PR 8068. The primary goal is reducing the bandwidth spikes at relay time, though in many cases it also reduces propagation delay. It is automatically enabled between compatible peers. -[BIP 152](https://github.com/BGL/bips/blob/master/bip-0152.mediawiki) +[BIP 152](https://github.com/bitcoin/bips/blob/master/bip-0152.mediawiki) As a side-effect, ordinary non-mining nodes will download and upload blocks faster if those blocks were produced by miners using similar transaction @@ -156,23 +156,23 @@ You can't disable HD key generation once you have created a HD wallet. There is no distinction between internal (change) and external keys. -HD wallets are incompatible with older versions of BGL Core. +HD wallets are incompatible with older versions of Bitcoin Core. -[Pull request](https://github.com/BGL/BGL/pull/8035/files), [BIP 32](https://github.com/BGL/bips/blob/master/bip-0032.mediawiki) +[Pull request](https://github.com/bitcoin/bitcoin/pull/8035/files), [BIP 32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) Segregated Witness ------------------ The code preparations for Segregated Witness ("segwit"), as described in [BIP -141](https://github.com/BGL/bips/blob/master/bip-0141.mediawiki), [BIP -143](https://github.com/BGL/bips/blob/master/bip-0143.mediawiki), [BIP -144](https://github.com/BGL/bips/blob/master/bip-0144.mediawiki), and [BIP -145](https://github.com/BGL/bips/blob/master/bip-0145.mediawiki) are +141](https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki), [BIP +143](https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki), [BIP +144](https://github.com/bitcoin/bips/blob/master/bip-0144.mediawiki), and [BIP +145](https://github.com/bitcoin/bips/blob/master/bip-0145.mediawiki) are finished and included in this release. However, BIP 141 does not yet specify activation parameters on mainnet, and so this release does not support segwit use on mainnet. Testnet use is supported, and after BIP 141 is updated with -proposed parameters, a future release of BGL Core is expected that +proposed parameters, a future release of Bitcoin Core is expected that implements those parameters for mainnet. Furthermore, because segwit activation is not yet specified for mainnet, @@ -199,7 +199,7 @@ The command line option `-blockmaxsize` remains an option to specify the maximum number of serialized bytes in a generated block. In addition, the new command line option `-blockmaxweight` has been added, which specifies the maximum "block weight" of a generated block, as defined by [BIP 141 (Segregated -Witness)] (https://github.com/BGL/bips/blob/master/bip-0141.mediawiki). +Witness)] (https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki). In preparation for Segregated Witness, the mining algorithm has been modified to optimize transaction selection for a given block weight, rather than a given @@ -216,7 +216,7 @@ support `-blockmaxsize` performs additional computation to ensure that constraint is met. (Note that for mainnet, in this release, the equivalent parameter for `-blockmaxweight` would be four times the desired `-blockmaxsize`. See [BIP 141] -(https://github.com/BGL/bips/blob/master/bip-0141.mediawiki) for additional +(https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki) for additional details.) In the future, the `-blockmaxsize` option may be removed, as block creation is @@ -232,7 +232,7 @@ files on disk. These two have now been split up, so that all blocks are known before validation starts. This was necessary to make certain optimizations that are available during normal synchronizations also available during reindexing. -The two phases are distinct in the BGL-Qt GUI. During the first one, +The two phases are distinct in the Bitcoin-Qt GUI. During the first one, "Reindexing blocks on disk" is shown. During the second (slower) one, "Processing blocks on disk" is shown. @@ -277,7 +277,7 @@ Low-level P2P changes - The optional new p2p message "feefilter" is implemented and the protocol version is bumped to 70013. Upon receiving a feefilter message from a peer, a node will not send invs for any transactions which do not meet the filter - feerate. [BIP 133](https://github.com/BGL/bips/blob/master/bip-0133.mediawiki) + feerate. [BIP 133](https://github.com/bitcoin/bips/blob/master/bip-0133.mediawiki) - The P2P alert system has been removed in PR #7692 and the `alert` P2P message is no longer supported. @@ -326,10 +326,10 @@ Low-level RPC changes - Asm script outputs replacements for OP_NOP2 and OP_NOP3 - OP_NOP2 has been renamed to OP_CHECKLOCKTIMEVERIFY by [BIP -65](https://github.com/BGL/bips/blob/master/bip-0065.mediawiki) +65](https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki) - OP_NOP3 has been renamed to OP_CHECKSEQUENCEVERIFY by [BIP -112](https://github.com/BGL/bips/blob/master/bip-0112.mediawiki) +112](https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki) - The following outputs are affected by this change: @@ -338,7 +338,7 @@ Low-level RPC changes - RPC `decodescript` - REST `/rest/tx/` (JSON format) - REST `/rest/block/` (JSON format when including extended tx details) - - `BGL-tx -json` + - `bitcoin-tx -json` - The sorting of the output of the `getrawmempool` output has changed. @@ -358,7 +358,7 @@ Low-level ZMQ changes listeners to detect lost notifications. The sequence number is always the last element in a multi-part ZMQ notification and therefore backward compatible. Each message type has its own counter. - PR [#7762](https://github.com/BGL/BGL/pull/7762). + PR [#7762](https://github.com/bitcoin/bitcoin/pull/7762). 0.13.0 Change log @@ -375,7 +375,7 @@ git merge commit are mentioned. - #7326 `2cd004b` Fix typo, wrong information in gettxout help text (paveljanik) - #7222 `82429d0` Indicate which transactions are signaling opt-in RBF (sdaftuar) - #7480 `b49a623` Changed getnetworkhps value to double to avoid overflow (instagibbs) -- #7550 `8b958ab` Input-from-stdin mode for BGL-cli (laanwj) +- #7550 `8b958ab` Input-from-stdin mode for bitcoin-cli (laanwj) - #7670 `c9a1265` Use cached block hash in blockToJSON() (rat4) - #7726 `9af69fa` Correct importaddress help reference to importpubkey (CypherGrue) - #7766 `16555b6` Register calls where they are defined (laanwj) @@ -540,7 +540,7 @@ git merge commit are mentioned. - #7604 `354b03d` build: Remove spurious dollar sign. Fixes #7189 (dooglus) - #7605 `7f001bd` Remove openssl info from init/log and from Qt debug window (jonasschnelli) - #7628 `87d6562` Add 'copy full transaction details' option (ericshawlinux) -- #7613 `3798e5d` Add autocomplete to BGL-qt's console window (GamerSg) +- #7613 `3798e5d` Add autocomplete to bitcoin-qt's console window (GamerSg) - #7668 `b24266c` Fix history deletion bug after font size change (achow101) - #7680 `41d2dfa` Remove reflection from `about` icon (laanwj) - #7686 `f034bce` Remove 0-fee from send dialog (MarcoFalke) @@ -557,13 +557,13 @@ git merge commit are mentioned. - #8014 `77b49ac` Sort transactions by date (Tyler-Hardin) - #8073 `eb2f6f7` askpassphrasedialog: Clear pass fields on accept (rat4) - #8129 `ee1533e` Fix RPC console auto completer (UdjinM6) -- #7636 `fb0ac48` Add BGL address label to request payment QR code (makevoid) +- #7636 `fb0ac48` Add bitcoin address label to request payment QR code (makevoid) - #8231 `760a6c7` Fix a bug where the SplashScreen will not be hidden during startup (jonasschnelli) -- #8256 `af2421c` BUG: BGL-qt crash (fsb4000) -- #8257 `ff03c50` Do not ask a UI question from BGLd (sipa) +- #8256 `af2421c` BUG: bitcoin-qt crash (fsb4000) +- #8257 `ff03c50` Do not ask a UI question from bitcoind (sipa) - #8288 `91abb77` Network-specific example address (laanwj) - #7707 `a914968` UI support for abandoned transactions (jonasschnelli) -- #8207 `f7a403b` Add a link to the BGL-Core repository and website to the About Dialog (MarcoFalke) +- #8207 `f7a403b` Add a link to the Bitcoin-Core repository and website to the About Dialog (MarcoFalke) - #8281 `6a87eb0` Remove client name from debug window (laanwj) - #8407 `45eba4b` Add dbcache migration path (jonasschnelli) @@ -650,7 +650,7 @@ git merge commit are mentioned. - #8038 `e2bf830` Various minor fixes (MarcoFalke) - #8072 `1b87e5b` Travis: 'make check' in parallel and verbose (theuni) - #8056 `8844ef1` Remove hardcoded "4 nodes" from test_framework (MarcoFalke) -- #8047 `37f9a1f` Test_framework: Set wait-timeout for BGLd procs (MarcoFalke) +- #8047 `37f9a1f` Test_framework: Set wait-timeout for bitcoind procs (MarcoFalke) - #8095 `6700cc9` Test framework: only cleanup on successful test runs (sdaftuar) - #8098 `06bd4f6` Test_framework: Append portseed to tmpdir (MarcoFalke) - #8104 `6ff2c8d` Add timeout to sync_blocks() and sync_mempools() (sdaftuar) @@ -660,7 +660,7 @@ git merge commit are mentioned. - #8090 `a2df115` Adding P2SH(p2pkh) script test case (Christewart) - #7992 `ec45cc5` Extend #7956 with one more test (TheBlueMatt) - #8139 `ae5575b` Fix interrupted HTTP RPC connection workaround for Python 3.5+ (sipa) -- #8164 `0f24eaf` [BGL-Tx] fix missing test fixtures, fix 32bit atoi issue (jonasschnelli) +- #8164 `0f24eaf` [Bitcoin-Tx] fix missing test fixtures, fix 32bit atoi issue (jonasschnelli) - #8166 `0b5279f` Src/test: Do not shadow local variables (paveljanik) - #8141 `44c1b1c` Continuing port of java comparison tool (mrbandrews) - #8201 `36b7400` fundrawtransaction: Fix race, assert amounts (MarcoFalke) @@ -670,7 +670,7 @@ git merge commit are mentioned. - #8216 `0d41d70` Assert 'changePosition out of bounds' (MarcoFalke) - #8222 `961893f` Enable mempool consistency checks in unit tests (sipa) - #7751 `84370d5` test_framework: python3.4 authproxy compat (laanwj) -- #7744 `d8e862a` test_framework: detect failure of BGLd startup (laanwj) +- #7744 `d8e862a` test_framework: detect failure of bitcoind startup (laanwj) - #8280 `115735d` Increase sync_blocks() timeouts in pruning.py (MarcoFalke) - #8340 `af9b7a9` Solve trivial merge conflict in p2p-segwit.py (MarcoFalke) - #8067 `3e4cf8f` Travis: use slim generic image, and some fixups (theuni) @@ -707,7 +707,7 @@ git merge commit are mentioned. - #7791 `e30a5b0` Change Precise to Trusty in gitian-building.md (JeremyRand) - #7838 `8bb5d3d` Update gitian build guide to debian 8.4.0 (fanquake) - #7855 `b778e59` Replace precise with trusty (MarcoFalke) -- #7975 `fc23fee` Update BGL-core GitHub links (MarcoFalke) +- #7975 `fc23fee` Update bitcoin-core GitHub links (MarcoFalke) - #8034 `e3a8207` Add basic git squash workflow (fanquake) - #7813 `214ec0b` Update port in tor.md (MarcoFalke) - #8193 `37c9830` Use Debian 8.5 in the gitian-build guide (fanquake) @@ -865,4 +865,4 @@ Thanks to everyone who directly contributed to this release: - Wladimir J. van der Laan - Yuri Zhykin -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.13.1.md b/doc/release-notes/release-notes-0.13.1.md index 5fba8a694a..75c2d61be8 100644 --- a/doc/release-notes/release-notes-0.13.1.md +++ b/doc/release-notes/release-notes-0.13.1.md @@ -1,6 +1,6 @@ -BGL Core version 0.13.1 is now available from: +Bitcoin Core version 0.13.1 is now available from: - + This is a new minor version release, including activation parameters for the segwit softfork, various bugfixes and performance improvements, as well as @@ -8,22 +8,22 @@ updated translations. Please report bugs using the issue tracker at github: - + To receive security and update notifications, please subscribe to: - + Compatibility ============== Microsoft ended support for Windows XP on [April 8th, 2014](https://www.microsoft.com/en-us/WindowsForBusiness/end-of-xp-support), an OS initially released in 2001. This means that not even critical security -updates will be released anymore. Without security updates, using a BGL +updates will be released anymore. Without security updates, using a bitcoin wallet on a XP machine is irresponsible at least. -In addition to that, with 0.12.x there have been varied reports of BGL Core -randomly crashing on Windows XP. It is [not clear](https://github.com/BGL/BGL/issues/7681#issuecomment-217439891) +In addition to that, with 0.12.x there have been varied reports of Bitcoin Core +randomly crashing on Windows XP. It is [not clear](https://github.com/bitcoin/bitcoin/issues/7681#issuecomment-217439891) what the source of these crashes is, but it is likely that upstream libraries such as Qt are no longer being tested on XP. @@ -56,9 +56,9 @@ covered by the txid. This provides several immediate benefits: identifier (txid) of transactions without referencing the witness, which can sometimes be changed by third-parties (such as miners) or by co-signers in a multisig spend. This solves all known cases of unwanted transaction - malleability, which is a problem that makes programming BGL wallet + malleability, which is a problem that makes programming Bitcoin wallet software more difficult and which seriously complicates the design of smart - contracts for BGL. + contracts for Bitcoin. - **Capacity increase:** Segwit transactions contain new fields that are not part of the data currently used to calculate the size of a block, which @@ -72,7 +72,7 @@ covered by the txid. This provides several immediate benefits: following section for details). - **Weighting data based on how it affects node performance:** Some parts of - each BGL block need to be stored by nodes in order to validate future + each Bitcoin block need to be stored by nodes in order to validate future blocks; other parts of a block can be immediately forgotten (pruned) or used only for helping other nodes sync their copy of the block chain. One large part of the immediately prunable data are transaction signatures (witnesses), @@ -89,8 +89,8 @@ covered by the txid. This provides several immediate benefits: (such as hardware wallets), reduces the amount of data the signature generator needs to download, and allows the signature generator to operate more quickly. This is made possible by having the generator sign the amount - of BGLs they think they are spending, and by having full nodes refuse to - accept those signatures unless the amount of BGLs being spent is exactly + of bitcoins they think they are spending, and by having full nodes refuse to + accept those signatures unless the amount of bitcoins being spent is exactly the same as was signed. For non-segwit transactions, wallets instead had to download the complete previous transactions being spent for every payment they made, which could be a slow operation on hardware wallets and in other @@ -105,7 +105,7 @@ covered by the txid. This provides several immediate benefits: different signature method that doesn't suffer from this problem and doesn't have any unwanted side-effects. -- **Increased security for multisig:** BGL addresses (both P2PKH addresses +- **Increased security for multisig:** Bitcoin addresses (both P2PKH addresses that start with a '1' and P2SH addresses that start with a '3') use a hash function known as RIPEMD-160. For P2PKH addresses, this provides about 160 bits of security---which is beyond what cryptographers believe can be broken @@ -115,15 +115,15 @@ covered by the txid. This provides several immediate benefits: Segwit allows advanced transactions to use the SHA256 hash function instead, which provides about 128 bits of security (that is 281 trillion times as much security as 80 bits and is equivalent to the maximum bits of security - believed to be provided by BGL's choice of parameters for its Elliptic + believed to be provided by Bitcoin's choice of parameters for its Elliptic Curve Digital Security Algorithm [ECDSA].) - **More efficient almost-full-node security** Satoshi Nakamoto's original - BGL paper describes a method for allowing newly-started full nodes to + Bitcoin paper describes a method for allowing newly-started full nodes to skip downloading and validating some data from historic blocks that are protected by large amounts of proof of work. Unfortunately, Nakamoto's method can't guarantee that a newly-started node using this method will - produce an accurate copy of BGL's current ledger (called the UTXO set), + produce an accurate copy of Bitcoin's current ledger (called the UTXO set), making the node vulnerable to falling out of consensus with other nodes. Although the problems with Nakamoto's method can't be fixed in a soft fork, Segwit accomplishes something similar to his original proposal: it makes it @@ -131,18 +131,18 @@ covered by the txid. This provides several immediate benefits: (specifically, the segregated witnesses) while still ensuring that the node can build an accurate copy of the UTXO set for the block chain with the most proof of work. Segwit enables this capability at the consensus layer, but - note that BGL Core does not provide an option to use this capability as + note that Bitcoin Core does not provide an option to use this capability as of this 0.13.1 release. - **Script versioning:** Segwit makes it easy for future soft forks to allow - BGL users to individually opt-in to almost any change in the BGL + Bitcoin users to individually opt-in to almost any change in the Bitcoin Script language when those users receive new transactions. Features - currently being researched by BGL Core contributors that may use this + currently being researched by Bitcoin Core contributors that may use this capability include support for Schnorr signatures, which can improve the privacy and efficiency of multisig transactions (or transactions with multiple inputs), and Merklized Abstract Syntax Trees (MAST), which can improve the privacy and efficiency of scripts with two or more conditions. - Other BGL community members are studying several other improvements + Other Bitcoin community members are studying several other improvements that can be made using script versioning. Activation for the segwit soft fork is being managed using BIP9 @@ -159,13 +159,13 @@ For more information about segwit, please see the [segwit FAQ][], the operator, please see the [versionbits FAQ][] for information about signaling support for a soft fork. -[Segwit FAQ]: https://BGLcore.org/en/2016/01/26/segwit-benefits/ -[segwit wallet developers guide]: https://BGLcore.org/en/segwit_wallet_dev/ -[BIP141]: https://github.com/BGL/bips/blob/master/bip-0141.mediawiki -[BIP143]: https://github.com/BGL/bips/blob/master/bip-0143.mediawiki -[BIP144]: https://github.com/BGL/bips/blob/master/bip-0144.mediawiki -[BIP145]: https://github.com/BGL/bips/blob/master/bip-0145.mediawiki -[versionbits FAQ]: https://BGLcore.org/en/2016/06/08/version-bits-miners-faq/ +[Segwit FAQ]: https://bitcoincore.org/en/2016/01/26/segwit-benefits/ +[segwit wallet developers guide]: https://bitcoincore.org/en/segwit_wallet_dev/ +[BIP141]: https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki +[BIP143]: https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki +[BIP144]: https://github.com/bitcoin/bips/blob/master/bip-0144.mediawiki +[BIP145]: https://github.com/bitcoin/bips/blob/master/bip-0145.mediawiki +[versionbits FAQ]: https://bitcoincore.org/en/2016/06/08/version-bits-miners-faq/ Null dummy soft fork @@ -183,7 +183,7 @@ a third-party to insert data into other people's transactions, changing the transaction's txid (called transaction malleability) and possibly causing other problems. -Since BGL Core 0.10.0, nodes have defaulted to only relaying and +Since Bitcoin Core 0.10.0, nodes have defaulted to only relaying and mining transactions whose dummy element was a null value (0x00, also called OP_0). The null dummy soft fork turns this relay rule into a consensus rule both for non-segwit transactions and segwit transactions, @@ -196,7 +196,7 @@ as segwit. For more information, please see [BIP147][]. -[BIP147]: https://github.com/BGL/bips/blob/master/bip-0147.mediawiki +[BIP147]: https://github.com/bitcoin/bips/blob/master/bip-0147.mediawiki Low-level RPC changes --------------------- @@ -215,9 +215,9 @@ is provided below. The following extra files can be found in the download directory or torrent: -- `BGL-${VERSION}-arm-linux-gnueabihf.tar.gz`: Linux binaries targeting +- `bitcoin-${VERSION}-arm-linux-gnueabihf.tar.gz`: Linux binaries targeting the 32-bit ARMv7-A architecture. -- `BGL-${VERSION}-aarch64-linux-gnu.tar.gz`: Linux binaries targeting +- `bitcoin-${VERSION}-aarch64-linux-gnu.tar.gz`: Linux binaries targeting the 64-bit ARMv8-A architecture. ARM builds are still experimental. If you have problems on a certain device or @@ -243,7 +243,7 @@ git merge commit are mentioned. ### Consensus - #8636 `9dfa0c8` Implement NULLDUMMY softfork (BIP147) (jl2012) -- #8848 `7a34a46` Add NULLDUMMY verify flag in BGLconsensus.h (jl2012) +- #8848 `7a34a46` Add NULLDUMMY verify flag in bitcoinconsensus.h (jl2012) - #8937 `8b66659` Define start and end time for segwit deployment (sipa) ### RPC and other APIs @@ -275,13 +275,13 @@ git merge commit are mentioned. - #8612 `2215c22` Check for compatibility with download in FindNextBlocksToDownload (sipa) - #8606 `bbf379b` Fix some locks (sipa) - #8594 `ab295bb` Do not add random inbound peers to addrman (gmaxwell) -- #8940 `5b4192b` Add x9 service bit support to dnsseed.bluematt.me, seed.BGLstats.com (TheBlueMatt, cdecker) +- #8940 `5b4192b` Add x9 service bit support to dnsseed.bluematt.me, seed.bitcoinstats.com (TheBlueMatt, cdecker) - #8944 `685e4c7` Remove bogus assert on number of oubound connections. (TheBlueMatt) - #8949 `0dbc48a` Be more agressive in getting connections to peers with relevant services (gmaxwell) ### Build system -- #8293 `fa5b249` Allow building libBGLconsensus without any univalue (luke-jr) -- #8492 `8b0bdd3` Allow building bench_BGL by itself (luke-jr) +- #8293 `fa5b249` Allow building libbitcoinconsensus without any univalue (luke-jr) +- #8492 `8b0bdd3` Allow building bench_bitcoin by itself (luke-jr) - #8563 `147003c` Add configure check for -latomic (ajtowns) - #8626 `ea51b0f` Berkeley DB v6 compatibility fix (netsafe) - #8520 `75f2065` Remove check for `openssl/ec.h` (laanwj) @@ -320,16 +320,16 @@ git merge commit are mentioned. - #8418 `ff893aa` Add tests for compact blocks (sdaftuar) - #8803 `375437c` Ping regularly in p2p-segwit.py to keep connection alive (jl2012) - #8827 `9bbe66e` Split up slow RPC calls to avoid pruning test timeouts (sdaftuar) -- #8829 `2a8bca4` Add BGL-tx JSON tests (jnewbery) +- #8829 `2a8bca4` Add bitcoin-tx JSON tests (jnewbery) - #8834 `1dd1783` blockstore: Switch to dumb dbm (MarcoFalke) - #8835 `d87227d` nulldummy.py: Don't run unused code (MarcoFalke) -- #8836 `eb18cc1` BGL-util-test.py should fail if the output file is empty (jnewbery) +- #8836 `eb18cc1` bitcoin-util-test.py should fail if the output file is empty (jnewbery) - #8839 `31ab2f8` Avoid ConnectionResetErrors during RPC tests (laanwj) - #8840 `cbc3fe5` Explicitly set encoding to utf8 when opening text files (laanwj) - #8841 `3e4abb5` Fix nulldummy test (jl2012) - #8854 `624a007` Fix race condition in p2p-compactblocks test (sdaftuar) - #8857 `1f60d45` mininode: Only allow named args in wait_until (MarcoFalke) -- #8860 `0bee740` util: Move wait_BGLds() into stop_nodes() (MarcoFalke) +- #8860 `0bee740` util: Move wait_bitcoinds() into stop_nodes() (MarcoFalke) - #8882 `b73f065` Fix race conditions in p2p-compactblocks.py and sendheaders.py (sdaftuar) - #8904 `cc6f551` Fix compact block shortids for a test case (dagurval) @@ -337,7 +337,7 @@ git merge commit are mentioned. - #8754 `0e2c6bd` Target protobuf 2.6 in OS X build notes. (fanquake) - #8461 `b17a3f9` Document return value of networkhashps for getmininginfo RPC endpoint (jlopp) - #8512 `156e305` Corrected JSON typo on setban of net.cpp (sevastos) -- #8683 `8a7d7ff` Fix incorrect file name BGL.qrc (BGLsSG) +- #8683 `8a7d7ff` Fix incorrect file name bitcoin.qrc (bitcoinsSG) - #8891 `5e0dd9e` Update bips.md for Segregated Witness (fanquake) - #8545 `863ae74` Update git-subtree-check.sh README (MarcoFalke) - #8607 `486650a` Fix doxygen off-by-one comments, fix typos (MarcoFalke) @@ -352,7 +352,7 @@ git merge commit are mentioned. - #8742 `d31ac72` Specify Protobuf version 2 in paymentrequest.proto (fanquake) - #8414,#8558,#8676,#8700,#8701,#8702 Add missing copyright headers (isle2983, kazcw) - #8899 `4ed2627` Fix wake from sleep issue with Boost 1.59.0 (fanquake) -- #8817 `bcf3806` update BGL-tx to output witness data (jnewbery) +- #8817 `bcf3806` update bitcoin-tx to output witness data (jnewbery) - #8513 `4e5fc31` Fix a type error that would not compile on OSX. (JeremyRubin) - #8392 `30eac2d` Fix several node initialization issues (sipa) - #8548 `305d8ac` Use `__func__` to get function name for output printing (MarcoFalke) @@ -407,4 +407,4 @@ Thanks to everyone who directly contributed to this release: - whythat - Wladimir J. van der Laan -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.13.2.md b/doc/release-notes/release-notes-0.13.2.md index 94665cd34e..45fff5c8bb 100644 --- a/doc/release-notes/release-notes-0.13.2.md +++ b/doc/release-notes/release-notes-0.13.2.md @@ -1,28 +1,28 @@ -BGL Core version 0.13.2 is now available from: +Bitcoin Core version 0.13.2 is now available from: - + This is a new minor version release, including various bugfixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at github: - + To receive security and update notifications, please subscribe to: - + Compatibility ============== Microsoft ended support for Windows XP on [April 8th, 2014](https://www.microsoft.com/en-us/WindowsForBusiness/end-of-xp-support), an OS initially released in 2001. This means that not even critical security -updates will be released anymore. Without security updates, using a BGL +updates will be released anymore. Without security updates, using a bitcoin wallet on a XP machine is irresponsible at least. -In addition to that, with 0.12.x there have been varied reports of BGL Core -randomly crashing on Windows XP. It is [not clear](https://github.com/BGL/BGL/issues/7681#issuecomment-217439891) +In addition to that, with 0.12.x there have been varied reports of Bitcoin Core +randomly crashing on Windows XP. It is [not clear](https://github.com/bitcoin/bitcoin/issues/7681#issuecomment-217439891) what the source of these crashes is, but it is likely that upstream libraries such as Qt are no longer being tested on XP. @@ -111,7 +111,7 @@ git merge commit are mentioned. - #8972 `6f86b53` Make warnings label selectable (jonasschnelli) (MarcoFalke) - #9185 `6d70a73` Fix coincontrol sort issue (jonasschnelli) - #9094 `5f3a12c` Use correct conversion function for boost::path datadir (laanwj) -- #8908 `4a974b2` Update BGL-qt.desktop (s-matthew-english) +- #8908 `4a974b2` Update bitcoin-qt.desktop (s-matthew-english) - #9190 `dc46b10` Plug many memory leaks (laanwj) ### Wallet @@ -134,7 +134,7 @@ git merge commit are mentioned. - #8838 `094848b` Calculate size and weight of block correctly in CreateNewBlock() (jnewbery) - #8920 `40169dc` Set minimum required Boost to 1.47.0 (fanquake) - #9251 `a710a43` Improvement of documentation of command line parameter 'whitelist' (wodry) -- #8932 `106da69` Allow BGL-tx to create v2 transactions (btcdrak) +- #8932 `106da69` Allow bitcoin-tx to create v2 transactions (btcdrak) - #8929 `12428b4` add software-properties-common (sigwo) - #9120 `08d1c90` bug: Missed one "return false" in recent refactoring in #9067 (UdjinM6) - #9067 `f85ee01` Fix exit codes (UdjinM6) @@ -175,4 +175,4 @@ Thanks to everyone who directly contributed to this release: - Wladimir J. van der Laan - wodry -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.14.0.md b/doc/release-notes/release-notes-0.14.0.md index 8769e2b9eb..c41f22979b 100644 --- a/doc/release-notes/release-notes-0.14.0.md +++ b/doc/release-notes/release-notes-0.14.0.md @@ -1,22 +1,22 @@ -BGL Core version 0.14.0 is now available from: +Bitcoin Core version 0.14.0 is now available from: - + This is a new major version release, including new features, various bugfixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at github: - + To receive security and update notifications, please subscribe to: - + Compatibility ============== -BGL Core is extensively tested on multiple operating systems using +Bitcoin Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.8+, and Windows Vista and later. Microsoft ended support for Windows XP on [April 8th, 2014](https://www.microsoft.com/en-us/WindowsForBusiness/end-of-xp-support), @@ -24,7 +24,7 @@ No attempt is made to prevent installing or running the software on Windows XP, can still do so at your own risk but be aware that there are known instabilities and issues. Please do not report issues about Windows XP to the issue tracker. -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not frequently tested on them. Notable changes @@ -55,7 +55,7 @@ improved, leading to much shorter sync and initial block download times. Manual Pruning -------------- -BGL Core has supported automatically pruning the blockchain since 0.11. Pruning +Bitcoin Core has supported automatically pruning the blockchain since 0.11. Pruning the blockchain allows for significant storage space savings as the vast majority of the downloaded data can be discarded after processing so very little of it remains on the disk. @@ -96,7 +96,7 @@ ZMQ On Windows Previously the ZeroMQ notification system was unavailable on Windows due to various issues with ZMQ. These have been fixed upstream and -now ZMQ can be used on Windows. Please see [this document](https://github.com/BitgesellOfficial/bitgesell/blob/master/doc/zmq.md) for +now ZMQ can be used on Windows. Please see [this document](https://github.com/bitcoin/bitcoin/blob/master/doc/zmq.md) for help with using ZMQ in general. Nested RPC Commands in Debug Console @@ -129,7 +129,7 @@ the same thing as the GUI icon. The command takes one boolean parameter, Out-of-sync Modal Info Layer ---------------------------- -When BGL Core is out-of-sync on startup, a semi-transparent information +When Bitcoin Core is out-of-sync on startup, a semi-transparent information layer will be shown over top of the normal display. This layer contains details about the current sync progress and estimates the amount of time remaining to finish syncing. This layer can also be hidden and subsequently @@ -138,19 +138,19 @@ unhidden by clicking on the progress bar at the bottom of the window. Support for JSON-RPC Named Arguments ------------------------------------ -Commands sent over the JSON-RPC interface and through the `BGL-cli` binary +Commands sent over the JSON-RPC interface and through the `bitcoin-cli` binary can now use named arguments. This follows the [JSON-RPC specification](http://www.jsonrpc.org/specification) for passing parameters by-name with an object. -`BGL-cli` has been updated to support this by parsing `name=value` arguments +`bitcoin-cli` has been updated to support this by parsing `name=value` arguments when the `-named` option is given. Some examples: - src/BGL-cli -named help command="help" - src/BGL-cli -named getblockhash height=0 - src/BGL-cli -named getblock blockhash=000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f - src/BGL-cli -named sendtoaddress address="(snip)" amount="1.0" subtractfeefromamount=true + src/bitcoin-cli -named help command="help" + src/bitcoin-cli -named getblockhash height=0 + src/bitcoin-cli -named getblock blockhash=000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f + src/bitcoin-cli -named sendtoaddress address="(snip)" amount="1.0" subtractfeefromamount=true The order of arguments doesn't matter in this case. Named arguments are also useful to leave out arguments that should stay at their default value. The @@ -189,7 +189,7 @@ commands such as `prioritisetransaction` so that those changes will not be lost. Final Alert ----------- -The Alert System was [disabled and deprecated](https://BGL.org/en/alert/2016-11-01-alert-retirement) in BGL Core 0.12.1 and removed in 0.13.0. +The Alert System was [disabled and deprecated](https://bitcoin.org/en/alert/2016-11-01-alert-retirement) in Bitcoin Core 0.12.1 and removed in 0.13.0. The Alert System was retired with a maximum sequence final alert which causes any nodes supporting the Alert System to display a static hard-coded "Alert Key Compromised" message which also prevents any other alerts from overriding it. This final alert is hard-coded into this release @@ -241,8 +241,8 @@ Low-level RPC changes the mempool or if `txindex` is enabled. - A new RPC command `getmemoryinfo` has been added which will return information - about the memory usage of BGL Core. This was added in conjunction with - optimizations to memory management. See [Pull #8753](https://github.com/BGL/BGL/pull/8753) + about the memory usage of Bitcoin Core. This was added in conjunction with + optimizations to memory management. See [Pull #8753](https://github.com/bitcoin/bitcoin/pull/8753) for more information. - A new RPC command `bumpfee` has been added which allows replacing an @@ -367,7 +367,7 @@ and git merge commit are mentioned. - #8421 `b77bb95` httpserver: drop boost dependency (theuni) - #8638 `f061415` rest.cpp: change `HTTP_INTERNAL_SERVER_ERROR` to `HTTP_BAD_REQUEST` (djpnewton) - #8272 `91990ee` Make the dummy argument to getaddednodeinfo optional (sipa) -- #8722 `bb843ad` BGL-cli: More detailed error reporting (laanwj) +- #8722 `bb843ad` bitcoin-cli: More detailed error reporting (laanwj) - #6996 `7f71a3c` Add preciousblock RPC (sipa) - #8788 `97c7f73` Give RPC commands more information about the RPC request (jonasschnelli) - #7948 `5d2c8e5` Augment getblockchaininfo bip9\_softforks data (mruddy) @@ -626,14 +626,14 @@ and git merge commit are mentioned. - #8680 `666eaf0` Address Travis spurious failures (theuni) - #8789 `e31a43c` pull-tester: Only print output when failed (MarcoFalke) - #8810 `14e8f99` tests: Add exception error message for JSONRPCException (laanwj) -- #8830 `ef0801b` test: Add option to run BGL-util-test.py manually (jnewbery) -- #8881 `e66cc1d` Add some verbose logging to BGL-util-test.py (jnewbery) +- #8830 `ef0801b` test: Add option to run bitcoin-util-test.py manually (jnewbery) +- #8881 `e66cc1d` Add some verbose logging to bitcoin-util-test.py (jnewbery) - #8922 `0329511` Send segwit-encoded blocktxn messages in p2p-compactblocks (TheBlueMatt) - #8873 `74dc388` Add microbenchmarks to profile more code paths (ryanofsky) - #9032 `6a8be7b` test: Add format-dependent comparison to bctest (laanwj) -- #9023 `774db92` Add logging to BGL-util-test.py (jnewbery) +- #9023 `774db92` Add logging to bitcoin-util-test.py (jnewbery) - #9065 `c9bdf9a` Merge `doc/unit-tests.md` into `src/test/README.md` (laanwj) -- #9069 `ed64bce` Clean up bctest.py and BGL-util-test.py (jnewbery) +- #9069 `ed64bce` Clean up bctest.py and bitcoin-util-test.py (jnewbery) - #9095 `b8f43e3` test: Fix test\_random includes (MarcoFalke) - #8894 `faec09b` Testing: Include fRelay in mininode version messages (jnewbery) - #9097 `e536499` Rework `sync_*` and preciousblock.py (MarcoFalke) @@ -665,7 +665,7 @@ and git merge commit are mentioned. - #9628 `f895023` Increase a sync\_blocks timeout in pruning.py (sdaftuar) - #9638 `a7ea2f8` Actually test assertions in pruning.py (MarcoFalke) - #9647 `e99f0d7` Skip RAII event tests if libevent is built without `event_set_mem_functions` (luke-jr) -- #9691 `fc67cd2` Init ECC context for `test_BGL_fuzzy` (gmaxwell) +- #9691 `fc67cd2` Init ECC context for `test_bitcoin_fuzzy` (gmaxwell) - #9712 `d304fef` bench: Fix initialization order in registration (laanwj) - #9707 `b860915` Fix RPC failure testing (jnewbery) - #9269 `43e8150` Align struct COrphan definition (sipa) @@ -711,25 +711,25 @@ and git merge commit are mentioned. - #8965 `23e03f8` Mention that PPA doesn't support Debian (anduck) - #9115 `bfc7aad` Mention reporting security issues responsibly (paveljanik) - #9840 `08e0690` Update sendfrom RPC help to correct coin selection misconception (ryanofsky) -- #9865 `289204f` Change BGL address in RPC help message (marijnfs) +- #9865 `289204f` Change bitcoin address in RPC help message (marijnfs) ### Miscellaneous - #8274 `7a2d402` util: Update tinyformat (laanwj) - #8291 `5cac8b1` util: CopyrightHolders: Check for untranslated substitution (MarcoFalke) - #8557 `44691f3` contrib: Rework verifybinaries (MarcoFalke) - #8621 `e8ed6eb` contrib: python: Don't use shell=True (MarcoFalke) -- #8813 `fb24d7e` BGLd: Daemonize using daemon(3) (laanwj) +- #8813 `fb24d7e` bitcoind: Daemonize using daemon(3) (laanwj) - #9004 `67728a3` Clarify `listenonion` (unsystemizer) - #8674 `bae81b8` tools for analyzing, updating and adding copyright headers in source files (isle2983) - #8976 `8c6218a` libconsensus: Add input validation of flags (laanwj) - #9112 `46027e8` Avoid ugly exception in log on unknown inv type (laanwj) -- #8837 `2108911` Allow BGL-tx to parse partial transactions (jnewbery) +- #8837 `2108911` Allow bitcoin-tx to parse partial transactions (jnewbery) - #9204 `74ced54` Clarify CreateTransaction error messages (instagibbs) -- #9265 `31bcc66` BGL-cli: Make error message less confusing (laanwj) +- #9265 `31bcc66` bitcoin-cli: Make error message less confusing (laanwj) - #9303 `72bf1b3` Update comments in ctaes (sipa) - #9417 `c4b7d4f` Do not evaluate hidden LogPrint arguments (sipa) - #9506 `593a00c` RFC: Improve style for if indentation (sipa) -- #8883 `d5d4ad8` Add all standard TXO types to BGL-tx (jnewbery) +- #8883 `d5d4ad8` Add all standard TXO types to bitcoin-tx (jnewbery) - #9531 `23281a4` Release notes for estimation changes (morcos) - #9486 `f62bc10` Make peer=%d log prints consistent (TheBlueMatt) - #9552 `41cb05c` Add IPv6 support to qos.sh (jamesmacwhite) @@ -870,4 +870,4 @@ Thanks to everyone who directly contributed to this release: - wodry - Zak Wilcox -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.14.1.md b/doc/release-notes/release-notes-0.14.1.md index cfe32b947e..ef072afd4d 100644 --- a/doc/release-notes/release-notes-0.14.1.md +++ b/doc/release-notes/release-notes-0.14.1.md @@ -1,22 +1,22 @@ -BGL Core version 0.14.1 is now available from: +Bitcoin Core version 0.14.1 is now available from: - + This is a new minor version release, including various bugfixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at github: - + To receive security and update notifications, please subscribe to: - + Compatibility ============== -BGL Core is extensively tested on multiple operating systems using +Bitcoin Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.8+, and Windows Vista and later. Microsoft ended support for Windows XP on [April 8th, 2014](https://www.microsoft.com/en-us/WindowsForBusiness/end-of-xp-support), @@ -24,7 +24,7 @@ No attempt is made to prevent installing or running the software on Windows XP, can still do so at your own risk but be aware that there are known instabilities and issues. Please do not report issues about Windows XP to the issue tracker. -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not frequently tested on them. Notable changes @@ -75,7 +75,7 @@ this parameter. Additional information relating to running on low-memory systems can be found here: -[reducing-BGLd-memory-usage.md](https://gist.github.com/laanwj/efe29c7661ce9b6620a7). +[reducing-bitcoind-memory-usage.md](https://gist.github.com/laanwj/efe29c7661ce9b6620a7). 0.14.1 Change log ================= @@ -117,7 +117,7 @@ git merge commit are mentioned. ### Miscellaneous - #10037 `4d8e660` Trivial: Fix typo in help getrawtransaction RPC (keystrike) - #10120 `e4c9a90` util: Work around (virtual) memory exhaustion on 32-bit w/ glibc (laanwj) -- #10130 `ecc5232` BGL-tx input verification (awemany, jnewbery) +- #10130 `ecc5232` bitcoin-tx input verification (awemany, jnewbery) Credits ======= @@ -139,5 +139,5 @@ Thanks to everyone who directly contributed to this release: - Suhas Daftuar - Wladimir J. van der Laan -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.14.2.md b/doc/release-notes/release-notes-0.14.2.md index a4edd585ae..0ad554b773 100644 --- a/doc/release-notes/release-notes-0.14.2.md +++ b/doc/release-notes/release-notes-0.14.2.md @@ -1,22 +1,22 @@ -BGL Core version 0.14.2 is now available from: +Bitcoin Core version 0.14.2 is now available from: - + This is a new minor version release, including various bugfixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at github: - + To receive security and update notifications, please subscribe to: - + Compatibility ============== -BGL Core is extensively tested on multiple operating systems using +Bitcoin Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.8+, and Windows Vista and later. Microsoft ended support for Windows XP on [April 8th, 2014](https://www.microsoft.com/en-us/WindowsForBusiness/end-of-xp-support), @@ -24,7 +24,7 @@ No attempt is made to prevent installing or running the software on Windows XP, can still do so at your own risk but be aware that there are known instabilities and issues. Please do not report issues about Windows XP to the issue tracker. -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not frequently tested on them. Notable changes @@ -40,7 +40,7 @@ other impact. This only affects users that have explicitly enabled UPnP through the GUI setting or through the `-upnp` option, as since the last UPnP vulnerability -(in BGL Core 0.10.3) it has been disabled by default. +(in Bitcoin Core 0.10.3) it has been disabled by default. If you use this option, it is recommended to upgrade to this version as soon as possible. @@ -48,7 +48,7 @@ possible. Known Bugs ========== -Since 0.14.0 the approximate transaction fee shown in BGL-Qt when using coin +Since 0.14.0 the approximate transaction fee shown in Bitcoin-Qt when using coin control and smart fee estimation does not reflect any change in target from the smart fee slider. It will only present an approximate fee calculated using the default target. The fee calculated using the correct target is still applied to @@ -71,7 +71,7 @@ git merge commit are mentioned. ### Build system - #10414 `ffb0c4b` miniupnpc 2.0.20170509 (fanquake) -- #10228 `ae479bc` Regenerate BGL-config.h as necessary (theuni) +- #10228 `ae479bc` Regenerate bitcoin-config.h as necessary (theuni) ### Miscellaneous - #10245 `44a17f2` Minor fix in build documentation for FreeBSD 11 (shigeya) @@ -98,5 +98,5 @@ Thanks to everyone who directly contributed to this release: - Shigeya Suzuki - Wladimir J. van der Laan -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.14.3.md b/doc/release-notes/release-notes-0.14.3.md index 639e6ac424..8259152f0b 100644 --- a/doc/release-notes/release-notes-0.14.3.md +++ b/doc/release-notes/release-notes-0.14.3.md @@ -1,22 +1,22 @@ -BGL Core version *0.14.3* is now available from: +Bitcoin Core version *0.14.3* is now available from: - + This is a new minor version release, including various bugfixes and performance improvements. Please report bugs using the issue tracker at github: - + To receive security and update notifications, please subscribe to: - + Compatibility ============== -BGL Core is extensively tested on multiple operating systems using +Bitcoin Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.8+, and Windows Vista and later. Microsoft ended support for Windows XP on [April 8th, 2014](https://www.microsoft.com/en-us/WindowsForBusiness/end-of-xp-support), @@ -24,7 +24,7 @@ No attempt is made to prevent installing or running the software on Windows XP, can still do so at your own risk but be aware that there are known instabilities and issues. Please do not report issues about Windows XP to the issue tracker. -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not frequently tested on them. Notable changes @@ -34,13 +34,13 @@ Denial-of-Service vulnerability CVE-2018-17144 ------------------------------- A denial-of-service vulnerability exploitable by miners has been discovered in -BGL Core versions 0.14.0 up to 0.16.2. It is recommended to upgrade any of +Bitcoin Core versions 0.14.0 up to 0.16.2. It is recommended to upgrade any of the vulnerable versions to 0.14.3, 0.15.2 or 0.16.3 as soon as possible. Known Bugs ========== -Since 0.14.0 the approximate transaction fee shown in BGL-Qt when using coin +Since 0.14.0 the approximate transaction fee shown in Bitcoin-Qt when using coin control and smart fee estimation does not reflect any change in target from the smart fee slider. It will only present an approximate fee calculated using the default target. The fee calculated using the correct target is still applied to @@ -72,7 +72,7 @@ git merge commit are mentioned. ### Miscellaneous -- #10451 `3612219` contrib/init/BGLd.openrcconf: Don't disable wallet by default (Luke Dashjr) +- #10451 `3612219` contrib/init/bitcoind.openrcconf: Don't disable wallet by default (Luke Dashjr) - #10250 `e23cef0` Fix some empty vector references (Pieter Wuille) - #10196 `d28d583` PrioritiseTransaction updates the mempool tx counter (Suhas Daftuar) - #9497 `e207342` Fix CCheckQueue IsIdle (potential) race condition and remove dangerous constructors. (Jeremy Rubin) diff --git a/doc/release-notes/release-notes-0.15.0.1.md b/doc/release-notes/release-notes-0.15.0.1.md index 178f8d5537..53ab02cbb0 100644 --- a/doc/release-notes/release-notes-0.15.0.1.md +++ b/doc/release-notes/release-notes-0.15.0.1.md @@ -1,28 +1,28 @@ -BGL Core version *0.15.0.1* is now available from: +Bitcoin Core version *0.15.0.1* is now available from: - + and - + This is a minor bug fix for 0.15.0. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: - + How to Upgrade ============== If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over `/Applications/BGL-Qt` (on Mac) -or `BGLd`/`BGL-qt` (on Linux). +installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on Mac) +or `bitcoind`/`bitcoin-qt` (on Linux). The first time you run version 0.15.0 or higher, your chainstate database will be converted to a new format, which will take anywhere from a few minutes to @@ -51,10 +51,10 @@ processing the entire blockchain. Compatibility ============== -BGL Core is extensively tested on multiple operating systems using +Bitcoin Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.8+, and Windows Vista and later. Windows XP is not supported. -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not frequently tested on them. Notable changes @@ -84,4 +84,4 @@ Thanks to everyone who directly contributed to this release: - Jonas Schnelli - Wladimir J. van der Laan -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.15.0.md b/doc/release-notes/release-notes-0.15.0.md index aaeda737e7..3d000e94d5 100644 --- a/doc/release-notes/release-notes-0.15.0.md +++ b/doc/release-notes/release-notes-0.15.0.md @@ -1,25 +1,25 @@ -BGL Core version *0.15.0* is now available from: +Bitcoin Core version *0.15.0* is now available from: - + This is a new major version release, including new features, various bugfixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: - + How to Upgrade ============== If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over `/Applications/BGL-Qt` (on Mac) -or `BGLd`/`BGL-qt` (on Linux). +installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on Mac) +or `bitcoind`/`bitcoin-qt` (on Linux). The first time you run version 0.15.0, your chainstate database will be converted to a new format, which will take anywhere from a few minutes to half an hour, @@ -48,10 +48,10 @@ processing the entire blockchain. Compatibility ============== -BGL Core is extensively tested on multiple operating systems using +Bitcoin Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.8+, and Windows Vista and later. Windows XP is not supported. -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not frequently tested on them. Notes for 0.15.0 @@ -85,7 +85,7 @@ Version 0.15 contains a number of significant performance improvements, which ma Initial Block Download, startup, transaction and block validation much faster: - The chainstate database (which is used for tracking UTXOs) has been changed - from a per-transaction model to a per-output model (See [PR 10195](https://github.com/BGL/BGL/pull/10195)). Advantages of this model + from a per-transaction model to a per-output model (See [PR 10195](https://github.com/bitcoin/bitcoin/pull/10195)). Advantages of this model are that it: - avoids the CPU overhead of deserializing and serializing the unused outputs; - has more predictable memory usage; @@ -98,32 +98,32 @@ Initial Block Download, startup, transaction and block validation much faster: a few extra gigabytes may be used. - Earlier versions experienced a spike in memory usage while flushing UTXO updates to disk. As a result, only half of the available memory was actually used as cache, and the other half was - reserved to accommodate flushing. This is no longer the case (See [PR 10148](https://github.com/BGL/BGL/pull/10148)), and the entirety of + reserved to accommodate flushing. This is no longer the case (See [PR 10148](https://github.com/bitcoin/bitcoin/pull/10148)), and the entirety of the available cache (see `-dbcache`) is now actually used as cache. This reduces the flushing frequency by a factor 2 or more. - In previous versions, signature validation for transactions has been cached when the transaction is accepted to the mempool. Version 0.15 extends this to cache the entire script - validity (See [PR 10192](https://github.com/BGL/BGL/pull/10192)). This means that if a transaction in a block has already been accepted to the + validity (See [PR 10192](https://github.com/bitcoin/bitcoin/pull/10192)). This means that if a transaction in a block has already been accepted to the mempool, the scriptSig does not need to be re-evaluated. Empirical tests show that this results in new block validation being 40-50% faster. -- LevelDB has been upgraded to version 1.20 (See [PR 10544](https://github.com/BGL/BGL/pull/10544)). This version contains hardware acceleration for CRC +- LevelDB has been upgraded to version 1.20 (See [PR 10544](https://github.com/bitcoin/bitcoin/pull/10544)). This version contains hardware acceleration for CRC on architectures supporting SSE 4.2. As a result, synchronization and block validation are now faster. -- SHA256 hashing has been optimized for architectures supporting SSE 4 (See [PR 10821](https://github.com/BGL/BGL/pull/10821)). SHA256 is around +- SHA256 hashing has been optimized for architectures supporting SSE 4 (See [PR 10821](https://github.com/bitcoin/bitcoin/pull/10821)). SHA256 is around 50% faster on supported hardware, which results in around 5% faster IBD and block validation. In version 0.15, SHA256 hardware optimization is disabled in release builds by default, but can be enabled by using `--enable-experimental-asm` when building. -- Refill of the keypool no longer flushes the wallet between each key which resulted in a ~20x speedup in creating a new wallet. Part of this speedup was used to increase the default keypool to 1000 keys to make recovery more robust. (See [PR 10831](https://github.com/BGL/BGL/pull/10831)). +- Refill of the keypool no longer flushes the wallet between each key which resulted in a ~20x speedup in creating a new wallet. Part of this speedup was used to increase the default keypool to 1000 keys to make recovery more robust. (See [PR 10831](https://github.com/bitcoin/bitcoin/pull/10831)). Fee Estimation Improvements --------------------------- -Fee estimation has been significantly improved in version 0.15, with more accurate fee estimates used by the wallet and a wider range of options for advanced users of the `estimatesmartfee` and `estimaterawfee` RPCs (See [PR 10199](https://github.com/BGL/BGL/pull/10199)). +Fee estimation has been significantly improved in version 0.15, with more accurate fee estimates used by the wallet and a wider range of options for advanced users of the `estimatesmartfee` and `estimaterawfee` RPCs (See [PR 10199](https://github.com/bitcoin/bitcoin/pull/10199)). ### Changes to internal logic and wallet behavior - Internally, estimates are now tracked on 3 different time horizons. This allows for longer targets and means estimates adjust more quickly to changes in conditions. - Estimates can now be *conservative* or *economical*. *Conservative* estimates use longer time horizons to produce an estimate which is less susceptible to rapid changes in fee conditions. *Economical* estimates use shorter time horizons and will be more affected by short-term changes in fee conditions. Economical estimates may be considerably lower during periods of low transaction activity (for example over weekends), but may result in transactions being unconfirmed if prevailing fees increase rapidly. -- By default, the wallet will use conservative fee estimates to increase the reliability of transactions being confirmed within the desired target. For transactions that are marked as replaceable, the wallet will use an economical estimate by default, since the fee can be 'bumped' if the fee conditions change rapidly (See [PR 10589](https://github.com/BGL/BGL/pull/10589)). +- By default, the wallet will use conservative fee estimates to increase the reliability of transactions being confirmed within the desired target. For transactions that are marked as replaceable, the wallet will use an economical estimate by default, since the fee can be 'bumped' if the fee conditions change rapidly (See [PR 10589](https://github.com/bitcoin/bitcoin/pull/10589)). - Estimates can now be made for confirmation targets up to 1008 blocks (one week). - More data on historical fee rates is stored, leading to more precise fee estimates. - Transactions which leave the mempool due to eviction or other non-confirmed reasons are now taken into account by the fee estimation logic, leading to more accurate fee estimates. @@ -132,27 +132,27 @@ Fee estimation has been significantly improved in version 0.15, with more accura ### Changes to fee estimate RPCs - The `estimatefee` RPC is now deprecated in favor of using only `estimatesmartfee` (which is the implementation used by the GUI) -- The `estimatesmartfee` RPC interface has been changed (See [PR 10707](https://github.com/BGL/BGL/pull/10707)): +- The `estimatesmartfee` RPC interface has been changed (See [PR 10707](https://github.com/bitcoin/bitcoin/pull/10707)): - The `nblocks` argument has been renamed to `conf_target` (to be consistent with other RPC methods). - An `estimate_mode` argument has been added. This argument takes one of the following strings: `CONSERVATIVE`, `ECONOMICAL` or `UNSET` (which defaults to `CONSERVATIVE`). - The RPC return object now contains an `errors` member, which returns errors encountered during processing. - - If BGL Core has not been running for long enough and has not seen enough blocks or transactions to produce an accurate fee estimation, an error will be returned (previously a value of -1 was used to indicate an error, which could be confused for a feerate). + - If Bitcoin Core has not been running for long enough and has not seen enough blocks or transactions to produce an accurate fee estimation, an error will be returned (previously a value of -1 was used to indicate an error, which could be confused for a feerate). - A new `estimaterawfee` RPC is added to provide raw fee data. External clients can query and use this data in their own fee estimation logic. Multi-wallet support -------------------- -BGL Core now supports loading multiple, separate wallets (See [PR 8694](https://github.com/BGL/BGL/pull/8694), [PR 10849](https://github.com/BGL/BGL/pull/10849)). The wallets are completely separated, with individual balances, keys and received transactions. +Bitcoin Core now supports loading multiple, separate wallets (See [PR 8694](https://github.com/bitcoin/bitcoin/pull/8694), [PR 10849](https://github.com/bitcoin/bitcoin/pull/10849)). The wallets are completely separated, with individual balances, keys and received transactions. -Multi-wallet is enabled by using more than one `-wallet` argument when starting BGL, either on the command line or in the BGL config file. +Multi-wallet is enabled by using more than one `-wallet` argument when starting Bitcoin, either on the command line or in the Bitcoin config file. -**In BGL-Qt, only the first wallet will be displayed and accessible for creating and signing transactions.** GUI selectable multiple wallets will be supported in a future version. However, even in 0.15 other loaded wallets will remain synchronized to the node's current tip in the background. This can be useful if running a pruned node, since loading a wallet where the most recent sync is beyond the pruned height results in having to download and revalidate the whole blockchain. Continuing to synchronize all wallets in the background avoids this problem. +**In Bitcoin-Qt, only the first wallet will be displayed and accessible for creating and signing transactions.** GUI selectable multiple wallets will be supported in a future version. However, even in 0.15 other loaded wallets will remain synchronized to the node's current tip in the background. This can be useful if running a pruned node, since loading a wallet where the most recent sync is beyond the pruned height results in having to download and revalidate the whole blockchain. Continuing to synchronize all wallets in the background avoids this problem. -BGL Core 0.15.0 contains the following changes to the RPC interface and `BGL-cli` for multi-wallet: +Bitcoin Core 0.15.0 contains the following changes to the RPC interface and `bitcoin-cli` for multi-wallet: -* When running BGL Core with a single wallet, there are **no** changes to the RPC interface or `BGL-cli`. All RPC calls and `BGL-cli` commands continue to work as before. -* When running BGL Core with multi-wallet, all *node-level* RPC methods continue to work as before. HTTP RPC requests should be send to the normal `:` endpoint, and `BGL-cli` commands should be run as before. A *node-level* RPC method is any method which does not require access to the wallet. -* When running BGL Core with multi-wallet, *wallet-level* RPC methods must specify the wallet for which they're intended in every request. HTTP RPC requests should be send to the `:/wallet/` endpoint, for example `127.0.0.1:8332/wallet/wallet1.dat`. `BGL-cli` commands should be run with a `-rpcwallet` option, for example `BGL-cli -rpcwallet=wallet1.dat getbalance`. +* When running Bitcoin Core with a single wallet, there are **no** changes to the RPC interface or `bitcoin-cli`. All RPC calls and `bitcoin-cli` commands continue to work as before. +* When running Bitcoin Core with multi-wallet, all *node-level* RPC methods continue to work as before. HTTP RPC requests should be send to the normal `:` endpoint, and `bitcoin-cli` commands should be run as before. A *node-level* RPC method is any method which does not require access to the wallet. +* When running Bitcoin Core with multi-wallet, *wallet-level* RPC methods must specify the wallet for which they're intended in every request. HTTP RPC requests should be send to the `:/wallet/` endpoint, for example `127.0.0.1:8332/wallet/wallet1.dat`. `bitcoin-cli` commands should be run with a `-rpcwallet` option, for example `bitcoin-cli -rpcwallet=wallet1.dat getbalance`. * A new *node-level* `listwallets` RPC method is added to display which wallets are currently loaded. The names returned by this method are the same as those used in the HTTP endpoint and for the `rpcwallet` argument. Note that while multi-wallet is now fully supported, the RPC multi-wallet interface should be considered unstable for version 0.15.0, and there may backwards-incompatible changes in future versions. @@ -160,18 +160,18 @@ Note that while multi-wallet is now fully supported, the RPC multi-wallet interf Replace-by-fee control in the GUI --------------------------------- -BGL Core has supported creating opt-in replace-by-fee (RBF) transactions +Bitcoin Core has supported creating opt-in replace-by-fee (RBF) transactions since version 0.12.0, and since version 0.14.0 has included a `bumpfee` RPC method to replace unconfirmed opt-in RBF transactions with a new transaction that pays a higher fee. In version 0.15, creating an opt-in RBF transaction and replacing the unconfirmed -transaction with a higher-fee transaction are both supported in the GUI (See [PR 9592](https://github.com/BGL/BGL/pull/9592)). +transaction with a higher-fee transaction are both supported in the GUI (See [PR 9592](https://github.com/bitcoin/bitcoin/pull/9592)). Removal of Coin Age Priority ---------------------------- -In previous versions of BGL Core, a portion of each block could be reserved for transactions based on the age and value of UTXOs they spent. This concept (Coin Age Priority) is a policy choice by miners, and there are no consensus rules around the inclusion of Coin Age Priority transactions in blocks. In practice, only a few miners continue to use Coin Age Priority for transaction selection in blocks. BGL Core 0.15 removes all remaining support for Coin Age Priority (See [PR 9602](https://github.com/BGL/BGL/pull/9602)). This has the following implications: +In previous versions of Bitcoin Core, a portion of each block could be reserved for transactions based on the age and value of UTXOs they spent. This concept (Coin Age Priority) is a policy choice by miners, and there are no consensus rules around the inclusion of Coin Age Priority transactions in blocks. In practice, only a few miners continue to use Coin Age Priority for transaction selection in blocks. Bitcoin Core 0.15 removes all remaining support for Coin Age Priority (See [PR 9602](https://github.com/bitcoin/bitcoin/pull/9602)). This has the following implications: - The concept of *free transactions* has been removed. High Coin Age Priority transactions would previously be allowed to be relayed even if they didn't attach a miner fee. This is no longer possible since there is no concept of Coin Age Priority. The `-limitfreerelay` and `-relaypriority` options which controlled relay of free transactions have therefore been removed. - The `-sendfreetransactions` option has been removed, since almost all miners do not include transactions which do not attach a transaction fee. @@ -185,26 +185,26 @@ In previous versions of BGL Core, a portion of each block could be reserved for Mempool Persistence Across Restarts ----------------------------------- -Version 0.14 introduced mempool persistence across restarts (the mempool is saved to a `mempool.dat` file in the data directory prior to shutdown and restores the mempool when the node is restarted). Version 0.15 allows this feature to be switched on or off using the `-persistmempool` command-line option (See [PR 9966](https://github.com/BGL/BGL/pull/9966)). By default, the option is set to true, and the mempool is saved on shutdown and reloaded on startup. If set to false, the `mempool.dat` file will not be loaded on startup or saved on shutdown. +Version 0.14 introduced mempool persistence across restarts (the mempool is saved to a `mempool.dat` file in the data directory prior to shutdown and restores the mempool when the node is restarted). Version 0.15 allows this feature to be switched on or off using the `-persistmempool` command-line option (See [PR 9966](https://github.com/bitcoin/bitcoin/pull/9966)). By default, the option is set to true, and the mempool is saved on shutdown and reloaded on startup. If set to false, the `mempool.dat` file will not be loaded on startup or saved on shutdown. New RPC methods --------------- Version 0.15 introduces several new RPC methods: -- `abortrescan` stops current wallet rescan, e.g. when triggered by an `importprivkey` call (See [PR 10208](https://github.com/BGL/BGL/pull/10208)). -- `combinerawtransaction` accepts a JSON array of raw transactions and combines them into a single raw transaction (See [PR 10571](https://github.com/BGL/BGL/pull/10571)). +- `abortrescan` stops current wallet rescan, e.g. when triggered by an `importprivkey` call (See [PR 10208](https://github.com/bitcoin/bitcoin/pull/10208)). +- `combinerawtransaction` accepts a JSON array of raw transactions and combines them into a single raw transaction (See [PR 10571](https://github.com/bitcoin/bitcoin/pull/10571)). - `estimaterawfee` returns raw fee data so that customized logic can be implemented to analyze the data and calculate estimates. See [Fee Estimation Improvements](#fee-estimation-improvements) for full details on changes to the fee estimation logic and interface. - `getchaintxstats` returns statistics about the total number and rate of transactions - in the chain (See [PR 9733](https://github.com/BGL/BGL/pull/9733)). + in the chain (See [PR 9733](https://github.com/bitcoin/bitcoin/pull/9733)). - `listwallets` lists wallets which are currently loaded. See the *Multi-wallet* section of these release notes for full details (See [Multi-wallet support](#multi-wallet-support)). -- `uptime` returns the total runtime of the `BGLd` server since its last start (See [PR 10400](https://github.com/BGL/BGL/pull/10400)). +- `uptime` returns the total runtime of the `bitcoind` server since its last start (See [PR 10400](https://github.com/bitcoin/bitcoin/pull/10400)). Low-level RPC changes --------------------- -- When using BGL Core in multi-wallet mode, RPC requests for wallet methods must specify +- When using Bitcoin Core in multi-wallet mode, RPC requests for wallet methods must specify the wallet that they're intended for. See [Multi-wallet support](#multi-wallet-support) for full details. - The new database model no longer stores information about transaction @@ -222,15 +222,15 @@ Low-level RPC changes `bytes_serialized`. The first is a more accurate estimate of actual disk usage, but is not deterministic. The second is unrelated to disk usage, but is a database-independent metric of UTXO set size: it counts every UTXO entry as 50 + the - length of its scriptPubKey (See [PR 10426](https://github.com/BGL/BGL/pull/10426)). + length of its scriptPubKey (See [PR 10426](https://github.com/bitcoin/bitcoin/pull/10426)). -- `signrawtransaction` can no longer be used to combine multiple transactions into a single transaction. Instead, use the new `combinerawtransaction` RPC (See [PR 10571](https://github.com/BGL/BGL/pull/10571)). +- `signrawtransaction` can no longer be used to combine multiple transactions into a single transaction. Instead, use the new `combinerawtransaction` RPC (See [PR 10571](https://github.com/bitcoin/bitcoin/pull/10571)). -- `fundrawtransaction` no longer accepts a `reserveChangeKey` option. This option used to allow RPC users to fund a raw transaction using an key from the keypool for the change address without removing it from the available keys in the keypool. The key could then be re-used for a `getnewaddress` call, which could potentially result in confusing or dangerous behaviour (See [PR 10784](https://github.com/BGL/BGL/pull/10784)). +- `fundrawtransaction` no longer accepts a `reserveChangeKey` option. This option used to allow RPC users to fund a raw transaction using an key from the keypool for the change address without removing it from the available keys in the keypool. The key could then be re-used for a `getnewaddress` call, which could potentially result in confusing or dangerous behaviour (See [PR 10784](https://github.com/bitcoin/bitcoin/pull/10784)). - `estimatepriority` and `estimatesmartpriority` have been removed. See [Removal of Coin Age Priority](#removal-of-coin-age-priority). -- The `listunspent` RPC now takes a `query_options` argument (see [PR 8952](https://github.com/BGL/BGL/pull/8952)), which is a JSON object +- The `listunspent` RPC now takes a `query_options` argument (see [PR 8952](https://github.com/bitcoin/bitcoin/pull/8952)), which is a JSON object containing one or more of the following members: - `minimumAmount` - a number specifying the minimum value of each UTXO - `maximumAmount` - a number specifying the maximum value of each UTXO @@ -240,22 +240,22 @@ Low-level RPC changes - The `getmempoolancestors`, `getmempooldescendants`, `getmempoolentry` and `getrawmempool` RPCs no longer return `startingpriority` and `currentpriority`. See [Removal of Coin Age Priority](#removal-of-coin-age-priority). - The `dumpwallet` RPC now returns the full absolute path to the dumped wallet. It - used to return no value, even if successful (See [PR 9740](https://github.com/BGL/BGL/pull/9740)). + used to return no value, even if successful (See [PR 9740](https://github.com/bitcoin/bitcoin/pull/9740)). -- In the `getpeerinfo` RPC, the return object for each peer now returns an `addrbind` member, which contains the ip address and port of the connection to the peer. This is in addition to the `addrlocal` member which contains the ip address and port of the local node as reported by the peer (See [PR 10478](https://github.com/BGL/BGL/pull/10478)). +- In the `getpeerinfo` RPC, the return object for each peer now returns an `addrbind` member, which contains the ip address and port of the connection to the peer. This is in addition to the `addrlocal` member which contains the ip address and port of the local node as reported by the peer (See [PR 10478](https://github.com/bitcoin/bitcoin/pull/10478)). -- The `disconnectnode` RPC can now disconnect a node specified by node ID (as well as by IP address/port). To disconnect a node based on node ID, call the RPC with the new `nodeid` argument (See [PR 10143](https://github.com/BGL/BGL/pull/10143)). +- The `disconnectnode` RPC can now disconnect a node specified by node ID (as well as by IP address/port). To disconnect a node based on node ID, call the RPC with the new `nodeid` argument (See [PR 10143](https://github.com/bitcoin/bitcoin/pull/10143)). -- The second argument in `prioritisetransaction` has been renamed from `priority_delta` to `dummy` since BGL Core no longer has a concept of coin age priority. The `dummy` argument has no functional effect, but is retained for positional argument compatibility. See [Removal of Coin Age Priority](#removal-of-coin-age-priority). +- The second argument in `prioritisetransaction` has been renamed from `priority_delta` to `dummy` since Bitcoin Core no longer has a concept of coin age priority. The `dummy` argument has no functional effect, but is retained for positional argument compatibility. See [Removal of Coin Age Priority](#removal-of-coin-age-priority). -- The `resendwallettransactions` RPC throws an error if the `-walletbroadcast` option is set to false (See [PR 10995](https://github.com/BGL/BGL/pull/10995)). +- The `resendwallettransactions` RPC throws an error if the `-walletbroadcast` option is set to false (See [PR 10995](https://github.com/bitcoin/bitcoin/pull/10995)). -- The second argument in the `submitblock` RPC argument has been renamed from `parameters` to `dummy`. This argument never had any effect, and the renaming is simply to communicate this fact to the user (See [PR 10191](https://github.com/BGL/BGL/pull/10191)) +- The second argument in the `submitblock` RPC argument has been renamed from `parameters` to `dummy`. This argument never had any effect, and the renaming is simply to communicate this fact to the user (See [PR 10191](https://github.com/bitcoin/bitcoin/pull/10191)) (Clients should, however, use positional arguments for `submitblock` in order to be compatible with BIP 22.) - The `verbose` argument of `getblock` has been renamed to `verbosity` and now takes an integer from 0 to 2. Verbose level 0 is equivalent to `verbose=false`. Verbose level 1 is equivalent to `verbose=true`. Verbose level 2 will give the full transaction details of each transaction in the output as given by `getrawtransaction`. The old behavior of using the `verbose` named argument and a boolean value is still maintained for compatibility. -- Error codes have been updated to be more accurate for the following error cases (See [PR 9853](https://github.com/BGL/BGL/pull/9853)): +- Error codes have been updated to be more accurate for the following error cases (See [PR 9853](https://github.com/bitcoin/bitcoin/pull/9853)): - `getblock` now returns RPC_MISC_ERROR if the block can't be found on disk (for example if the block has been pruned). Previously returned RPC_INTERNAL_ERROR. - `pruneblockchain` now returns RPC_MISC_ERROR if the blocks cannot be pruned @@ -268,13 +268,13 @@ Low-level RPC changes or subnet is invalid. Previously returned RPC_CLIENT_NODE_ALREADY_ADDED. - `setban` now returns RPC_CLIENT_INVALID_IP_OR_SUBNET if the user tries to unban a node that has not previously been banned. Previously returned RPC_MISC_ERROR. - - `removeprunedfunds` now returns RPC_WALLET_ERROR if `BGLd` is unable to remove + - `removeprunedfunds` now returns RPC_WALLET_ERROR if `bitcoind` is unable to remove the transaction. Previously returned RPC_INTERNAL_ERROR. - `removeprunedfunds` now returns RPC_INVALID_PARAMETER if the transaction does not exist in the wallet. Previously returned RPC_INTERNAL_ERROR. - `fundrawtransaction` now returns RPC_INVALID_ADDRESS_OR_KEY if an invalid change address is provided. Previously returned RPC_INVALID_PARAMETER. - - `fundrawtransaction` now returns RPC_WALLET_ERROR if `BGLd` is unable to create + - `fundrawtransaction` now returns RPC_WALLET_ERROR if `bitcoind` is unable to create the transaction. The error message provides further details. Previously returned RPC_INTERNAL_ERROR. - `bumpfee` now returns RPC_INVALID_PARAMETER if the provided transaction has @@ -331,17 +331,17 @@ Low-level RPC changes - #9740 `9fec4da` Add friendly output to dumpwallet (aideca) - #10426 `16f6c98` Replace bytes_serialized with bogosize (sipa) - #10252 `980deaf` RPC/Mining: Restore API compatibility for prioritisetransaction (luke-jr) -- #9672 `46311e7` Opt-into-RBF for RPC & BGL-tx (luke-jr) +- #9672 `46311e7` Opt-into-RBF for RPC & bitcoin-tx (luke-jr) - #10481 `9c248e3` Decodehextx scripts sanity check (achow101) - #10488 `fa1f106` Note that the prioritizetransaction dummy value is deprecated, and has no meaning (TheBlueMatt) - #9738 `c94b89e` gettxoutproof() should return consistent result (jnewbery) - #10191 `00350bd` [trivial] Rename unused RPC arguments 'dummy' (jnewbery) - #10627 `b62b4c8` fixed listunspent rpc convert parameter (tnakagawa) - #10412 `bef02fb` Improve wallet rescan API (ryanofsky) -- #10400 `1680ee0` [RPC] Add an uptime command that displays the amount of time (in seconds) BGLd has been running (rvelhote) +- #10400 `1680ee0` [RPC] Add an uptime command that displays the amount of time (in seconds) bitcoind has been running (rvelhote) - #10683 `d81bec7` rpc: Move the `generate` RPC call to rpcwallet (laanwj) - #10710 `30bc0f6` REST/RPC example update (Mirobit) -- #10747 `9edda0c` [rpc] fix verbose argument for getblock in BGL-cli (jnewbery) +- #10747 `9edda0c` [rpc] fix verbose argument for getblock in bitcoin-cli (jnewbery) - #10589 `104f5f2` More economical fee estimates for RBF and RPC options to control (morcos) - #10543 `b27b004` Change API to estimaterawfee (morcos) - #10807 `afd2fca` getbalance example covers at least 6 confirms (instagibbs) @@ -450,7 +450,7 @@ Low-level RPC changes - #10136 `81da4c7` build: Disable Wshadow warning (laanwj) - #10166 `64962ae` Ignore Doxyfile generated from Doxyfile.in template (paveljanik) - #10239 `0416ea9` Make Boost use std::atomic internally (sipa) -- #10228 `27faa6c` build: regenerate BGL-config.h as necessary (theuni) +- #10228 `27faa6c` build: regenerate bitcoin-config.h as necessary (theuni) - #10273 `8979f45` [scripts] Minor improvements to `macdeployqtplus` script (chrisgavin) - #10325 `a26280b` 0.15.0 Depends Updates (fanquake) - #10328 `79aeff6` Update contrib/debian to latest Ubuntu PPA upload (TheBlueMatt) @@ -576,7 +576,7 @@ Low-level RPC changes - #9497 `2c781fb` CCheckQueue Unit Tests (JeremyRubin) - #10024 `9225de2` [trivial] Use log.info() instead of print() in remaining functional test cases (jnewbery) - #9956 `3192e52` Reorganise qa directory (jnewbery) -- #10017 `02d64bd` combine_logs.py - aggregates log files from multiple BGLds during functional tests (jnewbery) +- #10017 `02d64bd` combine_logs.py - aggregates log files from multiple bitcoinds during functional tests (jnewbery) - #10047 `dfef6b6` [tests] Remove unused variables and imports (practicalswift) - #9701 `a230b05` Make bumpfee tests less fragile (ryanofsky) - #10053 `ca20923` [test] Allow functional test cases to be skipped (jnewbery) @@ -596,7 +596,7 @@ Low-level RPC changes - #10152 `080d7c7` [trivial] remove unused line in Travis config (jnewbery) - #10159 `df1ca9e` [tests] color test results and sort alphabetically (jnewbery) - #10124 `88799ea` [test] Suppress test logging spam (jnewbery) -- #10142 `ed09dd3` Run BGL_test-qt under minimal QPA platform (ryanofsky) +- #10142 `ed09dd3` Run bitcoin_test-qt under minimal QPA platform (ryanofsky) - #9949 `a27dbc5` [bench] Avoid function call arguments which are pointers to uninitialized values (practicalswift) - #10187 `b44adf9` tests: Fix test_runner return value in case of skipped test (laanwj) - #10197 `d86bb07` [tests] Functional test warnings (jnewbery) @@ -634,7 +634,7 @@ Low-level RPC changes - #10415 `217b416` [tests] Speed up fuzzing by ~200x when using afl-fuzz (practicalswift) - #10445 `b4b057a` Add test for empty chain and reorg consistency for gettxoutsetinfo (gmaxwell) - #10423 `1aefc94` [tests] skipped tests should clean up after themselves (jnewbery) -- #10359 `329fc1d` [tests] functional tests should call BGLTestFramework start/stop node methods (jnewbery) +- #10359 `329fc1d` [tests] functional tests should call BitcoinTestFramework start/stop node methods (jnewbery) - #10514 `e103b3f` Bugfix: missing == 0 after randrange (sipa) - #10515 `c871f32` [test] Add test for getchaintxstats (jimmysong) - #10509 `bea5b00` Remove xvfb configuration from travis (ryanofsky) @@ -648,12 +648,12 @@ Low-level RPC changes - #10555 `643fa0b` [tests] various improvements to zmq_test.py (jnewbery) - #10533 `d083bd9` [tests] Use cookie auth instead of rpcuser and rpcpassword (achow101) - #10632 `c68a9a6` qa: Add stopatheight test (MarcoFalke) -- #10636 `4bc853b` [qa] util: Check return code after closing BGLd proc (MarcoFalke) +- #10636 `4bc853b` [qa] util: Check return code after closing bitcoind proc (MarcoFalke) - #10662 `e0a7801` Initialize randomness in benchmarks (achow101) - #10612 `7c87a9c` The young person's guide to the test_framework (jnewbery) - #10659 `acb1153` [qa] blockchain: Pass on closed connection during generate call (MarcoFalke) - #10690 `416af3e` [qa] Bugfix: allow overriding extra_args in ComparisonTestFramework (sdaftuar) -- #10556 `65cc7aa` Move stop/start functions from utils.py into BGLTestFramework (jnewbery) +- #10556 `65cc7aa` Move stop/start functions from utils.py into BitcoinTestFramework (jnewbery) - #10704 `dd07f47` [tests] nits in dbcrash.py (jnewbery) - #10743 `be82498` [test] don't run dbcrash.py on Travis (jnewbery) - #10761 `d3b5870` [tests] fix replace_by_fee.py (jnewbery) @@ -694,7 +694,7 @@ Low-level RPC changes - #9734 `0c17afc` Add updating of chainTxData to release process (sipa) - #10063 `530fcbd` add missing spaces so that markdown recognizes headline (flack) - #10085 `db1ae54` Docs: remove 'noconnect' option (jlopp) -- #10090 `8e4f7e7` Update BGL.conf with example for pruning (coinables) +- #10090 `8e4f7e7` Update bitcoin.conf with example for pruning (coinables) - #9424 `1a5aaab` Change LogAcceptCategory to use uint32_t rather than sets of strings (gmaxwell) - #10036 `fbf36ca` Fix init README format to render correctly on github (jlopp) - #10058 `a2cd0b0` No need to use OpenSSL malloc/free (tjps) @@ -718,10 +718,10 @@ Low-level RPC changes - #10372 `15254e9` Add perf counter data to GetStrongRandBytes state in scheduler (TheBlueMatt) - #10461 `55b72f3` Update style guide (sipa) - #10486 `10e8c0a` devtools: Retry after signing fails in github-merge (laanwj) -- #10447 `f259263` Make BGLd invalid argument error message specific (laanwj) +- #10447 `f259263` Make bitcoind invalid argument error message specific (laanwj) - #10495 `6a38b79` contrib: Update location of seeds.txt (laanwj) - #10469 `b6b150b` Fixing typo in rpcdump.cpp help message (keystrike) -- #10451 `27b9931` contrib/init/BGLd.openrcconf: Don't disable wallet by default (luke-jr) +- #10451 `27b9931` contrib/init/bitcoind.openrcconf: Don't disable wallet by default (luke-jr) - #10323 `00d3692` Update to latest libsecp256k1 master (sipa) - #10422 `cec9e1e` Fix timestamp in fee estimate debug message (morcos) - #10566 `5d034ee` [docs] Use the "domain name setup" image (previously unused) in the gitian docs (practicalswift) @@ -740,9 +740,9 @@ Low-level RPC changes - #10728 `7397af9` fix typo in help text for removeprunedfunds (AkioNak) - #10193 `6dbcc74` scripted-diff: Remove #include (jtimon) - #10676 `379aed0` document script-based return fields for validateaddress (instagibbs) -- #10651 `cef4b5c` Verify binaries from BGLcore.org and BGL.org (TheBlueMatt) +- #10651 `cef4b5c` Verify binaries from bitcoincore.org and bitcoin.org (TheBlueMatt) - #10786 `ca4c545` Add PR description to merge commit in github-merge.py (sipa) -- #10812 `c5904e8` [utils] Allow BGL-cli's -rpcconnect option to be used with square brackets (jnewbery) +- #10812 `c5904e8` [utils] Allow bitcoin-cli's -rpcconnect option to be used with square brackets (jnewbery) - #10842 `3895e25` Fix incorrect Doxygen tag (@ince → @since). Doxygen parameter name matching (practicalswift) - #10681 `df0793f` add gdb attach process to test README (instagibbs) - #10789 `1124328` Punctuation/grammer fixes in rpcwallet.cpp (stevendlander) @@ -759,7 +759,7 @@ Low-level RPC changes - #9792 `342b9bc` FastRandomContext improvements and switch to ChaCha20 (sipa) - #9505 `67ed40e` Prevector Quick Destruct (JeremyRubin) - #10820 `ef37f20` Use cpuid intrinsics instead of asm code (sipa) -- #9999 `a328904` [LevelDB] Plug leveldb logs to BGL logs (NicolasDorier) +- #9999 `a328904` [LevelDB] Plug leveldb logs to bitcoin logs (NicolasDorier) - #9693 `c5e9e42` Prevent integer overflow in ReadVarInt (gmaxwell) - #10129 `351d0ad` scheduler: fix sub-second precision with boost < 1.50 (theuni) - #10153 `fade788` logging: Fix off-by-one for shrinkdebugfile default (MarcoFalke) @@ -771,7 +771,7 @@ Low-level RPC changes - #10837 `8bc6d1f` Fix resource leak on error in GetDevURandom (corebob) - #10832 `89bb036` init: Factor out AppInitLockDataDirectory and fix startup core dump issue (laanwj) - #10914 `b995a37` Add missing lock in CScheduler::AreThreadsServicingQueue() (TheBlueMatt) -- #10958 `659c096` Update to latest BGL patches for LevelDB (sipa) +- #10958 `659c096` Update to latest Bitcoin patches for LevelDB (sipa) - #10919 `c1c671f` Fix more init bugs (TheBlueMatt) Credits @@ -875,4 +875,4 @@ Thanks to everyone who directly contributed to this release: - Warren Togami - Wladimir J. van der Laan -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.15.1.md b/doc/release-notes/release-notes-0.15.1.md index 336020c786..75d2e09714 100644 --- a/doc/release-notes/release-notes-0.15.1.md +++ b/doc/release-notes/release-notes-0.15.1.md @@ -1,29 +1,29 @@ -BGL Core version *0.15.1* is now available from: +Bitcoin Core version *0.15.1* is now available from: - + or - + This is a new minor version release, including various bugfixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: - + How to Upgrade ============== If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over `/Applications/BGL-Qt` (on Mac) -or `BGLd`/`BGL-qt` (on Linux). +installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on Mac) +or `bitcoind`/`bitcoin-qt` (on Linux). The first time you run version 0.15.0 or higher, your chainstate database will be converted to a new format, which will take anywhere from a few minutes to @@ -52,10 +52,10 @@ processing the entire blockchain. Compatibility ============== -BGL Core is extensively tested on multiple operating systems using +Bitcoin Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.8+, and Windows Vista and later. Windows XP is not supported. -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not frequently tested on them. @@ -65,7 +65,7 @@ Notable changes Network fork safety enhancements -------------------------------- -A number of changes to the way BGL Core deals with peer connections and invalid blocks +A number of changes to the way Bitcoin Core deals with peer connections and invalid blocks have been made, as a safety precaution against blockchain forks and misbehaving peers. - Unrequested blocks with less work than the minimum-chain-work are now no longer processed even @@ -202,19 +202,19 @@ Low-level RPC changes - #11399 `a825d4a` Fix bip68-sequence rpc test (jl2012) - #11150 `847c75e` Add getmininginfo test (mess110) - #11407 `806c78f` add functional test for mempoolreplacement command line arg (instagibbs) -- #11433 `e169349` Restore BGL-util-test py2 compatibility (MarcoFalke) +- #11433 `e169349` Restore bitcoin-util-test py2 compatibility (MarcoFalke) - #11308 `2e1ac70` zapwallettxes: Wait up to 3s for mempool reload (MarcoFalke) -- #10798 `716066d` test BGL-cli (jnewbery) +- #10798 `716066d` test bitcoin-cli (jnewbery) - #11443 `019c492` Allow "make cov" out-of-tree; Fix rpc mapping check (MarcoFalke) - #11445 `51bad91` 0.15.1 Backports (MarcoFalke) - #11319 `2f0b30a` Fix error introduced into p2p-segwit.py, and prevent future similar errors (sdaftuar) - #10552 `e4605d9` Tests for zmqpubrawtx and zmqpubrawblock (achow101) - #11067 `eeb24a3` TestNode: Add wait_until_stopped helper method (MarcoFalke) - #11068 `5398f20` Move wait_until to util (MarcoFalke) -- #11125 `812c870` Add BGL-cli -stdin and -stdinrpcpass functional tests (promag) +- #11125 `812c870` Add bitcoin-cli -stdin and -stdinrpcpass functional tests (promag) - #11077 `1d80d1e` fix timeout issues from TestNode (jnewbery) - #11078 `f1ced0d` Make p2p-leaktests.py more robust (jnewbery) -- #11210 `f3f7891` Stop test_BGL-qt touching ~/.BGL (MeshCollider) +- #11210 `f3f7891` Stop test_bitcoin-qt touching ~/.bitcoin (MeshCollider) - #11234 `f0b6795` Remove redundant testutil.cpp|h files (MeshCollider) - #11215 `cef0319` fixups from set_test_params() (jnewbery) - #11345 `f9cf7b5` Check connectivity before sending in assumevalid.py (jnewbery) @@ -232,7 +232,7 @@ Low-level RPC changes - #11310 `b6468d3` Test listwallets RPC (mess110) ### Miscellaneous -- #11377 `75997c3` Disallow uncompressed pubkeys in BGL-tx [multisig] output adds (TheBlueMatt) +- #11377 `75997c3` Disallow uncompressed pubkeys in bitcoin-tx [multisig] output adds (TheBlueMatt) - #11437 `dea3b87` [Docs] Update Windows build instructions for using WSL and Ubuntu 17.04 (fanquake) - #11318 `8b61aee` Put back inadvertently removed copyright notices (gmaxwell) - #11442 `cf18f42` [Docs] Update OpenBSD Build Instructions for OpenBSD 6.2 (fanquake) @@ -274,4 +274,4 @@ Thanks to everyone who directly contributed to this release: - Tomas van der Wansem - Wladimir J. van der Laan -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.15.2.md b/doc/release-notes/release-notes-0.15.2.md index 549de22a62..1f58279051 100644 --- a/doc/release-notes/release-notes-0.15.2.md +++ b/doc/release-notes/release-notes-0.15.2.md @@ -1,25 +1,25 @@ -BGL Core version *0.15.2* is now available from: +Bitcoin Core version *0.15.2* is now available from: - + This is a new minor version release, including various bugfixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: - + How to Upgrade ============== If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over `/Applications/BGL-Qt` (on Mac) -or `BGLd`/`BGL-qt` (on Linux). +installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on Mac) +or `bitcoind`/`bitcoin-qt` (on Linux). The first time you run version 0.15.0 or higher, your chainstate database will be converted to a new format, which will take anywhere from a few minutes to @@ -48,10 +48,10 @@ processing the entire blockchain. Compatibility ============== -BGL Core is extensively tested on multiple operating systems using +Bitcoin Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.8+, and Windows Vista and later. Windows XP is not supported. -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not frequently tested on them. @@ -62,7 +62,7 @@ Denial-of-Service vulnerability CVE-2018-17144 ------------------------------- A denial-of-service vulnerability exploitable by miners has been discovered in -BGL Core versions 0.14.0 up to 0.16.2. It is recommended to upgrade any of +Bitcoin Core versions 0.14.0 up to 0.16.2. It is recommended to upgrade any of the vulnerable versions to 0.15.2 or 0.16.3 as soon as possible. 0.15.2 Change log @@ -87,9 +87,9 @@ the vulnerable versions to 0.15.2 or 0.16.3 as soon as possible. - #11289 `42ea47d` Add wallet backup text to import*, add* and dumpwallet RPCs (MeshCollider) - #11590 `6372a75` [Wallet] always show help-line of wallet encryption calls (Jonas Schnelli) -### BGL-tx +### bitcoin-tx -- #11554 `a69cc07` Sanity-check script sizes in BGL-tx (TheBlueMatt) +- #11554 `a69cc07` Sanity-check script sizes in bitcoin-tx (TheBlueMatt) ### Tests - #11277 `3a6cdd4` Add test for multiwallet batch RPC calls (Russell Yanofsky) diff --git a/doc/release-notes/release-notes-0.16.0.md b/doc/release-notes/release-notes-0.16.0.md index 9ca20a72df..8f158b3481 100644 --- a/doc/release-notes/release-notes-0.16.0.md +++ b/doc/release-notes/release-notes-0.16.0.md @@ -1,25 +1,25 @@ -BGL Core version 0.16.0 is now available from: +Bitcoin Core version 0.16.0 is now available from: - + This is a new major version release, including new features, various bugfixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: - + How to Upgrade ============== If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over `/Applications/BGL-Qt` (on Mac) -or `BGLd`/`BGL-qt` (on Linux). +installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on Mac) +or `bitcoind`/`bitcoin-qt` (on Linux). The first time you run version 0.15.0 or newer, your chainstate database will be converted to a new format, which will take anywhere from a few minutes to half an hour, @@ -40,10 +40,10 @@ wallets that were created with older versions are not affected by this. Compatibility ============== -BGL Core is extensively tested on multiple operating systems using +Bitcoin Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.8+, and Windows Vista and later. Windows XP is not supported. -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not frequently tested on them. Notable changes @@ -54,7 +54,7 @@ Wallet changes ### Segwit Wallet -BGL Core 0.16.0 introduces full support for segwit in the wallet and user interfaces. A new `-addresstype` argument has been added, which supports `legacy`, `p2sh-segwit` (default), and `bech32` addresses. It controls what kind of addresses are produced by `getnewaddress`, `getaccountaddress`, and `createmultisigaddress`. A `-changetype` argument has also been added, with the same options, and by default equal to `-addresstype`, to control which kind of change is used. +Bitcoin Core 0.16.0 introduces full support for segwit in the wallet and user interfaces. A new `-addresstype` argument has been added, which supports `legacy`, `p2sh-segwit` (default), and `bech32` addresses. It controls what kind of addresses are produced by `getnewaddress`, `getaccountaddress`, and `createmultisigaddress`. A `-changetype` argument has also been added, with the same options, and by default equal to `-addresstype`, to control which kind of change is used. A new `address_type` parameter has been added to the `getnewaddress` and `addmultisigaddress` RPCs to specify which type of address to generate. A `change_type` argument has been added to the `fundrawtransaction` RPC to override the `-changetype` argument for specific transactions. @@ -92,9 +92,9 @@ use the `replaceable` argument for individual transactions. ### Wallets directory configuration (`-walletdir`) -BGL Core now has more flexibility in where the wallets directory can be +Bitcoin Core now has more flexibility in where the wallets directory can be located. Previously wallet database files were stored at the top level of the -BGL data directory. The behavior is now: +bitcoin data directory. The behavior is now: - For new installations (where the data directory doesn't already exist), wallets will now be stored in a new `wallets/` subdirectory inside the data @@ -112,7 +112,7 @@ becomes unavailable during operation, funds may be lost. Build: Minimum GCC bumped to 4.8.x ------------------------------------ -The minimum version of the GCC compiler required to compile BGL Core is now 4.8. No effort will be +The minimum version of the GCC compiler required to compile Bitcoin Core is now 4.8. No effort will be made to support older versions of GCC. See discussion in issue #11732 for more information. The minimum version for the Clang compiler is still 3.3. Other minimum dependency versions can be found in `doc/dependencies.md` in the repository. @@ -191,14 +191,14 @@ The `validateaddress` RPC output has been extended with a few new fields, and su Other changed command-line options ---------------------------------- - `-debuglogfile=` can be used to specify an alternative debug logging file. -- BGL-cli now has an `-stdinrpcpass` option to allow the RPC password to be read from standard input. +- bitcoin-cli now has an `-stdinrpcpass` option to allow the RPC password to be read from standard input. - The `-usehd` option has been removed. -- BGL-cli now supports a new `-getinfo` flag which returns an output like that of the now-removed `getinfo` RPC. +- bitcoin-cli now supports a new `-getinfo` flag which returns an output like that of the now-removed `getinfo` RPC. Testing changes ---------------- - The default regtest JSON-RPC port has been changed to 18443 to avoid conflict with testnet's default of 18332. -- Segwit is now always active in regtest mode by default. Thus, if you upgrade a regtest node you will need to either -reindex or use the old rules by adding `vbparams=segwit:0:999999999999` to your regtest BGL.conf. Failure to do this will result in a CheckBlockIndex() assertion failure that will look like: Assertion `(pindexFirstNeverProcessed != nullptr) == (pindex->nChainTx == 0)' failed. +- Segwit is now always active in regtest mode by default. Thus, if you upgrade a regtest node you will need to either -reindex or use the old rules by adding `vbparams=segwit:0:999999999999` to your regtest bitcoin.conf. Failure to do this will result in a CheckBlockIndex() assertion failure that will look like: Assertion `(pindexFirstNeverProcessed != nullptr) == (pindex->nChainTx == 0)' failed. 0.16.0 change log ------------------ @@ -235,7 +235,7 @@ Testing changes - #11740 `59d3dc8` Implement BIP159 NODE_NETWORK_LIMITED (pruned peers) *signaling only* (jonasschnelli) - #11583 `37ffa16` Do not make it trivial for inbound peers to generate log entries (TheBlueMatt) - #11363 `ba2f195` Split socket create/connect (theuni) -- #11917 `bc66765` Add testnet DNS seed: seed.testnet.BGL.sprovoost.nl (Sjors) +- #11917 `bc66765` Add testnet DNS seed: seed.testnet.bitcoin.sprovoost.nl (Sjors) - #11512 `6e89de5` Use GetDesireableServiceFlags in seeds, dnsseeds, fixing static seed adding (TheBlueMatt) - #12262 `16bac24` Hardcoded seed update (laanwj) - #12270 `9cf6393` Update chainTxData for 0.16 (laanwj) @@ -268,7 +268,7 @@ Testing changes - #11923 `81c89e9` Remove unused fNoncriticalErrors variable from CWalletDB::FindWalletTx (PierreRochard) - #11726 `604e08c` Cleanups + nit fixes for walletdir PR (MeshCollider) - #11403 `d889c03` Segwit wallet support (sipa) -- #11970 `b7450cd` Add test coverage for BGL-cli multiwallet calls (ryanofsky) +- #11970 `b7450cd` Add test coverage for bitcoin-cli multiwallet calls (ryanofsky) - #11904 `66e3af7` Add a lock to the wallet directory (MeshCollider) - #12101 `c7978be` Clamp walletpassphrase timeout to 2^30 seconds and check its bounds (achow101) - #12210 `17180fa` Deprecate addwitnessaddress (laanwj) @@ -281,7 +281,7 @@ Testing changes ### RPC and other APIs - #11008 `3841aaf` Enable disablesafemode by default (gmaxwell) - #11050 `7ed57d3` Avoid treating null RPC arguments different from missing arguments (ryanofsky) -- #10997 `affe927` Add option -stdinrpcpass to BGL-cli to allow RPC password to be read from standard input (jharvell) +- #10997 `affe927` Add option -stdinrpcpass to bitcoin-cli to allow RPC password to be read from standard input (jharvell) - #11179 `e0e3cbb` Push down safe mode checks (laanwj) - #11203 `d745b4c` add wtxid to mempool entry output (sdaftuar) - #11099 `bc561b4` Add savemempool RPC (greenaddress) @@ -366,7 +366,7 @@ Testing changes - #11541 `bb9ab0f` Build: Fix Automake warnings when running autogen.sh (fanquake) - #11611 `0e70791` [build] Don't fail when passed --disable-lcov and lcov isn't available (fanquake) - #11651 `3c098a8` refactor: Make all #includes relative to project root (laanwj, MeshCollider, ryanofsky) -- #11621 `1f7695b` [build] Add temp_BGL_locale_qrc to CLEAN_QT to fix make distcheck (fanquake) +- #11621 `1f7695b` [build] Add temp_bitcoin_locale_qrc to CLEAN_QT to fix make distcheck (fanquake) - #11755 `84fa645` [Docs] Bump minimum required version of GCC to 4.8 (fanquake) - #9254 `6d3dc52` [depends] ZeroMQ 4.2.2 (fanquake) - #11842 `3c8f0a3` [build] Add missing stuff to clean-local (kallewoof) @@ -376,7 +376,7 @@ Testing changes - #11903 `8f68fd2` [trivial] Add required package dependencies for depends cross compilation (jonasschnelli) - #12168 `45cf8a0` #include sys/fcntl.h to just fcntl.h (without sys/) (jsarenik) - #12095 `3fa1ab4` Use BDB_LIBS/CFLAGS and pass --disable-replication (fanquake) -- #11711 `6378e5c` BGL_qt.m4: Minor fixes and clean-ups (fanquake) +- #11711 `6378e5c` bitcoin_qt.m4: Minor fixes and clean-ups (fanquake) - #11989 `90d4104` .gitignore: add QT Creator artifacts (Sjors) - #11577 `c0ae864` Fix warnings (-Wsign-compare) when building with DEBUG_ADDRMAN (practicalswift) @@ -389,7 +389,7 @@ Testing changes - #11260 `52f8877` travis: Assert default datadir isn't created, Run scripted diff only once (MarcoFalke) - #11271 `638e6c5` travis: filter out pyenv (theuni) - #11285 `3255d63` Add -usehd to excluded args in check-doc.py (MeshCollider) -- #11297 `16e4184` Make sure ~/.BGL doesn't exist before build (MeshCollider) +- #11297 `16e4184` Make sure ~/.bitcoin doesn't exist before build (MeshCollider) - #11311 `cce94c5` travis: Revert default datadir check (MarcoFalke) - #11300 `f4ed44a` Add a lint check for trailing whitespace (MeshCollider) - #11323 `4ce2f3d` mininode: add an optimistic write and disable nagle (theuni) @@ -535,7 +535,7 @@ Testing changes - #10781 `60dd9cc` Python cleanups (practicalswift) - #10701 `50fae68` Remove the virtual specifier for functions with the override specifier (practicalswift) - #11164 `38a54a5` Fix boost headers included as user instead of system headers (danra) -- #11143 `3aa60b7` Fix include path for BGL-config.h (danra) +- #11143 `3aa60b7` Fix include path for bitcoin-config.h (danra) - #8330 `59e1789` Structure Packing Optimizations in C{,Mutable}Transaction (JeremyRubin) - #10845 `39ae413` Remove unreachable code (practicalswift) - #11238 `6acdb1f` Add assertions before potential null deferences (MeshCollider) @@ -578,8 +578,8 @@ Testing changes ### Miscellaneous - #11246 `777519b` github-merge: Coalesce git fetches (laanwj) -- #10871 `c9a4aa8` Handle getinfo in BGL-cli w/ -getinfo (revival of #8843) (achow101) -- #11419 `093074b` Utils: Fix launchctl not being able to stop BGLd (OmeGak) +- #10871 `c9a4aa8` Handle getinfo in bitcoin-cli w/ -getinfo (revival of #8843) (achow101) +- #11419 `093074b` Utils: Fix launchctl not being able to stop bitcoind (OmeGak) - #11394 `6e4e98e` Perform a weaker subtree check in Travis (sipa) - #11702 `4122112` [build] Add a script for installing db4 (jamesob) - #11794 `dd49862` Prefix leveldb debug logging (laanwj) @@ -596,7 +596,7 @@ Testing changes - #11951 `1fb34e0` Remove dead feeest-file read code for old versions (TheBlueMatt) - #11421 `9ccafb1` Merge current secp256k1 subtree (MarcoFalke) - #11573 `2631d55` [Util] Update tinyformat.h (fanquake) -- #10529 `331352f` Improve BGLd systemd service file (Flowdalic) +- #10529 `331352f` Improve bitcoind systemd service file (Flowdalic) - #11620 `70fec9e` [build] .gitignore: add background.tiff (Sjors) - #11558 `68e021e` Minimal code changes to allow msvc compilation (sipsorcery) - #11284 `10bee0d` Fix invalid memory access in CScript::operator+= (guidovranken, ajtowns) @@ -717,4 +717,4 @@ Thanks to everyone who directly contributed to this release: - Willy Ko - Wladimir J. van der Laan -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.16.1.md b/doc/release-notes/release-notes-0.16.1.md index 4c855835d7..d99361ae1d 100644 --- a/doc/release-notes/release-notes-0.16.1.md +++ b/doc/release-notes/release-notes-0.16.1.md @@ -1,25 +1,25 @@ -BGL Core version 0.16.1 is now available from: +Bitcoin Core version 0.16.1 is now available from: - + This is a new minor version release, with various bugfixes as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: - + How to Upgrade ============== If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over `/Applications/BGL-Qt` (on Mac) -or `BGLd`/`BGL-qt` (on Linux). +installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on Mac) +or `bitcoind`/`bitcoin-qt` (on Linux). The first time you run version 0.15.0 or newer, your chainstate database will be converted to a new format, which will take anywhere from a few minutes to half an hour, @@ -40,10 +40,10 @@ wallets that were created with older versions are not affected by this. Compatibility ============== -BGL Core is extensively tested on multiple operating systems using +Bitcoin Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.8+, and Windows Vista and later. Windows XP is not supported. -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not frequently tested on them. Notable changes @@ -97,11 +97,11 @@ weights. - #12804 `4bdb0ce` Fix intermittent rpc_net.py failure. (jnewbery) - #12553 `0e98f96` Prefer wait_until over polling with time.sleep (Empact) - #12486 `cfebd40` Round target fee to 8 decimals in assert_fee_amount (kallewoof) -- #12843 `df38b13` Test starting BGLd with -h and -version (jnewbery) +- #12843 `df38b13` Test starting bitcoind with -h and -version (jnewbery) - #12475 `41c29f6` Fix python TypeError in script.py (MarcoFalke) - #12638 `0a76ed2` Cache only chain and wallet for regtest datadir (MarcoFalke) - #12902 `7460945` Handle potential cookie race when starting node (sdaftuar) -- #12904 `6c26df0` Ensure BGLd processes are cleaned up when tests end (sdaftuar) +- #12904 `6c26df0` Ensure bitcoind processes are cleaned up when tests end (sdaftuar) - #13049 `9ea62a3` Backports (MarcoFalke) - #13201 `b8aacd6` Handle disconnect_node race (sdaftuar) @@ -142,4 +142,4 @@ Thanks to everyone who directly contributed to this release: - Tamas Blummer - Wladimir J. van der Laan -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.16.2.md b/doc/release-notes/release-notes-0.16.2.md index ee18ff1d14..d549748d25 100644 --- a/doc/release-notes/release-notes-0.16.2.md +++ b/doc/release-notes/release-notes-0.16.2.md @@ -1,25 +1,25 @@ -BGL Core version 0.16.2 is now available from: +Bitcoin Core version 0.16.2 is now available from: - + This is a new minor version release, with various bugfixes as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: - + How to Upgrade ============== If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over `/Applications/BGL-Qt` (on Mac) -or `BGLd`/`BGL-qt` (on Linux). +installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on Mac) +or `bitcoind`/`bitcoin-qt` (on Linux). The first time you run version 0.15.0 or newer, your chainstate database will be converted to a new format, which will take anywhere from a few minutes to half an hour, @@ -40,10 +40,10 @@ wallets that were created with older versions are not affected by this. Compatibility ============== -BGL Core is extensively tested on multiple operating systems using +Bitcoin Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.8+, and Windows Vista and later. Windows XP is not supported. -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not frequently tested on them. 0.16.2 change log @@ -113,4 +113,4 @@ And to those that reported security issues: - Braydon Fuller - Himanshu Mehta -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.16.3.md b/doc/release-notes/release-notes-0.16.3.md index 12e63f3348..2e52d309c2 100644 --- a/doc/release-notes/release-notes-0.16.3.md +++ b/doc/release-notes/release-notes-0.16.3.md @@ -1,24 +1,24 @@ -BGL Core version 0.16.3 is now available from: +Bitcoin Core version 0.16.3 is now available from: - + This is a new minor version release, with various bugfixes. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: - + How to Upgrade ============== If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over `/Applications/BGL-Qt` (on Mac) -or `BGLd`/`BGL-qt` (on Linux). +installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on Mac) +or `bitcoind`/`bitcoin-qt` (on Linux). The first time you run version 0.15.0 or newer, your chainstate database will be converted to a new format, which will take anywhere from a few minutes to half an hour, @@ -39,10 +39,10 @@ wallets that were created with older versions are not affected by this. Compatibility ============== -BGL Core is extensively tested on multiple operating systems using +Bitcoin Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.8+, and Windows Vista and later. Windows XP is not supported. -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not frequently tested on them. Notable changes @@ -52,7 +52,7 @@ Denial-of-Service vulnerability ------------------------------- A denial-of-service vulnerability (CVE-2018-17144) exploitable by miners has -been discovered in BGL Core versions 0.14.0 up to 0.16.2. It is recommended +been discovered in Bitcoin Core versions 0.14.0 up to 0.16.2. It is recommended to upgrade any of the vulnerable versions to 0.16.3 as soon as possible. 0.16.3 change log @@ -65,7 +65,7 @@ to upgrade any of the vulnerable versions to 0.16.3 as soon as possible. - #13547 `212ef1f` Make `signrawtransaction*` give an error when amount is needed but missing (ajtowns) ### Miscellaneous -- #13655 `1cdbea7` BGLconsensus: invalid flags error should be set to `BGLconsensus_err` (afk11) +- #13655 `1cdbea7` bitcoinconsensus: invalid flags error should be set to `bitcoinconsensus_err` (afk11) ### Documentation - #13844 `11b9dbb` correct the help output for -prune (hebasto) diff --git a/doc/release-notes/release-notes-0.17.0.1.md b/doc/release-notes/release-notes-0.17.0.1.md index 1b5645a309..92db7dac7d 100644 --- a/doc/release-notes/release-notes-0.17.0.1.md +++ b/doc/release-notes/release-notes-0.17.0.1.md @@ -1,16 +1,16 @@ -BGL Core version 0.17.0.1 is now available from: +Bitcoin Core version 0.17.0.1 is now available from: - + This release provides a minor bug fix for 0.17.0. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: - + Notable changes =============== diff --git a/doc/release-notes/release-notes-0.17.0.md b/doc/release-notes/release-notes-0.17.0.md index ebf156a1ec..418d7ba5f9 100644 --- a/doc/release-notes/release-notes-0.17.0.md +++ b/doc/release-notes/release-notes-0.17.0.md @@ -1,25 +1,25 @@ -BGL Core version 0.17.0 is now available from: +Bitcoin Core version 0.17.0 is now available from: - + This is a new major version release, including new features, various bugfixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: - + How to Upgrade ============== If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over `/Applications/BGL-Qt` (on Mac) -or `BGLd`/`BGL-qt` (on Linux). +installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on Mac) +or `bitcoind`/`bitcoin-qt` (on Linux). If your node has a txindex, the txindex db will be migrated the first time you run 0.17.0 or newer, which may take up to a few hours. Your node will not be functional until this migration completes. @@ -46,10 +46,10 @@ processing the entire blockchain. Compatibility ============== -BGL Core is extensively tested on multiple operating systems using +Bitcoin Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.10+, and Windows 7 and newer (Windows XP is not supported). -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not frequently tested on them. From 0.17.0 onwards macOS <10.10 is no longer supported. 0.17.0 is built using Qt 5.9.x, which doesn't @@ -69,7 +69,7 @@ Changed configuration options ----------------------------- - `-includeconf=` can be used to include additional configuration files. - Only works inside the `BGL.conf` file, not inside included files or from + Only works inside the `bitcoin.conf` file, not inside included files or from command-line. Multiple files may be included. Can be disabled from command- line via `-noincludeconf`. Note that multi-argument commands like `-includeconf` will override preceding `-noincludeconf`, i.e. @@ -78,7 +78,7 @@ Changed configuration options includeconf=relative.conf ``` - as BGL.conf will still include `relative.conf`. + as bitcoin.conf will still include `relative.conf`. GUI changes ----------- @@ -109,7 +109,7 @@ same as before. Dynamic loading and creation of wallets --------------------------------------- -Previously, wallets could only be loaded or created at startup, by specifying `-wallet` parameters on the command line or in the BGL.conf file. It is now possible to load, create and unload wallets dynamically at runtime: +Previously, wallets could only be loaded or created at startup, by specifying `-wallet` parameters on the command line or in the bitcoin.conf file. It is now possible to load, create and unload wallets dynamically at runtime: - Existing wallets can be loaded by calling the `loadwallet` RPC. The wallet can be specified as file/directory basename (which must be located in the `walletdir` directory), or as an absolute path to a file/directory. - New wallets can be created (and loaded) by calling the `createwallet` RPC. The provided name must not match a wallet file in the `walletdir` directory or the name of a wallet that is currently loaded. @@ -131,8 +131,8 @@ It is now possible for a single configuration file to set different options for different networks. This is done by using sections or by prefixing the option with the network, such as: - main.uacomment=BGL - test.uacomment=BGL-testnet + main.uacomment=bitcoin + test.uacomment=bitcoin-testnet regtest.uacomment=regtest [main] mempoolsize=300 @@ -151,7 +151,7 @@ outside of sections. A new 'label' API has been introduced for the wallet. This is intended as a replacement for the deprecated 'account' API. The 'account' can continue to -be used in V0.17 by starting BGLd with the '-deprecatedrpc=accounts' +be used in V0.17 by starting bitcoind with the '-deprecatedrpc=accounts' argument, and will be fully removed in V0.18. The label RPC methods mirror the account functionality, with the following functional differences: @@ -184,18 +184,18 @@ Here are the changes to RPC methods: | `listtransactions` | The `account` named parameter has been renamed to `dummy`. If provided, the `dummy` parameter must be set to the string `*`, unless running with the `-deprecatedrpc=accounts` argument (in which case functionality is unchanged). | | `getbalance` | `account`, `minconf` and `include_watchonly` parameters are deprecated, and can only be used if running with '-deprecatedrpc=accounts' | -BIP 174 Partially Signed BGL Transactions support +BIP 174 Partially Signed Bitcoin Transactions support ----------------------------------------------------- -[BIP 174 PSBT](https://github.com/BGL/bips/blob/master/bip-0174.mediawiki) is an interchange format for BGL transactions that are not fully signed +[BIP 174 PSBT](https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki) is an interchange format for Bitcoin transactions that are not fully signed yet, together with relevant metadata to help entities work towards signing it. It is intended to simplify workflows where multiple parties need to cooperate to produce a transaction. Examples include hardware wallets, multisig setups, and -[CoinJoin](https://BGLtalk.org/?topic=279249) transactions. +[CoinJoin](https://bitcointalk.org/?topic=279249) transactions. ### Overall workflow -Overall, the construction of a fully signed BGL transaction goes through the +Overall, the construction of a fully signed Bitcoin transaction goes through the following steps: - A **Creator** proposes a particular transaction to be created. He constructs @@ -210,7 +210,7 @@ following steps: partial signature for the inputs for which they have relevant key(s). - A **Finalizer** is run for each input to convert the partial signatures and possibly script information into a final `scriptSig` and/or `scriptWitness`. -- An **Extractor** produces a valid BGL transaction (in network format) +- An **Extractor** produces a valid Bitcoin transaction (in network format) from a PSBT for which all inputs are finalized. Generally, each of the above (excluding Creator and Extractor) will simply @@ -256,7 +256,7 @@ hardware implementations will typically implement multiple roles simultaneously. Upgrading non-HD wallets to HD wallets -------------------------------------- -Since BGL Core 0.13.0, creating new BIP 32 Hierarchical Deterministic wallets has been supported by BGL Core but old non-HD wallets could not be upgraded to HD. Now non-HD wallets can be upgraded to HD using the `-upgradewallet` command line option. This upgrade will result in the all keys in the keypool being marked as used and a new keypool generated. **A new backup must be made when this upgrade is performed.** +Since Bitcoin Core 0.13.0, creating new BIP 32 Hierarchical Deterministic wallets has been supported by Bitcoin Core but old non-HD wallets could not be upgraded to HD. Now non-HD wallets can be upgraded to HD using the `-upgradewallet` command line option. This upgrade will result in the all keys in the keypool being marked as used and a new keypool generated. **A new backup must be made when this upgrade is performed.** Additionally, `-upgradewallet` can be used to upgraded from a non-split HD chain (all keys generated with `m/0'/0'/i'`) to a split HD chain (receiving keys generated with `'m/0'/0'/i'` and change keys generated with `m'/0'/1'/i'`). When this upgrade occurs, all keys already in the keypool will remain in the keypool to be used until all keys from before the upgrade are exhausted. This is to avoid issues with backups and downgrades when some keys may come from the change key keypool. Users can begin using the new split HD chain keypools by using the `newkeypool` RPC to mark all keys in the keypool as used and begin using a new keypool generated from the split HD chain. @@ -290,9 +290,9 @@ Low-level RPC changes `fee`, `modifiedfee`, `ancestorfee` and `descendantfee`. - The new RPC `getzmqnotifications` returns information about active ZMQ notifications. -- When BGL is not started with any `-wallet=` options, the name of +- When bitcoin is not started with any `-wallet=` options, the name of the default wallet returned by `getwalletinfo` and `listwallets` RPCs is - now the empty string `""` instead of `"wallet.dat"`. If BGL is started + now the empty string `""` instead of `"wallet.dat"`. If bitcoin is started with any `-wallet=` options, there is no change in behavior, and the name of any wallet is just its `` string. - Passing an empty string (`""`) as the `address_type` parameter to @@ -322,7 +322,7 @@ Low-level RPC changes `pubkeys`, `sigsrequired`, `pubkey`, `addresses`, `embedded`, `iscompressed`, `account`, `timestamp`, `hdkeypath`, `hdmasterkeyid`. - `signrawtransaction` is deprecated and will be fully removed in v0.18. To use - `signrawtransaction` in v0.17, restart BGLd with + `signrawtransaction` in v0.17, restart bitcoind with `-deprecatedrpc=signrawtransaction`. Projects should transition to using `signrawtransactionwithkey` and `signrawtransactionwithwallet` before upgrading to v0.18. @@ -336,7 +336,7 @@ Other API changes - The log timestamp format is now ISO 8601 (e.g. "2018-02-28T12:34:56Z"). -- When running BGLd with `-debug` but without `-daemon`, logging to stdout +- When running bitcoind with `-debug` but without `-daemon`, logging to stdout is now the default behavior. Setting `-printtoconsole=1` no longer implicitly disables logging to debug.log. Instead, logging to file can be explicitly disabled by setting `-debuglogfile=0`. @@ -345,7 +345,7 @@ Transaction index changes ------------------------- The transaction index is now built separately from the main node procedure, -meaning the `-txindex` flag can be toggled without a full reindex. If BGLd +meaning the `-txindex` flag can be toggled without a full reindex. If bitcoind is run with `-txindex` on a node that is already partially or fully synced without one, the transaction index will be built in the background and become available once caught up. When switching from running `-txindex` to running @@ -417,7 +417,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #10387 `5c2aff8` Eventually connect to `NODE_NETWORK_LIMITED` peers (jonasschnelli) - #9037 `a36834f` Add test-before-evict discipline to addrman (EthanHeilman) - #12622 `e1d6e2a` Correct addrman logging (laanwj) -- #11962 `0a01843` add seed.BGL.sprovoost.nl to DNS seeds (Sjors) +- #11962 `0a01843` add seed.bitcoin.sprovoost.nl to DNS seeds (Sjors) - #12569 `23e7fe8` Increase signal-to-noise ratio in debug.log by adjusting log level when logging failed non-manual connect():s (practicalswift) - #12855 `c199869` Minor accumulated cleanups (tjps) - #13153 `ef46c99` Add missing newlines to debug logging (laanwj) @@ -568,7 +568,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #12080 `56cc022` Add support to search the address book (promag) - #12621 `2bac3e4` Avoid querying unnecessary model data when filtering transactions (promag) - #12721 `e476826` remove "new" button during receive-mode in addressbook (jonasschnelli) -- #12723 `310dc61` Qt5: Warning users about invalid-BIP21 URI BGL:// (krab) +- #12723 `310dc61` Qt5: Warning users about invalid-BIP21 URI bitcoin:// (krab) - #12610 `25cf18f` Multiwallet for the GUI (jonasschnelli) - #12779 `f4353da` Remove unused method setupAmountWidget(…) (practicalswift) - #12795 `68484d6` do not truncate .dat extension for wallets in gui (instagibbs) @@ -587,7 +587,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #13043 `6e249e4` OptionsDialog: add prune setting (Sjors) - #13506 `6579d80` load wallet in UI after possible init aborts (jonasschnelli) - #13458 `dc53f7f` Drop qt4 support (laanwj) -- #13528 `b877c39` Move BGLGUI initializers to class, fix initializer order warning (laanwj) +- #13528 `b877c39` Move BitcoinGUI initializers to class, fix initializer order warning (laanwj) - #13536 `baf3a3a` coincontrol: Remove unused qt4 workaround (MarcoFalke) - #13537 `10ffca7` Peer table: Visualize inbound/outbound state for every row (wodry) - #13791 `2c14c1f` Reject dialogs if key escape is pressed (promag) @@ -623,7 +623,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #13465 `81069a7` Avoid concurrency issue when make multiple target (ken2812221) - #13454 `45c00f8` Make sure `LC_ALL=C` is set in all shell scripts (practicalswift) - #13480 `31145a3` Avoid copies in range-for loops and add a warning to detect them (theuni) -- #13486 `66e1a08` Move rpc/util.cpp from libBGL-util to libBGL-server (ken2812221) +- #13486 `66e1a08` Move rpc/util.cpp from libbitcoin-util to libbitcoin-server (ken2812221) - #13580 `40334c7` Detect if char equals `int8_t` (ken2812221) - #12788 `287e4ed` Tune wildcards for LIBSECP256K1 target (kallewoof) - #13611 `b55f0c3` bugfix: Use `__cpuid_count` for gnu C to avoid gitian build fail (ken2812221) @@ -633,7 +633,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #13659 `90b1c7e` add missing leveldb defines (theuni) - #13368 `c0f1569` Update gitian-build.sh for docker (achow101) - #13171 `19d8ca5` Change gitian-descriptors to use bionic instead (ken2812221) -- #13604 `75bea05` Add depends 32-bit arm support for BGL-qt (TheCharlatan) +- #13604 `75bea05` Add depends 32-bit arm support for bitcoin-qt (TheCharlatan) - #13623 `9cdb19f` Migrate gitian-build.sh to python (ken2812221) - #13689 `8c36432` disable Werror when building zmq (greenaddress) - #13617 `cf7f9ae` release: Require macos 10.10+ (fanquake) @@ -641,7 +641,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #13095 `415f2bf` update `ax_boost_chrono`/`unit_test_framework` (fanquake) - #13732 `e8ffec6` Fix Qt's rcc determinism (Fuzzbawls) - #13782 `8284f1d` Fix osslsigncode compile issue in gitian-build (ken2812221) -- #13696 `2ab7208` Add aarch64 qt depends support for cross compiling BGL-qt (TheCharlatan) +- #13696 `2ab7208` Add aarch64 qt depends support for cross compiling bitcoin-qt (TheCharlatan) - #13705 `b413ba0` Add format string linter (practicalswift) - #14000 `48c8459` fix qt determinism (theuni) - #14018 `3e4829a` Bugfix: NSIS: Exclude `Makefile*` from docs (luke-jr) @@ -652,12 +652,12 @@ Support for Python 2 has been discontinued for all test files and tools. - #12252 `8d57319` Require all tests to follow naming convention (ajtowns) - #12295 `935eb8d` Enable flake8 warnings for all currently non-violated rules (practicalswift) - #11858 `b4d8549` Prepare tests for Windows (MarcoFalke) -- #11771 `2dbc4a4` Change invalidtxrequest to use BGLTestFramework (jnewbery) +- #11771 `2dbc4a4` Change invalidtxrequest to use BitcoinTestFramework (jnewbery) - #12200 `d09968f` Bind functional test nodes to 127.0.0.1 (Sjors) - #12425 `26dc2da` Add some script tests (richardkiss) - #12455 `23481fa` Fix bip68 sequence test to reflect updated rpc error message (Empact) - #12477 `acd1e61` Plug memory leaks and stack-use-after-scope (MarcoFalke) -- #12443 `07090c5` Move common args to BGL.conf (MarcoFalke) +- #12443 `07090c5` Move common args to bitcoin.conf (MarcoFalke) - #12570 `39dcac2` Add test cases for HexStr (`std::reverse_iterator` and corner cases) (kostaz) - #12582 `6012f1c` Fix ListCoins test failure due to unset `g_wallet_allow_fallback_fee` (ryanofsky) - #12516 `7f99964` Avoid unintentional unsigned integer wraparounds in tests (practicalswift) @@ -665,7 +665,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #12600 `29088b1` Add a test for large tx output scripts with segwit input (richardkiss) - #12627 `791c3ea` Fix some tests to work on native windows (MarcoFalke) - #12405 `0f58d7f` travis: Full clone for git subtree check (MarcoFalke) -- #11772 `0630974` Change invalidblockrequest to use BGLTestFramework (jnewbery) +- #11772 `0630974` Change invalidblockrequest to use BitcoinTestFramework (jnewbery) - #12681 `1846296` Fix ComputeTimeSmart test failure with `-DDEBUG_LOCKORDER` (ryanofsky) - #12682 `9f04c8e` travis: Clone depth 1 unless `$check_doc` (MarcoFalke) - #12710 `00d1680` Append scripts to new `test_list` array to fix bad assignment (jeffrade) @@ -678,9 +678,9 @@ Support for Python 2 has been discontinued for all test files and tools. - #12806 `18606eb` Fix function names in `feature_blocksdir` (MarcoFalke) - #12811 `0d8fc8d` Make summary row bold-red if any test failed and show failed tests at end of table (laanwj) - #12790 `490644d` Use blockmaxweight where tests previously had blockmaxsize (conscott) -- #11773 `f0f9732` Change `feature_block.py` to use BGLTestFramework (jnewbery) +- #11773 `f0f9732` Change `feature_block.py` to use BitcoinTestFramework (jnewbery) - #12839 `40f4baf` Remove travis checkout depth (laanwj) -- #11817 `2a09a78` Change `feature_csv_activation.py` to use BGLTestFramework (jnewbery) +- #11817 `2a09a78` Change `feature_csv_activation.py` to use BitcoinTestFramework (jnewbery) - #12284 `fa5825d` Remove assigned but never used local variables. Enable Travis checking for unused local variables (practicalswift) - #12719 `9beded5` Add note about test suite naming convention in developer-notes.md (practicalswift) - #12861 `c564424` Stop `feature_block.py` from blowing up memory (jnewbery) @@ -690,7 +690,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #12766 `69310a3` Tidy up REST interface functional tests (romanz) - #12849 `83c7533` Add logging in loops in `p2p_sendhears.py` (ccdle12) - #12895 `d6f10b2` Add note about test suite name uniqueness requirement to developer notes (practicalswift) -- #12856 `27278df` Add Metaclass for BGLTestFramework (WillAyd) +- #12856 `27278df` Add Metaclass for BitcoinTestFramework (WillAyd) - #12918 `6fc5a05` Assert on correct variable (kallewoof) - #11878 `a04440f` Add Travis check for duplicate includes (practicalswift) - #12917 `cf8073f` Windows fixups for functional tests (MarcoFalke) @@ -747,7 +747,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #13219 `08516e0` bench: Add block assemble benchmark (MarcoFalke) - #13530 `b1dc39d` bench: Add missing pow.h header (laanwj) - #12686 `2643fa5` Add -ftrapv to CFLAGS and CXXFLAGS when --enable-debug is used. Enable -ftrapv in Travis (practicalswift) -- #12882 `d96bdd7` Make `test_BGL` pass under ThreadSanitzer (clang). Fix lock-order-inversion (potential deadlock) (practicalswift) +- #12882 `d96bdd7` Make `test_bitcoin` pass under ThreadSanitzer (clang). Fix lock-order-inversion (potential deadlock) (practicalswift) - #13535 `2328039` `wallet_basic`: Specify minimum required amount for listunspent (MarcoFalke) - #13551 `c93c360` Fix incorrect documentation for test case `cuckoocache_hit_rate_ok` (practicalswift) - #13563 `b330f3f` bench: Simplify coinselection (promag) @@ -763,7 +763,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #13663 `cbc9b50` Avoid read/write to default datadir (MarcoFalke) - #13682 `f8a32a3` bench: Remove unused variable (practicalswift) - #13638 `6fcdb5e` Use `MAX_SCRIPT_ELEMENT_SIZE` from script.py (domob1812) -- #13687 `9d26b69` travis: Check that ~/.BGL is never created (MarcoFalke) +- #13687 `9d26b69` travis: Check that ~/.bitcoin is never created (MarcoFalke) - #13715 `e1260a7` fixes mininode's P2PConnection sending messages on closing transport (marcoagner) - #13729 `aa9429a` travis: Avoid unnecessarily setting env variables on the lint build (Empact) - #13747 `ab28b5b` Skip P2PConnection's `is_closing()` check when not available (domob1812) @@ -774,7 +774,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #13779 `d25079a` travis: Improve readability of travis.yml and log outputs (scravy) - #13822 `0fb9c87` bench: Make coinselection output groups pass eligibility filter (achow101) - #13247 `e83d82a` Add tests to SingleThreadedSchedulerClient() and document the memory model (skeees) -- #13811 `660abc1` travis: Run `bench_BGL` once (MarcoFalke) +- #13811 `660abc1` travis: Run `bench_bitcoin` once (MarcoFalke) - #13837 `990e182` Extract `rpc_timewait` as test param (MarcoFalke) - #13851 `9c4324d` fix locale for lint-shell (scravy) - #13823 `489b51b` quote path in authproxy for external multiwallets (MarcoFalke) @@ -809,8 +809,8 @@ Support for Python 2 has been discontinued for all test files and tools. - #10694 `ae5bcc7` Remove redundant code in MutateTxSign(CMutableTransaction&, const std::string&) (practicalswift) - #12659 `3d16f58` Improve Fatal LevelDB Log Messages (eklitzke) - #12643 `0f0229d` util: Remove unused `sync_chain` (MarcoFalke) -- #12102 `7fb8fb4` Apply hardening measures in BGLd systemd service file (Flowdalic) -- #12652 `55f490a` BGL-cli: Provide a better error message when BGLd is not running (practicalswift) +- #12102 `7fb8fb4` Apply hardening measures in bitcoind systemd service file (Flowdalic) +- #12652 `55f490a` bitcoin-cli: Provide a better error message when bitcoind is not running (practicalswift) - #12630 `c290508` Provide useful error message if datadir is not writable (murrayn) - #11881 `624bee9` Remove Python2 support (jnewbery) - #12821 `082e26c` contrib: Remove unused import string (MarcoFalke) @@ -831,7 +831,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #13031 `826acc9` Fix for utiltime to compile with msvc (sipsorcery) - #13119 `81743b5` Remove script to clean up datadirs (MarcoFalke) - #12954 `5a66642` util: Refactor logging code into a global object (jimpo) -- #12769 `35eb9d6` Add systemd service to BGLd in debian package (ghost) +- #12769 `35eb9d6` Add systemd service to bitcoind in debian package (ghost) - #13146 `0bc980b` rpcauth: Make it possible to provide a custom password (laanwj) - #13148 `b62b437` logging: Fix potential use-after-free in logprintstr(…) (practicalswift) - #13214 `0612d96` Enable Travis checking for two Python linting rules we are currently not violating (practicalswift) @@ -840,7 +840,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #13228 `d792e47` Add script to detect circular dependencies between source modules (sipa) - #13320 `e08c130` Ensure gitian-build.sh uses bash (jhfrontz) - #13301 `e4082d5` lint: Add linter to error on `#include <*.cpp>` (Empact) -- #13374 `56f6936` utils and libraries: checking for BGL address in translations (kaplanmaxe) +- #13374 `56f6936` utils and libraries: checking for bitcoin address in translations (kaplanmaxe) - #13230 `7c32b41` Simplify include analysis by enforcing the developer guide's include syntax (practicalswift) - #13450 `32bf4c6` Add linter: Enforce the source code file naming convention described in the developer notes (practicalswift) - #13479 `fa2ea37` contrib: Fix cve-2018-12356 by hardening the regex (loganaden) @@ -848,7 +848,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #13494 `d67eff8` Follow-up to #13454: Fix broken build by exporting `LC_ALL=C` (practicalswift) - #13510 `03f3925` Scripts and tools: Obsolete #!/bin/bash shebang (DesWurstes) - #13577 `c9eb8d1` logging: Avoid nstart may be used uninitialized in appinitmain warning (mruddy) -- #13603 `453ae5e` BGL-tx: Stricter check for valid integers (domob1812) +- #13603 `453ae5e` bitcoin-tx: Stricter check for valid integers (domob1812) - #13118 `c05c93c` RPCAuth Detection in Logs (Linrono) - #13647 `4027ec1` Scripts and tools: Fix `BIND_NOW` check in security-check.py (conradoplg) - #13692 `f5d166a` contrib: Clone core repo in gitian-build (MarcoFalke) @@ -872,7 +872,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #13441 `4a7e64f` Prevent shared conf files from failing with different available options in different binaries (achow101) - #13471 `5eca4e8` For AVX2 code, also check for AVX, XSAVE, and OS support (sipa) - #13503 `c655b2c` Document FreeBSD quirk. Fix FreeBSD build: Use std::min(…) to allow for compilation under certain FreeBSD versions (practicalswift) -- #13725 `07ce278` Fix BGL-cli --version (Empact) +- #13725 `07ce278` Fix bitcoin-cli --version (Empact) ### Documentation - #12306 `216f9a4` Improvements to UNIX documentation (axvr) @@ -898,7 +898,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #12800 `2d97611` Add note about our preference for scoped enumerations ("enum class") (practicalswift) - #12798 `174d016` Refer to witness reserved value as spec. in the BIP (MarcoFalke) - #12759 `d3908e2` Improve formatting of developer notes (eklitzke) -- #12877 `2b54155` Use BGLd in Tor documentation (knoxcard) +- #12877 `2b54155` Use bitcoind in Tor documentation (knoxcard) - #12896 `b15485e` Fix conflicting statements about initialization in developer notes (practicalswift) - #12850 `319991d` add qrencode to brew install instructions (buddilla) - #12007 `cd8e45b` Clarify the meaning of fee delta not being a fee rate in prioritisetransaction RPC (honzik666) @@ -915,7 +915,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #13165 `627c376` Mention good first issue list in CONTRIBUTING.md (fanquake) - #13295 `fb77310` Update OpenBSD build instructions for OpenBSD 6.3 (practicalswift) - #13340 `3a8e3f4` remove leftover check-doc documentation (fanquake) -- #13346 `60f0358` update BGL-dot-org links in release-process.md (fanquake) +- #13346 `60f0358` update bitcoin-dot-org links in release-process.md (fanquake) - #13372 `f014933` split FreeBSD build instructions out of build-unix.md (steverusso) - #13366 `861de3b` Rename “OS X” to the newer “macOS” convention (giulio92) - #13369 `f8bcef3` update transifex doc link (mess110) @@ -935,7 +935,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #13625 `7146672` Add release notes for -printtoconsole and -debuglogfile changes (satwo) - #13718 `f7f574d` Specify preferred Python string formatting technique (masonicboom) - #12764 `10b9a81` Remove field in getblocktemplate help that has never been used (conscott) -- #13742 `d2186b3` Adjust BGLcore.org links (MarcoFalke) +- #13742 `d2186b3` Adjust bitcoincore.org links (MarcoFalke) - #13706 `94dd89e` Minor improvements to release-process.md (MitchellCash) - #13775 `ef4fac0` Remove newlines from error message (practicalswift) - #13803 `feb7dd9` add note to contributor docs about warranted PR's (kallewoof) @@ -948,7 +948,7 @@ Support for Python 2 has been discontinued for all test files and tools. - #13895 `1cd5f2c` fix GetWarnings docs to reflect behavior (Empact) - #13911 `3e3a50a` Revert translated string change, clarify wallet log messages (PierreRochard) - #13908 `d6faea4` upgrade rescan time warning from minutes to >1 hour (masonicboom) -- #13905 `73a09b4` fixed BGL-cli -help output for help2man (hebasto) +- #13905 `73a09b4` fixed bitcoin-cli -help output for help2man (hebasto) - #14100 `2936dbc` Change documentation for =0 for non-boolean options (laanwj) - #14096 `465a583` Add reference documentation for descriptors language (sipa) - #12757 `0c5f67b` Clarify include guard naming convention (practicalswift) @@ -1102,4 +1102,4 @@ And to those that reported security issues: - awemany (for CVE-2018-17144, previously credited as "anonymous reporter") -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.17.1.md b/doc/release-notes/release-notes-0.17.1.md index b428d6c633..b1e50e0391 100644 --- a/doc/release-notes/release-notes-0.17.1.md +++ b/doc/release-notes/release-notes-0.17.1.md @@ -1,29 +1,29 @@ -BGL Core version 0.17.1 is now available from: +Bitcoin Core version 0.17.1 is now available from: - + or through BitTorrent: - magnet:?xt=urn:btih:c56c87ccfaa8e6fbccc90d549121e61efd97cb6f&dn=BGL-core-0.17.1&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fexplodie.org%3A6969 + magnet:?xt=urn:btih:c56c87ccfaa8e6fbccc90d549121e61efd97cb6f&dn=bitcoin-core-0.17.1&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fexplodie.org%3A6969 This is a new minor version release, with various bugfixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: - + How to Upgrade ============== If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over `/Applications/BGL-Qt` (on Mac) -or `BGLd`/`BGL-qt` (on Linux). +installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on Mac) +or `bitcoind`/`bitcoin-qt` (on Linux). If your node has a txindex, the txindex db will be migrated the first time you run 0.17.0 or newer, which may take up to a few hours. Your node will not be functional until this migration completes. @@ -50,10 +50,10 @@ processing the entire blockchain. Compatibility ============== -BGL Core is extensively tested on multiple operating systems using +Bitcoin Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.10+, and Windows 7 and newer (Windows XP is not supported). -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not frequently tested on them. From 0.17.0 onwards macOS <10.10 is no longer supported. 0.17.0 is built using Qt 5.9.x, which doesn't @@ -68,7 +68,7 @@ Notable changes The `listtransactions` RPC `account` parameter which was deprecated in 0.17.0 and renamed to `dummy` has been un-deprecated and renamed again to `label`. -When BGL is configured with the `-deprecatedrpc=accounts` setting, specifying +When bitcoin is configured with the `-deprecatedrpc=accounts` setting, specifying a label/account/dummy argument will return both outgoing and incoming transactions. Without the `-deprecatedrpc=accounts` setting, it will only return incoming transactions (because it used to be possible to create transactions @@ -112,7 +112,7 @@ confusion. ### Build system - #14647 `7edebed` Remove illegal spacing in darwin.mk (ch4ot1c) -- #14698 `ec71f06` Add BGL-tx.exe into Windows installer (ken2812221) +- #14698 `ec71f06` Add bitcoin-tx.exe into Windows installer (ken2812221) ### Tests and QA - #13965 `29899ec` Fix extended functional tests fail (ken2812221) @@ -165,4 +165,4 @@ Thanks to everyone who directly contributed to this release: - Walter - Wladimir J. van der Laan -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.18.0.md b/doc/release-notes/release-notes-0.18.0.md index 8acee23111..3ca7d52243 100644 --- a/doc/release-notes/release-notes-0.18.0.md +++ b/doc/release-notes/release-notes-0.18.0.md @@ -1,17 +1,17 @@ -BGL Core version 0.18.0 is now available from: +Bitcoin Core version 0.18.0 is now available from: - + This is a new major version release, including new features, various bug fixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: - + How to Upgrade ============== @@ -19,7 +19,7 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the installer (on Windows) or just copy over -`/Applications/BGL-Qt` (on Mac) or `BGLd`/`BGL-qt` (on +`/Applications/Bitcoin-Qt` (on Mac) or `bitcoind`/`bitcoin-qt` (on Linux). The first time you run version 0.15.0 or newer, your chainstate database @@ -35,16 +35,16 @@ wallet versions are still supported. Compatibility ============== -BGL Core is supported and extensively tested on operating systems +Bitcoin Core is supported and extensively tested on operating systems using the Linux kernel, macOS 10.10+, and Windows 7 and newer. It is not -recommended to use BGL Core on unsupported systems. +recommended to use Bitcoin Core on unsupported systems. -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not as frequently tested on them. From 0.17.0 onwards, macOS <10.10 is no longer supported. 0.17.0 is built using Qt 5.9.x, which doesn't support versions of macOS older than -10.10. Additionally, BGL Core does not yet change appearance when +10.10. Additionally, Bitcoin Core does not yet change appearance when macOS "dark mode" is activated. In addition to previously-supported CPU platforms, this release's @@ -52,11 +52,11 @@ pre-compiled distribution also provides binaries for the RISC-V platform. If you are using the `systemd` unit configuration file located at -`contrib/init/BGLd.service`, it has been changed to use -`/var/lib/BGLd` as the data directory instead of -`~BGL/.BGL`. When switching over to the new configuration file, -please make sure that the filesystem on which `/var/lib/BGLd` will -exist has enough space (check using `df -h /var/lib/BGLd`), and +`contrib/init/bitcoind.service`, it has been changed to use +`/var/lib/bitcoind` as the data directory instead of +`~bitcoin/.bitcoin`. When switching over to the new configuration file, +please make sure that the filesystem on which `/var/lib/bitcoind` will +exist has enough space (check using `df -h /var/lib/bitcoind`), and optionally copy over your existing data directory. See the [systemd init file section](#systemd-init-file) for more details. @@ -95,7 +95,7 @@ Configuration option changes messages that ZMQ will queue in memory (the "high water mark") before dropping additional messages. The default value is 1,000, the same as was used for previous releases. See the [ZMQ - documentation](https://github.com/BGL/BGL/blob/master/doc/zmq.md#usage) + documentation](https://github.com/bitcoin/bitcoin/blob/master/doc/zmq.md#usage) for details. - The `rpcallowip` option can no longer be used to automatically listen @@ -119,16 +119,16 @@ Configuration option changes disconnect/ban behavior will not cause a node that is whitelisting another to be dropped by peers. Users can still explicitly enable this behavior with the command line option (and may want to consider - [contacting](https://BGLcore.org/en/contact/) the BGL Core + [contacting](https://bitcoincore.org/en/contact/) the Bitcoin Core project to let us know about their use-case, as this feature could be deprecated in the future). systemd init file ----------------- -The systemd init file (`contrib/init/BGLd.service`) has been changed -to use `/var/lib/BGLd` as the data directory instead of -`~BGL/.BGL`. This change makes BGL Core more consistent with +The systemd init file (`contrib/init/bitcoind.service`) has been changed +to use `/var/lib/bitcoind` as the data directory instead of +`~bitcoin/.bitcoin`. This change makes Bitcoin Core more consistent with other services, and makes the systemd init config more consistent with existing Upstart and OpenRC configs. @@ -138,33 +138,33 @@ See [`systemd.exec(5)`](https://www.freedesktop.org/software/systemd/man/systemd for more details. When using the provided init files under `contrib/init`, overriding the -`datadir` option in `/etc/BGL/BGL.conf` will have no effect. +`datadir` option in `/etc/bitcoin/bitcoin.conf` will have no effect. This is because the command line arguments specified in the init files take precedence over the options specified in -`/etc/BGL/BGL.conf`. +`/etc/bitcoin/bitcoin.conf`. Documentation ------------- -- A new short [document](https://github.com/BGL/BGL/blob/master/doc/JSON-RPC-interface.md) +- A new short [document](https://github.com/bitcoin/bitcoin/blob/master/doc/JSON-RPC-interface.md) about the JSON-RPC interface describes cases where the results of an RPC might contain inconsistencies between data sourced from different subsystems, such as wallet state and mempool state. A note is added - to the [REST interface documentation](https://github.com/BGL/BGL/blob/master/doc/REST-interface.md) + to the [REST interface documentation](https://github.com/bitcoin/bitcoin/blob/master/doc/REST-interface.md) indicating that the same rules apply. - Further information is added to the [JSON-RPC - documentation](https://github.com/BGL/BGL/blob/master/doc/JSON-RPC-interface.md) + documentation](https://github.com/bitcoin/bitcoin/blob/master/doc/JSON-RPC-interface.md) about how to secure this interface. -- A new [document](https://github.com/BGL/BGL/blob/master/doc/BGL-conf.md) - about the `BGL.conf` file describes how to use it to configure - BGL Core. +- A new [document](https://github.com/bitcoin/bitcoin/blob/master/doc/bitcoin-conf.md) + about the `bitcoin.conf` file describes how to use it to configure + Bitcoin Core. -- A new document introduces BGL Core's BIP174 [Partially-Signed - BGL Transactions - (PSBT)](https://github.com/BGL/BGL/blob/master/doc/psbt.md) +- A new document introduces Bitcoin Core's BIP174 [Partially-Signed + Bitcoin Transactions + (PSBT)](https://github.com/bitcoin/bitcoin/blob/master/doc/psbt.md) interface, which is used to allow multiple programs to collaboratively work to create, sign, and broadcast new transactions. This is useful for offline (cold storage) wallets, multisig wallets, coinjoin @@ -172,7 +172,7 @@ Documentation to interact to generate a complete transaction. - The [output script - descriptor](https://github.com/BGL/BGL/blob/master/doc/descriptors.md) + descriptor](https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md) documentation has been updated with information about new features in this still-developing language for describing the output scripts that a wallet or other program wants to receive notifications for, such as @@ -185,15 +185,15 @@ Build system changes -------------------- - A new `--disable-bip70` option may be passed to `./configure` to - prevent BGL-Qt from being built with support for the BIP70 payment + prevent Bitcoin-Qt from being built with support for the BIP70 payment protocol or from linking libssl. As the payment protocol has exposed - BGL Core to libssl vulnerabilities in the past, builders who don't + Bitcoin Core to libssl vulnerabilities in the past, builders who don't need BIP70 support are encouraged to use this option to reduce their exposure to future vulnerabilities. - The minimum required version of Qt (when building the GUI) has been increased from 5.2 to 5.5.1 (the [depends - system](https://github.com/BGL/BGL/blob/master/depends/README.md) + system](https://github.com/bitcoin/bitcoin/blob/master/depends/README.md) provides 5.9.7) New RPCs @@ -211,7 +211,7 @@ New RPCs they've been running. - `deriveaddresses` returns one or more addresses corresponding to an - [output descriptor](https://github.com/BGL/BGL/blob/master/doc/descriptors.md). + [output descriptor](https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md). - `getdescriptorinfo` accepts a descriptor and returns information about it, including its computed checksum. @@ -278,7 +278,7 @@ in the Low-level Changes section below. ignored or are inconsistent, if there are any. - `getaddressinfo` now returns an additional `solvable` boolean field - when BGL Core knows enough about the address's scriptPubKey, + when Bitcoin Core knows enough about the address's scriptPubKey, optional redeemScript, and optional witnessScript in order for the wallet to be able to generate an unsigned input spending funds sent to that address. @@ -292,7 +292,7 @@ in the Low-level Changes section below. - `importprivkey` will preserve previously-set labels for addresses or public keys corresponding to the private key being imported. For example, if you imported a watch-only address with the label "cold - wallet" in earlier releases of BGL Core, subsequently importing + wallet" in earlier releases of Bitcoin Core, subsequently importing the private key would default to resetting the address's label to the default empty-string label (""). In this release, the previous label of "cold wallet" will be retained. If you optionally specify any @@ -320,7 +320,7 @@ in the Low-level Changes section below. origin information imported through `importmulti` will have their key origin information stored in the wallet for use with creating PSBTs. More information about descriptors can be found - [here](https://github.com/BGL/BGL/blob/master/doc/descriptors.md). + [here](https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md). - `listunspent` has been modified so that it also returns `witnessScript`, the witness script in the case of a P2WSH or @@ -343,7 +343,7 @@ Deprecated or removed RPCs - The 'account' API is removed after being deprecated in v0.17. The 'label' API was introduced in v0.17 as a replacement for accounts. See the [release notes from - v0.17](https://github.com/BGL/BGL/blob/master/doc/release-notes/release-notes-0.17.0.md#label-and-account-apis-for-wallet) + v0.17](https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes/release-notes-0.17.0.md#label-and-account-apis-for-wallet) for a full description of the changes from the 'account' API to the 'label' API. @@ -359,7 +359,7 @@ Deprecated or removed RPCs require or use the wallet component. Calling `generatetoaddress` with an address returned by the `getnewaddress` RPC gives the same functionality as the old `generate` RPC. To continue using `generate` - in this version, restart BGLd with the `-deprecatedrpc=generate` + in this version, restart bitcoind with the `-deprecatedrpc=generate` configuration option. - Be reminded that parts of the `validateaddress` command have been @@ -406,7 +406,7 @@ Graphical User Interface (GUI) Tools ----- -- A new `BGL-wallet` tool is now distributed alongside BGL +- A new `bitcoin-wallet` tool is now distributed alongside Bitcoin Core's other executables. Without needing to use any RPCs, this tool can currently create a new wallet file or display some basic information about an existing wallet, such as whether the wallet is @@ -416,24 +416,24 @@ Tools Planned changes =============== -This section describes planned changes to BGL Core that may affect -other BGL software and services. +This section describes planned changes to Bitcoin Core that may affect +other Bitcoin software and services. -- Since version 0.16.0, BGL Core’s built-in wallet has defaulted to +- Since version 0.16.0, Bitcoin Core’s built-in wallet has defaulted to generating P2SH-wrapped segwit addresses when users want to receive payments. These addresses are backwards compatible with all - widely-used software. Starting with BGL Core 0.20 (expected about - a year after 0.18), BGL Core will default to native segwit + widely-used software. Starting with Bitcoin Core 0.20 (expected about + a year after 0.18), Bitcoin Core will default to native segwit addresses (bech32) that provide additional fee savings and other benefits. Currently, many wallets and services already support sending - to bech32 addresses, and if the BGL Core project sees enough + to bech32 addresses, and if the Bitcoin Core project sees enough additional adoption, it will instead default to bech32 receiving - addresses in BGL Core 0.19 (approximately November 2019). + addresses in Bitcoin Core 0.19 (approximately November 2019). P2SH-wrapped segwit addresses will continue to be provided if the user requests them in the GUI or by RPC, and anyone who doesn’t want the update will be able to configure their default address type. (Similarly, pioneering users who want to change their default now may - set the `addresstype=bech32` configuration option in any BGL Core + set the `addresstype=bech32` configuration option in any Bitcoin Core release from 0.16.0 up.) Deprecated P2P messages @@ -495,7 +495,7 @@ Network a misbehaving node will be disconnected to make room for nodes without a history of problems (unless the misbehaving node helps your node in some other way, such as by connecting to a part of the Internet from - which you don't have many other peers). Previously, BGL Core + which you don't have many other peers). Previously, Bitcoin Core banned the IP addresses of misbehaving peers for a period of time (default of 1 day); this was easily circumvented by attackers with multiple IP addresses. If you manually ban a peer, such as by using @@ -514,18 +514,18 @@ Wallet software. Instead such wallets will be completely unloaded and reloaded to achieve the same effect. -- A sub-project of BGL Core now provides Hardware Wallet Interaction +- A sub-project of Bitcoin Core now provides Hardware Wallet Interaction (HWI) scripts that allow command-line users to use several popular - hardware key management devices with BGL Core. See their [project - page](https://github.com/BGL-core/HWI#readme) for details. + hardware key management devices with Bitcoin Core. See their [project + page](https://github.com/bitcoin-core/HWI#readme) for details. Security -------- - This release changes the Random Number Generator (RNG) used from - OpenSSL to BGL Core's own implementation, although entropy - gathered by BGL Core is fed out to OpenSSL and then read back in - when the program needs strong randomness. This moves BGL Core a + OpenSSL to Bitcoin Core's own implementation, although entropy + gathered by Bitcoin Core is fed out to OpenSSL and then read back in + when the program needs strong randomness. This moves Bitcoin Core a little closer to no longer needing to depend on OpenSSL, a dependency that has caused security issues in the past. The new implementation gathers entropy from multiple sources, including from hardware @@ -534,7 +534,7 @@ Security Changes for particular platforms -------------------------------- -- On macOS, BGL Core now opts out of application CPU throttling +- On macOS, Bitcoin Core now opts out of application CPU throttling ("app nap") during initial blockchain download, when catching up from over 100 blocks behind the current chain tip, or when reindexing chain data. This helps prevent these operations from taking an excessively @@ -589,9 +589,9 @@ Changes for particular platforms - #14023 Remove accounts RPCs (jnewbery) - #13825 Kill accounts (jnewbery) - #10605 Add AssertLockHeld assertions in CWallet::ListCoins (ryanofsky) -- #12490 Remove deprecated wallet rpc features from `BGL_server` (jnewbery) +- #12490 Remove deprecated wallet rpc features from `bitcoin_server` (jnewbery) - #14138 Set `encrypted_batch` to nullptr after delete. Avoid double free in the case of NDEBUG (practicalswift) -- #14168 Remove `ENABLE_WALLET` from `libBGL_server.a` (jnewbery) +- #14168 Remove `ENABLE_WALLET` from `libbitcoin_server.a` (jnewbery) - #12493 Reopen CDBEnv after encryption instead of shutting down (achow101) - #14282 Remove `-usehd` option (jnewbery) - #14146 Remove trailing separators from `-walletdir` arg (PierreRochard) @@ -623,7 +623,7 @@ Changes for particular platforms - #14711 Remove uses of chainActive and mapBlockIndex in wallet code (ryanofsky) - #15279 Clarify rescanblockchain doc (MarcoFalke) - #15292 Remove `boost::optional`-related false positive -Wmaybe-uninitialized warnings on GCC compiler (hebasto) -- #13926 [Tools] BGL-wallet - a tool for creating and managing wallets offline (jnewbery) +- #13926 [Tools] bitcoin-wallet - a tool for creating and managing wallets offline (jnewbery) - #11911 Free BerkeleyEnvironment instances when not in use (ryanofsky) - #15235 Do not import private keys to wallets with private keys disabled (achow101) - #15263 Descriptor expansions only need pubkey entries for PKH/WPKH (sipa) @@ -709,7 +709,7 @@ Changes for particular platforms - #13248 Make proxy icon from statusbar clickable (mess110) - #12818 TransactionView: highlight replacement tx after fee bump (Sjors) - #13529 Use new Qt5 connect syntax (promag) -- #14162 Also log and print messages or questions like BGLd (MarcoFalke) +- #14162 Also log and print messages or questions like bitcoind (MarcoFalke) - #14385 Avoid system harfbuzz and bz2 (theuni) - #14450 Fix QCompleter popup regression (hebasto) - #14177 Set C locale for amountWidget (hebasto) @@ -717,7 +717,7 @@ Changes for particular platforms - #14554 Remove unused `adjustedTime` parameter (hebasto) - #14228 Enable system tray icon by default if available (hebasto) - #14608 Remove the "Pay only required fee…" checkbox (hebasto) -- #14521 qt, docs: Fix `BGL-qt -version` output formatting (hebasto) +- #14521 qt, docs: Fix `bitcoin-qt -version` output formatting (hebasto) - #13966 When private key is disabled, only show watch-only balance (ken2812221) - #14828 Remove hidden columns in coin control dialog (promag) - #14783 Fix `boost::signals2::no_slots_error` in early calls to InitWarning (promag) @@ -730,7 +730,7 @@ Changes for particular platforms - #14375 Correct misleading "overridden options" label (hebasto) - #15007 Notificator class refactoring (hebasto) - #14784 Use `WalletModel*` instead of the wallet name as map key (promag) -- #11625 Add BGLApplication & RPCConsole tests (ryanofsky) +- #11625 Add BitcoinApplication & RPCConsole tests (ryanofsky) - #14517 Fix start with the `-min` option (hebasto) - #13216 implements concept for different disk sizes on intro (marcoagner) - #15114 Replace remaining 0 with nullptr (Empact) @@ -766,7 +766,7 @@ Changes for particular platforms - #14183 Remove unused Qt 4 dependencies (ken2812221) - #14127 Avoid getifaddrs when unavailable (greenaddress) - #14184 Scripts and tools: increased timeout downloading (cisba) -- #14204 Move `interfaces/*` to `libBGL_server` (laanwj) +- #14204 Move `interfaces/*` to `libbitcoin_server` (laanwj) - #14208 Actually remove `ENABLE_WALLET` (jnewbery) - #14212 Remove libssl from LDADD unless GUI (MarcoFalke) - #13578 Upgrade zeromq to 4.2.5 and avoid deprecated zeromq API functions (mruddy) @@ -786,19 +786,19 @@ Changes for particular platforms - #14849 Qt 5.9.7 (fanquake) - #15020 Add names to Travis jobs (gkrizek) - #15047 Allow to configure --with-sanitizers=fuzzer (MarcoFalke) -- #15154 Configure: BGL-tx doesn't need libevent, so don't pull it in (luke-jr) +- #15154 Configure: bitcoin-tx doesn't need libevent, so don't pull it in (luke-jr) - #15175 Drop macports support (Empact) - #15308 Restore compatibility with older boost (Empact) - #15407 msvc: Fix silent merge conflict between #13926 and #14372 part II (ken2812221) -- #15388 Makefile.am: add rule for src/BGL-wallet (Sjors) +- #15388 Makefile.am: add rule for src/bitcoin-wallet (Sjors) - #15393 Bump minimum Qt version to 5.5.1 (Sjors) - #15285 Prefer Python 3.4 even if newer versions are present on the system (Sjors) - #15398 msvc: Add rapidcheck property tests (ken2812221) - #15431 msvc: scripted-diff: Remove NDEBUG pre-define in project file (ken2812221) - #15549 gitian: Improve error handling (laanwj) - #15548 use full version string in setup.exe (MarcoFalke) -- #11526 Visual Studio build configuration for BGL Core (sipsorcery) -- #15110 build\_msvc: Fix the build problem in `libBGL_server` (Mr-Leshiy) +- #11526 Visual Studio build configuration for Bitcoin Core (sipsorcery) +- #15110 build\_msvc: Fix the build problem in `libbitcoin_server` (Mr-Leshiy) - #14372 msvc: build secp256k1 and leveldb locally (ken2812221) - #15325 msvc: Fix silent merge conflict between #13926 and #14372 (ken2812221) - #15391 Add compile time verification of assumptions we're currently making implicitly/tacitly (practicalswift) @@ -808,7 +808,7 @@ Changes for particular platforms ### Tests and QA - #15405 appveyor: Clean cache when build configuration changes (Sjors) -- #13953 Fix deprecation in BGL-util-test.py (isghe) +- #13953 Fix deprecation in bitcoin-util-test.py (isghe) - #13963 Replace usage of tostring() with tobytes() (dongcarl) - #13964 ci: Add appveyor ci (ken2812221) - #13997 appveyor: fetch the latest port data (ken2812221) @@ -824,7 +824,7 @@ Changes for particular platforms - #14088 Don't assert(…) with side effects (practicalswift) - #14086 appveyor: Use clcache to speed up build (ken2812221) - #13954 Warn (don't fail!) on spelling errors. Fix typos reported by codespell (practicalswift) -- #12775 Integration of property based testing into BGL Core (Christewart) +- #12775 Integration of property based testing into Bitcoin Core (Christewart) - #14119 Read reject reasons from debug log, not P2P messages (MarcoFalke) - #14189 Fix silent merge conflict in `wallet_importmulti` (MarcoFalke) - #13419 Speed up `knapsack_solver_test` by not recreating wallet 100 times (lucash-dev) @@ -837,7 +837,7 @@ Changes for particular platforms - #14275 Write the notification message to different files to avoid race condition in `feature_notifications.py` (ken2812221) - #14306 appveyor: Move AppVeyor YAML to dot-file-style YAML (MitchellCash) - #14305 Enforce critical class instance attributes in functional tests, fix segwit test specificity (JustinTArthur) -- #12246 Bugfix: Only run BGL-tx tests when BGL-tx is enabled (luke-jr) +- #12246 Bugfix: Only run bitcoin-tx tests when bitcoin-tx is enabled (luke-jr) - #14316 Exclude all tests with difference parameters in `--exclude` list (ken2812221) - #14381 Add missing call to `skip_if_no_cli()` (practicalswift) - #14389 travis: Set codespell version to avoid breakage (MarcoFalke) @@ -859,7 +859,7 @@ Changes for particular platforms - #14631 Move deterministic address import to `setup_nodes` (jnewbery) - #14630 test: Remove travis specific code (MarcoFalke) - #14528 travis: Compile once on xenial (MarcoFalke) -- #14092 Dry run `bench_BGL` as part `make check` to allow for quick identification of assertion/sanitizer failures in benchmarking code (practicalswift) +- #14092 Dry run `bench_bitcoin` as part `make check` to allow for quick identification of assertion/sanitizer failures in benchmarking code (practicalswift) - #14664 `example_test.py`: fixup coinbase height argument, derive number clearly (instagibbs) - #14522 Add invalid P2P message tests (jamesob) - #14619 Fix value display name in `test_runner` help text (merland) @@ -903,7 +903,7 @@ Changes for particular platforms - #14969 Fix `cuckoocache_tests` TSAN failure introduced in 14935 (practicalswift) - #14964 Fix race in `mempool_accept` (MarcoFalke) - #14829 travis: Enable functional tests in the threadsanitizer (tsan) build job (practicalswift) -- #14985 Remove `thread_local` from `test_BGL` (MarcoFalke) +- #14985 Remove `thread_local` from `test_bitcoin` (MarcoFalke) - #15005 Bump timeout to run tests in travis thread sanitizer (MarcoFalke) - #15013 Avoid race in `p2p_timeouts` (MarcoFalke) - #14960 lint/format-strings: Correctly exclude escaped percent symbols (luke-jr) @@ -980,8 +980,8 @@ Changes for particular platforms - #14097 validation: Log FormatStateMessage on ConnectBlock error in ConnectTip (MarcoFalke) - #13724 contrib: Support ARM and RISC-V symbol check (ken2812221) - #13159 Don't close old debug log file handle prematurely when trying to re-open (on SIGHUP) (practicalswift) -- #14186 BGL-cli: don't translate command line options (HashUnlimited) -- #14057 logging: Only log `using config file path_to_BGL.conf` message on startup if conf file exists (leishman) +- #14186 bitcoin-cli: don't translate command line options (HashUnlimited) +- #14057 logging: Only log `using config file path_to_bitcoin.conf` message on startup if conf file exists (leishman) - #14164 Update univalue subtree (MarcoFalke) - #14272 init: Remove deprecated args from hidden args (MarcoFalke) - #14494 Error if # is used in rpcpassword in conf (MeshCollider) @@ -1001,7 +1001,7 @@ Changes for particular platforms - #14839 threads: Fix unitialized members in `sched_param` (fanquake) - #14955 Switch all RNG code to the built-in PRNG (sipa) - #15258 Scripts and tools: Fix `devtools/copyright_header.py` to always honor exclusions (Empact) -- #12255 Update BGL.service to conform to init.md (dongcarl) +- #12255 Update bitcoin.service to conform to init.md (dongcarl) - #15266 memory: Construct globals on first use (MarcoFalke) - #15347 Fix build after pr 15266 merged (hebasto) - #15351 Update linearize-hashes.py (OverlordQ) @@ -1037,7 +1037,7 @@ Changes for particular platforms - #14428 Fix macOS files description in qt/README.md (hebasto) - #14390 release process: RPC documentation (karel-3d) - #14472 getblocktemplate: use SegWit in example (Sjors) -- #14497 Add doc/BGL-conf.md (hebasto) +- #14497 Add doc/bitcoin-conf.md (hebasto) - #14526 Document lint tests (fanquake) - #14511 Remove explicit storage requirement from README.md (merland) - #14600 Clarify commit message guidelines (merland) @@ -1073,7 +1073,7 @@ Changes for particular platforms - #15272 Correct logging return type and RPC example (fanquake) - #15244 Gdb attaching to process during tests has non-sudo solution (instagibbs) - #15332 Small updates to `getrawtransaction` description (amitiuttarwar) -- #15354 Add missing `BGL-wallet` tool manpages (MarcoFalke) +- #15354 Add missing `bitcoin-wallet` tool manpages (MarcoFalke) - #15343 netaddress: Make IPv4 loopback comment more descriptive (dongcarl) - #15353 Minor textual improvements in `translation_strings_policy.md` (merland) - #15426 importmulti: add missing description of keypool option (harding) @@ -1091,9 +1091,9 @@ Changes for particular platforms - #15754 getrpcinfo docs (benthecarman) - #15763 Update bips.md for 0.18.0 (sipa) - #15757 List new RPCs in psbt.md and descriptors.md (sipa) -- #15765 correct BGLconsensus_version in shared-libraries.md (fanquake) +- #15765 correct bitcoinconsensus_version in shared-libraries.md (fanquake) - #15792 describe onlynet option in doc/tor.md (jonatack) -- #15802 mention creating application support BGL folder on OSX (JimmyMow) +- #15802 mention creating application support bitcoin folder on OSX (JimmyMow) - #15799 Clarify RPC versioning (MarcoFalke) Credits @@ -1122,7 +1122,7 @@ Thanks to everyone who directly contributed to this release: - Ben Carman - Ben Woosley - benthecarman -- BGLhodler +- bitcoinhodler - Carl Dong - Chakib Benziane - Chris Moore @@ -1221,4 +1221,4 @@ Thanks to everyone who directly contributed to this release: - Wladimir J. van der Laan - Zain Iqbal Allarakhia -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.18.1.md b/doc/release-notes/release-notes-0.18.1.md index 7d45db39d8..483cc5075e 100644 --- a/doc/release-notes/release-notes-0.18.1.md +++ b/doc/release-notes/release-notes-0.18.1.md @@ -1,17 +1,17 @@ -BGL Core version 0.18.1 is now available from: +Bitcoin Core version 0.18.1 is now available from: - + This is a new minor version release, including new features, various bug fixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: - + How to Upgrade ============== @@ -19,7 +19,7 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the installer (on Windows) or just copy over -`/Applications/BGL-Qt` (on Mac) or `BGLd`/`BGL-qt` (on +`/Applications/Bitcoin-Qt` (on Mac) or `bitcoind`/`bitcoin-qt` (on Linux). The first time you run version 0.15.0 or newer, your chainstate database @@ -35,16 +35,16 @@ wallet versions are still supported. Compatibility ============== -BGL Core is supported and extensively tested on operating systems +Bitcoin Core is supported and extensively tested on operating systems using the Linux kernel, macOS 10.10+, and Windows 7 and newer. It is not -recommended to use BGL Core on unsupported systems. +recommended to use Bitcoin Core on unsupported systems. -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not as frequently tested on them. From 0.17.0 onwards, macOS <10.10 is no longer supported. 0.17.0 is built using Qt 5.9.x, which doesn't support versions of macOS older than -10.10. Additionally, BGL Core does not yet change appearance when +10.10. Additionally, Bitcoin Core does not yet change appearance when macOS "dark mode" is activated. Known issues @@ -91,7 +91,7 @@ not to use coin control features with multiple wallets loaded. ### Build system - #15985 Add test for GCC bug 90348 (sipa) -- #15947 Install BGL-wallet manpage (domob1812) +- #15947 Install bitcoin-wallet manpage (domob1812) - #15983 build with -fstack-reuse=none (MarcoFalke) ### Tests and QA @@ -133,4 +133,4 @@ Thanks to everyone who directly contributed to this release: - tecnovert - Wladimir J. van der Laan -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.19.0.1.md b/doc/release-notes/release-notes-0.19.0.1.md index 800de83da3..70b8ec589f 100644 --- a/doc/release-notes/release-notes-0.19.0.1.md +++ b/doc/release-notes/release-notes-0.19.0.1.md @@ -1,48 +1,48 @@ -BGL Core version 0.19.0.1 is now available from: +Bitcoin Core version 0.19.0.1 is now available from: - + This release includes new features, various bug fixes and performance improvements, as well as updated translations. Please report bugs using the issue tracker at GitHub: - + To receive security and update notifications, please subscribe to: - + How to Upgrade ============== If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over `/Applications/BGL-Qt` (on Mac) -or `BGLd`/`BGL-qt` (on Linux). +installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on Mac) +or `bitcoind`/`bitcoin-qt` (on Linux). -Upgrading directly from a version of BGL Core that has reached its EOL is +Upgrading directly from a version of Bitcoin Core that has reached its EOL is possible, but might take some time if the datadir needs to be migrated. Old -wallet versions of BGL Core are generally supported. +wallet versions of Bitcoin Core are generally supported. Compatibility ============== -BGL Core is supported and extensively tested on operating systems using +Bitcoin Core is supported and extensively tested on operating systems using the Linux kernel, macOS 10.10+, and Windows 7 and newer. It is not recommended -to use BGL Core on unsupported systems. +to use Bitcoin Core on unsupported systems. -BGL Core should also work on most other Unix-like systems but is not +Bitcoin Core should also work on most other Unix-like systems but is not as frequently tested on them. From 0.17.0 onwards, macOS <10.10 is no longer supported. 0.17.0 is built using Qt 5.9.x, which doesn't support versions of macOS older than -10.10. Additionally, BGL Core does not yet change appearance when +10.10. Additionally, Bitcoin Core does not yet change appearance when macOS "dark mode" is activated. Users running macOS Catalina may need to "right-click" and then choose "Open" -to open the BGL Core .dmg. This is due to new signing requirements -imposed by Apple, which the BGL Core project does not yet adhere too. +to open the Bitcoin Core .dmg. This is due to new signing requirements +imposed by Apple, which the Bitcoin Core project does not yet adhere too. Notable changes =============== @@ -50,8 +50,8 @@ Notable changes New user documentation ---------------------- -- [Reduce memory](https://github.com/BGL/BGL/blob/master/doc/reduce-memory.md) - suggests configuration tweaks for running BGL Core on systems with +- [Reduce memory](https://github.com/bitcoin/bitcoin/blob/master/doc/reduce-memory.md) + suggests configuration tweaks for running Bitcoin Core on systems with limited memory. (#16339) New RPCs @@ -78,7 +78,7 @@ New settings - `-blockfilterindex` enables the creation of BIP158 block filters for the entire blockchain. Filters will be created in the background and - currently use about 4 GiB of space. Note: this version of BGL + currently use about 4 GiB of space. Note: this version of Bitcoin Core does not serve block filters over the P2P network, although the local user may obtain block filters using the `getblockfilter` RPC. (#14121) @@ -90,7 +90,7 @@ Updated settings provide peers connecting using the indicated interfaces or IP addresses. If no permissions are specified with an address or CIDR network, the implicit default permissions are the same as previous - releases. See the `BGLd -help` output for these two options for + releases. See the `bitcoind -help` output for these two options for details about the available permissions. (#16248) - Users setting custom `dbcache` values can increase their setting slightly @@ -197,7 +197,7 @@ GUI changes type may be changed with the `-addresstype` configuration option. (#15711, #16497) -- In 0.18.0, a `./configure` flag was introduced to allow disabling BIP70 support in the GUI (support was enabled by default). In 0.19.0, this flag is now __disabled__ by default. If you want to compile BGL Core with BIP70 support in the GUI, you can pass `--enable-bip70` to `./configure`. (#15584) +- In 0.18.0, a `./configure` flag was introduced to allow disabling BIP70 support in the GUI (support was enabled by default). In 0.19.0, this flag is now __disabled__ by default. If you want to compile Bitcoin Core with BIP70 support in the GUI, you can pass `--enable-bip70` to `./configure`. (#15584) Deprecated or removed configuration options ------------------------------------------- @@ -217,7 +217,7 @@ Deprecated or removed RPCs - `bumpfee` has a new `fee_rate` option as a replacement for the deprecated `totalFee`. (#16727) -- `generate` is now removed after being deprecated in BGL Core 0.18. +- `generate` is now removed after being deprecated in Bitcoin Core 0.18. Use the `generatetoaddress` RPC instead. (#15492) P2P changes @@ -226,12 +226,12 @@ P2P changes - BIP 61 reject messages were deprecated in v0.18. They are now disabled by default, but can be enabled by setting the `-enablebip61` command line option. BIP 61 reject messages will be removed entirely in a - future version of BGL Core. (#14054) + future version of Bitcoin Core. (#14054) -- To eliminate well-known denial-of-service vectors in BGL Core, +- To eliminate well-known denial-of-service vectors in Bitcoin Core, especially for nodes with spinning disks, the default value for the `-peerbloomfilters` configuration option has been changed to false. - This prevents BGL Core from sending the BIP111 NODE_BLOOM service + This prevents Bitcoin Core from sending the BIP111 NODE_BLOOM service flag, accepting BIP37 bloom filters, or serving merkle blocks or transactions matching a bloom filter. Users who still want to provide bloom filter support may either set the configuration option to true @@ -240,17 +240,17 @@ P2P changes `-whitebind` configuration options described elsewhere in these release notes. For the near future, lightweight clients using public BIP111/BIP37 nodes should still be able to connect to older versions - of BGL Core and nodes that have manually enabled BIP37 support, + of Bitcoin Core and nodes that have manually enabled BIP37 support, but developers of such software should consider migrating to either using specific BIP37 nodes or an alternative transaction filtering system. (#16152) -- By default, BGL Core will now make two additional outbound connections that are exclusively used for block-relay. No transactions or addr messages will be processed on these connections. These connections are designed to add little additional memory or bandwidth resource requirements but should make some partitioning attacks more difficult to carry out. (#15759) +- By default, Bitcoin Core will now make two additional outbound connections that are exclusively used for block-relay. No transactions or addr messages will be processed on these connections. These connections are designed to add little additional memory or bandwidth resource requirements but should make some partitioning attacks more difficult to carry out. (#15759) Miscellaneous CLI Changes ------------------------- -- The `testnet` field in `BGL-cli -getinfo` has been renamed to +- The `testnet` field in `bitcoin-cli -getinfo` has been renamed to `chain` and now returns the current network name as defined in BIP70 (main, test, regtest). (#15566) @@ -262,7 +262,7 @@ RPC - `getblockchaininfo` no longer returns a `bip9_softforks` object. Instead, information has been moved into the `softforks` object and - an additional `type` field describes how BGL Core determines + an additional `type` field describes how Bitcoin Core determines whether that soft fork is active (e.g. BIP9 or BIP90). See the RPC help for details. (#16060) @@ -301,7 +301,7 @@ Network ------- - When fetching a transaction announced by multiple peers, previous versions of - BGL Core would sequentially attempt to download the transaction from each + Bitcoin Core would sequentially attempt to download the transaction from each announcing peer until the transaction is received, in the order that those peers' announcements were received. In this release, the download logic has changed to randomize the fetch order across peers and to prefer sending @@ -309,7 +309,7 @@ Network where inbound peers could prevent a node from getting a transaction. (#14897, #15834) -- If a Tor hidden service is being used, BGL Core will be bound to +- If a Tor hidden service is being used, Bitcoin Core will be bound to the standard port 8333 even if a different port is configured for clearnet connections. This prevents leaking node identity through use of identical non-default port numbers. (#15651) @@ -333,7 +333,7 @@ Mempool and transaction relay segwit versions) are now accepted into the mempool, relayed, and mined. Attempting to spend those outputs remains forbidden by policy ("non-standard"). When this change has been widely deployed, wallets - and services can accept any valid bech32 BGL address without + and services can accept any valid bech32 Bitcoin address without concern that transactions paying future segwit versions will become stuck in an unconfirmed state. (#15846) @@ -362,7 +362,7 @@ Wallet and default to not use the former in coin selection. When setting this flag on an existing wallet, rescanning the blockchain is required to correctly mark previously used destinations. Together with "avoid - partial spends" (added in BGL Core v0.17.0), this can eliminate a + partial spends" (added in Bitcoin Core v0.17.0), this can eliminate a serious privacy issue where a malicious user can track spends by sending small payments to a previously-paid address that would then be included with unrelated inputs in future payments. (#13756) @@ -424,7 +424,7 @@ Build system changes - #15834 Fix transaction relay bugs introduced in #14897 and expire transactions from peer in-flight map (sdaftuar) - #15651 torcontrol: Use the default/standard network port for Tor hidden services, even if the internal port is set differently (luke-jr) - #16188 Document what happens to getdata of unknown type (MarcoFalke) -- #15649 Add ChaCha20Poly1305@BGL AEAD (jonasschnelli) +- #15649 Add ChaCha20Poly1305@Bitcoin AEAD (jonasschnelli) - #16152 Disable bloom filtering by default (TheBlueMatt) - #15993 Drop support of the insecure miniUPnPc versions (hebasto) - #16197 Use mockable time for tx download (MarcoFalke) @@ -443,7 +443,7 @@ Build system changes - #15508 Refactor analyzepsbt for use outside RPC code (gwillen) - #15747 Remove plethora of Get*Balance (MarcoFalke) - #15728 Refactor relay transactions (jnewbery) -- #15639 BGL-wallet tool: Drop libBGL_server.a dependency (ryanofsky) +- #15639 bitcoin-wallet tool: Drop libbitcoin_server.a dependency (ryanofsky) - #15853 Remove unused import checkpoints.h (MarcoFalke) - #15780 add cachable amounts for caching credit/debit values (kallewoof) - #15778 Move maxtxfee from node to wallet (jnewbery) @@ -569,7 +569,7 @@ Build system changes - #16291 Stop translating PACKAGE_NAME (MarcoFalke) - #16380 Remove unused bits from the service flags enum (MarcoFalke) - #16379 Fix autostart filenames on Linux for testnet/regtest (hebasto) -- #16366 init: Use InitError for all errors in BGLd/qt (MarcoFalke) +- #16366 init: Use InitError for all errors in bitcoind/qt (MarcoFalke) - #16436 Do not create payment server if -disablewallet option provided (hebasto) - #16514 Remove unused RPCConsole::tabFocus (promag) - #16497 Generate bech32 addresses by default (take 2, fixup) (MarcoFalke) @@ -618,7 +618,7 @@ Build system changes - #15919 Remove unused OpenSSL includes to make it more clear where OpenSSL is used (practicalswift) - #15978 .gitignore: Don't ignore depends patches (dongcarl) - #15939 gitian: Remove windows 32 bit build (MarcoFalke) -- #15239 scripts and tools: Move non-linux build source tarballs to "BGL-binaries/version" directory (hebasto) +- #15239 scripts and tools: Move non-linux build source tarballs to "bitcoin-binaries/version" directory (hebasto) - #14047 Add HKDF_HMAC256_L32 and method to negate a private key (jonasschnelli) - #16051 add patch to common dependencies (fanquake) - #16049 switch to secure download of all dependencies (Kemu) @@ -630,7 +630,7 @@ Build system changes - #16235 Cleaned up and consolidated msbuild files (no code changes) (sipsorcery) - #16246 MSVC: Fix error in debug mode (Fix #16245) (NicolasDorier) - #16183 xtrans: Configure flags cleanup (dongcarl) -- #16258 [MSVC]: Create the config.ini as part of BGLd build (NicolasDorier) +- #16258 [MSVC]: Create the config.ini as part of bitcoind build (NicolasDorier) - #16271 remove -Wall from rapidcheck build flags (fanquake) - #16309 [MSVC] allow user level project customization (NicolasDorier) - #16308 [MSVC] Copy build output to src/ automatically after build (NicolasDorier) @@ -641,7 +641,7 @@ Build system changes - #16408 Prune X packages (dongcarl) - #16386 disable unused Qt features (fanquake) - #16424 Treat -Wswitch as error when --enable-werror (MarcoFalke) -- #16441 remove qt libjpeg check from BGL_qt.m4 (fanquake) +- #16441 remove qt libjpeg check from bitcoin_qt.m4 (fanquake) - #16434 Specify AM_CPPFLAGS for ZMQ (domob1812) - #16534 add Qt Creator Makefile.am.user to .gitignore (Bushstar) - #16573 disable building libsecp256k1 benchmarks (fanquake) @@ -654,7 +654,7 @@ Build system changes - #16654 build: update RapidCheck Makefile (jonatack) - #16370 cleanup package configure flags (fanquake) - #16746 msbuild: Ignore linker warning (sipsorcery) -- #16750 msbuild: adds bench_BGL to auto generated project files (sipsorcery) +- #16750 msbuild: adds bench_bitcoin to auto generated project files (sipsorcery) - #16810 guix: Remove ssp spec file hack (dongcarl) - #16477 skip deploying plugins we dont use in macdeployqtplus (fanquake) - #16413 Bump QT to LTS release 5.9.8 (THETCR) @@ -688,16 +688,16 @@ Build system changes - #15771 Prevent concurrency issues reading .cookie file (promag) - #15693 travis: Switch to ubuntu keyserver to avoid timeouts (MarcoFalke) - #15629 init: Throw error when network specific config is ignored (MarcoFalke) -- #15773 Add BGLTestFramework::sync_* methods (MarcoFalke) +- #15773 Add BitcoinTestFramework::sync_* methods (MarcoFalke) - #15797 travis: Bump second timeout to 33 minutes, add rationale (MarcoFalke) - #15788 Unify testing setups for fuzz, bench, and unit tests (MarcoFalke) -- #15352 Reduce noise level in test_BGL output (practicalswift) +- #15352 Reduce noise level in test_bitcoin output (practicalswift) - #15779 Add wallet_balance benchmark (MarcoFalke) - #15843 fix outdated include in blockfilter_index_tests (jamesob) - #15866 Add missing syncwithvalidationinterfacequeue to wallet_import_rescan (MarcoFalke) - #15697 Make swap_magic_bytes in p2p_invalid_messages atomic (MarcoFalke) - #15895 Avoid re-reading config.ini unnecessarily (luke-jr) -- #15896 feature_filelock, interface_BGL_cli: Use PACKAGE_NAME in messages rather than hardcoding BGL Core (luke-jr) +- #15896 feature_filelock, interface_bitcoin_cli: Use PACKAGE_NAME in messages rather than hardcoding Bitcoin Core (luke-jr) - #15897 QA/mininode: Send all headers upfront in send_blocks_and_test to avoid sending an unconnected one (luke-jr) - #15696 test_runner: Move feature_pruning to base tests (MarcoFalke) - #15869 Add settings merge test to prevent regresssions (ryanofsky) @@ -751,7 +751,7 @@ Build system changes - #16505 Changes verbosity of msbuild from quiet to normal in the appveyor script (sipsorcery) - #16293 Make test cases separate functions (MarcoFalke) - #16470 Fail early on disconnect in mininode.wait_for_* (MarcoFalke) -- #16277 Suppress output in test_BGL for expected errors (gertjaap) +- #16277 Suppress output in test_bitcoin for expected errors (gertjaap) - #16493 Fix test failures (MarcoFalke) - #16538 Add missing sync_blocks to feature_pruning (MarcoFalke) - #16509 Adapt test framework for chains other than "regtest" (MarcoFalke) @@ -851,7 +851,7 @@ Build system changes - #16556 Fix systemd service file configuration directory setup (setpill) - #15615 Add log output during initial header sync (jonasschnelli) - #16774 Avoid unnecessary "Synchronizing blockheaders" log messages (jonasschnelli) -- #16489 log: harmonize BGLd logging (jonatack) +- #16489 log: harmonize bitcoind logging (jonatack) - #16577 util: Cbufferedfile fixes and unit test (LarryRuane) - #16984 util: Make thread names shorter (hebasto) - #17038 Don't rename main thread at process level (laanwj) @@ -859,11 +859,11 @@ Build system changes - #17095 util: Filter control characters out of log messages (laanwj) - #17085 init: Change fallback locale to C.UTF-8 (laanwj) - #16957 9% less memory: make SaltedOutpointHasher noexcept (martinus) -- #17449 fix uninitialized variable nMinerConfirmationWindow (BGLVBR) +- #17449 fix uninitialized variable nMinerConfirmationWindow (bitcoinVBR) ### Documentation - #15514 Update Transifex links (fanquake) -- #15513 add "sections" info to example BGL.conf (fanquake) +- #15513 add "sections" info to example bitcoin.conf (fanquake) - #15530 Move wallet lock annotations to header (MarcoFalke) - #15562 remove duplicate clone step in build-windows.md (fanquake) - #15565 remove release note fragments (fanquake) @@ -873,7 +873,7 @@ Build system changes - #15611 Add Gitian key for droark (droark) - #15626 Update ACK description in CONTRIBUTING.md (jonatack) - #15603 Add more tips to productivity.md (gwillen) -- #15683 Comment for seemingly duplicate LIBBGL_SERVER (Bushstar) +- #15683 Comment for seemingly duplicate LIBBITCOIN_SERVER (Bushstar) - #15685 rpc-mining: Clarify error messages (MarcoFalke) - #15760 Clarify sendrawtransaction::maxfeerate==0 help (MarcoFalke) - #15659 fix findFork comment (r8921039) @@ -891,7 +891,7 @@ Build system changes - #15777 Add doxygen comments for keypool classes (jnewbery) - #15820 Add productivity notes for dummy rebases (dongcarl) - #15922 Explain how to pass in non-fundamental types into functions (MarcoFalke) -- #16080 build/doc: update BGL_config.h packages, release process (jonatack) +- #16080 build/doc: update bitcoin_config.h packages, release process (jonatack) - #16047 analyzepsbt description in doc/psbt.md (jonatack) - #16039 add release note for 14954 (fanquake) - #16139 Add riscv64 to outputs list in release-process.md (JeremyRand) @@ -915,7 +915,7 @@ Build system changes - #16484 update labels in CONTRIBUTING.md (MarcoFalke) - #16483 update Python command in msvc readme (sipsorcery) - #16504 Add release note for the deprecated totalFee option of bumpfee (promag) -- #16448 add note on precedence of options in BGL.conf (fanquake) +- #16448 add note on precedence of options in bitcoin.conf (fanquake) - #16536 Update and extend benchmarking.md (ariard) - #16530 Fix grammar and punctuation in developer notes (Tech1k) - #16574 Add historical release notes for 0.18.1 (laanwj) @@ -933,19 +933,19 @@ Build system changes - #16629 Add documentation for the new whitelist permissions (NicolasDorier) - #16723 Update labels in CONTRIBUTING.md (hebasto) - #16461 Tidy up shadowing section (promag) -- #16621 add default BGL.conf locations (GChuf) +- #16621 add default bitcoin.conf locations (GChuf) - #16752 Delete stale URL in test README (michaelfolkson) - #14862 Declare BLOCK_VALID_HEADER reserved (MarcoFalke) - #16806 Add issue templates for bug and feature request (MarcoFalke) - #16857 Elaborate need to re-login on Debian-based after usermod for Tor group (clashicly) -- #16863 Add a missing closing parenthesis in the BGL-wallet's help (darosior) +- #16863 Add a missing closing parenthesis in the bitcoin-wallet's help (darosior) - #16757 CChainState return values (MarcoFalke) - #16847 add comments clarifying how local services are advertised (jamesob) -- #16812 Fix whitespace errs in .md files, BGL.conf, and Info.plist.in (ch4ot1c) +- #16812 Fix whitespace errs in .md files, bitcoin.conf, and Info.plist.in (ch4ot1c) - #16885 Update tx-size-small comment with relevant CVE disclosure (instagibbs) - #16900 Fix doxygen comment for SignTransaction in rpc/rawtransaction_util (MarcoFalke) - #16914 Update homebrew instruction for doxygen (Sjors) -- #16912 Remove Doxygen intro from src/BGLd.cpp (ch4ot1c) +- #16912 Remove Doxygen intro from src/bitcoind.cpp (ch4ot1c) - #16960 replace outdated OpenSSL comment in test README (fanquake) - #16968 Remove MSVC update step from translation process (laanwj) - #16953 Improve test READMEs (fjahr) @@ -1086,4 +1086,4 @@ Thanks to everyone who directly contributed to this release: - Wladimir J. van der Laan - zenosage -As well as everyone that helped translating on [Transifex](https://www.transifex.com/BGL/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/bitcoin/bitcoin/). diff --git a/doc/release-notes/release-notes-0.20.0.md b/doc/release-notes/release-notes-0.20.0.md index 8415651d98..6fc1606b37 100644 --- a/doc/release-notes/release-notes-0.20.0.md +++ b/doc/release-notes/release-notes-0.20.0.md @@ -53,7 +53,7 @@ this release: `./configure`. This is the same as when checking out from git. - Instead of running `make` simply, you should instead run - `BGL_GENBUILD_NO_GIT=1 make`. + `BITCOIN_GENBUILD_NO_GIT=1 make`. Notable changes =============== @@ -528,7 +528,7 @@ Build system - #17756 Remove `WINDOWS_BITS` from build system (fanquake) - #17769 Set `AC_PREREQ` to 2.69 (fanquake) - #17880 Add -Wdate-time to Werror flags (fanquake) -- #17910 Remove double `LIBBGL_SERVER` linking (fanquake) +- #17910 Remove double `LIBBITCOIN_SERVER` linking (fanquake) - #17928 Consistent use of package variable (Bushstar) - #17933 guix: Pin Guix using `guix time-machine` (dongcarl) - #17948 pass -fno-ident in Windows gitian descriptor (fanquake) @@ -546,7 +546,7 @@ Build system - #18331 Use git archive as source tarball (hebasto) - #18397 Fix libevent linking for `bench_bitcoin` binary (hebasto) - #18426 scripts: `Previous_release`: improve behaviour on failed download (theStack) -- #18429 Remove double `LIBBGL_SERVER` from bench-Makefile (brakmic) +- #18429 Remove double `LIBBITCOIN_SERVER` from bench-Makefile (brakmic) - #18528 Create `test_fuzz` library from src/test/fuzz/fuzz.cpp (brakmic) - #18558 Fix boost detection for arch armv7l (hebasto) - #18598 gitian: Add missing automake package to gitian-win-signer.yml (achow101) diff --git a/doc/release-notes/release-notes-0.20.1.md b/doc/release-notes/release-notes-0.20.1.md index d07eade53d..9fbb29cb82 100644 --- a/doc/release-notes/release-notes-0.20.1.md +++ b/doc/release-notes/release-notes-0.20.1.md @@ -53,7 +53,7 @@ this release: `./configure`. This is the same as when checking out from git. - Instead of running `make` simply, you should instead run - `BGL_GENBUILD_NO_GIT=1 make`. + `BITCOIN_GENBUILD_NO_GIT=1 make`. Notable changes =============== diff --git a/doc/release-notes/release-notes-0.21.0.md b/doc/release-notes/release-notes-0.21.0.md index a3bf4a2a42..3baba3d49b 100644 --- a/doc/release-notes/release-notes-0.21.0.md +++ b/doc/release-notes/release-notes-0.21.0.md @@ -843,7 +843,7 @@ Tests - #19094 Only allow ASCII identifiers (laanwj) - #18820 Propagate well-known vars into depends (dongcarl) - #19173 turn on --enable-c++17 by --enable-fuzz (vasild) -- #18297 Use pkg-config in BGL_QT_CONFIGURE for all hosts including Windows (hebasto) +- #18297 Use pkg-config in BITCOIN_QT_CONFIGURE for all hosts including Windows (hebasto) - #19301 don't warn when doxygen isn't found (fanquake) - #19240 macOS toolchain simplification and bump (dongcarl) - #19356 Fix search for brew-installed BDB 4 on OS X (gwillen) diff --git a/doc/release-notes/release-notes-0.3.12.md b/doc/release-notes/release-notes-0.3.12.md index 9fa18a6c4e..38715bc75f 100644 --- a/doc/release-notes/release-notes-0.3.12.md +++ b/doc/release-notes/release-notes-0.3.12.md @@ -7,7 +7,7 @@ Features: * Recovers and continues if an exception is caused by a message you received. Other nodes shouldn't be able to cause an exception, and it hasn't happened before, but if a way is found to cause an exception, this would keep it from being used to stop network nodes. If you have json-rpc code that checks the contents of the error string, you need to change it to expect error objects of the form {"code":,"message":}, which is the standard. See this thread: -http://www.BGL.org/smf/index.php?topic=969.0 +http://www.bitcoin.org/smf/index.php?topic=969.0 Download: -http://sourceforge.net/projects/BGL/files/BGL/BGL-0.3.12/ +http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.3.12/ diff --git a/doc/release-notes/release-notes-0.3.13.md b/doc/release-notes/release-notes-0.3.13.md index 3e135b6e82..2b95ff233d 100644 --- a/doc/release-notes/release-notes-0.3.13.md +++ b/doc/release-notes/release-notes-0.3.13.md @@ -12,15 +12,15 @@ Gavin Andresen: * Clean shutdown on SIGTERM on Linux. Download: -http://sourceforge.net/projects/BGL/files/BGL/BGL-0.3.13/ +http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.3.13/ (Thanks Laszlo for the Mac OSX build!) Note: The SSE2 auto-detect in the Linux 64-bit version doesn't work with AMD in 64-bit mode. Please try this instead and let me know if it gets it right: -http://www.BGL.org/download/BGL-0.3.13.1-specialbuild-linux64.tar.gz +http://www.bitcoin.org/download/bitcoin-0.3.13.1-specialbuild-linux64.tar.gz You can still control the SSE2 use manually with -4way and -4way=0. Version 0.3.13.2 (SVN rev 161) has improvements for the case where you already had 0/unconfirmed transactions that you might have already spent. Here's a Windows build of it: -http://www.BGL.org/download/BGL-0.3.13.2-win32-setup.exe +http://www.bitcoin.org/download/bitcoin-0.3.13.2-win32-setup.exe diff --git a/doc/release-notes/release-notes-0.3.14.md b/doc/release-notes/release-notes-0.3.14.md index 66c4bf1282..e73052ed9b 100644 --- a/doc/release-notes/release-notes-0.3.14.md +++ b/doc/release-notes/release-notes-0.3.14.md @@ -1,5 +1,5 @@ Version 0.3.14 is now available -http://sourceforge.net/projects/BGL/files/BGL/BGL-0.3.14/ +http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.3.14/ Changes: * Key pool feature for safer wallet backup diff --git a/doc/release-notes/release-notes-0.3.15.md b/doc/release-notes/release-notes-0.3.15.md index 52c16a3e4d..b98052ef59 100644 --- a/doc/release-notes/release-notes-0.3.15.md +++ b/doc/release-notes/release-notes-0.3.15.md @@ -1,6 +1,6 @@ * paytxfee switch is now per KB, so it adds the correct fee for large transactions * sending avoids using coins with less than 6 confirmations if it can -* BGLMiner processes transactions in priority order based on age of dependencies +* BitcoinMiner processes transactions in priority order based on age of dependencies * make sure generation doesn't start before block 74000 downloaded * bugfixes by Dean Gores * testnet, keypoololdest and paytxfee added to getinfo diff --git a/doc/release-notes/release-notes-0.3.18.md b/doc/release-notes/release-notes-0.3.18.md index 91feaa8af0..ab1c2e0692 100644 --- a/doc/release-notes/release-notes-0.3.18.md +++ b/doc/release-notes/release-notes-0.3.18.md @@ -3,7 +3,7 @@ Changes: * IsStandard() check to only include known transaction types in blocks * Jgarzik's optimisation to speed up the initial block download a little -The main addition in this release is the Accounts-Based JSON-RPC commands that Gavin's been working on (more details at http://www.BGL.org/smf/index.php?topic=1886.0). +The main addition in this release is the Accounts-Based JSON-RPC commands that Gavin's been working on (more details at http://www.bitcoin.org/smf/index.php?topic=1886.0). * getaccountaddress * sendfrom * move diff --git a/doc/release-notes/release-notes-0.3.20.2.md b/doc/release-notes/release-notes-0.3.20.2.md index 9aa6049c15..09ecb736bd 100644 --- a/doc/release-notes/release-notes-0.3.20.2.md +++ b/doc/release-notes/release-notes-0.3.20.2.md @@ -3,13 +3,13 @@ worse as people upgraded, so I cherry-picked the bug fix and created a minor rel The Amazon Machine Images I used to do the builds are available: - ami-38a05251 BGL-v0.3.20.2 Mingw (Windows; Administrator password 'BGL development') - ami-30a05259 BGL_0.3.20.2 Linux32 - ami-8abc4ee3 BGL_0.3.20.2 Linux64 + ami-38a05251 Bitcoin-v0.3.20.2 Mingw (Windows; Administrator password 'bitcoin development') + ami-30a05259 Bitcoin_0.3.20.2 Linux32 + ami-8abc4ee3 Bitcoin_0.3.20.2 Linux64 (mac build will be done soon) -If you have already downloaded version 0.3.20.1, please either add this to your BGL.conf file: +If you have already downloaded version 0.3.20.1, please either add this to your bitcoin.conf file: maxsendbuffer=10000 maxreceivebuffer=10000 diff --git a/doc/release-notes/release-notes-0.3.20.md b/doc/release-notes/release-notes-0.3.20.md index 5faaeba131..651d2c8f58 100644 --- a/doc/release-notes/release-notes-0.3.20.md +++ b/doc/release-notes/release-notes-0.3.20.md @@ -1,20 +1,20 @@ Please checkout the git integration branch from: -https://github.com/BitgesellOfficial/bitgesell +https://github.com/bitcoin/bitcoin ... and help test. The new features that need testing are: -* -nolisten : https://github.com/BGL/BGL/pull/11 +* -nolisten : https://github.com/bitcoin/bitcoin/pull/11 * -rescan : scan block chain for missing wallet transactions -* -printtoconsole : https://github.com/BGL/BGL/pull/37 -* RPC gettransaction details : https://github.com/BGL/BGL/pull/24 -* listtransactions new features : https://github.com/BGL/BGL/pull/10 +* -printtoconsole : https://github.com/bitcoin/bitcoin/pull/37 +* RPC gettransaction details : https://github.com/bitcoin/bitcoin/pull/24 +* listtransactions new features : https://github.com/bitcoin/bitcoin/pull/10 Bug fixes that also need testing: -* -maxconnections= : https://github.com/BGL/BGL/pull/42 -* RPC listaccounts minconf : https://github.com/BGL/BGL/pull/27 -* RPC move, add time to output : https://github.com/BGL/BGL/pull/21 +* -maxconnections= : https://github.com/bitcoin/bitcoin/pull/42 +* RPC listaccounts minconf : https://github.com/bitcoin/bitcoin/pull/27 +* RPC move, add time to output : https://github.com/bitcoin/bitcoin/pull/21 * ...and several improvements to --help output. This needs more testing on Windows! Please drop me a quick private message, email, or IRC message if you are able to do some testing. If you find bugs, please open an issue at: diff --git a/doc/release-notes/release-notes-0.3.21.md b/doc/release-notes/release-notes-0.3.21.md index acc187c699..f3b6bc4264 100644 --- a/doc/release-notes/release-notes-0.3.21.md +++ b/doc/release-notes/release-notes-0.3.21.md @@ -1,19 +1,19 @@ -Binaries for BGL version 0.3.21 are available at: - https://sourceforge.net/projects/BGL/files/BGL/BGL-0.3.21/ +Binaries for Bitcoin version 0.3.21 are available at: + https://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.3.21/ Changes and new features from the 0.3.20 release include: -* Universal Plug and Play support. Enable automatic opening of a port for incoming connections by running BGL or BGLd with the - -upnp=1 command line switch or using the Options dialog box. +* Universal Plug and Play support. Enable automatic opening of a port for incoming connections by running bitcoin or bitcoind with the - -upnp=1 command line switch or using the Options dialog box. -* Support for full-precision BGL amounts. You can now send, and BGL will display, BGL amounts smaller than 0.01. However, sending fewer than 0.01 BGLs still requires a 0.01 BGL fee (so you can send 1.0001 BGLs without a fee, but you will be asked to pay a fee if you try to send 0.0001). +* Support for full-precision bitcoin amounts. You can now send, and bitcoin will display, bitcoin amounts smaller than 0.01. However, sending fewer than 0.01 bitcoins still requires a 0.01 bitcoin fee (so you can send 1.0001 bitcoins without a fee, but you will be asked to pay a fee if you try to send 0.0001). -* A new method of finding BGL nodes to connect with, via DNS A records. Use the -dnsseed option to enable. +* A new method of finding bitcoin nodes to connect with, via DNS A records. Use the -dnsseed option to enable. -For developers, changes to BGL's remote-procedure-call API: +For developers, changes to bitcoin's remote-procedure-call API: -* New rpc command "sendmany" to send BGLs to more than one address in a single transaction. +* New rpc command "sendmany" to send bitcoins to more than one address in a single transaction. -* Several bug fixes, including a serious intermittent bug that would sometimes cause BGLd to stop accepting rpc requests. +* Several bug fixes, including a serious intermittent bug that would sometimes cause bitcoind to stop accepting rpc requests. * -logtimestamps option, to add a timestamp to each line in debug.log. diff --git a/doc/release-notes/release-notes-0.3.22.md b/doc/release-notes/release-notes-0.3.22.md index 03c6d5d65b..4c05e3e5e7 100644 --- a/doc/release-notes/release-notes-0.3.22.md +++ b/doc/release-notes/release-notes-0.3.22.md @@ -1,4 +1,4 @@ -Download URL: https://sourceforge.net/projects/BGL/files/BGL/BGL-0.3.22/ +Download URL: https://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.3.22/ This is largely a bugfix and TX fee schedule release. We also hope to make 0.3.23 a quick release, to fix problems that the network has seen due to explosive growth in the past week. @@ -7,7 +7,7 @@ Notable changes: * Non-standard transactions accepted on testnet * Source code tree reorganized (prep for autotools build) * Remove "Generate Coins" option from GUI, and remove 4way SSE miner. Internal reference CPU miner remains available, but users are directed to external miners for best hash production. -* IRC is overflowing. Client now bootstraps to channels #BGL00 - #BGL99 +* IRC is overflowing. Client now bootstraps to channels #bitcoin00 - #bitcoin99 * DNS names now may be used with -addnode, -connect (requires -dns to enable) RPC changes: diff --git a/doc/release-notes/release-notes-0.3.23.md b/doc/release-notes/release-notes-0.3.23.md index 2c6e2dc298..c1d520e492 100644 --- a/doc/release-notes/release-notes-0.3.23.md +++ b/doc/release-notes/release-notes-0.3.23.md @@ -1,7 +1,7 @@ -Win32, Linux, MacOSX and source releases for BGL v0.3.23 have been uploaded to -https://sourceforge.net/projects/BGL/files/BGL/BGL-0.3.23/ +Win32, Linux, MacOSX and source releases for bitcoin v0.3.23 have been uploaded to +https://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.3.23/ -This is another quick bugfix release, trying to deal with the influx of new BGL users. +This is another quick bugfix release, trying to deal with the influx of new bitcoin users. Main items of note: diff --git a/doc/release-notes/release-notes-0.3.24.md b/doc/release-notes/release-notes-0.3.24.md index 9e780b4323..d35ac66f2c 100644 --- a/doc/release-notes/release-notes-0.3.24.md +++ b/doc/release-notes/release-notes-0.3.24.md @@ -1,7 +1,7 @@ -BGL v0.3.24 is now available for download at -https://sourceforge.net/projects/BGL/files/BGL/BGL-0.3.24/ +Bitcoin v0.3.24 is now available for download at +https://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.3.24/ -This is another bug fix release. We had hoped to have wallet encryption ready for release, but more urgent fixes for existing clients were needed -- most notably block download problems were getting severe. Wallet encryption is ready for testing at https://github.com/BGL/BGL/pull/352 for the git-savvy, and hopefully will follow shortly in the next release, v0.4. +This is another bug fix release. We had hoped to have wallet encryption ready for release, but more urgent fixes for existing clients were needed -- most notably block download problems were getting severe. Wallet encryption is ready for testing at https://github.com/bitcoin/bitcoin/pull/352 for the git-savvy, and hopefully will follow shortly in the next release, v0.4. Notable fixes in v0.3.24, and the main reasons for this release: @@ -13,8 +13,8 @@ Notable changes in v0.3.24: C1) DNS seeding enabled by default. -C2) UPNP enabled by default in the GUI client. The percentage of BGL clients that accept incoming connections is quite small, and that is a problem. This should help. BGLd, and unofficial builds, are unchanged (though we encourage use of "-upnp" to help the network!) +C2) UPNP enabled by default in the GUI client. The percentage of bitcoin clients that accept incoming connections is quite small, and that is a problem. This should help. bitcoind, and unofficial builds, are unchanged (though we encourage use of "-upnp" to help the network!) -C3) Initial unit testing framework. BGL sorely needs automated tests, and this is a beginning. Contributions welcome. +C3) Initial unit testing framework. Bitcoin sorely needs automated tests, and this is a beginning. Contributions welcome. C4) Internal wallet code cleanup. While invisible to an end user, this change provides the basis for v0.4's wallet encryption. diff --git a/doc/release-notes/release-notes-0.4.0.md b/doc/release-notes/release-notes-0.4.0.md index 11306acc56..145072a369 100644 --- a/doc/release-notes/release-notes-0.4.0.md +++ b/doc/release-notes/release-notes-0.4.0.md @@ -1,24 +1,24 @@ -BGL version 0.4.0 is now available for download at: -http://sourceforge.net/projects/BGL/files/BGL/BGL-0.4.0/ +Bitcoin version 0.4.0 is now available for download at: +http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.4.0/ The main feature in this release is wallet private key encryption; you can set a passphrase that must be entered before sending coins. See below for more information; if you decide to encrypt your wallet, WRITE DOWN YOUR PASSPHRASE AND PUT IT IN A SECURE LOCATION. If you -forget or lose your wallet passphrase, you lose your BGLs. -Previous versions of BGL are unable to read encrypted wallets, +forget or lose your wallet passphrase, you lose your bitcoins. +Previous versions of bitcoin are unable to read encrypted wallets, and will crash on startup if the wallet is encrypted. -Also note: BGL version 0.4 uses a newer version of Berkeley DB +Also note: bitcoin version 0.4 uses a newer version of Berkeley DB (bdb version 4.8) than previous versions (bdb 4.7). If you upgrade -to version 0.4 and then revert back to an earlier version of BGL +to version 0.4 and then revert back to an earlier version of bitcoin the it may be unable to start because bdb 4.7 cannot read bdb 4.8 "log" files. Notable bug fixes from version 0.3.24: -Fix several BGL-becomes-unresponsive bugs due to multithreading +Fix several bitcoin-becomes-unresponsive bugs due to multithreading deadlocks. Optimize database writes for large (lots of inputs) transactions @@ -27,44 +27,44 @@ Optimize database writes for large (lots of inputs) transactions Wallet Encryption -BGL supports native wallet encryption so that people who steal your -wallet file don't automatically get access to all of your BGLs. +Bitcoin supports native wallet encryption so that people who steal your +wallet file don't automatically get access to all of your Bitcoins. In order to enable this feature, choose "Encrypt Wallet" from the Options menu. You will be prompted to enter a passphrase, which will be used as the key to encrypt your wallet and will be needed -every time you wish to send BGLs. If you lose this passphrase, -you will lose access to spend all of the BGLs in your wallet, -no one, not even the BGL developers can recover your BGLs. +every time you wish to send Bitcoins. If you lose this passphrase, +you will lose access to spend all of the bitcoins in your wallet, +no one, not even the Bitcoin developers can recover your Bitcoins. This means you are responsible for your own security, store your passphrase in a secure location and do not forget it. -Remember that the encryption built into BGL only encrypts the -actual keys which are required to send your BGLs, not the full +Remember that the encryption built into bitcoin only encrypts the +actual keys which are required to send your bitcoins, not the full wallet. This means that someone who steals your wallet file will be able to see all the addresses which belong to you, as well as the relevant transactions, you are only protected from someone spending your coins. It is recommended that you backup your wallet file before you -encrypt your wallet. To do this, close the BGL client and -copy the wallet.dat file from ~/.BGL/ on Linux, /Users/(user -name)/Application Support/BGL/ on Mac OSX, and %APPDATA%/BGL/ -on Windows (that is /Users/(user name)/AppData/Roaming/BGL on +encrypt your wallet. To do this, close the Bitcoin client and +copy the wallet.dat file from ~/.bitcoin/ on Linux, /Users/(user +name)/Application Support/Bitcoin/ on Mac OSX, and %APPDATA%/Bitcoin/ +on Windows (that is /Users/(user name)/AppData/Roaming/Bitcoin on Windows Vista and 7 and /Documents and Settings/(user name)/Application -Data/BGL on Windows XP). Once you have copied that file to a -safe location, reopen the BGL client and Encrypt your wallet. +Data/Bitcoin on Windows XP). Once you have copied that file to a +safe location, reopen the Bitcoin client and Encrypt your wallet. If everything goes fine, delete the backup and enjoy your encrypted wallet. Note that once you encrypt your wallet, you will never be -able to go back to a version of the BGL client older than 0.4. +able to go back to a version of the Bitcoin client older than 0.4. Keep in mind that you are always responsible for your own security. All it takes is a slightly more advanced wallet-stealing trojan which installs a keylogger to steal your wallet passphrase as you enter it -in addition to your wallet file and you have lost all your BGLs. +in addition to your wallet file and you have lost all your Bitcoins. Wallet encryption cannot keep you safe if you do not practice good security, such as running up-to-date antivirus software, only -entering your wallet passphrase in the BGL client and using the +entering your wallet passphrase in the Bitcoin client and using the same passphrase only as your wallet passphrase. -See the doc/README file in the BGL source for technical details +See the doc/README file in the bitcoin source for technical details of wallet encryption. diff --git a/doc/release-notes/release-notes-0.4.1.md b/doc/release-notes/release-notes-0.4.1.md index 3b8d7aac57..ac471a8d7f 100644 --- a/doc/release-notes/release-notes-0.4.1.md +++ b/doc/release-notes/release-notes-0.4.1.md @@ -1,5 +1,5 @@ -BGL version 0.4.1 is now available for download at: -http://sourceforge.net/projects/BGL/files/BGL/BGL-0.4.1/ +Bitcoin version 0.4.1 is now available for download at: +http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.4.1/ This is a bugfix only release based on 0.4.0. @@ -7,32 +7,32 @@ Please report bugs by replying to this forum thread. MAJOR BUG FIX (CVE-2011-4447) -The wallet encryption feature introduced in BGL version 0.4.0 did not sufficiently secure the private keys. An attacker who +The wallet encryption feature introduced in Bitcoin version 0.4.0 did not sufficiently secure the private keys. An attacker who managed to get a copy of your encrypted wallet.dat file might be able to recover some or all of the unencrypted keys and steal the associated coins. -If you have a previously encrypted wallet.dat, the first time you run wxBGL or BGLd the wallet will be rewritten, BGL will +If you have a previously encrypted wallet.dat, the first time you run wxbitcoin or bitcoind the wallet will be rewritten, Bitcoin will shut down, and you will be prompted to restart it to run with the new, properly encrypted file. If you had a previously encrypted wallet.dat that might have been copied or stolen (for example, you backed it up to a public -location) you should send all of your BGLs to yourself using a new BGL address and stop using any previously generated addresses. +location) you should send all of your bitcoins to yourself using a new bitcoin address and stop using any previously generated addresses. -Wallets encrypted with this version of BGL are written properly. +Wallets encrypted with this version of Bitcoin are written properly. -Technical note: the encrypted wallet's 'keypool' will be regenerated the first time you request a new BGL address; to be certain that the +Technical note: the encrypted wallet's 'keypool' will be regenerated the first time you request a new bitcoin address; to be certain that the new private keys are properly backed up you should: -1. Run BGL and let it rewrite the wallet.dat file +1. Run Bitcoin and let it rewrite the wallet.dat file -2. Run it again, then ask it for a new BGL address. -wxBGL: new address visible on main window -BGLd: run the 'walletpassphrase' RPC command to unlock the wallet, then run the 'getnewaddress' RPC command. +2. Run it again, then ask it for a new bitcoin address. +wxBitcoin: new address visible on main window +bitcoind: run the 'walletpassphrase' RPC command to unlock the wallet, then run the 'getnewaddress' RPC command. -3. If your encrypted wallet.dat may have been copied or stolen, send all of your BGLs to the new BGL address. +3. If your encrypted wallet.dat may have been copied or stolen, send all of your bitcoins to the new bitcoin address. -4. Shut down BGL, then backup the wallet.dat file. -IMPORTANT: be sure to request a new BGL address before backing up, so that the 'keypool' is regenerated and backed up. +4. Shut down Bitcoin, then backup the wallet.dat file. +IMPORTANT: be sure to request a new bitcoin address before backing up, so that the 'keypool' is regenerated and backed up. -"Security in depth" is always a good idea, so choosing a secure location for the backup and/or encrypting the backup before uploading it is recommended. And as in previous releases, if your machine is infected by malware there are several ways an attacker might steal your BGLs. +"Security in depth" is always a good idea, so choosing a secure location for the backup and/or encrypting the backup before uploading it is recommended. And as in previous releases, if your machine is infected by malware there are several ways an attacker might steal your bitcoins. Thanks to Alan Reiner (etotheipi) for finding and reporting this bug. diff --git a/doc/release-notes/release-notes-0.4.3.md b/doc/release-notes/release-notes-0.4.3.md index 81005a2d5d..79b74404de 100644 --- a/doc/release-notes/release-notes-0.4.3.md +++ b/doc/release-notes/release-notes-0.4.3.md @@ -1,21 +1,21 @@ -BGLd version 0.4.3 is now available for download at: -http://luke.dashjr.org/programs/BGL/files/BGLd-0.4.3/ (until Gavin uploads to SourceForge) +bitcoind version 0.4.3 is now available for download at: +http://luke.dashjr.org/programs/bitcoin/files/bitcoind-0.4.3/ (until Gavin uploads to SourceForge) This is a bugfix-only release based on 0.4.0. -Please note that the wxBGL GUI client is no longer maintained nor supported. If someone would like to step up to maintain this, they should contact Luke-Jr. +Please note that the wxBitcoin GUI client is no longer maintained nor supported. If someone would like to step up to maintain this, they should contact Luke-Jr. Please report bugs for the daemon only using the issue tracker at github: https://github.com/BitgesellOfficial/bitgesell/issues Stable source code is hosted at Gitorious: -http://gitorious.org/BGL/BGLd-stable/archive-tarball/v0.4.3#.tar.gz +http://gitorious.org/bitcoin/bitcoind-stable/archive-tarball/v0.4.3#.tar.gz BUG FIXES Cease locking memory used by non-sensitive information (this caused a huge performance hit on some platforms, especially noticable during initial blockchain download). Fixed some address-handling deadlocks (client freezes). -No longer accept inbound connections over the internet when BGL is being used with Tor (identity leak). +No longer accept inbound connections over the internet when Bitcoin is being used with Tor (identity leak). Use the correct base transaction fee of 0.0005 BTC for accepting transactions into mined blocks (since 0.4.0, it was incorrectly accepting 0.0001 BTC which was only meant to be relayed). Add new DNS seeds (maintained by Pieter Wuille and Luke Dashjr). diff --git a/doc/release-notes/release-notes-0.4.4.md b/doc/release-notes/release-notes-0.4.4.md index ec4d184e20..a0c839cbd8 100644 --- a/doc/release-notes/release-notes-0.4.4.md +++ b/doc/release-notes/release-notes-0.4.4.md @@ -1,15 +1,15 @@ -BGL version 0.4.4 is now available for download at: -http://luke.dashjr.org/programs/BGL/files/BGLd-0.4.4/ +Bitcoin version 0.4.4 is now available for download at: +http://luke.dashjr.org/programs/bitcoin/files/bitcoind-0.4.4/ This is a bugfix-only release based on 0.4.0. -Please note that the wxBGL GUI client is no longer maintained nor supported. If someone would like to step up to maintain this, they should contact Luke-Jr. +Please note that the wxBitcoin GUI client is no longer maintained nor supported. If someone would like to step up to maintain this, they should contact Luke-Jr. Please report bugs for the daemon only using the issue tracker at github: https://github.com/BitgesellOfficial/bitgesell/issues Stable source code is hosted at Gitorious: -http://gitorious.org/BGL/BGLd-stable/archive-tarball/v0.4.4#.tar.gz +http://gitorious.org/bitcoin/bitcoind-stable/archive-tarball/v0.4.4#.tar.gz BUG FIXES @@ -24,7 +24,7 @@ Several shutdown issues have been fixed. Check that keys stored in the wallet are valid at startup, and if not, report corruption. Various build fixes. -If no password is specified to BGLd, recommend a secure password. +If no password is specified to bitcoind, recommend a secure password. Update hard-coded fallback seed nodes, choosing recent ones with long uptime and versions at least 0.4.0. Add checkpoint at block 168,000. diff --git a/doc/release-notes/release-notes-0.4.6.md b/doc/release-notes/release-notes-0.4.6.md index 18e89b88ae..07c5e4b694 100644 --- a/doc/release-notes/release-notes-0.4.6.md +++ b/doc/release-notes/release-notes-0.4.6.md @@ -1,11 +1,11 @@ -BGLd version 0.4.6 is now available for download at: +bitcoind version 0.4.6 is now available for download at: Windows: installer | zip (sig) Source: tar.gz -BGLd and BGL-Qt version 0.6.0.7 are also tagged in git, but it is recommended to upgrade to 0.6.1. +bitcoind and Bitcoin-Qt version 0.6.0.7 are also tagged in git, but it is recommended to upgrade to 0.6.1. These are bugfix-only releases. -Please report bugs by replying to this forum thread. Note that the 0.4.x wxBGL GUI client is no longer maintained nor supported. If someone would like to step up to maintain this, they should contact Luke-Jr. +Please report bugs by replying to this forum thread. Note that the 0.4.x wxBitcoin GUI client is no longer maintained nor supported. If someone would like to step up to maintain this, they should contact Luke-Jr. BUG FIXES @@ -13,25 +13,25 @@ Version 0.6.0 allowed importing invalid "private keys", which would be unspendab Verify status of encrypt/decrypt calls to detect failed padding Check blocks for duplicate transactions earlier. Fixes #1167 Upgrade Windows builds to OpenSSL 1.0.1b -Set label when selecting an address that already has a label. Fixes #1080 (BGL-Qt) +Set label when selecting an address that already has a label. Fixes #1080 (Bitcoin-Qt) JSON-RPC listtransactions's from/count handling is now fixed Optimize and fix multithreaded access, when checking whether we already know about transactions Fix potential networking deadlock Proper support for Growl 1.3 notifications Display an error, rather than crashing, if encoding a QR Code failed (0.6.0.7) -Don't erroneously set "Display addresses" for users who haven't explicitly enabled it (BGL-Qt) +Don't erroneously set "Display addresses" for users who haven't explicitly enabled it (Bitcoin-Qt) Some non-ASCII input in JSON-RPC expecting hexadecimal may have been misinterpreted rather than rejected Missing error condition checking added -Do not show green tick unless all known blocks are downloaded. Fixes #921 (BGL-Qt) +Do not show green tick unless all known blocks are downloaded. Fixes #921 (Bitcoin-Qt) Increase time ago of last block for "up to date" status from 30 to 90 minutes -Show a message box when runaway exception happens (BGL-Qt) +Show a message box when runaway exception happens (Bitcoin-Qt) Use a messagebox to display the error when -server is provided without providing a rpc password -Show error message instead of exception crash when unable to bind RPC port (BGL-Qt) -Correct sign message BGL address tooltip. Fixes #1050 (BGL-Qt) +Show error message instead of exception crash when unable to bind RPC port (Bitcoin-Qt) +Correct sign message bitcoin address tooltip. Fixes #1050 (Bitcoin-Qt) Removed "(no label)" from QR Code dialog titlebar if we have no label (0.6.0.7) Removed an ugly line break in tooltip for mature transactions (0.6.0.7) -Add missing tooltip and key shortcut in settings dialog (part of #1088) (BGL-Qt) +Add missing tooltip and key shortcut in settings dialog (part of #1088) (Bitcoin-Qt) Work around issue in boost::program_options that prevents from compiling in clang Fixed bugs occurring only on platforms with unsigned characters (such as ARM). -Rename make_windows_icon.py to .sh as it is a shell script. Fixes #1099 (BGL-Qt) +Rename make_windows_icon.py to .sh as it is a shell script. Fixes #1099 (Bitcoin-Qt) Various trivial internal corrections to types used for counting/size loops and warnings diff --git a/doc/release-notes/release-notes-0.5.0.md b/doc/release-notes/release-notes-0.5.0.md index 2c42f08f70..8cba35bb7c 100644 --- a/doc/release-notes/release-notes-0.5.0.md +++ b/doc/release-notes/release-notes-0.5.0.md @@ -1,45 +1,45 @@ -BGL version 0.5.0 is now available for download at: -http://sourceforge.net/projects/BGL/files/BGL/BGL-0.5.0/ +Bitcoin version 0.5.0 is now available for download at: +http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.5.0/ The major change for this release is a completely new graphical interface that uses the Qt user interface toolkit. This release include German, Spanish, Spanish-Castilian, Norwegian and Dutch translations. More translations are welcome; join the project at Transifex if you can help: -https://www.transifex.net/projects/p/BGL/ +https://www.transifex.net/projects/p/bitcoin/ Please report bugs using the issue tracker at github: https://github.com/BitgesellOfficial/bitgesell/issues -For Ubuntu users, there is a new ppa maintained by Matt Corallo which you can add to your system so that it will automatically keep BGL up-to-date. Just type "sudo apt-add-repository ppa:BGL/BGL" in your terminal, then install the BGL-qt package. +For Ubuntu users, there is a new ppa maintained by Matt Corallo which you can add to your system so that it will automatically keep bitcoin up-to-date. Just type "sudo apt-add-repository ppa:bitcoin/bitcoin" in your terminal, then install the bitcoin-qt package. MAJOR BUG FIX (CVE-2011-4447) -The wallet encryption feature introduced in BGL version 0.4.0 did not sufficiently secure the private keys. An attacker who +The wallet encryption feature introduced in Bitcoin version 0.4.0 did not sufficiently secure the private keys. An attacker who managed to get a copy of your encrypted wallet.dat file might be able to recover some or all of the unencrypted keys and steal the associated coins. -If you have a previously encrypted wallet.dat, the first time you run BGL-qt or BGLd the wallet will be rewritten, BGL will +If you have a previously encrypted wallet.dat, the first time you run bitcoin-qt or bitcoind the wallet will be rewritten, Bitcoin will shut down, and you will be prompted to restart it to run with the new, properly encrypted file. If you had a previously encrypted wallet.dat that might have been copied or stolen (for example, you backed it up to a public -location) you should send all of your BGLs to yourself using a new BGL address and stop using any previously generated addresses. +location) you should send all of your bitcoins to yourself using a new bitcoin address and stop using any previously generated addresses. -Wallets encrypted with this version of BGL are written properly. +Wallets encrypted with this version of Bitcoin are written properly. -Technical note: the encrypted wallet's 'keypool' will be regenerated the first time you request a new BGL address; to be certain that the +Technical note: the encrypted wallet's 'keypool' will be regenerated the first time you request a new bitcoin address; to be certain that the new private keys are properly backed up you should: -1. Run BGL and let it rewrite the wallet.dat file +1. Run Bitcoin and let it rewrite the wallet.dat file -2. Run it again, then ask it for a new BGL address. -BGL-Qt: Address Book, then New Address... -BGLd: run the 'walletpassphrase' RPC command to unlock the wallet, then run the 'getnewaddress' RPC command. +2. Run it again, then ask it for a new bitcoin address. +Bitcoin-Qt: Address Book, then New Address... +bitcoind: run the 'walletpassphrase' RPC command to unlock the wallet, then run the 'getnewaddress' RPC command. -3. If your encrypted wallet.dat may have been copied or stolen, send all of your BGLs to the new BGL address. +3. If your encrypted wallet.dat may have been copied or stolen, send all of your bitcoins to the new bitcoin address. -4. Shut down BGL, then backup the wallet.dat file. -IMPORTANT: be sure to request a new BGL address before backing up, so that the 'keypool' is regenerated and backed up. +4. Shut down Bitcoin, then backup the wallet.dat file. +IMPORTANT: be sure to request a new bitcoin address before backing up, so that the 'keypool' is regenerated and backed up. -"Security in depth" is always a good idea, so choosing a secure location for the backup and/or encrypting the backup before uploading it is recommended. And as in previous releases, if your machine is infected by malware there are several ways an attacker might steal your BGLs. +"Security in depth" is always a good idea, so choosing a secure location for the backup and/or encrypting the backup before uploading it is recommended. And as in previous releases, if your machine is infected by malware there are several ways an attacker might steal your bitcoins. Thanks to Alan Reiner (etotheipi) for finding and reporting this bug. @@ -51,7 +51,7 @@ MAJOR GUI CHANGES Icons at the bottom of the window that show how well connected you are to the network, with tooltips to display details. -Drag and drop support for BGL: URIs on web pages. +Drag and drop support for bitcoin: URIs on web pages. Export transactions as a .csv file. @@ -63,7 +63,7 @@ getmemorypool : new RPC command, provides everything needed to construct a block listsinceblock : new RPC command, list transactions since given block -signmessage/verifymessage : new RPC commands to sign a message with one of your private keys or verify that a message signed by the private key associated with a BGL address. +signmessage/verifymessage : new RPC commands to sign a message with one of your private keys or verify that a message signed by the private key associated with a bitcoin address. GENERAL CHANGES diff --git a/doc/release-notes/release-notes-0.5.1.md b/doc/release-notes/release-notes-0.5.1.md index ac996c226d..e8914becfb 100644 --- a/doc/release-notes/release-notes-0.5.1.md +++ b/doc/release-notes/release-notes-0.5.1.md @@ -1,12 +1,12 @@ -BGL version 0.5.1 is now available for download at: -http://sourceforge.net/projects/BGL/files/BGL/BGL-0.5.1/ +Bitcoin version 0.5.1 is now available for download at: +http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.5.1/ This is a bugfix-only release. This release includes 13 translations, including 5 new translations: Italian, Hungarian, Ukranian, Portuguese (Brazilian) and Simplified Chinese. More translations are welcome; join the project at Transifex if you can help: -https://www.transifex.net/projects/p/BGL/ +https://www.transifex.net/projects/p/bitcoin/ Please report bugs using the issue tracker at github: https://github.com/BitgesellOfficial/bitgesell/issues @@ -14,14 +14,14 @@ https://github.com/BitgesellOfficial/bitgesell/issues Project source code is hosted at github; we are no longer distributing .tar.gz files here, you can get them directly from github: -https://github.com/BGL/BGL/tarball/v0.5.1 # .tar.gz -https://github.com/BGL/BGL/zipball/v0.5.1 # .zip +https://github.com/bitcoin/bitcoin/tarball/v0.5.1 # .tar.gz +https://github.com/bitcoin/bitcoin/zipball/v0.5.1 # .zip For Ubuntu users, there is a new ppa maintained by Matt Corallo which you can add to your system so that it will automatically keep -BGL up-to-date. Just type -sudo apt-add-repository ppa:BGL/BGL -in your terminal, then install the BGL-qt package. +bitcoin up-to-date. Just type +sudo apt-add-repository ppa:bitcoin/bitcoin +in your terminal, then install the bitcoin-qt package. BUG FIXES @@ -29,15 +29,15 @@ BUG FIXES Re-enable SSL support for the JSON-RPC interface (it was unintentionally disabled for the 0.5.0 release binaries). -The code that finds peers via "dns seeds" no longer stops BGL startup +The code that finds peers via "dns seeds" no longer stops bitcoin startup if one of the dns seed machines is down. Tooltips on the transaction list view were rendering incorrectly (as black boxes or with a transparent background). -Prevent a denial-of-service attack involving flooding a BGL node with +Prevent a denial-of-service attack involving flooding a bitcoin node with orphan blocks. The wallet passphrase dialog now warns you if the caps lock key was pressed. -Improved searching in addresses and labels in BGL-qt. +Improved searching in addresses and labels in bitcoin-qt. diff --git a/doc/release-notes/release-notes-0.5.2.md b/doc/release-notes/release-notes-0.5.2.md index eed88b00d8..1c2e0f58b5 100644 --- a/doc/release-notes/release-notes-0.5.2.md +++ b/doc/release-notes/release-notes-0.5.2.md @@ -1,5 +1,5 @@ -BGL version 0.5.2 is now available for download at: -http://sourceforge.net/projects/BGL/files/BGL/BGL-0.5.2/ +Bitcoin version 0.5.2 is now available for download at: +http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.5.2/ This is a bugfix-only release based on 0.5.1. @@ -7,7 +7,7 @@ Please report bugs using the issue tracker at github: https://github.com/BitgesellOfficial/bitgesell/issues Stable source code is hosted at Gitorious: -http://gitorious.org/BGL/BGLd-stable/archive-tarball/v0.5.2#.tar.gz +http://gitorious.org/bitcoin/bitcoind-stable/archive-tarball/v0.5.2#.tar.gz BUG FIXES @@ -15,7 +15,7 @@ Check all transactions in blocks after the last checkpoint (0.5.0 and 0.5.1 skip Cease locking memory used by non-sensitive information (this caused a huge performance hit on some platforms, especially noticable during initial blockchain download; this was not a security vulnerability). Fixed some address-handling deadlocks (client freezes). -No longer accept inbound connections over the internet when BGL is being used with Tor (identity leak). +No longer accept inbound connections over the internet when Bitcoin is being used with Tor (identity leak). Re-enable SSL support for the JSON-RPC interface (it was unintentionally disabled for the 0.5.0 and 0.5.1 release Linux binaries). Use the correct base transaction fee of 0.0005 BTC for accepting transactions into mined blocks (since 0.4.0, it was incorrectly accepting 0.0001 BTC which was only meant to be relayed). Don't show "IP" for transactions which are not necessarily IP transactions. diff --git a/doc/release-notes/release-notes-0.5.3.md b/doc/release-notes/release-notes-0.5.3.md index 2d693b49aa..38b0b051d0 100644 --- a/doc/release-notes/release-notes-0.5.3.md +++ b/doc/release-notes/release-notes-0.5.3.md @@ -1,5 +1,5 @@ -BGL version 0.5.3 is now available for download at: -http://sourceforge.net/projects/BGL/files/BGL/BGL-0.5.3/ +Bitcoin version 0.5.3 is now available for download at: +http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.5.3/ This is a bugfix-only release based on 0.5.1. It also includes a few protocol updates. @@ -8,12 +8,12 @@ Please report bugs using the issue tracker at github: https://github.com/BitgesellOfficial/bitgesell/issues Stable source code is hosted at Gitorious: -http://gitorious.org/BGL/BGLd-stable/archive-tarball/v0.5.3#.tar.gz +http://gitorious.org/bitcoin/bitcoind-stable/archive-tarball/v0.5.3#.tar.gz PROTOCOL UPDATES BIP 30: Introduce a new network rule: "a block is not valid if it contains a transaction whose hash already exists in the block chain, unless all that transaction's outputs were already spent before said block" beginning on March 15, 2012, 00:00 UTC. -On testnet, allow mining of min-difficulty blocks if 20 minutes have gone by without mining a regular-difficulty block. This is to make testing BGL easier, and will not affect normal mode. +On testnet, allow mining of min-difficulty blocks if 20 minutes have gone by without mining a regular-difficulty block. This is to make testing Bitcoin easier, and will not affect normal mode. BUG FIXES @@ -24,19 +24,19 @@ Resolved multiple bugs preventing long-term unlocking of encrypted wallets Only send local IP in "version" messages if it is globally routable (ie, not private), and try to get such an IP from UPnP if applicable. Reannounce UPnP port forwards every 20 minutes, to workaround routers expiring old entries, and allow the -upnp option to override any stored setting. Skip splash screen when -min is used, and fix Minimize to Tray function. -Do not blank "label" in BGL-Qt "Send" tab, if the user has already entered something. +Do not blank "label" in Bitcoin-Qt "Send" tab, if the user has already entered something. Correct various labels and messages. Various memory leaks and potential null pointer deferences have been fixed. -Handle invalid BGL URIs using "BGL://" instead of "BGL:". +Handle invalid Bitcoin URIs using "bitcoin://" instead of "bitcoin:". Several shutdown issues have been fixed. Revert to "global progress indication", as starting from zero every time was considered too confusing for many users. Check that keys stored in the wallet are valid at startup, and if not, report corruption. Enable accessible widgets on Windows, so that people with screen readers such as NVDA can make sense of it. Various build fixes. -If no password is specified to BGLd, recommend a secure password. -Automatically focus and scroll to new "Send coins" entries in BGL-Qt. -Show a message box for --help on Windows, for BGL-Qt. +If no password is specified to bitcoind, recommend a secure password. +Automatically focus and scroll to new "Send coins" entries in Bitcoin-Qt. +Show a message box for --help on Windows, for Bitcoin-Qt. Add missing "About Qt" menu option to show built-in Qt About dialog. -Don't show "-daemon" as an option for BGL-Qt, since it isn't available. +Don't show "-daemon" as an option for Bitcoin-Qt, since it isn't available. Update hard-coded fallback seed nodes, choosing recent ones with long uptime and versions at least 0.4.0. Add checkpoint at block 168,000. diff --git a/doc/release-notes/release-notes-0.5.4.md b/doc/release-notes/release-notes-0.5.4.md index 0c73f6ec05..ce2160fbb9 100644 --- a/doc/release-notes/release-notes-0.5.4.md +++ b/doc/release-notes/release-notes-0.5.4.md @@ -1,5 +1,5 @@ -BGL version 0.5.4 is now available for download at: -http://sourceforge.net/projects/BGL/files/BGL/BGL-0.5.4/ +Bitcoin version 0.5.4 is now available for download at: +http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.5.4/ NOTE: 0.5.4rc3 is being renamed to 0.5.4 final with no changes. This is a bugfix-only release in the 0.5.x series, plus a few protocol updates. @@ -8,7 +8,7 @@ Please report bugs using the issue tracker at github: https://github.com/BitgesellOfficial/bitgesell/issues Stable source code is hosted at Gitorious: -http://gitorious.org/BGL/BGLd-stable/archive-tarball/v0.5.4#.tar.gz +http://gitorious.org/bitcoin/bitcoind-stable/archive-tarball/v0.5.4#.tar.gz PROTOCOL UPDATES @@ -22,8 +22,8 @@ Fix broken testnet mining. Stop excess inventory relay during initial block download. When disconnecting a node, clear the received buffer so that we do not process any already received messages. Yet another attempt at implementing "minimize to tray" that works on all operating systems. -Fix BGL-Qt notifications under Growl 1.3. -Increase required age of BGL-Qt's "not up to date" status from 30 to 90 minutes. +Fix Bitcoin-Qt notifications under Growl 1.3. +Increase required age of Bitcoin-Qt's "not up to date" status from 30 to 90 minutes. Implemented missing verifications that led to crash on entering some wrong passphrases for encrypted wallets. Fix default filename suffixes in GNOME save dialog. Make the "Send coins" tab use the configured unit type, even on the first attempt. @@ -31,7 +31,7 @@ Print detailed wallet loading errors to debug.log when it is corrupt. Allocate exactly the amount of space needed for signing transactions, instead of a fixed 10k buffer. Workaround for improbable memory access violation. Check wallet's minimum version before trying to load it. -Remove wxBGL properly when installing BGL-Qt over it. (Windows) +Remove wxBitcoin properly when installing Bitcoin-Qt over it. (Windows) Detail reorganization information better in debug log. Use a messagebox to display the error when -server is provided without configuring a RPC password. Testing suite build now honours provided CXXFLAGS. diff --git a/doc/release-notes/release-notes-0.5.5.md b/doc/release-notes/release-notes-0.5.5.md index 2c12ac11ce..75ebc3e6b6 100644 --- a/doc/release-notes/release-notes-0.5.5.md +++ b/doc/release-notes/release-notes-0.5.5.md @@ -1,11 +1,11 @@ -BGLd and BGL-Qt version 0.5.5 are now available for download at: +bitcoind and Bitcoin-Qt version 0.5.5 are now available for download at: Windows: installer | zip (sig) Source: tar.gz -BGLd and BGL-Qt version 0.6.0.7 are also tagged in git, but it is recommended to upgrade to 0.6.1. +bitcoind and Bitcoin-Qt version 0.6.0.7 are also tagged in git, but it is recommended to upgrade to 0.6.1. These are bugfix-only releases. -Please report bugs by replying to this forum thread. Note that the 0.4.x wxBGL GUI client is no longer maintained nor supported. If someone would like to step up to maintain this, they should contact Luke-Jr. +Please report bugs by replying to this forum thread. Note that the 0.4.x wxBitcoin GUI client is no longer maintained nor supported. If someone would like to step up to maintain this, they should contact Luke-Jr. BUG FIXES @@ -13,25 +13,25 @@ Version 0.6.0 allowed importing invalid "private keys", which would be unspendab Verify status of encrypt/decrypt calls to detect failed padding Check blocks for duplicate transactions earlier. Fixes #1167 Upgrade Windows builds to OpenSSL 1.0.1b -Set label when selecting an address that already has a label. Fixes #1080 (BGL-Qt) +Set label when selecting an address that already has a label. Fixes #1080 (Bitcoin-Qt) JSON-RPC listtransactions's from/count handling is now fixed Optimize and fix multithreaded access, when checking whether we already know about transactions Fix potential networking deadlock Proper support for Growl 1.3 notifications Display an error, rather than crashing, if encoding a QR Code failed (0.6.0.7) -Don't erroneously set "Display addresses" for users who haven't explicitly enabled it (BGL-Qt) +Don't erroneously set "Display addresses" for users who haven't explicitly enabled it (Bitcoin-Qt) Some non-ASCII input in JSON-RPC expecting hexadecimal may have been misinterpreted rather than rejected Missing error condition checking added -Do not show green tick unless all known blocks are downloaded. Fixes #921 (BGL-Qt) +Do not show green tick unless all known blocks are downloaded. Fixes #921 (Bitcoin-Qt) Increase time ago of last block for "up to date" status from 30 to 90 minutes -Show a message box when runaway exception happens (BGL-Qt) +Show a message box when runaway exception happens (Bitcoin-Qt) Use a messagebox to display the error when -server is provided without providing a rpc password -Show error message instead of exception crash when unable to bind RPC port (BGL-Qt) -Correct sign message BGL address tooltip. Fixes #1050 (BGL-Qt) +Show error message instead of exception crash when unable to bind RPC port (Bitcoin-Qt) +Correct sign message bitcoin address tooltip. Fixes #1050 (Bitcoin-Qt) Removed "(no label)" from QR Code dialog titlebar if we have no label (0.6.0.7) Removed an ugly line break in tooltip for mature transactions (0.6.0.7) -Add missing tooltip and key shortcut in settings dialog (part of #1088) (BGL-Qt) +Add missing tooltip and key shortcut in settings dialog (part of #1088) (Bitcoin-Qt) Work around issue in boost::program_options that prevents from compiling in clang Fixed bugs occurring only on platforms with unsigned characters (such as ARM). -Rename make_windows_icon.py to .sh as it is a shell script. Fixes #1099 (BGL-Qt) +Rename make_windows_icon.py to .sh as it is a shell script. Fixes #1099 (Bitcoin-Qt) Various trivial internal corrections to types used for counting/size loops and warnings diff --git a/doc/release-notes/release-notes-0.6.0.md b/doc/release-notes/release-notes-0.6.0.md index 21431ddad1..549404325e 100644 --- a/doc/release-notes/release-notes-0.6.0.md +++ b/doc/release-notes/release-notes-0.6.0.md @@ -1,10 +1,10 @@ -BGL version 0.6.0 is now available for download at: -http://sourceforge.net/projects/BGL/files/BGL/BGL-0.6.0/test/ +Bitcoin version 0.6.0 is now available for download at: +http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.6.0/test/ This release includes more than 20 language localizations. More translations are welcome; join the project at Transifex to help: -https://www.transifex.net/projects/p/BGL/ +https://www.transifex.net/projects/p/bitcoin/ Please report bugs using the issue tracker at github: https://github.com/BitgesellOfficial/bitgesell/issues @@ -12,14 +12,14 @@ https://github.com/BitgesellOfficial/bitgesell/issues Project source code is hosted at github; we are no longer distributing .tar.gz files here, you can get them directly from github: -https://github.com/BGL/BGL/tarball/v0.6.0 # .tar.gz -https://github.com/BGL/BGL/zipball/v0.6.0 # .zip +https://github.com/bitcoin/bitcoin/tarball/v0.6.0 # .tar.gz +https://github.com/bitcoin/bitcoin/zipball/v0.6.0 # .zip For Ubuntu users, there is a ppa maintained by Matt Corallo which you can add to your system so that it will automatically keep -BGL up-to-date. Just type -sudo apt-add-repository ppa:BGL/BGL -in your terminal, then install the BGL-qt package. +bitcoin up-to-date. Just type +sudo apt-add-repository ppa:bitcoin/bitcoin +in your terminal, then install the bitcoin-qt package. KNOWN ISSUES @@ -30,7 +30,7 @@ because database writes are queued to speed up download time. -NEW FEATURES SINCE BGL VERSION 0.5 +NEW FEATURES SINCE BITCOIN VERSION 0.5 Initial network synchronization should be much faster (one or two hours on a typical machine instead of ten or more @@ -38,30 +38,30 @@ hours). Backup Wallet menu option. -BGL-Qt can display and save QR codes for sending +Bitcoin-Qt can display and save QR codes for sending and receiving addresses. New context menu on addresses to copy/edit/delete them. New Sign Message dialog that allows you to prove that you -own a BGL address by creating a digital +own a bitcoin address by creating a digital signature. New wallets created with this version will use 33-byte 'compressed' public keys instead of 65-byte public keys, resulting in smaller -transactions and less traffic on the BGL +transactions and less traffic on the bitcoin network. The shorter keys are already supported by the network but wallet.dat files containing short keys are not compatible with earlier -versions of BGL-Qt/BGLd. +versions of Bitcoin-Qt/bitcoind. New command-line argument -blocknotify= that will spawn a shell process to run when a new block is accepted. New command-line argument -splash=0 to disable -BGL-Qt's initial splash screen +Bitcoin-Qt's initial splash screen validateaddress JSON-RPC api command output includes two new fields for addresses in the wallet: @@ -104,11 +104,11 @@ attacks were fixed. NOT YET IMPLEMENTED FEATURES -Support for clicking on BGL: URIs and -opening/launching BGL-Qt is available only on Linux, +Support for clicking on bitcoin: URIs and +opening/launching Bitcoin-Qt is available only on Linux, and only if you configure your desktop to launch -BGL-Qt. All platforms support dragging and dropping -BGL: URIs onto the BGL-Qt window to start +Bitcoin-Qt. All platforms support dragging and dropping +bitcoin: URIs onto the Bitcoin-Qt window to start payment. @@ -117,7 +117,7 @@ PRELIMINARY SUPPORT FOR MULTISIGNATURE TRANSACTIONS This release has preliminary support for multisignature transactions-- transactions that require authorization from more than one person or device before they -will be accepted by the BGL network. +will be accepted by the bitcoin network. Prior to this release, multisignature transactions were considered 'non-standard' and were ignored; @@ -125,13 +125,13 @@ with this release multisignature transactions are considered standard and will start to be relayed and accepted into blocks. -It is expected that future releases of BGL-Qt +It is expected that future releases of Bitcoin-Qt will support the creation of multisignature transactions, once enough of the network has upgraded so relaying and validating them is robust. For this release, creation and testing of multisignature -transactions is limited to the BGL test network using +transactions is limited to the bitcoin test network using the "addmultisigaddress" JSON-RPC api call. Short multisignature address support is included in this diff --git a/doc/release-notes/release-notes-0.6.2.md b/doc/release-notes/release-notes-0.6.2.md index cf87d63761..442be3add3 100644 --- a/doc/release-notes/release-notes-0.6.2.md +++ b/doc/release-notes/release-notes-0.6.2.md @@ -1,5 +1,5 @@ -BGL version 0.6.2 is now available for download at: -http://sourceforge.net/projects/BGL/files/BGL/BGL-0.6.2/ +Bitcoin version 0.6.2 is now available for download at: +http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.6.2/ This is a bug-fix and code-cleanup release, with no major new features. @@ -14,7 +14,7 @@ portable to different data directories by default. If you need a portable blkindex.dat file then run with the new -detachdb=1 option or the "Detach databases at shutdown" GUI preference. -Fixed https://github.com/BGL/BGL/issues/1065, a bug that +Fixed https://github.com/bitcoin/bitcoin/issues/1065, a bug that could cause long-running nodes to crash. Mac and Windows binaries are compiled against OpenSSL 1.0.1b (Linux diff --git a/doc/release-notes/release-notes-0.6.3.md b/doc/release-notes/release-notes-0.6.3.md index 30f441fc99..2e33acd107 100644 --- a/doc/release-notes/release-notes-0.6.3.md +++ b/doc/release-notes/release-notes-0.6.3.md @@ -1,5 +1,5 @@ -BGL version 0.6.3 is now available for download at: - http://sourceforge.net/projects/BGL/files/BGL/BGL-0.6.3/ +Bitcoin version 0.6.3 is now available for download at: + http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.6.3/ This is a bug-fix release, with no new features. @@ -9,21 +9,21 @@ Please report bugs using the issue tracker at github: CHANGE SUMMARY Fixed a serious denial-of-service attack that could cause the -BGL process to become unresponsive. Thanks to Sergio Lerner +bitcoin process to become unresponsive. Thanks to Sergio Lerner for finding and responsibly reporting the problem. (CVE-2012-3789) Optimized the process of checking transaction signatures, to speed up processing of new block messages and make propagating blocks across the network faster. -Fixed an obscure bug that could cause the BGL process to get +Fixed an obscure bug that could cause the bitcoin process to get stuck on an invalid block-chain, if the invalid chain was hundreds of blocks long. -BGL-Qt no longer automatically selects the first address +Bitcoin-Qt no longer automatically selects the first address in the address book (Issue #1384). -Fixed minimize-to-dock behavior of BGL-Qt on the Mac. +Fixed minimize-to-dock behavior of Bitcoin-Qt on the Mac. Added a block checkpoint at block 185,333 to speed up initial blockchain download. diff --git a/doc/release-notes/release-notes-0.7.0.md b/doc/release-notes/release-notes-0.7.0.md index c34e3f16f4..81d0597833 100644 --- a/doc/release-notes/release-notes-0.7.0.md +++ b/doc/release-notes/release-notes-0.7.0.md @@ -1,7 +1,7 @@ -BGL version 0.7.0 is now available for download at: - http://sourceforge.net/projects/BGL/files/BGL/BGL-0.7.0/ +Bitcoin version 0.7.0 is now available for download at: + http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.7.0/ -We recommend that everybody running prior versions of BGLd/BGL-Qt +We recommend that everybody running prior versions of bitcoind/Bitcoin-Qt upgrade to this release, except for users running Mac OSX 10.5. Please report bugs using the issue tracker at github: @@ -9,16 +9,16 @@ Please report bugs using the issue tracker at github: Project source code is hosted at github; you can get source-only tarballs/zipballs directly from there: - https://github.com/BGL/BGL/tarball/v0.7.0 # .tar.gz - https://github.com/BGL/BGL/zipball/v0.7.0 # .zip + https://github.com/bitcoin/bitcoin/tarball/v0.7.0 # .tar.gz + https://github.com/bitcoin/bitcoin/zipball/v0.7.0 # .zip Ubuntu Linux users can use the "Personal Package Archive" (PPA) maintained by Matt Corallo to automatically keep -BGL up-to-date. Just type - sudo apt-add-repository ppa:BGL/BGL +bitcoin up-to-date. Just type + sudo apt-add-repository ppa:bitcoin/bitcoin sudo apt-get update -in your terminal, then install the BGL-qt package: - sudo apt-get install BGL-qt +in your terminal, then install the bitcoin-qt package: + sudo apt-get install bitcoin-qt How to Upgrade @@ -27,10 +27,10 @@ If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the installer (on Windows) or just copy over Code: -/Applications/BGL-Qt +/Applications/Bitcoin-Qt (on Mac) or Code: -BGLd/BGL-qt +bitcoind/bitcoin-qt (on Linux). If you were running on Linux with a version that might have been compiled @@ -45,14 +45,14 @@ Incompatible Changes and 'getrawmempool' commands. * Remove deprecated RPC 'getblocknumber' -BGL Improvement Proposals implemented +Bitcoin Improvement Proposals implemented BIP 22 - 'getblocktemplate', 'submitblock' RPCs BIP 34 - block version 2, height in coinbase BIP 35 - 'mempool' message, extended 'getdata' message behavior -Core BGL handling and blockchain database +Core bitcoin handling and blockchain database * Reduced CPU usage, by eliminating some redundant hash calculations * Cache signature verifications, to eliminate redundant signature checks @@ -109,7 +109,7 @@ Qt GUI * Add 2 labels to the overviewpage that display Wallet and Transaction status (obsolete or current) * Extend the optionsdialog (e.g. language selection) and re-work it to a tabbed UI * Merge sign/verify message into a single window with tabbed UI -* Ensure a changed BGL unit immediately updates all GUI elements that use units +* Ensure a changed bitcoin unit immediately updates all GUI elements that use units * Update QR Code dialog * Improve error reporting at startup * Fine-grained UI updates for a much smoother UI during block downloads @@ -119,8 +119,8 @@ Qt GUI * Much better translations * Override progress bar design on platforms with segmented progress bars to assist with readability * Added 'immature balance' display on the overview page -* (Windows only): enable ASLR and DEP for BGL-qt.exe -* (Windows only): add meta-data to BGL-qt.exe (e.g. description) +* (Windows only): enable ASLR and DEP for bitcoin-qt.exe +* (Windows only): add meta-data to bitcoin-qt.exe (e.g. description) Internal codebase @@ -131,7 +131,7 @@ Internal codebase Miscellaneous * Reopen debug.log upon SIGHUP -* Bash programmable completion for BGLd(1) +* Bash programmable completion for bitcoind(1) * On supported OS's, each thread is given a useful name diff --git a/doc/release-notes/release-notes-0.7.1.md b/doc/release-notes/release-notes-0.7.1.md index b17784700a..98ec79637b 100644 --- a/doc/release-notes/release-notes-0.7.1.md +++ b/doc/release-notes/release-notes-0.7.1.md @@ -1,5 +1,5 @@ -BGL version 0.7.1 is now available from: - http://sourceforge.net/projects/BGL/files/BGL/BGL-0.7.1/ +Bitcoin version 0.7.1 is now available from: + http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.7.1/ This is a bug-fix minor release. @@ -8,16 +8,16 @@ Please report bugs using the issue tracker at github: Project source code is hosted at github; you can get source-only tarballs/zipballs directly from there: - https://github.com/BGL/BGL/tarball/v0.7.1 # .tar.gz - https://github.com/BGL/BGL/zipball/v0.7.1 # .zip + https://github.com/bitcoin/bitcoin/tarball/v0.7.1 # .tar.gz + https://github.com/bitcoin/bitcoin/zipball/v0.7.1 # .zip Ubuntu Linux users can use the "Personal Package Archive" (PPA) maintained by Matt Corallo to automatically keep up-to-date. Just type: - sudo apt-add-repository ppa:BGL/BGL + sudo apt-add-repository ppa:bitcoin/bitcoin sudo apt-get update -in your terminal, then install the BGL-qt package: - sudo apt-get install BGL-qt +in your terminal, then install the bitcoin-qt package: + sudo apt-get install bitcoin-qt KNOWN ISSUES ------------ @@ -30,7 +30,7 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the installer (on Windows) or just copy over -/Applications/BGL-Qt (on Mac) or BGLd/BGL-qt (on Linux). +/Applications/Bitcoin-Qt (on Mac) or bitcoind/bitcoin-qt (on Linux). If you were running on Linux with a version that might have been compiled with a different version of Berkeley DB (for example, if you were using an @@ -75,7 +75,7 @@ Dependency changes Bug fixes --------- -* Clicking on a BGL: URI on Windows should now launch BGL-Qt properly. +* Clicking on a bitcoin: URI on Windows should now launch Bitcoin-Qt properly. * When running -testnet, use RPC port 18332 by default. diff --git a/doc/release-notes/release-notes-0.7.2.md b/doc/release-notes/release-notes-0.7.2.md index b7cfc53dca..fd0bbfe65e 100644 --- a/doc/release-notes/release-notes-0.7.2.md +++ b/doc/release-notes/release-notes-0.7.2.md @@ -1,5 +1,5 @@ -BGL version 0.7.2 is now available from: - http://sourceforge.net/projects/BGL/files/BGL/BGL-0.7.2 +Bitcoin version 0.7.2 is now available from: + http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.7.2 This is a bug-fix minor release. @@ -12,7 +12,7 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the installer (on Windows) or just copy over -/Applications/BGL-Qt (on Mac) or BGLd/BGL-qt (on Linux). +/Applications/Bitcoin-Qt (on Mac) or bitcoind/bitcoin-qt (on Linux). If you were running on Linux with a version that might have been compiled with a different version of Berkeley DB (for example, if you were using an @@ -40,7 +40,7 @@ Bug fixes database twice. * Fix use-after-free problems in initialization and shutdown, the latter of - which caused BGL-Qt to crash on Windows when exiting. + which caused Bitcoin-Qt to crash on Windows when exiting. * Correct library linking so building on Windows natively works. diff --git a/doc/release-notes/release-notes-0.8.0.md b/doc/release-notes/release-notes-0.8.0.md index 15c3a74647..6406dabea3 100644 --- a/doc/release-notes/release-notes-0.8.0.md +++ b/doc/release-notes/release-notes-0.8.0.md @@ -1,5 +1,5 @@ -BGL-Qt version 0.8.0 is now available from: - http://sourceforge.net/projects/BGL/files/BGL/BGL-0.8.0/ +Bitcoin-Qt version 0.8.0 is now available from: + http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.8.0/ This is a major release designed to improve performance and handle the increasing volume of transactions on the network. @@ -13,7 +13,7 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the installer (on Windows) or just copy over -/Applications/BGL-Qt (on Mac) or BGLd/BGL-qt (on Linux). +/Applications/Bitcoin-Qt (on Mac) or bitcoind/bitcoin-qt (on Linux). The first time you run after the upgrade a re-indexing process will be started that will take anywhere from 30 minutes to several hours, @@ -31,7 +31,7 @@ details). Improvements ------------ -Mac and Windows binaries are signed with certificates owned by the BGL +Mac and Windows binaries are signed with certificates owned by the Bitcoin Foundation, to be compatible with the new security features in OSX 10.8 and Windows 8. @@ -61,7 +61,7 @@ contrib/spendfrom is a python-language command-line utility that demonstrates how to use the "raw transactions" JSON-RPC api to send coins received from particular addresses (also known as "coin control"). -New/changed settings (command-line or BGL.conf file) +New/changed settings (command-line or bitcoin.conf file) -------------------------------------------------------- dbcache : controls LevelDB memory usage. diff --git a/doc/release-notes/release-notes-0.8.1.md b/doc/release-notes/release-notes-0.8.1.md index 3e47c8a8a7..85c4867cd7 100644 --- a/doc/release-notes/release-notes-0.8.1.md +++ b/doc/release-notes/release-notes-0.8.1.md @@ -1,5 +1,5 @@ -BGL-Qt/BGLd version 0.8.1 is now available from: - http://sourceforge.net/projects/BGL/files/BGL/BGL-0.8.1/ +Bitcoin-Qt/bitcoind version 0.8.1 is now available from: + http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.8.1/ This is a maintenance release that adds a new network rule to avoid a chain-forking incompatibility with versions 0.7.2 and earlier. @@ -14,7 +14,7 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the installer (on Windows) or just copy over -/Applications/BGL-Qt (on Mac) or BGLd/BGL-qt (on Linux). +/Applications/Bitcoin-Qt (on Mac) or bitcoind/bitcoin-qt (on Linux). If you are upgrading from version 0.7.2 or earlier, the first time you run 0.8.1 your blockchain files will be re-indexed, which will take diff --git a/doc/release-notes/release-notes-0.8.2.md b/doc/release-notes/release-notes-0.8.2.md index a99fea1348..013fffe982 100644 --- a/doc/release-notes/release-notes-0.8.2.md +++ b/doc/release-notes/release-notes-0.8.2.md @@ -1,5 +1,5 @@ -BGL-Qt version 0.8.2 is now available from: - http://sourceforge.net/projects/BGL/files/BGL/BGL-0.8.2/ +Bitcoin-Qt version 0.8.2 is now available from: + http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.8.2/ This is a maintenance release that fixes many bugs and includes a few small new features. @@ -13,7 +13,7 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the installer (on Windows) or just copy over -/Applications/BGL-Qt (on Mac) or BGLd/BGL-qt (on Linux). +/Applications/Bitcoin-Qt (on Mac) or bitcoind/bitcoin-qt (on Linux). If you are upgrading from version 0.7.2 or earlier, the first time you run 0.8.2 your blockchain files will be re-indexed, which will take @@ -43,7 +43,7 @@ with code that automatically calculates and suggests appropriate fees in the 0.9 release and note that if you set a fee policy significantly different from the rest of the network your transactions may never confirm. -BGL-Qt changes +Bitcoin-Qt changes * New icon and splash screen * Improve reporting of synchronization process @@ -58,7 +58,7 @@ BGL-Qt changes to current translations MacOSX: -* OSX support for click-to-pay (BGL:) links +* OSX support for click-to-pay (bitcoin:) links * Fix GUI disappearing problem on MacOSX (issue #1522) Linux/Unix: @@ -97,8 +97,8 @@ Wallet compatibility/rescuing Known Bugs -* Entering the 'getblocktemplate' or 'getwork' RPC commands into the BGL-Qt debug -console will cause BGL-Qt to crash. Run BGL-Qt with the -server command-line +* Entering the 'getblocktemplate' or 'getwork' RPC commands into the Bitcoin-Qt debug +console will cause Bitcoin-Qt to crash. Run Bitcoin-Qt with the -server command-line option to workaround. Thanks to everybody who contributed to the 0.8.2 release! diff --git a/doc/release-notes/release-notes-0.8.3.md b/doc/release-notes/release-notes-0.8.3.md index 507d8ba097..92f2fb813f 100644 --- a/doc/release-notes/release-notes-0.8.3.md +++ b/doc/release-notes/release-notes-0.8.3.md @@ -1,5 +1,5 @@ -BGL-Qt version 0.8.3 is now available from: - http://sourceforge.net/projects/BGL/files/BGL/BGL-0.8.3/ +Bitcoin-Qt version 0.8.3 is now available from: + http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.8.3/ This is a maintenance release to fix a denial-of-service attack that can cause nodes to crash. diff --git a/doc/release-notes/release-notes-0.8.4.md b/doc/release-notes/release-notes-0.8.4.md index 3611be7fc7..41c40b930d 100644 --- a/doc/release-notes/release-notes-0.8.4.md +++ b/doc/release-notes/release-notes-0.8.4.md @@ -1,5 +1,5 @@ -BGL-Qt version 0.8.4 is now available from: - http://sourceforge.net/projects/BGL/files/BGL/BGL-0.8.4/ +Bitcoin-Qt version 0.8.4 is now available from: + http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.8.4/ This is a maintenance release to fix a critical bug and three security issues; we urge all users to upgrade. @@ -14,7 +14,7 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the installer (on Windows) or just copy over -/Applications/BGL-Qt (on Mac) or BGLd/BGL-qt (on Linux). +/Applications/Bitcoin-Qt (on Mac) or bitcoind/bitcoin-qt (on Linux). If you are upgrading from version 0.7.2 or earlier, the first time you run 0.8.4 your blockchain files will be re-indexed, which will take @@ -29,12 +29,12 @@ Security issues An attacker could send a series of messages that resulted in an integer division-by-zero error in the Bloom Filter handling -code, causing the BGL-Qt or BGLd process to crash. +code, causing the Bitcoin-Qt or bitcoind process to crash. Bloom filters were introduced with version 0.8, so versions 0.8.0 through 0.8.3 are vulnerable to this critical denial-of-service attack. A constant-time algorithm is now used to check RPC password -guess attempts; fixes https://github.com/BGL/BGL/issues/2838 +guess attempts; fixes https://github.com/bitcoin/bitcoin/issues/2838 (CVE-2013-4165) Implement a better fix for the fill-memory-with-orphan-transactions @@ -55,11 +55,11 @@ OSX: use 'FD_FULLSYNC' with LevelDB, which will (hopefully!) prevent the database corruption issues many people have experienced on OSX. -Linux: clicking on BGL: links was broken if you were using +Linux: clicking on bitcoin: links was broken if you were using a Gnome-based desktop. Fix a hang-at-shutdown bug that only affects users that compile -their own version of BGL against Boost versions 1.50-1.52. +their own version of Bitcoin against Boost versions 1.50-1.52. Other changes ------------- diff --git a/doc/release-notes/release-notes-0.8.5.md b/doc/release-notes/release-notes-0.8.5.md index c9aa1db5dd..5e42b5bee6 100644 --- a/doc/release-notes/release-notes-0.8.5.md +++ b/doc/release-notes/release-notes-0.8.5.md @@ -1,5 +1,5 @@ -BGL-Qt version 0.8.5 is now available from: - http://sourceforge.net/projects/BGL/files/BGL/BGL-0.8.5/ +Bitcoin-Qt version 0.8.5 is now available from: + http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.8.5/ This is a maintenance release to fix a critical bug; we urge all users to upgrade. @@ -14,7 +14,7 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the installer (on Windows) or just copy over -/Applications/BGL-Qt (on Mac) or BGLd/BGL-qt (on Linux). +/Applications/Bitcoin-Qt (on Mac) or bitcoind/bitcoin-qt (on Linux). If you are upgrading from version 0.7.2 or earlier, the first time you run 0.8.5 your blockchain files will be re-indexed, which will take diff --git a/doc/release-notes/release-notes-0.8.6.md b/doc/release-notes/release-notes-0.8.6.md index d7ffe47ee6..019a9373ec 100644 --- a/doc/release-notes/release-notes-0.8.6.md +++ b/doc/release-notes/release-notes-0.8.6.md @@ -1,6 +1,6 @@ -BGL-Qt version 0.8.6 final is now available from: +Bitcoin-Qt version 0.8.6 final is now available from: - http://sourceforge.net/projects/BGL/files/BGL/BGL-0.8.6/ + http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.8.6/ This is a maintenance release to fix a critical bug; we urge all users to upgrade. @@ -16,7 +16,7 @@ If you already downloaded 0.8.6rc1 you do not need to re-download. This release If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the installer (on Windows) or just copy over -/Applications/BGL-Qt (on Mac) or BGLd/BGL-qt (on Linux). +/Applications/Bitcoin-Qt (on Mac) or bitcoind/bitcoin-qt (on Linux). If you are upgrading from version 0.7.2 or earlier, the first time you run 0.8.6 your blockchain files will be re-indexed, which will take @@ -47,7 +47,7 @@ your machine. - Additional debug.log logging for diagnosis of network problems, log timestamps by default -- Fix BGL-Qt startup crash when clicking dock icon on OSX +- Fix Bitcoin-Qt startup crash when clicking dock icon on OSX - Fix memory leaks in CKey::SetCompactSignature() and Key::SignCompact() @@ -63,4 +63,4 @@ Warning Hence it is recommended to use a 64-bit executable if possible. A 64-bit executable for Windows is planned for 0.9. -Note: Gavin Andresen's GPG signing key for SHA256SUMS.asc has been changed from key id 1FC730C1 to sub key 7BF6E212 (see https://github.com/BGL/BGL.org/pull/279). +Note: Gavin Andresen's GPG signing key for SHA256SUMS.asc has been changed from key id 1FC730C1 to sub key 7BF6E212 (see https://github.com/bitcoin/bitcoin.org/pull/279). diff --git a/doc/release-notes/release-notes-0.9.0.md b/doc/release-notes/release-notes-0.9.0.md index 10d6201091..1c4f7293d7 100644 --- a/doc/release-notes/release-notes-0.9.0.md +++ b/doc/release-notes/release-notes-0.9.0.md @@ -1,6 +1,6 @@ -BGL Core version 0.9.0 is now available from: +Bitcoin Core version 0.9.0 is now available from: - https://BGL.org/bin/0.9.0/ + https://bitcoin.org/bin/0.9.0/ This is a new major version release, bringing both new features and bug fixes. @@ -14,14 +14,14 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), uninstall all -earlier versions of BGL, then run the installer (on Windows) or just copy -over /Applications/BGL-Qt (on Mac) or BGLd/BGL-qt (on Linux). +earlier versions of Bitcoin, then run the installer (on Windows) or just copy +over /Applications/Bitcoin-Qt (on Mac) or bitcoind/bitcoin-qt (on Linux). If you are upgrading from version 0.7.2 or earlier, the first time you run 0.9.0 your blockchain files will be re-indexed, which will take anywhere from 30 minutes to several hours, depending on the speed of your machine. -On Windows, do not forget to uninstall all earlier versions of the BGL +On Windows, do not forget to uninstall all earlier versions of the Bitcoin client first, especially if you are switching to the 64-bit version. Windows 64-bit installer @@ -59,11 +59,11 @@ Also, the first time you run a 0.8.x release on a 0.9 wallet it will rescan the blockchain for missing spent coins, which will take a long time (tens of minutes on a typical machine). -Rebranding to BGL Core +Rebranding to Bitcoin Core --------------------------- -To reduce confusion between BGL-the-network and BGL-the-software we -have renamed the reference client to BGL Core. +To reduce confusion between Bitcoin-the-network and Bitcoin-the-software we +have renamed the reference client to Bitcoin Core. OP_RETURN and data in the block chain @@ -74,7 +74,7 @@ blockchain. This change is not an endorsement of storing data in the blockchain. The OP_RETURN change creates a provably-prunable output, to avoid data storage schemes -- some of which were already deployed -- that were storing arbitrary data such as images as forever-unspendable -TX outputs, bloating BGL's UTXO database. +TX outputs, bloating bitcoin's UTXO database. Storing arbitrary data in the blockchain is still a bad idea; it is less costly and far more efficient to store non-currency data elsewhere. @@ -85,20 +85,20 @@ Autotools build system For 0.9.0 we switched to an autotools-based build system instead of individual (q)makefiles. -Using the standard "./autogen.sh; ./configure; make" to build BGL-Qt and -BGLd makes it easier for experienced open source developers to contribute +Using the standard "./autogen.sh; ./configure; make" to build Bitcoin-Qt and +bitcoind makes it easier for experienced open source developers to contribute to the project. Be sure to check doc/build-*.md for your platform before building from source. -BGL-cli +Bitcoin-cli ------------- -Another change in the 0.9 release is moving away from the BGLd executable +Another change in the 0.9 release is moving away from the bitcoind executable functioning both as a server and as a RPC client. The RPC client functionality -("tell the running BGL daemon to do THIS") was split into a separate -executable, 'BGL-cli'. The RPC client code will eventually be removed from -BGLd, but will be kept for backwards compatibility for a release or two. +("tell the running bitcoin daemon to do THIS") was split into a separate +executable, 'bitcoin-cli'. The RPC client code will eventually be removed from +bitcoind, but will be kept for backwards compatibility for a release or two. `walletpassphrase` RPC ----------------------- @@ -197,13 +197,13 @@ Command-line options: - New option: -nospendzeroconfchange to never spend unconfirmed change outputs - New option: -zapwallettxes to rebuild the wallet's transaction information - Rename option '-tor' to '-onion' to better reflect what it does -- Add '-disablewallet' mode to let BGLd run entirely without wallet (when +- Add '-disablewallet' mode to let bitcoind run entirely without wallet (when built with wallet) - Update default '-rpcsslciphers' to include TLSv1.2 - make '-logtimestamps' default on and rework help-message - RPC client option: '-rpcwait', to wait for server start - Remove '-logtodebugger' -- Allow `-noserver` with BGLd +- Allow `-noserver` with bitcoind Block-chain handling and storage: @@ -254,7 +254,7 @@ Protocol and network: - Improve logging of failed connections - Bump protocol version to 70002 - Add some additional logging to give extra network insight -- Added new DNS seed from BGLstats.com +- Added new DNS seed from bitcoinstats.com Validation: @@ -295,18 +295,18 @@ GUI: - Add Coin Control Features - Improve receive coins workflow: make the 'Receive' tab into a form to request payments, and move historical address list functionality to File menu. -- Rebrand to `BGL Core` +- Rebrand to `Bitcoin Core` - Move initialization/shutdown to a thread. This prevents "Not responding" messages during startup. Also show a window during shutdown. - Don't regenerate autostart link on every client startup -- Show and store message of normal BGL:URI +- Show and store message of normal bitcoin:URI - Fix richtext detection hang issue on very old Qt versions - OS X: Make use of the 10.8+ user notification center to display Growl-like notifications - OS X: Added NSHighResolutionCapable flag to Info.plist for better font rendering on Retina displays. -- OS X: Fix BGL-qt startup crash when clicking dock icon -- Linux: Fix Gnome BGL: URI handler +- OS X: Fix bitcoin-qt startup crash when clicking dock icon +- Linux: Fix Gnome bitcoin: URI handler Miscellaneous: @@ -314,7 +314,7 @@ Miscellaneous: - Add '-regtest' mode, similar to testnet but private with instant block generation with 'setgenerate' RPC. - Add 'linearize.py' script to contrib, for creating bootstrap.dat -- Add separate BGL-cli client +- Add separate bitcoin-cli client Credits -------- diff --git a/doc/release-notes/release-notes-0.9.1.md b/doc/release-notes/release-notes-0.9.1.md index 54d3570249..eb6ea8ae62 100644 --- a/doc/release-notes/release-notes-0.9.1.md +++ b/doc/release-notes/release-notes-0.9.1.md @@ -1,13 +1,13 @@ -BGL Core version 0.9.1 is now available from: +Bitcoin Core version 0.9.1 is now available from: - https://BGL.org/bin/0.9.1/ + https://bitcoin.org/bin/0.9.1/ This is a security update. It is recommended to upgrade to this release as soon as possible. It is especially important to upgrade if you currently have version 0.9.0 installed and are using the graphical interface OR you are using -BGLd from any pre-0.9.1 version, and have enabled SSL for RPC and +bitcoind from any pre-0.9.1 version, and have enabled SSL for RPC and have configured allowip to allow rpc connections from potentially hostile hosts. @@ -20,8 +20,8 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). If you are upgrading from version 0.7.2 or earlier, the first time you run 0.9.1 your blockchain files will be re-indexed, which will take anywhere from @@ -33,7 +33,7 @@ If you are upgrading from version 0.7.2 or earlier, the first time you run No code changes were made between 0.9.0 and 0.9.1. Only the dependencies were changed. - Upgrade OpenSSL to 1.0.1g. This release fixes the following vulnerabilities which can - affect the BGL Core software: + affect the Bitcoin Core software: - CVE-2014-0160 ("heartbleed") A missing bounds check in the handling of the TLS heartbeat extension can diff --git a/doc/release-notes/release-notes-0.9.2.1.md b/doc/release-notes/release-notes-0.9.2.1.md index 65630d2014..2089147493 100644 --- a/doc/release-notes/release-notes-0.9.2.1.md +++ b/doc/release-notes/release-notes-0.9.2.1.md @@ -1,6 +1,6 @@ -BGL Core version 0.9.2.1 is now available from: +Bitcoin Core version 0.9.2.1 is now available from: - https://BGL.org/bin/0.9.2.1/ + https://bitcoin.org/bin/0.9.2.1/ This is a new minor version release, bringing mostly bug fixes and some minor improvements. OpenSSL has been updated because of a security issue (CVE-2014-0224). @@ -15,8 +15,8 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). If you are upgrading from version 0.7.2 or earlier, the first time you run 0.9.2.1 your blockchain files will be re-indexed, which will take anywhere from @@ -130,7 +130,7 @@ GUI: - Catch Windows shutdown events while client is running - Optionally add third party links to transaction context menu - Check for !pixmap() before trying to export QR code (avoids crashes when no QR code could be generated) -- Fix "Start BGL on system login" +- Fix "Start bitcoin on system login" Miscellaneous: diff --git a/doc/release-notes/release-notes-0.9.2.md b/doc/release-notes/release-notes-0.9.2.md index fafb398994..7a89e85a66 100644 --- a/doc/release-notes/release-notes-0.9.2.md +++ b/doc/release-notes/release-notes-0.9.2.md @@ -1,6 +1,6 @@ -BGL Core version 0.9.2 is now available from: +Bitcoin Core version 0.9.2 is now available from: - https://BGL.org/bin/0.9.2/ + https://bitcoin.org/bin/0.9.2/ This is a new minor version release, bringing mostly bug fixes and some minor improvements. OpenSSL has been updated because of a security issue (CVE-2014-0224). @@ -15,8 +15,8 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). If you are upgrading from version 0.7.2 or earlier, the first time you run 0.9.2 your blockchain files will be re-indexed, which will take anywhere from @@ -130,7 +130,7 @@ GUI: - Catch Windows shutdown events while client is running - Optionally add third party links to transaction context menu - Check for !pixmap() before trying to export QR code (avoids crashes when no QR code could be generated) -- Fix "Start BGL on system login" +- Fix "Start bitcoin on system login" Miscellaneous: diff --git a/doc/release-notes/release-notes-0.9.3.md b/doc/release-notes/release-notes-0.9.3.md index 92e7551a36..bb03fb8084 100644 --- a/doc/release-notes/release-notes-0.9.3.md +++ b/doc/release-notes/release-notes-0.9.3.md @@ -1,6 +1,6 @@ -BGL Core version 0.9.3 is now available from: +Bitcoin Core version 0.9.3 is now available from: - https://BGL.org/bin/0.9.3/ + https://bitcoin.org/bin/0.9.3/ This is a new minor version release, bringing only bug fixes and updated translations. Upgrading to this release is recommended. @@ -17,8 +17,8 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). If you are upgrading from version 0.7.2 or earlier, the first time you run 0.9.3 your blockchain files will be re-indexed, which will take anywhere from @@ -70,7 +70,7 @@ GUI: Miscellaneous: - key.cpp: fail with a friendlier message on missing ssl EC support - Remove bignum dependency for scripts -- Upgrade OpenSSL to 1.0.1i (see https://www.openssl.org/news/secadv_20140806.txt - just to be sure, no critical issues for BGL Core) +- Upgrade OpenSSL to 1.0.1i (see https://www.openssl.org/news/secadv_20140806.txt - just to be sure, no critical issues for Bitcoin Core) - Upgrade miniupnpc to 1.9.20140701 - Fix boost detection in build system on some platforms @@ -98,4 +98,4 @@ Thanks to everyone who contributed to this release: - Wladimir J. van der Laan - Zak Wilcox -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.9.4.md b/doc/release-notes/release-notes-0.9.4.md index b109f5b1bf..fd16b6b7a1 100644 --- a/doc/release-notes/release-notes-0.9.4.md +++ b/doc/release-notes/release-notes-0.9.4.md @@ -1,6 +1,6 @@ -BGL Core version 0.9.4 is now available from: +Bitcoin Core version 0.9.4 is now available from: - https://BGL.org/bin/0.9.4/ + https://bitcoin.org/bin/0.9.4/ This is a new minor version release, bringing only bug fixes and updated translations. Upgrading to this release is recommended. @@ -14,26 +14,26 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). OpenSSL Warning ================ OpenSSL 1.0.0p / 1.0.1k was recently released and is being pushed out by various operating system maintainers. Review by Gregory Maxwell determined that -this update is incompatible with the BGL system and could lead to consensus +this update is incompatible with the Bitcoin system and could lead to consensus forks. -BGL Core released binaries from https://BGL.org are unaffected, +Bitcoin Core released binaries from https://bitcoin.org are unaffected, as are any built with the gitian deterministic build system. However, if you are running either -- The Ubuntu PPA from https://launchpad.net/~BGL/+archive/ubuntu/BGL -- A third-party or self-compiled BGL Core +- The Ubuntu PPA from https://launchpad.net/~bitcoin/+archive/ubuntu/bitcoin +- A third-party or self-compiled Bitcoin Core -upgrade to BGL Core 0.9.4, which includes a workaround, **before** updating +upgrade to Bitcoin Core 0.9.4, which includes a workaround, **before** updating OpenSSL. The incompatibility is due to the OpenSSL update changing the @@ -92,4 +92,4 @@ Thanks to who contributed to this release, at least: - Sergio Demian Lerner - Wladimir J. van der Laan -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). diff --git a/doc/release-notes/release-notes-0.9.5.md b/doc/release-notes/release-notes-0.9.5.md index 64f6851ea1..ad8ac11c7d 100644 --- a/doc/release-notes/release-notes-0.9.5.md +++ b/doc/release-notes/release-notes-0.9.5.md @@ -1,6 +1,6 @@ -BGL Core version 0.9.5 is now available from: +Bitcoin Core version 0.9.5 is now available from: - https://BGL.org/bin/0.9.5/ + https://bitcoin.org/bin/0.9.5/ This is a new minor version release, with the goal of backporting BIP66. There are also a few bug fixes and updated translations. Upgrading to this release is @@ -15,8 +15,8 @@ How to Upgrade If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the -installer (on Windows) or just copy over /Applications/BGL-Qt (on Mac) or -BGLd/BGL-qt (on Linux). +installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or +bitcoind/bitcoin-qt (on Linux). Notable changes ================ @@ -24,10 +24,10 @@ Notable changes Mining and relay policy enhancements ------------------------------------ -BGL Core's block templates are now for version 3 blocks only, and any mining +Bitcoin Core's block templates are now for version 3 blocks only, and any mining software relying on its `getblocktemplate` must be updated in parallel to use libblkmaker either version 0.4.2 or any version from 0.5.1 onward. -If you are solo mining, this will affect you the moment you upgrade BGL +If you are solo mining, this will affect you the moment you upgrade Bitcoin Core, which must be done prior to BIP66 achieving its 951/1001 status. If you are mining with the stratum mining protocol: this does not affect you. If you are mining with the getblocktemplate protocol to a pool: this will affect @@ -57,4 +57,4 @@ Thanks to who contributed to this release, at least: - Pieter Wuille - Wladimir J. van der Laan -As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/BGL/). +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). From d2fe6e6b0fbfbf44b139a4cf3a515782cb502256 Mon Sep 17 00:00:00 2001 From: SlowRiot Date: Fri, 20 Aug 2021 00:26:16 +0100 Subject: [PATCH 003/144] fix broken links to bitcoin repo pull requests (broken by dumb bitcoin->BGL search-replace) --- .appveyor.yml | 4 ++-- CONTRIBUTING.md | 2 +- contrib/testgen/base58.py | 4 ++-- depends/README.md | 2 +- doc/developer-notes.md | 2 +- src/compat.h | 2 +- src/interfaces/README.md | 8 ++++---- src/qt/BGLamountfield.h | 2 +- src/txdb.h | 2 +- src/util/settings.h | 2 +- src/util/system.cpp | 2 +- test/README.md | 8 ++++---- test/functional/feature_assumevalid.py | 2 +- test/functional/feature_notifications.py | 2 +- 14 files changed, 22 insertions(+), 22 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 8a6ec72940..f074fc9687 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -57,8 +57,8 @@ test_script: - cmd: python test\util\rpcauth-test.py # Fee estimation test failing on appveyor with: WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted. # functional tests disabled for now. See -# https://github.com/BGL/BGL/pull/18626#issuecomment-613396202 -# https://github.com/BGL/BGL/issues/18623 +# https://github.com/bitcoin/bitcoin/pull/18626#issuecomment-613396202 +# https://github.com/bitcoin/bitcoin/issues/18623 # - cmd: python test\functional\test_runner.py --ci --quiet --combinedlogslen=4000 --failfast --exclude feature_fee_estimation artifacts: #- path: BGL-%APPVEYOR_BUILD_VERSION%.zip diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bbbeafc551..6ab64ddb91 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -417,7 +417,7 @@ Rebased-From: ``` Have a look at [an example backport PR]( -https://github.com/BGL/BGL/pull/16189). +https://github.com/bitcoin/bitcoin/pull/16189). Also see the [backport.py script]( https://github.com/BGL-core/BGL-maintainer-tools#backport). diff --git a/contrib/testgen/base58.py b/contrib/testgen/base58.py index 08203b8e0b..6519df7ae9 100644 --- a/contrib/testgen/base58.py +++ b/contrib/testgen/base58.py @@ -4,7 +4,7 @@ ''' BGL base58 encoding and decoding. -Based on https://BGLtalk.org/index.php?topic=1026.0 (public domain) +Based on https://bitcointalk.org/index.php?topic=1026.0 (public domain) ''' import hashlib @@ -106,7 +106,7 @@ def get_bcaddress_version(strAddress): return ord(version) if __name__ == '__main__': - # Test case (from http://gitorious.org/BGL/python-base58.git) + # Test case (from http://gitorious.org/bitcoin/python-base58.git) assert get_bcaddress_version('15VjRaDX9zpbA8LVnbrCAFzrVzN7ixHNsC') is 0 _ohai = 'o hai'.encode('ascii') _tmp = b58encode(_ohai) diff --git a/depends/README.md b/depends/README.md index f78d8858e1..e8c7f5eb93 100755 --- a/depends/README.md +++ b/depends/README.md @@ -75,7 +75,7 @@ For linux RISC-V 64-bit cross compilation (there are no packages for 32-bit): sudo apt-get install g++-riscv64-linux-gnu binutils-riscv64-linux-gnu -RISC-V known issue: gcc-7.3.0 and gcc-7.3.1 result in a broken `test_BGL` executable (see https://github.com/BGL/BGL/pull/13543), +RISC-V known issue: gcc-7.3.0 and gcc-7.3.1 result in a broken `test_BGL` executable (see https://github.com/bitcoin/bitcoin/pull/13543), this is apparently fixed in gcc-8.1.0. For linux S390X cross compilation: diff --git a/doc/developer-notes.md b/doc/developer-notes.md index b0fff9615e..43730dda59 100644 --- a/doc/developer-notes.md +++ b/doc/developer-notes.md @@ -1339,4 +1339,4 @@ communication: Note: This last convention isn't generally followed outside of [`src/interfaces/`](../src/interfaces/), though it did come up for discussion - before in [#14635](https://github.com/BGL/BGL/pull/14635). + before in [#14635](https://github.com/bitcoin/bitcoin/pull/14635). diff --git a/src/compat.h b/src/compat.h index 748f3766e1..4de9512b8a 100644 --- a/src/compat.h +++ b/src/compat.h @@ -96,7 +96,7 @@ typedef char* sockopt_arg_type; // Note these both should work with the current usage of poll, but best to be safe // WIN32 poll is broken https://daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken/ -// __APPLE__ poll is broke https://github.com/BGL/BGL/pull/14336#issuecomment-437384408 +// __APPLE__ poll is broke https://github.com/bitcoin/bitcoin/pull/14336#issuecomment-437384408 #if defined(__linux__) #define USE_POLL #endif diff --git a/src/interfaces/README.md b/src/interfaces/README.md index e450816d33..deb590fc85 100644 --- a/src/interfaces/README.md +++ b/src/interfaces/README.md @@ -2,13 +2,13 @@ The following interfaces are defined here: -* [`Chain`](chain.h) — used by wallet to access blockchain and mempool state. Added in [#14437](https://github.com/BGL/BGL/pull/14437), [#14711](https://github.com/BGL/BGL/pull/14711), [#15288](https://github.com/BGL/BGL/pull/15288), and [#10973](https://github.com/BGL/BGL/pull/10973). +* [`Chain`](chain.h) — used by wallet to access blockchain and mempool state. Added in [#14437](https://github.com/bitcoin/bitcoin/pull/14437), [#14711](https://github.com/bitcoin/bitcoin/pull/14711), [#15288](https://github.com/bitcoin/bitcoin/pull/15288), and [#10973](https://github.com/bitcoin/bitcoin/pull/10973). -* [`ChainClient`](chain.h) — used by node to start & stop `Chain` clients. Added in [#14437](https://github.com/BGL/BGL/pull/14437). +* [`ChainClient`](chain.h) — used by node to start & stop `Chain` clients. Added in [#14437](https://github.com/bitcoin/bitcoin/pull/14437). -* [`Node`](node.h) — used by GUI to start & stop BGL node. Added in [#10244](https://github.com/BGL/BGL/pull/10244). +* [`Node`](node.h) — used by GUI to start & stop BGL node. Added in [#10244](https://github.com/bitcoin/bitcoin/pull/10244). -* [`Wallet`](wallet.h) — used by GUI to access wallets. Added in [#10244](https://github.com/BGL/BGL/pull/10244). +* [`Wallet`](wallet.h) — used by GUI to access wallets. Added in [#10244](https://github.com/bitcoin/bitcoin/pull/10244). * [`Handler`](handler.h) — returned by `handleEvent` methods on interfaces above and used to manage lifetimes of event handlers. diff --git a/src/qt/BGLamountfield.h b/src/qt/BGLamountfield.h index 5536ac1c08..a5c9b7f92b 100644 --- a/src/qt/BGLamountfield.h +++ b/src/qt/BGLamountfield.h @@ -22,7 +22,7 @@ class BGLAmountField: public QWidget Q_OBJECT // ugly hack: for some unknown reason CAmount (instead of qint64) does not work here as expected - // discussion: https://github.com/BGL/BGL/pull/5117 + // discussion: https://github.com/bitcoin/bitcoin/pull/5117 Q_PROPERTY(qint64 value READ value WRITE setValue NOTIFY valueChanged USER true) public: diff --git a/src/txdb.h b/src/txdb.h index f6a43baa39..a7b45e3694 100644 --- a/src/txdb.h +++ b/src/txdb.h @@ -34,7 +34,7 @@ static const int64_t nMinDbCache = 4; static const int64_t nMaxBlockDBCache = 2; //! Max memory allocated to block tree DB specific cache, if -txindex (MiB) // Unlike for the UTXO database, for the txindex scenario the leveldb cache make -// a meaningful difference: https://github.com/BGL/BGL/pull/8273#issuecomment-229601991 +// a meaningful difference: https://github.com/bitcoin/bitcoin/pull/8273#issuecomment-229601991 static const int64_t nMaxTxIndexCache = 1024; //! Max memory allocated to all block filter index caches combined in MiB. static const int64_t max_filter_index_cache = 1024; diff --git a/src/util/settings.h b/src/util/settings.h index f7b70ccc03..77fd33b731 100644 --- a/src/util/settings.h +++ b/src/util/settings.h @@ -23,7 +23,7 @@ namespace util { //! get_int64(), get_bool(), isNum(), isBool(), isFalse(), isTrue() and //! isNull() methods can be substituted if there's a need to move away //! from UniValue. (An implementation with boost::variant was posted at -//! https://github.com/BGL/BGL/pull/15934/files#r337691812) +//! https://github.com/bitcoin/bitcoin/pull/15934/files#r337691812) using SettingsValue = UniValue; //! Stored settings. This struct combines settings from the command line, a diff --git a/src/util/system.cpp b/src/util/system.cpp index 7a31b449b1..cff65119bf 100644 --- a/src/util/system.cpp +++ b/src/util/system.cpp @@ -223,7 +223,7 @@ static util::SettingsValue InterpretOption(std::string& section, std::string& ke * * TODO: Add more meaningful error checks here in the future * See "here's how the flags are meant to behave" in - * https://github.com/BGL/BGL/pull/16097#issuecomment-514627823 + * https://github.com/bitcoin/bitcoin/pull/16097#issuecomment-514627823 */ static bool CheckValid(const std::string& key, const util::SettingsValue& val, unsigned int flags, std::string& error) { diff --git a/test/README.md b/test/README.md index 89879cec0e..9ff6c0482a 100644 --- a/test/README.md +++ b/test/README.md @@ -263,11 +263,11 @@ Use the `-v` option for verbose output. | Lint test | Dependency | Version [used by CI](../ci/lint/04_install.sh) | Installation |-----------|:----------:|:-------------------------------------------:|-------------- -| [`lint-python.sh`](lint/lint-python.sh) | [flake8](https://gitlab.com/pycqa/flake8) | [3.8.3](https://github.com/BGL/BGL/pull/19348) | `pip3 install flake8==3.8.3` -| [`lint-python.sh`](lint/lint-python.sh) | [mypy](https://github.com/python/mypy) | [0.781](https://github.com/BGL/BGL/pull/19348) | `pip3 install mypy==0.781` -| [`lint-shell.sh`](lint/lint-shell.sh) | [ShellCheck](https://github.com/koalaman/shellcheck) | [0.7.1](https://github.com/BGL/BGL/pull/19348) | [details...](https://github.com/koalaman/shellcheck#installing) +| [`lint-python.sh`](lint/lint-python.sh) | [flake8](https://gitlab.com/pycqa/flake8) | [3.8.3](https://github.com/bitcoin/bitcoin/pull/19348) | `pip3 install flake8==3.8.3` +| [`lint-python.sh`](lint/lint-python.sh) | [mypy](https://github.com/python/mypy) | [0.781](https://github.com/bitcoin/bitcoin/pull/19348) | `pip3 install mypy==0.781` +| [`lint-shell.sh`](lint/lint-shell.sh) | [ShellCheck](https://github.com/koalaman/shellcheck) | [0.7.1](https://github.com/bitcoin/bitcoin/pull/19348) | [details...](https://github.com/koalaman/shellcheck#installing) | [`lint-shell.sh`](lint/lint-shell.sh) | [yq](https://github.com/kislyuk/yq) | default | `pip3 install yq` -| [`lint-spelling.sh`](lint/lint-spelling.sh) | [codespell](https://github.com/codespell-project/codespell) | [2.0.0](https://github.com/BGL/BGL/pull/19348) | `pip3 install codespell==2.0.0` +| [`lint-spelling.sh`](lint/lint-spelling.sh) | [codespell](https://github.com/codespell-project/codespell) | [2.0.0](https://github.com/bitcoin/bitcoin/pull/19348) | `pip3 install codespell==2.0.0` Please be aware that on Linux distributions all dependencies are usually available as packages, but could be outdated. diff --git a/test/functional/feature_assumevalid.py b/test/functional/feature_assumevalid.py index 5f17055afe..f8f168c910 100755 --- a/test/functional/feature_assumevalid.py +++ b/test/functional/feature_assumevalid.py @@ -5,7 +5,7 @@ """Test logic for skipping signature validation on old blocks. Test logic for skipping signature validation on blocks which we've assumed -valid (https://github.com/BGL/BGL/pull/9484) +valid (https://github.com/bitcoin/bitcoin/pull/9484) We build a chain that includes and invalid signature for one of the transactions: diff --git a/test/functional/feature_notifications.py b/test/functional/feature_notifications.py index d7d25c4ec1..58354f86bb 100755 --- a/test/functional/feature_notifications.py +++ b/test/functional/feature_notifications.py @@ -122,7 +122,7 @@ def run_test(self): # Generate bump transaction, sync mempools, and check for bump1 # notification. In the future, per - # https://github.com/BGL/BGL/pull/9371, it might be better + # https://github.com/bitcoin/bitcoin/pull/9371, it might be better # to have notifications for both tx1 and bump1. bump1 = self.nodes[0].bumpfee(tx1)["txid"] assert_equal(bump1 in self.nodes[0].getrawmempool(), True) From 786dd1c421800b6040f31530151a22253251974f Mon Sep 17 00:00:00 2001 From: SlowRiot Date: Fri, 20 Aug 2021 00:30:03 +0100 Subject: [PATCH 004/144] fix broken links to old bitcoin repo issues, commits and blobs (broken by dumb bitcoin->BGL search-replace) --- contrib/install_db4.sh | 2 +- contrib/zmq/zmq_sub.py | 2 +- doc/build-openbsd.md | 2 +- doc/developer-notes.md | 8 ++++---- doc/release-process.md | 2 +- src/bench/ccoins_caching.cpp | 2 +- src/bench/coin_selection.cpp | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/contrib/install_db4.sh b/contrib/install_db4.sh index cbabc724df..d2ad408388 100755 --- a/contrib/install_db4.sh +++ b/contrib/install_db4.sh @@ -220,7 +220,7 @@ EOF # The packaged config.guess and config.sub are ancient (2009) and can cause build issues. # Replace them with modern versions. -# See https://github.com/BGL/BGL/issues/16064 +# See https://github.com/bitcoin/bitcoin/issues/16064 CONFIG_GUESS_URL='https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=55eaf3e779455c4e5cc9f82efb5278be8f8f900b' CONFIG_GUESS_HASH='2d1ff7bca773d2ec3c6217118129220fa72d8adda67c7d2bf79994b3129232c1' CONFIG_SUB_URL='https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=55eaf3e779455c4e5cc9f82efb5278be8f8f900b' diff --git a/contrib/zmq/zmq_sub.py b/contrib/zmq/zmq_sub.py index 437a8488ee..ecd1734a81 100755 --- a/contrib/zmq/zmq_sub.py +++ b/contrib/zmq/zmq_sub.py @@ -20,7 +20,7 @@ alternative is to wrap the contents of `handle` inside `while True`. A blocking example using python 2.7 can be obtained from the git history: - https://github.com/BGL/BGL/blob/37a7fe9e440b83e2364d5498931253937abe9294/contrib/zmq/zmq_sub.py + https://github.com/bitcoin/bitcoin/blob/37a7fe9e440b83e2364d5498931253937abe9294/contrib/zmq/zmq_sub.py """ import binascii diff --git a/doc/build-openbsd.md b/doc/build-openbsd.md index 3736706658..fbd63e3f14 100644 --- a/doc/build-openbsd.md +++ b/doc/build-openbsd.md @@ -106,7 +106,7 @@ The standard ulimit restrictions in OpenBSD are very strict: data(kbytes) 1572864 This is, unfortunately, in some cases not enough to compile some `.cpp` files in the project, -(see issue [#6658](https://github.com/BGL/BGL/issues/6658)). +(see issue [#6658](https://github.com/bitcoin/bitcoin/issues/6658)). If your user is in the `staff` group the limit can be raised with: ulimit -d 3000000 diff --git a/doc/developer-notes.md b/doc/developer-notes.md index 43730dda59..61fb0a6ecb 100644 --- a/doc/developer-notes.md +++ b/doc/developer-notes.md @@ -434,7 +434,7 @@ Additional resources: * [UndefinedBehaviorSanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html) * [GCC Instrumentation Options](https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html) * [Google Sanitizers Wiki](https://github.com/google/sanitizers/wiki) - * [Issue #12691: Enable -fsanitize flags in Travis](https://github.com/BGL/BGL/issues/12691) + * [Issue #12691: Enable -fsanitize flags in Travis](https://github.com/bitcoin/bitcoin/issues/12691) Locking/mutex usage notes ------------------------- @@ -1080,13 +1080,13 @@ introduce accidental changes. Some good examples of scripted-diff: -- [scripted-diff: Rename InitInterfaces to NodeContext](https://github.com/BGL/BGL/commit/301bd41a2e6765b185bd55f4c541f9e27aeea29d) +- [scripted-diff: Rename InitInterfaces to NodeContext](https://github.com/bitcoin/bitcoin/commit/301bd41a2e6765b185bd55f4c541f9e27aeea29d) uses an elegant script to replace occurrences of multiple terms in all source files. -- [scripted-diff: Remove g_connman, g_banman globals](https://github.com/BGL/BGL/commit/301bd41a2e6765b185bd55f4c541f9e27aeea29d) +- [scripted-diff: Remove g_connman, g_banman globals](https://github.com/bitcoin/bitcoin/commit/301bd41a2e6765b185bd55f4c541f9e27aeea29d) replaces specific terms in a list of specific source files. -- [scripted-diff: Replace fprintf with tfm::format](https://github.com/BGL/BGL/commit/fac03ec43a15ad547161e37e53ea82482cc508f9) +- [scripted-diff: Replace fprintf with tfm::format](https://github.com/bitcoin/bitcoin/commit/fac03ec43a15ad547161e37e53ea82482cc508f9) does a global replacement but excludes certain directories. To find all previous uses of scripted diffs in the repository, do: diff --git a/doc/release-process.md b/doc/release-process.md index d7f2a889b6..12a1a3d4e5 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -45,7 +45,7 @@ Release Process #### After branch-off (on the major release branch) - Update the versions. -- Create a pinned meta-issue for testing the release candidate (see [this issue](https://github.com/BGL/BGL/issues/17079) for an example) and provide a link to it in the release announcements where useful. +- Create a pinned meta-issue for testing the release candidate (see [this issue](https://github.com/bitcoin/bitcoin/issues/17079) for an example) and provide a link to it in the release announcements where useful. #### Before final release diff --git a/src/bench/ccoins_caching.cpp b/src/bench/ccoins_caching.cpp index 849e3dfa12..577b36c3e5 100644 --- a/src/bench/ccoins_caching.cpp +++ b/src/bench/ccoins_caching.cpp @@ -15,7 +15,7 @@ // many times micro-benchmarks of the database showed completely different // characteristics than e.g. reindex timings. But that's not a requirement of // every benchmark." -// (https://github.com/BGL/BGL/issues/7883#issuecomment-224807484) +// (https://github.com/bitcoin/bitcoin/issues/7883#issuecomment-224807484) static void CCoinsCaching(benchmark::Bench& bench) { const ECCVerifyHandle verify_handle; diff --git a/src/bench/coin_selection.cpp b/src/bench/coin_selection.cpp index d0dd76c41c..3f9102dadb 100644 --- a/src/bench/coin_selection.cpp +++ b/src/bench/coin_selection.cpp @@ -26,7 +26,7 @@ static void addCoin(const CAmount& nValue, const CWallet& wallet, std::vector Date: Fri, 20 Aug 2021 00:35:10 +0100 Subject: [PATCH 005/144] fixing site url, BGLcore.org -> bitgesell.ca. Note that some of these are broken links as they have been copied from bitcoincore.org and the equivalents do not exist at bitgesell.ca currently --- build_msvc/BGL_config.h | 2 +- configure.ac | 7 +++---- debian.minimal/copyright | 4 ++-- depends/Makefile | 2 +- doc/README.md | 4 ++-- doc/README_doxygen.md | 2 +- doc/release-notes.md | 4 ++-- doc/release-process.md | 10 +++++----- share/setup-BGL-win.nsi | 2 +- src/test/netbase_tests.cpp | 8 ++++---- 10 files changed, 22 insertions(+), 23 deletions(-) diff --git a/build_msvc/BGL_config.h b/build_msvc/BGL_config.h index 73f32f9862..62e809b9a8 100644 --- a/build_msvc/BGL_config.h +++ b/build_msvc/BGL_config.h @@ -256,7 +256,7 @@ #define PACKAGE_TARNAME "BGL" /* Define to the home page for this package. */ -#define PACKAGE_URL "https://BGLcore.org/" +#define PACKAGE_URL "https://bitgesell.ca/" /* Define to the version of this package. */ #define PACKAGE_VERSION "21.99.0" diff --git a/configure.ac b/configure.ac index 9fc705f2ab..ea84333964 100755 --- a/configure.ac +++ b/configure.ac @@ -8,7 +8,7 @@ define(_CLIENT_VERSION_IS_RELEASE, true) define(_COPYRIGHT_YEAR, 2021) define(_COPYRIGHT_HOLDERS,[The %s developers]) define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[BGL Core]]) -AC_INIT([BGL Core],m4_join([.], _CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MINOR, _CLIENT_VERSION_BUILD)m4_if(_CLIENT_VERSION_RC, [0], [], [rc]_CLIENT_VERSION_RC),[https://github.com/BGL/BGL/issues],[BGL],[https://BGLcore.org/]) +AC_INIT([BGL Core],m4_join([.], _CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MINOR, _CLIENT_VERSION_BUILD)m4_if(_CLIENT_VERSION_RC, [0], [], [rc]_CLIENT_VERSION_RC),[https://github.com/BitgesellOfficial/bitgesell/issues],[BGL],[https://bitgesell.ca/]) AC_CONFIG_SRCDIR([src/validation.cpp]) AC_CONFIG_HEADERS([src/config/BGL-config.h]) AC_CONFIG_AUX_DIR([build-aux]) @@ -167,7 +167,7 @@ AC_ARG_ENABLE([natpmp-default], AC_ARG_ENABLE(tests, AS_HELP_STRING([--disable-tests],[do not compile tests (default is to compile)]), [use_tests=$enableval], - [use_tests=no]) + [use_tests=yes]) AC_ARG_ENABLE(gui-tests, AS_HELP_STRING([--disable-gui-tests],[do not compile GUI tests (default is to compile if GUI and tests enabled)]), @@ -343,7 +343,7 @@ AC_ARG_ENABLE([werror], AC_ARG_ENABLE([external-signer], [AS_HELP_STRING([--enable-external-signer],[compile external signer support (default is no, requires Boost::Process)])], [use_external_signer=$enableval], - [use_external_signer=no]) + [use_external_signer=yes]) AC_LANG_PUSH([C++]) @@ -480,7 +480,6 @@ if test "x$CXXFLAGS_overridden" = "xno"; then AX_CHECK_COMPILE_FLAG([-Wunused-parameter],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-unused-parameter"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wself-assign],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-self-assign"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wunused-local-typedef],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-unused-local-typedef"],,[[$CXXFLAG_WERROR]]) - AX_CHECK_COMPILE_FLAG([-Wimplicit-fallthrough],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-implicit-fallthrough"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wdeprecated-copy],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-deprecated-copy"],,[[$CXXFLAG_WERROR]]) fi diff --git a/debian.minimal/copyright b/debian.minimal/copyright index 36cd059ff9..7235ef128b 100644 --- a/debian.minimal/copyright +++ b/debian.minimal/copyright @@ -1721,7 +1721,7 @@ Files: doc/man/BGL-cli.1 Copyright: 2009-2019 The Bitcoin Core developers License: __UNKNOWN__ Please contribute if you find BGL Core useful. Visit - for further information about the software. + for further information about the software. The source code is available from . . This is experimental software. @@ -2630,7 +2630,7 @@ Files: contrib/verifybinaries/verify.sh Copyright: 2016 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. License: __UNKNOWN__ This script attempts to download the signature file SHA256SUMS.asc from - BGLcore.org and BGL.org and compares them. + bitgesell.ca and BGL.org and compares them. It first checks if the signature passes, and then downloads the files specified in the file, and checks if the hashes of these files match those that are specified in the signature file. diff --git a/depends/Makefile b/depends/Makefile index 0a6f12d2ec..62f08e2f28 100755 --- a/depends/Makefile +++ b/depends/Makefile @@ -39,7 +39,7 @@ NO_ZMQ ?= NO_UPNP ?= NO_NATPMP ?= MULTIPROCESS ?= -FALLBACK_DOWNLOAD_PATH ?= https://BGLcore.org/depends-sources +FALLBACK_DOWNLOAD_PATH ?= https://bitgesell.ca/depends-sources BUILD = $(shell ./config.guess) HOST ?= $(BUILD) diff --git a/doc/README.md b/doc/README.md index 649f57746a..1e8a62d960 100644 --- a/doc/README.md +++ b/doc/README.md @@ -5,7 +5,7 @@ Setup --------------------- BGL Core is the original BGL client and it builds the backbone of the network. It downloads and, by default, stores the entire history of BGL transactions, which requires a few hundred gigabytes of disk space. Depending on the speed of your computer and network connection, the synchronization process can take anywhere from a few hours to a day or more. -To download BGL Core, visit [BGLcore.org](https://BGLcore.org/en/download/). +To download BGL Core, visit [bitgesell.ca](https://bitgesell.ca/en/download/). Running --------------------- @@ -55,7 +55,7 @@ The BGL repo's [root README](/README.md) contains relevant information on the de - [Productivity Notes](productivity.md) - [Release Notes](release-notes.md) - [Release Process](release-process.md) -- [Source Code Documentation (External Link)](https://doxygen.BGLcore.org/) +- [Source Code Documentation (External Link)](https://doxygen.bitgesell.ca/) - [Translation Process](translation_process.md) - [Translation Strings Policy](translation_strings_policy.md) - [JSON-RPC Interface](JSON-RPC-interface.md) diff --git a/doc/README_doxygen.md b/doc/README_doxygen.md index a6b1e81ef9..4329c47a77 100644 --- a/doc/README_doxygen.md +++ b/doc/README_doxygen.md @@ -8,7 +8,7 @@ with no central authority: managing transactions and issuing money are carried o The software is a community-driven open source project, released under the MIT license. -See https://github.com/BitgesellOfficial/bitgesell and https://BGLcore.org/ for further information about the project. +See https://github.com/BitgesellOfficial/bitgesell and https://bitgesell.ca/ for further information about the project. \section Navigation Use Modules, Namespaces, Classes, or Files at the top of the page to start navigating the code. diff --git a/doc/release-notes.md b/doc/release-notes.md index 12ff082707..16079feb93 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -17,7 +17,7 @@ for the process.* BGL Core version *version* is now available from: - + This release includes new features, various bug fixes and performance improvements, as well as updated translations. @@ -28,7 +28,7 @@ Please report bugs using the issue tracker at GitHub: To receive security and update notifications, please subscribe to: - + How to Upgrade ============== diff --git a/doc/release-process.md b/doc/release-process.md index 12a1a3d4e5..9fb2abff00 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -317,12 +317,12 @@ BGL.org (see below for BGL.org update instructions). - Update other repositories and websites for new version - - BGLcore.org blog post + - bitgesell.ca blog post - - BGLcore.org maintained versions update: - [table](https://github.com/BGL-core/BGLcore.org/commits/master/_includes/posts/maintenance-table.md) + - bitgesell.ca maintained versions update: + [table](https://github.com/BGL-core/bitgesell.ca/commits/master/_includes/posts/maintenance-table.md) - - BGLcore.org RPC documentation update + - bitgesell.ca RPC documentation update - Install [golang](https://golang.org/doc/install) @@ -371,7 +371,7 @@ BGL.org (see below for BGL.org update instructions). - BGL-dev and BGL-core-dev mailing list - - BGL Core announcements list https://BGLcore.org/en/list/announcements/join/ + - BGL Core announcements list https://bitgesell.ca/en/list/announcements/join/ - Update title of #BGL on Freenode IRC diff --git a/share/setup-BGL-win.nsi b/share/setup-BGL-win.nsi index 9c1ec89b0c..f94ac96f92 100644 --- a/share/setup-BGL-win.nsi +++ b/share/setup-BGL-win.nsi @@ -6,7 +6,7 @@ SetCompressor /SOLID lzma # General Symbol Definitions !define REGKEY "SOFTWARE\$(^Name)" !define COMPANY "BGL Core project" -!define URL https://BGLcore.org/ +!define URL https://bitgesell.ca/ # MUI Symbol Definitions !define MUI_ICON "..\share\pixmaps\BGL.ico" diff --git a/src/test/netbase_tests.cpp b/src/test/netbase_tests.cpp index 71266377f0..59ddfa6794 100644 --- a/src/test/netbase_tests.cpp +++ b/src/test/netbase_tests.cpp @@ -94,10 +94,10 @@ bool static TestSplitHost(const std::string& test, const std::string& host, uint BOOST_AUTO_TEST_CASE(netbase_splithost) { - BOOST_CHECK(TestSplitHost("www.BGLcore.org", "www.BGLcore.org", -1)); - BOOST_CHECK(TestSplitHost("[www.BGLcore.org]", "www.BGLcore.org", -1)); - BOOST_CHECK(TestSplitHost("www.BGLcore.org:80", "www.BGLcore.org", 80)); - BOOST_CHECK(TestSplitHost("[www.BGLcore.org]:80", "www.BGLcore.org", 80)); + BOOST_CHECK(TestSplitHost("www.bitgesell.ca", "www.bitgesell.ca", -1)); + BOOST_CHECK(TestSplitHost("[www.bitgesell.ca]", "www.bitgesell.ca", -1)); + BOOST_CHECK(TestSplitHost("www.bitgesell.ca:80", "www.bitgesell.ca", 80)); + BOOST_CHECK(TestSplitHost("[www.bitgesell.ca]:80", "www.bitgesell.ca", 80)); BOOST_CHECK(TestSplitHost("127.0.0.1", "127.0.0.1", -1)); BOOST_CHECK(TestSplitHost("127.0.0.1:8333", "127.0.0.1", 8333)); BOOST_CHECK(TestSplitHost("[127.0.0.1]", "127.0.0.1", 0)); From 3c0c6c48b8db6fc420345204c32b9e865bce0ee5 Mon Sep 17 00:00:00 2001 From: SlowRiot Date: Fri, 20 Aug 2021 00:41:08 +0100 Subject: [PATCH 006/144] correct python3 comparison operator --- contrib/testgen/base58.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/testgen/base58.py b/contrib/testgen/base58.py index 08203b8e0b..11bacd7124 100644 --- a/contrib/testgen/base58.py +++ b/contrib/testgen/base58.py @@ -107,7 +107,7 @@ def get_bcaddress_version(strAddress): if __name__ == '__main__': # Test case (from http://gitorious.org/BGL/python-base58.git) - assert get_bcaddress_version('15VjRaDX9zpbA8LVnbrCAFzrVzN7ixHNsC') is 0 + assert get_bcaddress_version('15VjRaDX9zpbA8LVnbrCAFzrVzN7ixHNsC') == 0 _ohai = 'o hai'.encode('ascii') _tmp = b58encode(_ohai) assert _tmp == 'DYB3oMS' From 6ff22421fbd1300b45564ade79a9e52f8ec0e754 Mon Sep 17 00:00:00 2001 From: SlowRiot Date: Fri, 20 Aug 2021 00:42:18 +0100 Subject: [PATCH 007/144] remove pull request template comment with irrelevant broken link to bitcoin-core/gui repository --- .github/PULL_REQUEST_TEMPLATE.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index b7c70d0834..95bdf8981f 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,11 +4,6 @@ what is the goal of the pull request Pull requests without a rationale and clear improvement may be closed immediately. -GUI-related pull requests should be opened against -https://github.com/BGL-core/gui -first. See CONTRIBUTING.md ---> - ### Notes implementation details, hints for reviewers From 0e898fe637aa24329eb514740cdfab172377b427 Mon Sep 17 00:00:00 2001 From: SlowRiot Date: Fri, 20 Aug 2021 01:10:05 +0100 Subject: [PATCH 008/144] revert unrelated changes --- configure.ac | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index ea84333964..0d5dc27272 100755 --- a/configure.ac +++ b/configure.ac @@ -167,7 +167,7 @@ AC_ARG_ENABLE([natpmp-default], AC_ARG_ENABLE(tests, AS_HELP_STRING([--disable-tests],[do not compile tests (default is to compile)]), [use_tests=$enableval], - [use_tests=yes]) + [use_tests=no]) AC_ARG_ENABLE(gui-tests, AS_HELP_STRING([--disable-gui-tests],[do not compile GUI tests (default is to compile if GUI and tests enabled)]), @@ -343,7 +343,7 @@ AC_ARG_ENABLE([werror], AC_ARG_ENABLE([external-signer], [AS_HELP_STRING([--enable-external-signer],[compile external signer support (default is no, requires Boost::Process)])], [use_external_signer=$enableval], - [use_external_signer=yes]) + [use_external_signer=no]) AC_LANG_PUSH([C++]) @@ -480,6 +480,7 @@ if test "x$CXXFLAGS_overridden" = "xno"; then AX_CHECK_COMPILE_FLAG([-Wunused-parameter],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-unused-parameter"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wself-assign],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-self-assign"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wunused-local-typedef],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-unused-local-typedef"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wimplicit-fallthrough],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-implicit-fallthrough"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wdeprecated-copy],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-deprecated-copy"],,[[$CXXFLAG_WERROR]]) fi From e027dc78c657fad6d321ff18997b1eb7e1165507 Mon Sep 17 00:00:00 2001 From: SlowRiot Date: Fri, 20 Aug 2021 01:11:19 +0100 Subject: [PATCH 009/144] enable building tests by default, external signer default to match bitcoin core, and turn off warning silencing for implicit fallthrough --- configure.ac | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 9fc705f2ab..86b7b56944 100755 --- a/configure.ac +++ b/configure.ac @@ -167,7 +167,7 @@ AC_ARG_ENABLE([natpmp-default], AC_ARG_ENABLE(tests, AS_HELP_STRING([--disable-tests],[do not compile tests (default is to compile)]), [use_tests=$enableval], - [use_tests=no]) + [use_tests=yes]) AC_ARG_ENABLE(gui-tests, AS_HELP_STRING([--disable-gui-tests],[do not compile GUI tests (default is to compile if GUI and tests enabled)]), @@ -343,7 +343,7 @@ AC_ARG_ENABLE([werror], AC_ARG_ENABLE([external-signer], [AS_HELP_STRING([--enable-external-signer],[compile external signer support (default is no, requires Boost::Process)])], [use_external_signer=$enableval], - [use_external_signer=no]) + [use_external_signer=yes]) AC_LANG_PUSH([C++]) @@ -480,7 +480,6 @@ if test "x$CXXFLAGS_overridden" = "xno"; then AX_CHECK_COMPILE_FLAG([-Wunused-parameter],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-unused-parameter"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wself-assign],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-self-assign"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wunused-local-typedef],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-unused-local-typedef"],,[[$CXXFLAG_WERROR]]) - AX_CHECK_COMPILE_FLAG([-Wimplicit-fallthrough],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-implicit-fallthrough"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wdeprecated-copy],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-deprecated-copy"],,[[$CXXFLAG_WERROR]]) fi From 0f6925278287bf0670901c3b18a170afc492cac4 Mon Sep 17 00:00:00 2001 From: SlowRiot Date: Fri, 20 Aug 2021 01:26:11 +0100 Subject: [PATCH 010/144] reinstate valid base58 test data and test methodology from bitcoin core --- src/test/base58_tests.cpp | 4 ++-- src/test/data/base58_encode_decode.json | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/base58_tests.cpp b/src/test/base58_tests.cpp index 13b1bad4e7..5a738902e3 100644 --- a/src/test/base58_tests.cpp +++ b/src/test/base58_tests.cpp @@ -18,7 +18,7 @@ using namespace std::literals; -extern UniValue read_json(const std::string& jsondata); +UniValue read_json(const std::string& jsondata); BOOST_FIXTURE_TEST_SUITE(base58_tests, BasicTestingSetup) @@ -88,7 +88,7 @@ BOOST_AUTO_TEST_CASE(base58_random_encode_decode) for (int n = 0; n < 1000; ++n) { unsigned int len = 1 + InsecureRandBits(8); unsigned int zeroes = InsecureRandBool() ? InsecureRandRange(len + 1) : 0; - auto data = Cat(std::vector(zeroes, '\010'), g_insecure_rand_ctx.randbytes(len - zeroes)); + auto data = Cat(std::vector(zeroes, '\000'), g_insecure_rand_ctx.randbytes(len - zeroes)); auto encoded = EncodeBase58Check(data); std::vector decoded; auto ok_too_small = DecodeBase58Check(encoded, decoded, InsecureRandRange(len)); diff --git a/src/test/data/base58_encode_decode.json b/src/test/data/base58_encode_decode.json index 4d91fd67dc..1a4bd7f458 100644 --- a/src/test/data/base58_encode_decode.json +++ b/src/test/data/base58_encode_decode.json @@ -4,13 +4,13 @@ ["626262", "a3gV"], ["636363", "aPEr"], ["73696d706c792061206c6f6e6720737472696e67", "2cFupjhnEsSn59qHXstmK2ffpLv2"], -["0aeb15231dfceb60925886b67d065299925915aeb172c06647", "1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L"], +["00eb15231dfceb60925886b67d065299925915aeb172c06647", "1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L"], ["516b6fcd0f", "ABnLTmg"], ["bf4f89001e670274dd", "3SEo3LWLoPntC"], ["572e4794", "3EFU7m"], ["ecac89cad93923c02321", "EJDM8drfXA6uyA"], ["10c8511e", "Rt5zm"], -["0a0a0a0a0a0a0a0a0a0a", "1111111111"], -["0a0111d38e5fc9071ffcd20b4a763cc9ae4f252bb4e48fd66a835e252ada93ff480d6dd43dc62a641155a5", "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"], -["0a0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", "1cWB5HCBdLjAuqGGReWE3R3CguuwSjw6RHn39s2yuDRTS5NsBgNiFpWgAnEx6VQi8csexkgYw3mdYrMHr8x9i7aEwP8kZ7vccXWqKDvGv3u1GxFKPuAkn8JCPPGDMf3vMMnbzm6Nh9zh1gcNsMvH3ZNLmP5fSG6DGbbi2tuwMWPthr4boWwCxf7ewSgNQeacyozhKDDQQ1qL5fQFUW52QKUZDZ5fw3KXNQJMcNTcaB723LchjeKun7MuGW5qyCBZYzA1KjofN1gYBV3NqyhQJ3Ns746GNuf9N2pQPmHz4xpnSrrfCvy6TVVz5d4PdrjeshsWQwpZsZGzvbdAdN8MKV5QsBDY"] +["00000000000000000000", "1111111111"], +["000111d38e5fc9071ffcd20b4a763cc9ae4f252bb4e48fd66a835e252ada93ff480d6dd43dc62a641155a5", "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"], +["000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", "1cWB5HCBdLjAuqGGReWE3R3CguuwSjw6RHn39s2yuDRTS5NsBgNiFpWgAnEx6VQi8csexkgYw3mdYrMHr8x9i7aEwP8kZ7vccXWqKDvGv3u1GxFKPuAkn8JCPPGDMf3vMMnbzm6Nh9zh1gcNsMvH3ZNLmP5fSG6DGbbi2tuwMWPthr4boWwCxf7ewSgNQeacyozhKDDQQ1qL5fQFUW52QKUZDZ5fw3KXNQJMcNTcaB723LchjeKun7MuGW5qyCBZYzA1KjofN1gYBV3NqyhQJ3Ns746GNuf9N2pQPmHz4xpnSrrfCvy6TVVz5d4PdrjeshsWQwpZsZGzvbdAdN8MKV5QsBDY"] ] From 60bc8a1b8c518a030d2ae70d1ed6b774584d55d9 Mon Sep 17 00:00:00 2001 From: SlowRiot Date: Fri, 20 Aug 2021 01:26:16 +0100 Subject: [PATCH 011/144] fix base58 implementation --- src/base58.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/base58.cpp b/src/base58.cpp index cadbef6fdf..2a7fbe5e2c 100644 --- a/src/base58.cpp +++ b/src/base58.cpp @@ -80,7 +80,7 @@ static const int8_t mapBase58[256] = { std::vector::iterator it = b256.begin() + (size - length); // Copy result into output vector. vch.reserve(zeroes + (b256.end() - it)); - vch.assign(zeroes, 0x0a); + vch.assign(zeroes, 0x00); while (it != b256.end()) vch.push_back(*(it++)); return true; @@ -91,7 +91,7 @@ std::string EncodeBase58(Span input) // Skip & count leading zeroes. int zeroes = 0; int length = 0; - while (input.size() > 0 && input[0] == 10) { + while (input.size() > 0 && input[0] == 0) { input = input.subspan(1); zeroes++; } From 9781fd3588fefb0c355ac141cd7e30aa1c61331f Mon Sep 17 00:00:00 2001 From: SlowRiot Date: Tue, 24 Aug 2021 18:12:20 +0100 Subject: [PATCH 012/144] don't disable implicit-fallthrough warning (this is now dealt with in another PR) --- configure.ac | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index 86b7b56944..d8de32985f 100755 --- a/configure.ac +++ b/configure.ac @@ -480,6 +480,7 @@ if test "x$CXXFLAGS_overridden" = "xno"; then AX_CHECK_COMPILE_FLAG([-Wunused-parameter],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-unused-parameter"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wself-assign],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-self-assign"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wunused-local-typedef],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-unused-local-typedef"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wimplicit-fallthrough],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-implicit-fallthrough"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wdeprecated-copy],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-deprecated-copy"],,[[$CXXFLAG_WERROR]]) fi From 2557ff6f85438627b8e16cfef3168b32180ddec1 Mon Sep 17 00:00:00 2001 From: ijanus Date: Sat, 19 Feb 2022 20:48:18 +0100 Subject: [PATCH 013/144] WIP: Trying to solve what causes Clang fuzz compilation fail It fails relocation related issue, and the linker advises to use -fpie --- src/secp256k1/Makefile.am | 30 +- src/secp256k1/build-aux/m4/BGL_secp.m4 | 100 +++++ src/secp256k1/configure.ac | 347 +++++++++--------- src/secp256k1/src/ecmult.h | 2 +- src/secp256k1/src/ecmult_const.h | 2 +- src/secp256k1/src/field_5x52.h | 2 +- src/secp256k1/src/field_impl.h | 2 +- src/secp256k1/src/gen_context.c | 2 +- src/secp256k1/src/group.h | 2 +- src/secp256k1/src/modinv64.h | 2 +- .../src/modules/extrakeys/main_impl.h | 2 +- .../src/modules/recovery/main_impl.h | 22 +- .../src/modules/schnorrsig/main_impl.h | 3 +- src/secp256k1/src/scalar.h | 2 +- src/secp256k1/src/scalar_4x64.h | 2 +- src/secp256k1/src/testrand_impl.h | 10 +- src/secp256k1/src/tests_exhaustive.c | 8 +- src/secp256k1/src/valgrind_ctime_test.c | 90 +++-- 18 files changed, 384 insertions(+), 246 deletions(-) create mode 100644 src/secp256k1/build-aux/m4/BGL_secp.m4 diff --git a/src/secp256k1/Makefile.am b/src/secp256k1/Makefile.am index 023fa6067f..1e03560884 100644 --- a/src/secp256k1/Makefile.am +++ b/src/secp256k1/Makefile.am @@ -1,5 +1,9 @@ ACLOCAL_AMFLAGS = -I build-aux/m4 +# AM_CFLAGS will be automatically prepended to CFLAGS by Automake when compiling some foo +# which does not have an explicit foo_CFLAGS variable set. +AM_CFLAGS = $(SECP_CFLAGS) + lib_LTLIBRARIES = libsecp256k1.la include_HEADERS = include/secp256k1.h include_HEADERS += include/secp256k1_preallocated.h @@ -14,8 +18,6 @@ noinst_HEADERS += src/scalar_8x32_impl.h noinst_HEADERS += src/scalar_low_impl.h noinst_HEADERS += src/group.h noinst_HEADERS += src/group_impl.h -noinst_HEADERS += src/num_gmp.h -noinst_HEADERS += src/num_gmp_impl.h noinst_HEADERS += src/ecdsa.h noinst_HEADERS += src/ecdsa_impl.h noinst_HEADERS += src/eckey.h @@ -26,14 +28,16 @@ noinst_HEADERS += src/ecmult_const.h noinst_HEADERS += src/ecmult_const_impl.h noinst_HEADERS += src/ecmult_gen.h noinst_HEADERS += src/ecmult_gen_impl.h -noinst_HEADERS += src/num.h -noinst_HEADERS += src/num_impl.h noinst_HEADERS += src/field_10x26.h noinst_HEADERS += src/field_10x26_impl.h noinst_HEADERS += src/field_5x52.h noinst_HEADERS += src/field_5x52_impl.h noinst_HEADERS += src/field_5x52_int128_impl.h noinst_HEADERS += src/field_5x52_asm_impl.h +noinst_HEADERS += src/modinv32.h +noinst_HEADERS += src/modinv32_impl.h +noinst_HEADERS += src/modinv64.h +noinst_HEADERS += src/modinv64_impl.h noinst_HEADERS += src/assumptions.h noinst_HEADERS += src/util.h noinst_HEADERS += src/scratch.h @@ -68,7 +72,7 @@ endif endif libsecp256k1_la_SOURCES = src/secp256k1.c -libsecp256k1_la_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/include -I$(top_srcdir)/src $(SECP_INCLUDES) +libsecp256k1_la_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/src $(SECP_INCLUDES) libsecp256k1_la_LIBADD = $(SECP_LIBS) $(COMMON_LIB) if VALGRIND_ENABLED @@ -81,27 +85,27 @@ noinst_PROGRAMS += bench_verify bench_sign bench_internal bench_ecmult bench_verify_SOURCES = src/bench_verify.c bench_verify_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) # SECP_TEST_INCLUDES are only used here for CRYPTO_CPPFLAGS -bench_verify_CPPFLAGS = -DSECP256K1_BUILD $(SECP_TEST_INCLUDES) +bench_verify_CPPFLAGS = $(SECP_TEST_INCLUDES) bench_sign_SOURCES = src/bench_sign.c bench_sign_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) bench_internal_SOURCES = src/bench_internal.c bench_internal_LDADD = $(SECP_LIBS) $(COMMON_LIB) -bench_internal_CPPFLAGS = -DSECP256K1_BUILD $(SECP_INCLUDES) +bench_internal_CPPFLAGS = $(SECP_INCLUDES) bench_ecmult_SOURCES = src/bench_ecmult.c bench_ecmult_LDADD = $(SECP_LIBS) $(COMMON_LIB) -bench_ecmult_CPPFLAGS = -DSECP256K1_BUILD $(SECP_INCLUDES) +bench_ecmult_CPPFLAGS = $(SECP_INCLUDES) endif TESTS = if USE_TESTS noinst_PROGRAMS += tests tests_SOURCES = src/tests.c -tests_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/src -I$(top_srcdir)/include $(SECP_INCLUDES) $(SECP_TEST_INCLUDES) +tests_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/include $(SECP_INCLUDES) $(SECP_TEST_INCLUDES) if VALGRIND_ENABLED tests_CPPFLAGS += -DVALGRIND noinst_PROGRAMS += valgrind_ctime_test valgrind_ctime_test_SOURCES = src/valgrind_ctime_test.c -valgrind_ctime_test_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_LIBS) $(COMMON_LIB) +valgrind_ctime_test_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB) endif if !ENABLE_COVERAGE tests_CPPFLAGS += -DVERIFY @@ -114,7 +118,7 @@ endif if USE_EXHAUSTIVE_TESTS noinst_PROGRAMS += exhaustive_tests exhaustive_tests_SOURCES = src/tests_exhaustive.c -exhaustive_tests_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/src $(SECP_INCLUDES) +exhaustive_tests_CPPFLAGS = -I$(top_srcdir)/src $(SECP_INCLUDES) if !ENABLE_COVERAGE exhaustive_tests_CPPFLAGS += -DVERIFY endif @@ -129,10 +133,10 @@ CPPFLAGS_FOR_BUILD +=-I$(top_srcdir) -I$(builddir)/src gen_context_OBJECTS = gen_context.o gen_context_BIN = gen_context$(BUILD_EXEEXT) gen_%.o: src/gen_%.c src/libsecp256k1-config.h - $(CC_FOR_BUILD) $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD) -c $< -o $@ + $(CC_FOR_BUILD) $(DEFS) $(CPPFLAGS_FOR_BUILD) $(SECP_CFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD) -c $< -o $@ $(gen_context_BIN): $(gen_context_OBJECTS) - $(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) $(LDFLAGS_FOR_BUILD) $^ -o $@ + $(CC_FOR_BUILD) $(SECP_CFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD) $(LDFLAGS_FOR_BUILD) $^ -o $@ $(libsecp256k1_la_OBJECTS): src/ecmult_static_context.h $(tests_OBJECTS): src/ecmult_static_context.h diff --git a/src/secp256k1/build-aux/m4/BGL_secp.m4 b/src/secp256k1/build-aux/m4/BGL_secp.m4 new file mode 100644 index 0000000000..8245b2b863 --- /dev/null +++ b/src/secp256k1/build-aux/m4/BGL_secp.m4 @@ -0,0 +1,100 @@ +dnl escape "$0x" below using the m4 quadrigaph @S|@, and escape it again with a \ for the shell. +AC_DEFUN([SECP_64BIT_ASM_CHECK],[ +AC_MSG_CHECKING(for x86_64 assembly availability) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include ]],[[ + uint64_t a = 11, tmp; + __asm__ __volatile__("movq \@S|@0x100000000,%1; mulq %%rsi" : "+a"(a) : "S"(tmp) : "cc", "%rdx"); + ]])],[has_64bit_asm=yes],[has_64bit_asm=no]) +AC_MSG_RESULT([$has_64bit_asm]) +]) + +dnl +AC_DEFUN([SECP_OPENSSL_CHECK],[ + has_libcrypto=no + m4_ifdef([PKG_CHECK_MODULES],[ + PKG_CHECK_MODULES([CRYPTO], [libcrypto], [has_libcrypto=yes],[has_libcrypto=no]) + if test x"$has_libcrypto" = x"yes"; then + TEMP_LIBS="$LIBS" + LIBS="$LIBS $CRYPTO_LIBS" + AC_CHECK_LIB(crypto, main,[AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed])],[has_libcrypto=no]) + LIBS="$TEMP_LIBS" + fi + ]) + if test x$has_libcrypto = xno; then + AC_CHECK_HEADER(openssl/crypto.h,[ + AC_CHECK_LIB(crypto, main,[ + has_libcrypto=yes + CRYPTO_LIBS=-lcrypto + AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed]) + ]) + ]) + LIBS= + fi +if test x"$has_libcrypto" = x"yes" && test x"$has_openssl_ec" = x; then + AC_MSG_CHECKING(for EC functions in libcrypto) + CPPFLAGS_TEMP="$CPPFLAGS" + CPPFLAGS="$CRYPTO_CPPFLAGS $CPPFLAGS" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + #include + #include ]],[[ + # if OPENSSL_VERSION_NUMBER < 0x10100000L + void ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps) {(void)sig->r; (void)sig->s;} + # endif + + unsigned int zero = 0; + const unsigned char *zero_ptr = (unsigned char*)&zero; + EC_KEY_free(EC_KEY_new_by_curve_name(NID_secp256k1)); + EC_KEY *eckey = EC_KEY_new(); + EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_secp256k1); + EC_KEY_set_group(eckey, group); + ECDSA_sign(0, NULL, 0, NULL, &zero, eckey); + ECDSA_verify(0, NULL, 0, NULL, 0, eckey); + o2i_ECPublicKey(&eckey, &zero_ptr, 0); + d2i_ECPrivateKey(&eckey, &zero_ptr, 0); + EC_KEY_check_key(eckey); + EC_KEY_free(eckey); + EC_GROUP_free(group); + ECDSA_SIG *sig_openssl; + sig_openssl = ECDSA_SIG_new(); + d2i_ECDSA_SIG(&sig_openssl, &zero_ptr, 0); + i2d_ECDSA_SIG(sig_openssl, NULL); + ECDSA_SIG_get0(sig_openssl, NULL, NULL); + ECDSA_SIG_free(sig_openssl); + const BIGNUM *bignum = BN_value_one(); + BN_is_negative(bignum); + BN_num_bits(bignum); + if (sizeof(zero) >= BN_num_bytes(bignum)) { + BN_bn2bin(bignum, (unsigned char*)&zero); + } + ]])],[has_openssl_ec=yes],[has_openssl_ec=no]) + AC_MSG_RESULT([$has_openssl_ec]) + CPPFLAGS="$CPPFLAGS_TEMP" +fi +]) + +AC_DEFUN([SECP_VALGRIND_CHECK],[ +if test x"$has_valgrind" != x"yes"; then + CPPFLAGS_TEMP="$CPPFLAGS" + CPPFLAGS="$VALGRIND_CPPFLAGS $CPPFLAGS" + AC_CHECK_HEADER([valgrind/memcheck.h], [has_valgrind=yes; AC_DEFINE(HAVE_VALGRIND,1,[Define this symbol if valgrind is installed])]) +fi +]) + +dnl SECP_TRY_APPEND_CFLAGS(flags, VAR) +dnl Append flags to VAR if CC accepts them. +AC_DEFUN([SECP_TRY_APPEND_CFLAGS], [ + AC_MSG_CHECKING([if ${CC} supports $1]) + SECP_TRY_APPEND_CFLAGS_saved_CFLAGS="$CFLAGS" + CFLAGS="$1 $CFLAGS" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], [flag_works=yes], [flag_works=no]) + AC_MSG_RESULT($flag_works) + CFLAGS="$SECP_TRY_APPEND_CFLAGS_saved_CFLAGS" + if test x"$flag_works" = x"yes"; then + $2="$$2 $1" + fi + unset flag_works + AC_SUBST($2) +]) diff --git a/src/secp256k1/configure.ac b/src/secp256k1/configure.ac index eb3b449bec..20a2092c59 100644 --- a/src/secp256k1/configure.ac +++ b/src/secp256k1/configure.ac @@ -8,13 +8,9 @@ AH_TOP([#define LIBSECP256K1_CONFIG_H]) AH_BOTTOM([#endif /*LIBSECP256K1_CONFIG_H*/]) AM_INIT_AUTOMAKE([foreign subdir-objects]) -# Set -g if CFLAGS are not already set, which matches the default autoconf -# behavior (see PROG_CC in the Autoconf manual) with the exception that we don't -# set -O2 here because we set it in any case (see further down). -: ${CFLAGS="-g"} LT_INIT -dnl make the compilation flags quiet unless V=1 is used +# Make the compilation flags quiet unless V=1 is used. m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) PKG_PROG_PKG_CONFIG @@ -22,9 +18,16 @@ PKG_PROG_PKG_CONFIG AC_PATH_TOOL(AR, ar) AC_PATH_TOOL(RANLIB, ranlib) AC_PATH_TOOL(STRIP, strip) -AX_PROG_CC_FOR_BUILD +# Save definition of AC_PROG_CC because AM_PROG_CC_C_O in automake<=1.13 will +# redefine AC_PROG_CC to exit with an error, which avoids the user calling it +# accidently and screwing up the effect of AM_PROG_CC_C_O. However, we'll need +# AC_PROG_CC later on in AX_PROG_CC_FOR_BUILD, where its usage is fine, and +# we'll carefully make sure not to call AC_PROG_CC anywhere else. +m4_copy([AC_PROG_CC], [saved_AC_PROG_CC]) AM_PROG_CC_C_O +# Restore AC_PROG_CC +m4_rename_force([saved_AC_PROG_CC], [AC_PROG_CC]) AC_PROG_CC_C89 if test x"$ac_cv_prog_cc_c89" = x"no"; then @@ -35,28 +38,26 @@ AM_PROG_AS case $host_os in *darwin*) if test x$cross_compiling != xyes; then - AC_PATH_PROG([BREW],brew,) - if test x$BREW != x; then - dnl These Homebrew packages may be keg-only, meaning that they won't be found - dnl in expected paths because they may conflict with system files. Ask - dnl Homebrew where each one is located, then adjust paths accordingly. - + AC_CHECK_PROG([BREW], brew, brew) + if test x$BREW = xbrew; then + # These Homebrew packages may be keg-only, meaning that they won't be found + # in expected paths because they may conflict with system files. Ask + # Homebrew where each one is located, then adjust paths accordingly. openssl_prefix=`$BREW --prefix openssl 2>/dev/null` - gmp_prefix=`$BREW --prefix gmp 2>/dev/null` + valgrind_prefix=`$BREW --prefix valgrind 2>/dev/null` if test x$openssl_prefix != x; then PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" export PKG_CONFIG_PATH CRYPTO_CPPFLAGS="-I$openssl_prefix/include" fi - if test x$gmp_prefix != x; then - GMP_CPPFLAGS="-I$gmp_prefix/include" - GMP_LIBS="-L$gmp_prefix/lib" + if test x$valgrind_prefix != x; then + VALGRIND_CPPFLAGS="-I$valgrind_prefix/include" fi else - AC_PATH_PROG([PORT],port,) - dnl if homebrew isn't installed and macports is, add the macports default paths - dnl as a last resort. - if test x$PORT != x; then + AC_CHECK_PROG([PORT], port, port) + # If homebrew isn't installed and macports is, add the macports default paths + # as a last resort. + if test x$PORT = xport; then CPPFLAGS="$CPPFLAGS -isystem /opt/local/include" LDFLAGS="$LDFLAGS -L/opt/local/lib" fi @@ -65,26 +66,45 @@ case $host_os in ;; esac -CFLAGS="-W $CFLAGS" - -warn_CFLAGS="-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wundef -Wno-unused-function -Wno-long-long -Wno-overlength-strings" -saved_CFLAGS="$CFLAGS" -CFLAGS="$warn_CFLAGS $CFLAGS" -AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}]) -AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], - [ AC_MSG_RESULT([yes]) ], - [ AC_MSG_RESULT([no]) - CFLAGS="$saved_CFLAGS" - ]) - -saved_CFLAGS="$CFLAGS" -CFLAGS="-fvisibility=hidden $CFLAGS" -AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden]) -AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], - [ AC_MSG_RESULT([yes]) ], - [ AC_MSG_RESULT([no]) - CFLAGS="$saved_CFLAGS" - ]) +# Try if some desirable compiler flags are supported and append them to SECP_CFLAGS. +# +# These are our own flags, so we append them to our own SECP_CFLAGS variable (instead of CFLAGS) as +# recommended in the automake manual (Section "Flag Variables Ordering"). CFLAGS belongs to the user +# and we are not supposed to touch it. In the Makefile, we will need to ensure that SECP_CFLAGS +# is prepended to CFLAGS when invoking the compiler so that the user always has the last word (flag). +# +# Another advantage of not touching CFLAGS is that the contents of CFLAGS will be picked up by +# libtool for compiling helper executables. For example, when compiling for Windows, libtool will +# generate entire wrapper executables (instead of simple wrapper scripts as on Unix) to ensure +# proper operation of uninstalled programs linked by libtool against the uninstalled shared library. +# These executables are compiled from C source file for which our flags may not be appropriate, +# e.g., -std=c89 flag has lead to undesirable warnings in the past. +# +# TODO We should analogously not touch CPPFLAGS and LDFLAGS but currently there are no issues. +AC_DEFUN([SECP_TRY_APPEND_DEFAULT_CFLAGS], [ + # Try to append -Werror=unknown-warning-option to CFLAGS temporarily. Otherwise clang will + # not error out if it gets unknown warning flags and the checks here will always succeed + # no matter if clang knows the flag or not. + SECP_TRY_APPEND_DEFAULT_CFLAGS_saved_CFLAGS="$CFLAGS" + SECP_TRY_APPEND_CFLAGS([-Werror=unknown-warning-option], CFLAGS) + + SECP_TRY_APPEND_CFLAGS([-std=c89 -pedantic -Wno-long-long -Wnested-externs -Wshadow -Wstrict-prototypes -Wundef], $1) # GCC >= 3.0, -Wlong-long is implied by -pedantic. + SECP_TRY_APPEND_CFLAGS([-Wno-overlength-strings], $1) # GCC >= 4.2, -Woverlength-strings is implied by -pedantic. + SECP_TRY_APPEND_CFLAGS([-Wall], $1) # GCC >= 2.95 and probably many other compilers + SECP_TRY_APPEND_CFLAGS([-Wno-unused-function], $1) # GCC >= 3.0, -Wunused-function is implied by -Wall. + SECP_TRY_APPEND_CFLAGS([-Wextra], $1) # GCC >= 3.4, this is the newer name of -W, which we don't use because older GCCs will warn about unused functions. + SECP_TRY_APPEND_CFLAGS([-Wcast-align], $1) # GCC >= 2.95 + SECP_TRY_APPEND_CFLAGS([-Wcast-align=strict], $1) # GCC >= 8.0 + SECP_TRY_APPEND_CFLAGS([-Wconditional-uninitialized], $1) # Clang >= 3.0 only + SECP_TRY_APPEND_CFLAGS([-fvisibility=hidden], $1) # GCC >= 4.0 + + CFLAGS="$SECP_TRY_APPEND_DEFAULT_CFLAGS_saved_CFLAGS" +]) +SECP_TRY_APPEND_DEFAULT_CFLAGS(SECP_CFLAGS) + +### +### Define config arguments +### AC_ARG_ENABLE(benchmark, AS_HELP_STRING([--enable-benchmark],[compile benchmark [default=yes]]), @@ -146,15 +166,12 @@ AC_ARG_ENABLE(external_default_callbacks, [use_external_default_callbacks=$enableval], [use_external_default_callbacks=no]) -dnl Test-only override of the (autodetected by the C code) "widemul" setting. -dnl Legal values are int64 (for [u]int64_t), int128 (for [unsigned] __int128), and auto (the default). +# Test-only override of the (autodetected by the C code) "widemul" setting. +# Legal values are int64 (for [u]int64_t), int128 (for [unsigned] __int128), and auto (the default). AC_ARG_WITH([test-override-wide-multiply], [] ,[set_widemul=$withval], [set_widemul=auto]) -AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto], -[bignum implementation to use [default=auto]])],[req_bignum=$withval], [req_bignum=auto]) - AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto], -[assembly optimizations to use (experimental: arm) [default=auto]])],[req_asm=$withval], [req_asm=auto]) +[assembly optimizations to use (experimental: arm) [default=auto]])],[req_asm=$withval], [req_asm=auto]) AC_ARG_WITH([ecmult-window], [AS_HELP_STRING([--with-ecmult-window=SIZE|auto], [window size for ecmult precomputation for verification, specified as integer in range [2..24].] @@ -177,79 +194,35 @@ AC_ARG_WITH([valgrind], [AS_HELP_STRING([--with-valgrind=yes|no|auto], )], [req_valgrind=$withval], [req_valgrind=auto]) +### +### Handle config options (except for modules) +### + if test x"$req_valgrind" = x"no"; then enable_valgrind=no else - AC_CHECK_HEADER([valgrind/memcheck.h], [enable_valgrind=yes], [ + SECP_VALGRIND_CHECK + if test x"$has_valgrind" != x"yes"; then if test x"$req_valgrind" = x"yes"; then AC_MSG_ERROR([Valgrind support explicitly requested but valgrind/memcheck.h header not available]) fi enable_valgrind=no - ], []) + else + enable_valgrind=yes + fi fi AM_CONDITIONAL([VALGRIND_ENABLED],[test "$enable_valgrind" = "yes"]) if test x"$enable_coverage" = x"yes"; then AC_DEFINE(COVERAGE, 1, [Define this symbol to compile out all VERIFY code]) - CFLAGS="-O0 --coverage $CFLAGS" + SECP_CFLAGS="-O0 --coverage $SECP_CFLAGS" LDFLAGS="--coverage $LDFLAGS" else - CFLAGS="-O2 $CFLAGS" -fi - -if test x"$use_ecmult_static_precomputation" != x"no"; then - # Temporarily switch to an environment for the native compiler - save_cross_compiling=$cross_compiling - cross_compiling=no - SAVE_CC="$CC" - CC="$CC_FOR_BUILD" - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS_FOR_BUILD" - SAVE_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS_FOR_BUILD" - SAVE_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS_FOR_BUILD" - - warn_CFLAGS_FOR_BUILD="-Wall -Wextra -Wno-unused-function" - saved_CFLAGS="$CFLAGS" - CFLAGS="$warn_CFLAGS_FOR_BUILD $CFLAGS" - AC_MSG_CHECKING([if native ${CC_FOR_BUILD} supports ${warn_CFLAGS_FOR_BUILD}]) - AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], - [ AC_MSG_RESULT([yes]) ], - [ AC_MSG_RESULT([no]) - CFLAGS="$saved_CFLAGS" - ]) - - AC_MSG_CHECKING([for working native compiler: ${CC_FOR_BUILD}]) - AC_RUN_IFELSE( - [AC_LANG_PROGRAM([], [])], - [working_native_cc=yes], - [working_native_cc=no],[:]) - - CFLAGS_FOR_BUILD="$CFLAGS" - - # Restore the environment - cross_compiling=$save_cross_compiling - CC="$SAVE_CC" - CFLAGS="$SAVE_CFLAGS" - CPPFLAGS="$SAVE_CPPFLAGS" - LDFLAGS="$SAVE_LDFLAGS" - - if test x"$working_native_cc" = x"no"; then - AC_MSG_RESULT([no]) - set_precomp=no - m4_define([please_set_for_build], [Please set CC_FOR_BUILD, CFLAGS_FOR_BUILD, CPPFLAGS_FOR_BUILD, and/or LDFLAGS_FOR_BUILD.]) - if test x"$use_ecmult_static_precomputation" = x"yes"; then - AC_MSG_ERROR([native compiler ${CC_FOR_BUILD} does not produce working binaries. please_set_for_build]) - else - AC_MSG_WARN([Disabling statically generated ecmult table because the native compiler ${CC_FOR_BUILD} does not produce working binaries. please_set_for_build]) - fi - else - AC_MSG_RESULT([yes]) - set_precomp=yes - fi -else - set_precomp=no + # Most likely the CFLAGS already contain -O2 because that is autoconf's default. + # We still add it here because passing it twice is not an issue, and handling + # this case would just add unnecessary complexity (see #896). + SECP_CFLAGS="-O2 $SECP_CFLAGS" + SECP_CFLAGS_FOR_BUILD="-O2 $SECP_CFLAGS_FOR_BUILD" fi if test x"$req_asm" = x"auto"; then @@ -279,33 +252,7 @@ else esac fi -if test x"$req_bignum" = x"auto"; then - SECP_GMP_CHECK - if test x"$has_gmp" = x"yes"; then - set_bignum=gmp - fi - - if test x"$set_bignum" = x; then - set_bignum=no - fi -else - set_bignum=$req_bignum - case $set_bignum in - gmp) - SECP_GMP_CHECK - if test x"$has_gmp" != x"yes"; then - AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available]) - fi - ;; - no) - ;; - *) - AC_MSG_ERROR([invalid bignum implementation selection]) - ;; - esac -fi - -# select assembly optimization +# Select assembly optimization use_external_asm=no case $set_asm in @@ -322,7 +269,12 @@ no) ;; esac -# select wide multiplication implementation +if test x"$use_external_asm" = x"yes"; then + AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used]) +fi + + +# Select wide multiplication implementation case $set_widemul in int128) AC_DEFINE(USE_FORCE_WIDEMUL_INT128, 1, [Define this symbol to force the use of the (unsigned) __int128 based wide multiplication implementation]) @@ -337,25 +289,7 @@ auto) ;; esac -# select bignum implementation -case $set_bignum in -gmp) - AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed]) - AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num]) - AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation]) - AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation]) - ;; -no) - AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation]) - AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation]) - AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation]) - ;; -*) - AC_MSG_ERROR([invalid bignum implementation]) - ;; -esac - -#set ecmult window size +# Set ecmult window size if test x"$req_ecmult_window" = x"auto"; then set_ecmult_window=15 else @@ -377,7 +311,7 @@ case $set_ecmult_window in ;; esac -#set ecmult gen precision +# Set ecmult gen precision if test x"$req_ecmult_gen_precision" = x"auto"; then set_ecmult_gen_precision=4 else @@ -419,15 +353,88 @@ else enable_openssl_tests=no fi -if test x"$set_bignum" = x"gmp"; then - SECP_LIBS="$SECP_LIBS $GMP_LIBS" - SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS" +if test x"$enable_valgrind" = x"yes"; then + SECP_INCLUDES="$SECP_INCLUDES $VALGRIND_CPPFLAGS" +fi + +# Add -Werror and similar flags passed from the outside (for testing, e.g., in CI) +SECP_CFLAGS="$SECP_CFLAGS $WERROR_CFLAGS" + +# Handle static precomputation (after everything which modifies CFLAGS and friends) +if test x"$use_ecmult_static_precomputation" != x"no"; then + if test x"$cross_compiling" = x"no"; then + set_precomp=yes + if test x"${CC_FOR_BUILD+x}${CFLAGS_FOR_BUILD+x}${CPPFLAGS_FOR_BUILD+x}${LDFLAGS_FOR_BUILD+x}" != x; then + AC_MSG_WARN([CC_FOR_BUILD, CFLAGS_FOR_BUILD, CPPFLAGS_FOR_BUILD, and/or LDFLAGS_FOR_BUILD is set but ignored because we are not cross-compiling.]) + fi + # If we're not cross-compiling, simply use the same compiler for building the static precompation code. + CC_FOR_BUILD="$CC" + CPPFLAGS_FOR_BUILD="$CPPFLAGS" + SECP_CFLAGS_FOR_BUILD="$SECP_CFLAGS" + CFLAGS_FOR_BUILD="$CFLAGS" + LDFLAGS_FOR_BUILD="$LDFLAGS" + else + AX_PROG_CC_FOR_BUILD + + # Temporarily switch to an environment for the native compiler + save_cross_compiling=$cross_compiling + cross_compiling=no + SAVE_CC="$CC" + CC="$CC_FOR_BUILD" + SAVE_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS_FOR_BUILD" + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS_FOR_BUILD" + SAVE_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS_FOR_BUILD" + + SECP_TRY_APPEND_DEFAULT_CFLAGS(SECP_CFLAGS_FOR_BUILD) + + AC_MSG_CHECKING([for working native compiler: ${CC_FOR_BUILD}]) + AC_RUN_IFELSE( + [AC_LANG_PROGRAM([], [])], + [working_native_cc=yes], + [working_native_cc=no],[:]) + + # Restore the environment + cross_compiling=$save_cross_compiling + CC="$SAVE_CC" + CPPFLAGS="$SAVE_CPPFLAGS" + CFLAGS="$SAVE_CFLAGS" + LDFLAGS="$SAVE_LDFLAGS" + + if test x"$working_native_cc" = x"no"; then + AC_MSG_RESULT([no]) + set_precomp=no + m4_define([please_set_for_build], [Please set CC_FOR_BUILD, CPPFLAGS_FOR_BUILD, CFLAGS_FOR_BUILD, and/or LDFLAGS_FOR_BUILD.]) + if test x"$use_ecmult_static_precomputation" = x"yes"; then + AC_MSG_ERROR([native compiler ${CC_FOR_BUILD} does not produce working binaries. please_set_for_build]) + else + AC_MSG_WARN([Disabling statically generated ecmult table because the native compiler ${CC_FOR_BUILD} does not produce working binaries. please_set_for_build]) + fi + else + AC_MSG_RESULT([yes]) + set_precomp=yes + fi + fi + + AC_SUBST(CC_FOR_BUILD) + AC_SUBST(CPPFLAGS_FOR_BUILD) + AC_SUBST(SECP_CFLAGS_FOR_BUILD) + AC_SUBST(CFLAGS_FOR_BUILD) + AC_SUBST(LDFLAGS_FOR_BUILD) +else + set_precomp=no fi if test x"$set_precomp" = x"yes"; then AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table]) fi +### +### Handle module options +### + if test x"$enable_module_ecdh" = x"yes"; then AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module]) fi @@ -447,14 +454,14 @@ if test x"$enable_module_extrakeys" = x"yes"; then AC_DEFINE(ENABLE_MODULE_EXTRAKEYS, 1, [Define this symbol to enable the extrakeys module]) fi -if test x"$use_external_asm" = x"yes"; then - AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used]) -fi - if test x"$use_external_default_callbacks" = x"yes"; then AC_DEFINE(USE_EXTERNAL_DEFAULT_CALLBACKS, 1, [Define this symbol if an external implementation of the default callbacks is used]) fi +### +### Check for --enable-experimental if necessary +### + if test x"$enable_experimental" = x"yes"; then AC_MSG_NOTICE([******]) AC_MSG_NOTICE([WARNING: experimental build]) @@ -474,12 +481,17 @@ else fi fi +### +### Generate output +### + AC_CONFIG_HEADERS([src/libsecp256k1-config.h]) AC_CONFIG_FILES([Makefile libsecp256k1.pc]) AC_SUBST(SECP_INCLUDES) AC_SUBST(SECP_LIBS) AC_SUBST(SECP_TEST_LIBS) AC_SUBST(SECP_TEST_INCLUDES) +AC_SUBST(SECP_CFLAGS) AM_CONDITIONAL([ENABLE_COVERAGE], [test x"$enable_coverage" = x"yes"]) AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"]) AM_CONDITIONAL([USE_EXHAUSTIVE_TESTS], [test x"$use_exhaustive_tests" != x"no"]) @@ -492,7 +504,7 @@ AM_CONDITIONAL([ENABLE_MODULE_SCHNORRSIG], [test x"$enable_module_schnorrsig" = AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"]) AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"]) -dnl make sure nothing new is exported so that we don't break the cache +# Make sure nothing new is exported so that we don't break the cache. PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH" unset PKG_CONFIG_PATH PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP" @@ -513,17 +525,24 @@ echo " module extrakeys = $enable_module_extrakeys" echo " module schnorrsig = $enable_module_schnorrsig" echo echo " asm = $set_asm" -echo " bignum = $set_bignum" echo " ecmult window size = $set_ecmult_window" echo " ecmult gen prec. bits = $set_ecmult_gen_precision" -dnl Hide test-only options unless they're used. +# Hide test-only options unless they're used. if test x"$set_widemul" != xauto; then echo " wide multiplication = $set_widemul" fi echo echo " valgrind = $enable_valgrind" echo " CC = $CC" -echo " CFLAGS = $CFLAGS" echo " CPPFLAGS = $CPPFLAGS" +echo " SECP_CFLAGS = $SECP_CFLAGS" +echo " CFLAGS = $CFLAGS" echo " LDFLAGS = $LDFLAGS" echo +if test x"$set_precomp" = x"yes"; then +echo " CC_FOR_BUILD = $CC_FOR_BUILD" +echo " CPPFLAGS_FOR_BUILD = $CPPFLAGS_FOR_BUILD" +echo " SECP_CFLAGS_FOR_BUILD = $SECP_CFLAGS_FOR_BUILD" +echo " CFLAGS_FOR_BUILD = $CFLAGS_FOR_BUILD" +echo " LDFLAGS_FOR_BUILD = $LDFLAGS_FOR_BUILD" +fi diff --git a/src/secp256k1/src/ecmult.h b/src/secp256k1/src/ecmult.h index 929e732198..84537bbfed 100644 --- a/src/secp256k1/src/ecmult.h +++ b/src/secp256k1/src/ecmult.h @@ -41,4 +41,4 @@ typedef int (secp256k1_ecmult_multi_callback)(secp256k1_scalar *sc, secp256k1_ge */ static int secp256k1_ecmult_multi_var(const secp256k1_callback* error_callback, const secp256k1_ecmult_context *ctx, secp256k1_scratch *scratch, secp256k1_gej *r, const secp256k1_scalar *inp_g_sc, secp256k1_ecmult_multi_callback cb, void *cbdata, size_t n); -#endif /* SECP256K1_ECMULT_H */ \ No newline at end of file +#endif /* SECP256K1_ECMULT_H */ diff --git a/src/secp256k1/src/ecmult_const.h b/src/secp256k1/src/ecmult_const.h index f02f31a618..d6f0ea2227 100644 --- a/src/secp256k1/src/ecmult_const.h +++ b/src/secp256k1/src/ecmult_const.h @@ -17,4 +17,4 @@ */ static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *q, int bits); -#endif /* SECP256K1_ECMULT_CONST_H */ \ No newline at end of file +#endif /* SECP256K1_ECMULT_CONST_H */ diff --git a/src/secp256k1/src/field_5x52.h b/src/secp256k1/src/field_5x52.h index faaa4a1c70..50ee3f9ec9 100644 --- a/src/secp256k1/src/field_5x52.h +++ b/src/secp256k1/src/field_5x52.h @@ -52,4 +52,4 @@ typedef struct { (uint32_t)(d.n[1] >> 32), (uint32_t)d.n[1], \ (uint32_t)(d.n[0] >> 32), (uint32_t)d.n[0] -#endif /* SECP256K1_FIELD_REPR_H */ \ No newline at end of file +#endif /* SECP256K1_FIELD_REPR_H */ diff --git a/src/secp256k1/src/field_impl.h b/src/secp256k1/src/field_impl.h index 325d8dd646..374284a1f4 100644 --- a/src/secp256k1/src/field_impl.h +++ b/src/secp256k1/src/field_impl.h @@ -137,4 +137,4 @@ static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a) { static const secp256k1_fe secp256k1_fe_one = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); -#endif /* SECP256K1_FIELD_IMPL_H */ \ No newline at end of file +#endif /* SECP256K1_FIELD_IMPL_H */ diff --git a/src/secp256k1/src/gen_context.c b/src/secp256k1/src/gen_context.c index 69eecfd588..f9176eb996 100644 --- a/src/secp256k1/src/gen_context.c +++ b/src/secp256k1/src/gen_context.c @@ -92,4 +92,4 @@ int main(int argc, char **argv) { fclose(fp); return 0; -} \ No newline at end of file +} diff --git a/src/secp256k1/src/group.h b/src/secp256k1/src/group.h index 3834288fbc..b9cd334dae 100644 --- a/src/secp256k1/src/group.h +++ b/src/secp256k1/src/group.h @@ -141,4 +141,4 @@ static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *b); */ static int secp256k1_ge_is_in_correct_subgroup(const secp256k1_ge* ge); -#endif /* SECP256K1_GROUP_H */ \ No newline at end of file +#endif /* SECP256K1_GROUP_H */ diff --git a/src/secp256k1/src/modinv64.h b/src/secp256k1/src/modinv64.h index 2061331da4..da506dfa9f 100644 --- a/src/secp256k1/src/modinv64.h +++ b/src/secp256k1/src/modinv64.h @@ -43,4 +43,4 @@ static void secp256k1_modinv64_var(secp256k1_modinv64_signed62 *x, const secp256 /* Same as secp256k1_modinv64_var, but constant time in x (not in the modulus). */ static void secp256k1_modinv64(secp256k1_modinv64_signed62 *x, const secp256k1_modinv64_modinfo *modinfo); -#endif /* SECP256K1_MODINV64_H */ \ No newline at end of file +#endif /* SECP256K1_MODINV64_H */ diff --git a/src/secp256k1/src/modules/extrakeys/main_impl.h b/src/secp256k1/src/modules/extrakeys/main_impl.h index a1f8b406a5..8607bbede7 100644 --- a/src/secp256k1/src/modules/extrakeys/main_impl.h +++ b/src/secp256k1/src/modules/extrakeys/main_impl.h @@ -284,4 +284,4 @@ int secp256k1_keypair_xonly_tweak_add(const secp256k1_context* ctx, secp256k1_ke return ret; } -#endif \ No newline at end of file +#endif diff --git a/src/secp256k1/src/modules/recovery/main_impl.h b/src/secp256k1/src/modules/recovery/main_impl.h index e7f5f3ce40..9e19f2a2dc 100644 --- a/src/secp256k1/src/modules/recovery/main_impl.h +++ b/src/secp256k1/src/modules/recovery/main_impl.h @@ -1,8 +1,8 @@ -/********************************************************************** - * Copyright (c) 2013-2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ +/*********************************************************************** + * Copyright (c) 2013-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or https://www.opensource.org/licenses/mit-license.php.* + ***********************************************************************/ #ifndef SECP256K1_MODULE_RECOVERY_MAIN_H #define SECP256K1_MODULE_RECOVERY_MAIN_H @@ -120,34 +120,34 @@ static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context *ctx, cons return !secp256k1_gej_is_infinity(&qj); } -int secp256k1_ecdsa_sign_recoverable(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) { +int secp256k1_ecdsa_sign_recoverable(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msghash32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) { secp256k1_scalar r, s; int ret, recid; VERIFY_CHECK(ctx != NULL); ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - ARG_CHECK(msg32 != NULL); + ARG_CHECK(msghash32 != NULL); ARG_CHECK(signature != NULL); ARG_CHECK(seckey != NULL); - ret = secp256k1_ecdsa_sign_inner(ctx, &r, &s, &recid, msg32, seckey, noncefp, noncedata); + ret = secp256k1_ecdsa_sign_inner(ctx, &r, &s, &recid, msghash32, seckey, noncefp, noncedata); secp256k1_ecdsa_recoverable_signature_save(signature, &r, &s, recid); return ret; } -int secp256k1_ecdsa_recover(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32) { +int secp256k1_ecdsa_recover(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msghash32) { secp256k1_ge q; secp256k1_scalar r, s; secp256k1_scalar m; int recid; VERIFY_CHECK(ctx != NULL); ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - ARG_CHECK(msg32 != NULL); + ARG_CHECK(msghash32 != NULL); ARG_CHECK(signature != NULL); ARG_CHECK(pubkey != NULL); secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, signature); VERIFY_CHECK(recid >= 0 && recid < 4); /* should have been caught in parse_compact */ - secp256k1_scalar_set_b32(&m, msg32, NULL); + secp256k1_scalar_set_b32(&m, msghash32, NULL); if (secp256k1_ecdsa_sig_recover(&ctx->ecmult_ctx, &r, &s, &q, &m, recid)) { secp256k1_pubkey_save(pubkey, &q); return 1; diff --git a/src/secp256k1/src/modules/schnorrsig/main_impl.h b/src/secp256k1/src/modules/schnorrsig/main_impl.h index 91d461f6be..693b78f034 100644 --- a/src/secp256k1/src/modules/schnorrsig/main_impl.h +++ b/src/secp256k1/src/modules/schnorrsig/main_impl.h @@ -1,4 +1,3 @@ - /*********************************************************************** * Copyright (c) 2018-2020 Andrew Poelstra, Jonas Nick * * Distributed under the MIT software license, see the accompanying * @@ -254,4 +253,4 @@ int secp256k1_schnorrsig_verify(const secp256k1_context* ctx, const unsigned cha secp256k1_fe_equal_var(&rx, &r.x); } -#endif \ No newline at end of file +#endif diff --git a/src/secp256k1/src/scalar.h b/src/secp256k1/src/scalar.h index 84973bbe56..aaaa3d8827 100644 --- a/src/secp256k1/src/scalar.h +++ b/src/secp256k1/src/scalar.h @@ -102,4 +102,4 @@ static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_ /** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. Both *r and *a must be initialized.*/ static void secp256k1_scalar_cmov(secp256k1_scalar *r, const secp256k1_scalar *a, int flag); -#endif /* SECP256K1_SCALAR_H */ \ No newline at end of file +#endif /* SECP256K1_SCALAR_H */ diff --git a/src/secp256k1/src/scalar_4x64.h b/src/secp256k1/src/scalar_4x64.h index a097d519ab..700964291e 100644 --- a/src/secp256k1/src/scalar_4x64.h +++ b/src/secp256k1/src/scalar_4x64.h @@ -16,4 +16,4 @@ typedef struct { #define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{((uint64_t)(d1)) << 32 | (d0), ((uint64_t)(d3)) << 32 | (d2), ((uint64_t)(d5)) << 32 | (d4), ((uint64_t)(d7)) << 32 | (d6)}} -#endif /* SECP256K1_SCALAR_REPR_H */ \ No newline at end of file +#endif /* SECP256K1_SCALAR_REPR_H */ diff --git a/src/secp256k1/src/testrand_impl.h b/src/secp256k1/src/testrand_impl.h index 50555e573d..c8d30ef6a8 100644 --- a/src/secp256k1/src/testrand_impl.h +++ b/src/secp256k1/src/testrand_impl.h @@ -1,8 +1,8 @@ -/********************************************************************** - * Copyright (c) 2013-2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ +/*********************************************************************** + * Copyright (c) 2013-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or https://www.opensource.org/licenses/mit-license.php.* + ***********************************************************************/ #ifndef SECP256K1_TESTRAND_IMPL_H #define SECP256K1_TESTRAND_IMPL_H diff --git a/src/secp256k1/src/tests_exhaustive.c b/src/secp256k1/src/tests_exhaustive.c index 62e14d7682..5b9a3035d9 100644 --- a/src/secp256k1/src/tests_exhaustive.c +++ b/src/secp256k1/src/tests_exhaustive.c @@ -1,8 +1,8 @@ /*********************************************************************** - * Copyright (c) 2016 Andrew Poelstra * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ + * Copyright (c) 2016 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or https://www.opensource.org/licenses/mit-license.php.* + ***********************************************************************/ #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" diff --git a/src/secp256k1/src/valgrind_ctime_test.c b/src/secp256k1/src/valgrind_ctime_test.c index 3169e3651c..ea6d4b3deb 100644 --- a/src/secp256k1/src/valgrind_ctime_test.c +++ b/src/secp256k1/src/valgrind_ctime_test.c @@ -1,32 +1,68 @@ -/********************************************************************** - * Copyright (c) 2020 Gregory Maxwell * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ +/*********************************************************************** + * Copyright (c) 2020 Gregory Maxwell * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or https://www.opensource.org/licenses/mit-license.php.* + ***********************************************************************/ #include -#include "include/secp256k1.h" +#include + +#include "../include/secp256k1.h" #include "assumptions.h" #include "util.h" #ifdef ENABLE_MODULE_ECDH -# include "include/secp256k1_ecdh.h" +# include "../include/secp256k1_ecdh.h" #endif #ifdef ENABLE_MODULE_RECOVERY -# include "include/secp256k1_recovery.h" +# include "../include/secp256k1_recovery.h" #endif #ifdef ENABLE_MODULE_EXTRAKEYS -# include "include/secp256k1_extrakeys.h" +# include "../include/secp256k1_extrakeys.h" #endif #ifdef ENABLE_MODULE_SCHNORRSIG -#include "include/secp256k1_schnorrsig.h" +#include "../include/secp256k1_schnorrsig.h" #endif +void run_tests(secp256k1_context *ctx, unsigned char *key); + int main(void) { secp256k1_context* ctx; + unsigned char key[32]; + int ret, i; + + if (!RUNNING_ON_VALGRIND) { + fprintf(stderr, "This test can only usefully be run inside valgrind.\n"); + fprintf(stderr, "Usage: libtool --mode=execute valgrind ./valgrind_ctime_test\n"); + return 1; + } + ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN + | SECP256K1_CONTEXT_VERIFY + | SECP256K1_CONTEXT_DECLASSIFY); + /** In theory, testing with a single secret input should be sufficient: + * If control flow depended on secrets the tool would generate an error. + */ + for (i = 0; i < 32; i++) { + key[i] = i + 65; + } + + run_tests(ctx, key); + + /* Test context randomisation. Do this last because it leaves the context + * tainted. */ + VALGRIND_MAKE_MEM_UNDEFINED(key, 32); + ret = secp256k1_context_randomize(ctx, key); + VALGRIND_MAKE_MEM_DEFINED(&ret, sizeof(ret)); + CHECK(ret); + + secp256k1_context_destroy(ctx); + return 0; +} + +void run_tests(secp256k1_context *ctx, unsigned char *key) { secp256k1_ecdsa_signature signature; secp256k1_pubkey pubkey; size_t siglen = 74; @@ -34,7 +70,6 @@ int main(void) { int i; int ret; unsigned char msg[32]; - unsigned char key[32]; unsigned char sig[74]; unsigned char spubkey[33]; #ifdef ENABLE_MODULE_RECOVERY @@ -45,26 +80,10 @@ int main(void) { secp256k1_keypair keypair; #endif - if (!RUNNING_ON_VALGRIND) { - fprintf(stderr, "This test can only usefully be run inside valgrind.\n"); - fprintf(stderr, "Usage: libtool --mode=execute valgrind ./valgrind_ctime_test\n"); - exit(1); - } - - /** In theory, testing with a single secret input should be sufficient: - * If control flow depended on secrets the tool would generate an error. - */ - for (i = 0; i < 32; i++) { - key[i] = i + 65; - } for (i = 0; i < 32; i++) { msg[i] = i + 1; } - ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN - | SECP256K1_CONTEXT_VERIFY - | SECP256K1_CONTEXT_DECLASSIFY); - /* Test keygen. */ VALGRIND_MAKE_MEM_UNDEFINED(key, 32); ret = secp256k1_ec_pubkey_create(ctx, &pubkey, key); @@ -122,12 +141,6 @@ int main(void) { VALGRIND_MAKE_MEM_DEFINED(&ret, sizeof(ret)); CHECK(ret == 1); - /* Test context randomisation. Do this last because it leaves the context tainted. */ - VALGRIND_MAKE_MEM_UNDEFINED(key, 32); - ret = secp256k1_context_randomize(ctx, key); - VALGRIND_MAKE_MEM_DEFINED(&ret, sizeof(ret)); - CHECK(ret); - /* Test keypair_create and keypair_xonly_tweak_add. */ #ifdef ENABLE_MODULE_EXTRAKEYS VALGRIND_MAKE_MEM_UNDEFINED(key, 32); @@ -140,6 +153,12 @@ int main(void) { ret = secp256k1_keypair_xonly_tweak_add(ctx, &keypair, msg); VALGRIND_MAKE_MEM_DEFINED(&ret, sizeof(ret)); CHECK(ret == 1); + + VALGRIND_MAKE_MEM_UNDEFINED(key, 32); + VALGRIND_MAKE_MEM_UNDEFINED(&keypair, sizeof(keypair)); + ret = secp256k1_keypair_sec(ctx, key, &keypair); + VALGRIND_MAKE_MEM_DEFINED(&ret, sizeof(ret)); + CHECK(ret == 1); #endif #ifdef ENABLE_MODULE_SCHNORRSIG @@ -147,11 +166,8 @@ int main(void) { ret = secp256k1_keypair_create(ctx, &keypair, key); VALGRIND_MAKE_MEM_DEFINED(&ret, sizeof(ret)); CHECK(ret == 1); - ret = secp256k1_schnorrsig_sign(ctx, sig, msg, &keypair, NULL, NULL); + ret = secp256k1_schnorrsig_sign(ctx, sig, msg, &keypair, NULL); VALGRIND_MAKE_MEM_DEFINED(&ret, sizeof(ret)); CHECK(ret == 1); #endif - - secp256k1_context_destroy(ctx); - return 0; } From 22e1641912cf20ec51398f1e6f5d2f8c6405a7ad Mon Sep 17 00:00:00 2001 From: VanOrton <> Date: Sun, 3 Apr 2022 15:20:07 +0200 Subject: [PATCH 014/144] Version bump --- configure.ac | 12 ++++++------ debian.minimal/changelog | 8 ++++++++ debian.qt/changelog | 8 ++++++++ share/setup-BGL-win.nsi | 10 +++++----- src/chainparams.cpp | 1 + src/chainparamsseeds.h | 23 +++++++++++------------ 6 files changed, 39 insertions(+), 23 deletions(-) diff --git a/configure.ac b/configure.ac index df1aa5ab6d..2cee099dfa 100755 --- a/configure.ac +++ b/configure.ac @@ -1,13 +1,13 @@ AC_PREREQ([2.69]) -define(_CLIENT_VERSION_MAJOR, 22) -define(_CLIENT_VERSION_MINOR, 99) +define(_CLIENT_VERSION_MAJOR, 1) +define(_CLIENT_VERSION_MINOR, 8) define(_CLIENT_VERSION_BUILD, 0) define(_CLIENT_VERSION_RC, 0) -define(_CLIENT_VERSION_IS_RELEASE, false) -define(_COPYRIGHT_YEAR, 2021) +define(_CLIENT_VERSION_IS_RELEASE, true) +define(_COPYRIGHT_YEAR, 2022) define(_COPYRIGHT_HOLDERS,[The %s developers]) -define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[Bitcoin Core]]) -AC_INIT([BGL Core],m4_join([.], _CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MINOR, _CLIENT_VERSION_BUILD)m4_if(_CLIENT_VERSION_RC, [0], [], [rc]_CLIENT_VERSION_RC),[https://github.com/bitcoin/bitcoin/issues],[bitcoin],[https://bitcoincore.org/]) +define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[BGL Core]]) +AC_INIT([BGL Core],m4_join([.], _CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MINOR, _CLIENT_VERSION_BUILD)m4_if(_CLIENT_VERSION_RC, [0], [], [rc]_CLIENT_VERSION_RC),[https://github.com/BitgesellOfficial/bitgesell/issues],[BGL],[https://bitgesell.ca/]) AC_CONFIG_SRCDIR([src/validation.cpp]) AC_CONFIG_HEADERS([src/config/BGL-config.h]) AC_CONFIG_AUX_DIR([build-aux]) diff --git a/debian.minimal/changelog b/debian.minimal/changelog index 0c5ba0da9d..cf9a9ad023 100644 --- a/debian.minimal/changelog +++ b/debian.minimal/changelog @@ -1,3 +1,11 @@ +bitgesell (0.1.8) UNRELEASED; urgency=low + + * Codebase synced to Bitcoin Core up to 31 Oct 2021 + * New logo and logo icons + + -- Mathias van Orton Sun, 31 Mar 2022 10:05:38 +0000 + + bitgesell (0.1.7) UNRELEASED; urgency=low * Taproot activation rescheduled with relaxed conditions diff --git a/debian.qt/changelog b/debian.qt/changelog index 28d90ce5d4..ac298db471 100644 --- a/debian.qt/changelog +++ b/debian.qt/changelog @@ -1,3 +1,11 @@ +bitgesell (0.1.8) UNRELEASED; urgency=low + + * Codebase synced to Bitcoin Core up to 31 Oct 2021 + * New logo and logo icons + + -- Mathias van Orton Sun, 31 Mar 2022 10:05:38 +0000 + + bitgesell-qt (0.1.7) UNRELEASED; urgency=low * Taproot activation rescheduled with relaxed conditions diff --git a/share/setup-BGL-win.nsi b/share/setup-BGL-win.nsi index 9c1ec89b0c..333751ae3f 100644 --- a/share/setup-BGL-win.nsi +++ b/share/setup-BGL-win.nsi @@ -46,18 +46,18 @@ Var StartMenuGroup !insertmacro MUI_LANGUAGE English # Installer attributes -OutFile ..\BGL-0.1.7.0-win64-setup.exe +OutFile ..\BGL-0.1.8.0-win64-setup.exe InstallDir $PROGRAMFILES64\BGL CRCCheck on XPStyle on BrandingText " " ShowInstDetails show -VIProductVersion 0.1.7.0 +VIProductVersion 0.1.8.0 VIAddVersionKey ProductName "BGL Core" -VIAddVersionKey ProductVersion "0.1.7" +VIAddVersionKey ProductVersion "0.1.8" VIAddVersionKey CompanyName "${COMPANY}" VIAddVersionKey CompanyWebsite "${URL}" -VIAddVersionKey FileVersion "0.1.7" +VIAddVersionKey FileVersion "0.1.8" VIAddVersionKey FileDescription "" VIAddVersionKey LegalCopyright "" InstallDirRegKey HKCU "${REGKEY}" Path @@ -92,7 +92,7 @@ Section -post SEC0001 CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall $(^Name).lnk" $INSTDIR\uninstall.exe !insertmacro MUI_STARTMENU_WRITE_END WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayName "$(^Name)" - WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayVersion "0.1.7" + WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayVersion "0.1.8" WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" Publisher "${COMPANY}" WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" URLInfoAbout "${URL}" WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayIcon $INSTDIR\BGL-qt.exe diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 7c0da0f4be..978beb7724 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -234,6 +234,7 @@ class CTestNetParams : public CChainParams { vFixedSeeds.clear(); vSeeds.clear(); + vSeeds.emplace_back("seedtest.satoshithefirst.com"); // BGL primary seed node // nodes with support for servicebits filtering should be at the top // -- no seeds defined for now -- diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h index 6fc5dccec8..f5e9315d95 100644 --- a/src/chainparamsseeds.h +++ b/src/chainparamsseeds.h @@ -21,17 +21,16 @@ static const uint8_t chainparams_seed_main[] = { }; static const uint8_t chainparams_seed_test[] = { - 0x04,0x20,0xdf,0x55,0xaa,0x83,0xd5,0xc5,0xb8,0xe7,0x75,0x78,0xd4,0x29,0x51,0x4b,0x26,0x1c,0x23,0xdf,0x28,0x4d,0x29,0x85,0x07,0xb5,0xe2,0x29,0x69,0x3e,0x25,0xbb,0x61,0xcf,0x47,0x9d, - 0x04,0x20,0x0a,0xdd,0xa2,0x48,0xb5,0x56,0xa3,0x1f,0xca,0x3c,0x4c,0x9e,0xca,0x6e,0xb3,0xd5,0x5e,0x68,0xf6,0x28,0x31,0x57,0x24,0xfb,0x9d,0x2b,0x55,0x4f,0xd7,0x90,0x62,0xd3,0x47,0x9d, - 0x04,0x20,0x2d,0x04,0xa1,0x4a,0xd4,0x7c,0x7b,0x16,0x2e,0xb7,0xd2,0xa1,0x08,0xc5,0xd2,0xbd,0x53,0x87,0x34,0xdc,0x38,0x26,0xca,0x56,0xf2,0xac,0xc5,0x62,0x70,0x72,0x3f,0x63,0x47,0x9d, - 0x04,0x20,0x30,0x57,0x85,0xe0,0x02,0x4a,0xd1,0x31,0xeb,0x16,0x1b,0x1d,0xa8,0x43,0x0b,0xb4,0xc6,0xac,0x7d,0x46,0x24,0x0b,0x55,0x9d,0x16,0xe6,0x46,0x03,0x72,0xfe,0xd4,0xef,0x47,0x9d, - 0x04,0x20,0x36,0x6c,0xf1,0xd2,0xbb,0xda,0xff,0x8c,0x93,0x61,0x10,0xf2,0x9d,0xa1,0xa4,0x0a,0x30,0x9b,0x0c,0x69,0x6d,0xaa,0xd4,0x9c,0xfd,0xb5,0x5b,0x5e,0x30,0x9f,0xf3,0x13,0x47,0x9d, - 0x04,0x20,0x3e,0xe2,0xf3,0xe5,0xc5,0xbe,0x61,0xdd,0x4c,0x3e,0xdb,0x0d,0xd2,0xf9,0x42,0xe3,0x31,0xb2,0xa8,0x51,0x31,0xf6,0xce,0xc2,0x38,0x20,0x27,0x39,0x73,0x68,0x5a,0x42,0x47,0x9d, - 0x04,0x20,0x51,0x79,0x05,0x9c,0x8a,0xdf,0x03,0xb5,0x1b,0x17,0xc3,0x86,0xb6,0x54,0xcc,0xe0,0x6e,0x58,0xa6,0x41,0x4c,0xcc,0x0c,0x60,0x08,0xa6,0x0f,0x1d,0x11,0xd8,0x29,0xa6,0x47,0x9d, - 0x04,0x20,0x60,0xbe,0xae,0x7d,0xa3,0x4d,0x6a,0x71,0x1a,0x5d,0xe5,0x98,0x9c,0xde,0xa0,0x99,0x39,0x19,0xd3,0x01,0x0a,0x5d,0x1c,0x21,0x43,0x94,0x92,0x71,0x5d,0x77,0xd7,0xdf,0x47,0x9d, - 0x04,0x20,0x64,0x4e,0x86,0xa1,0x02,0xa1,0x8a,0xef,0xb0,0xd1,0xb5,0x77,0x69,0xb9,0x6a,0xdc,0xdf,0x35,0x8a,0xda,0xa4,0x3e,0x83,0xfa,0x50,0xe6,0xca,0x0e,0x2b,0x99,0x0a,0x17,0x47,0x9d, - 0x04,0x20,0xa2,0x28,0x3c,0x5a,0x5b,0x82,0x32,0x66,0x11,0xe5,0x71,0xff,0x6b,0x25,0x92,0x75,0xdd,0x7a,0x4f,0x90,0x8b,0x1d,0x34,0xa4,0xf1,0x6e,0xb9,0xfb,0xb5,0x2e,0x7c,0x7f,0x47,0x9d, - 0x04,0x20,0xc8,0xb5,0x6a,0xba,0x02,0x26,0x45,0x12,0xfb,0x93,0x8a,0x51,0xe4,0xb0,0xf3,0x94,0xb7,0xc0,0x74,0x72,0xeb,0x67,0x91,0x9e,0x04,0x36,0x6a,0x4b,0xef,0x0d,0x88,0xfe,0x47,0x9d, - 0x04,0x20,0xc8,0xfa,0xcd,0x8c,0xc3,0x6f,0x3c,0xd0,0x27,0x7e,0x7d,0xeb,0x51,0x01,0x65,0xb6,0x9e,0x02,0x09,0x64,0xf4,0x87,0x78,0x7b,0x8f,0x9d,0xaf,0x3b,0xa5,0xcc,0x56,0x2c,0x47,0x9d, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4d,0xda,0x24, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xec,0x5b,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x9a,0xe7,0xcd, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x72,0x4f,0x37,0x68, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x75,0x59,0x1f, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x8d,0xe3,0xee, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x0e,0x29,0xd1, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x26,0x63,0x7f, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x7a,0x96,0x9b, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0xf7,0xd0,0x7f, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x84,0x84,0xa6 }; #endif // FCO_CHAINPARAMSSEEDS_H From a2972fc0397c595b9a6fce2ac4af2eabdd96f40a Mon Sep 17 00:00:00 2001 From: VanOrton <> Date: Sun, 3 Apr 2022 15:47:55 +0200 Subject: [PATCH 015/144] Icons and resources update for new branding --- share/pixmaps/BGL.ico | Bin 144214 -> 140976 bytes share/pixmaps/BGL128.png | Bin 17601 -> 1250 bytes share/pixmaps/BGL128.xpm | 463 +++++++++++----------- share/pixmaps/BGL16.png | Bin 901 -> 339 bytes share/pixmaps/BGL16.xpm | 233 +++-------- share/pixmaps/BGL256.png | Bin 43098 -> 1782 bytes share/pixmaps/BGL256.xpm | 710 +++++++++++++++++----------------- share/pixmaps/BGL32.png | Bin 2637 -> 735 bytes share/pixmaps/BGL32.xpm | 248 ++++++------ share/pixmaps/BGL64.png | Bin 6796 -> 865 bytes share/pixmaps/BGL64.xpm | 319 +++++++-------- share/pixmaps/nsis-header.bmp | Bin 25818 -> 25818 bytes share/pixmaps/nsis-wizard.bmp | Bin 154542 -> 154542 bytes src/qt/res/icons/BGL.icns | Bin 153728 -> 23358 bytes src/qt/res/icons/BGL.ico | Bin 144214 -> 140976 bytes src/qt/res/icons/BGL.png | Bin 149510 -> 4442 bytes src/qt/res/icons/BGL16.png | Bin 901 -> 339 bytes src/qt/res/src/BGL.svg | 528 +++++++++++++++++-------- 18 files changed, 1280 insertions(+), 1221 deletions(-) diff --git a/share/pixmaps/BGL.ico b/share/pixmaps/BGL.ico index a3a9321cba53b4e6714c634c7185df364804f73f..9ac4542b7c1f0eff32c5921486e090af108fe8f4 100644 GIT binary patch literal 140976 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 z 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 diff --git a/share/pixmaps/BGL128.png b/share/pixmaps/BGL128.png index 6bac483b42fc3b32a6c650e8d44dc933952a1e16..253c7d1b05390de00c9c50d65dacd615cafc321b 100644 GIT binary patch literal 1250 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 c #2BB4B4", -", c #2EB9B9", -"< c #33B3B3", -"1 c #3BB2B2", -"2 c #34BBBB", -"3 c #3BBDBD", -"4 c #43B5B5", -"5 c #4AB7B7", -"6 c #43BEBE", -"7 c #4DB9B9", -"8 c #55BCBC", -"9 c #5ABEBE", -"0 c #37C0C0", -"q c #3CC2C2", -"w c #43C4C4", -"e c #4BC5C5", -"r c #46C9C9", -"t c #4CCBCB", -"y c #50C7C7", -"u c #5EC0C0", -"i c #53CDCD", -"p c #5BCDCD", -"a c #54D2D2", -"s c #5BD4D4", -"d c #5DD8D8", -"f c #64C2C2", -"g c #6CC5C5", -"h c #62CECE", -"j c #71C7C7", -"k c #74C8C8", -"l c #7DCCCC", -"z c #63D5D5", -"x c #6BD6D6", -"c c #66DEDE", -"v c #69DFDF", -"b c #72D6D6", -"n c #73DCDC", -"m c #7BDDDD", -"M c #67E0E0", -"N c #6CE1E1", -"B c #73E3E3", -"V c #7BE6E6", -"C c #76E9E9", -"Z c #7DE9E9", -"A c #84CECE", -"S c #88CFCF", -"D c #8CD2D2", -"F c #82DEDE", -"G c #93D4D4", -"H c #9AD7D7", -"J c #9DD8D8", -"K c #A3DADA", -"L c #ABDEDE", -"P c #B1DFDF", -"I c #81E6E6", -"U c #8CE6E6", -"Y c #84E9E9", -"T c #8BEBEB", -"R c #90E7E7", -"E c #93EEEE", -"W c #99EDED", -"Q c #93F1F1", -"! c #9DF1F1", -"~ c #A3EFEF", -"^ c #B4E1E1", -"/ c #BDE5E5", -"( c #A3F3F3", -") c #ABF5F5", -"_ c #A7F8F8", -"` c #ABF9F9", -"' c #B2F7F7", -"] c #B5F9F9", -"[ c #BBFBFB", -"{ c #C2E6E6", -"} c #C6E9E9", -"| c #CBEAEA", -" . c #D4EEEE", -".. c #D9EFEF", -"X. c #C3FEFE", -"o. c #C9FFFF", -"O. c #DCF1F1", -"+. c #D1FFFF", -"@. c #E3F4F4", -"#. c #EAF6F6", -"$. c #EEF8F8", -"%. c #F3FAFA", -"&. c #FDFDFD", -"*. c None", +"128 128 101 2 ", +" c #5F24E2", +". c #6329E3", +"X c #632AE3", +"o c #642BE3", +"O c #652BE3", +"+ c #652CE3", +"@ c #652DE3", +"# c #672DE3", +"$ c #672EE3", +"% c #662DE4", +"& c #672DE4", +"* c #672EE4", +"= c #672FE4", +"- c #682FE4", +"; c #6830E4", +": c #6930E4", +"> c #6931E4", +", c #6A32E4", +"< c #6A33E4", +"1 c #6B34E4", +"2 c #6C34E4", +"3 c #6C35E4", +"4 c #6C35E5", +"5 c #6D36E5", +"6 c #6D37E5", +"7 c #6E37E5", +"8 c #6E38E5", +"9 c #6F39E5", +"0 c #6F3AE5", +"q c #703AE5", +"w c #703BE5", +"e c #713BE5", +"r c #713CE5", +"t c #723EE5", +"y c #7541E6", +"u c #7542E6", +"i c #7642E6", +"p c #7744E6", +"a c #7947E7", +"s c #7A49E7", +"d c #7B4AE7", +"f c #8151E8", +"g c #8253E8", +"h c #8456E9", +"j c #8557E9", +"k c #8558E9", +"l c #8659E9", +"z c #8759E9", +"x c #875AE9", +"c c #8C61EA", +"v c #8D63EB", +"b c #8E63EB", +"n c #8E64EB", +"m c #8F65EB", +"M c #9066EB", +"N c #9168EB", +"B c #946CEC", +"V c #946DEC", +"C c #956DEC", +"Z c #956EEC", +"A c #966FEC", +"S c #9770EC", +"D c #9771EC", +"F c #9872EC", +"G c #9973ED", +"H c #9A73ED", +"J c #9A74ED", +"K c #AD8FF0", +"L c #B69BF2", +"P c #B79CF2", +"I c #B89EF2", +"U c #B99FF2", +"Y c #BDA5F3", +"T c #C2ABF4", +"R c #C2ACF4", +"E c #C3ACF4", +"W c #C3ADF4", +"Q c #C4ADF4", +"! c #C4AEF4", +"~ c #D8CAF8", +"^ c #D9CAF8", +"/ c #DACCF8", +"( c #DBCDF9", +") c #DCCEF9", +"_ c #DCCFF9", +"` c #DFD3F9", +"' c #E1D6F9", +"] c #F6F2FD", +"[ c #FBF9FF", +"{ c #FBFAFF", +"} c #FBFBFF", +"| c #FCFAFF", +" . c #FCFBFF", +".. c #FDFBFF", +"X. c #FDFCFF", +"o. c #FDFDFF", +"O. c #FEFDFF", +"+. c #FDFEFF", +"@. c #FEFEFF", +"#. c #FFFEFF", +"$. c white", /* pixels */ -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.+ X X X X X X X X X + X X + X X X X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X X X X X + X X + + X X X X X X X + X X + + X X X + X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X X X + X X X + + + X + + @ @ @ @ # @ + + X + + X + + + X X X X + X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X + X X + X + X X + % : 2 w d c M M N C C C N N N N c c t q : % @ + X X + X X X + X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X X X + + X @ & q d N N C N N N C C B v a a M N N N N M N N B N B N N t , % + X + X X X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X + X + X % q d B C N N N N N B B v s w > # X X t B N N N N N N N N M N N N N N N t & @ X + X X + X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X X + X + # q c N C N N M N N N N d r > % X . . . X . : C N N N N N N N N N v N M N N N N C N a & @ X X X X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X + X X + X + > d N C N N M N N N N B r # X X . X = u K l . # N N N N N N N N N N N N N N N N M N M N B N 0 @ + X + X + X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X X + @ 0 N C C C N c N B N N N N N # . X * 8 G | %.&.&.O.X X d B N B B B v N N N N B N N N N N N v N v v B C t % + X X + X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X + X X @ 0 C Z N d t 2 = @ # s B N N B B & . f %.&.&.&.&.&.&.%.- . w Z B B v B B N B N B N B N N N N N N v N N v M M C t % X X + X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X X + + 0 B c t , % + X . . X . 2 C N B B C 2 . 7 &.&.&.&.&.&.&.&.9 > V B B B B B B B B N B v B B n N B v N N v N M N M N B t @ + X + + X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X + X : B t # X . . . . # 1 l 8 . = B B B B C a . # $.&.&.&.&.&.&.&.G . % B B B B B B B B B B B B B N B v B B B N N N v N N N N N B 0 + X X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.+ X + X @ s C c X X X $ 7 A / #.&.&./ . @ v B B B V c X . { &.&.&.&.&.&.&.| X X c V B V B B B B B B B B B B B B B v B v B N N N N N v N v N N & X X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X + X 2 C N N c + . A $.&.&.&.&.&.&.O.@ X a Z B B V V & . S &.&.&.&.&.&.&.%.* . t Z B B B V V B V B B B B B B B B B B B N B N N N N N v N v M B t X X + X + *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X + + @ a B M M N B : . l &.&.&.&.&.&.&.&.; . w Y B V B Z 2 . 7 &.&.&.&.&.&.&.&.8 . 2 Y B V V B V n V B B B V B B B B B B n B v N B B v N N v N N c N c % + + X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.+ X X X & N N c N N N C 2 . 1 &.&.&.&.&.&.&.&.u . > Z B B V Y t . & %.&.&.&.&.&.&.&.S . % V V V V V V V B V V V B V B V B B B B B B B N B B N B N N N M N M C : X X X + *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.+ X X + 2 B N M N M N N B a . # #.&.&.&.&.&.&.&.H . # V V V V I c X X { &.&.&.&.&.&.&./ . + v Y B C Z V V V V V B V B B V B V B B B B B B B B N B N N N N N c M N t X X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X X r C v M N N N N N B c + X ^ &.&.&.&.&.&.&.| X X x V V V Z V # . G &.&.&.&.&.&.&.$.$ . a T V V Z V V V V V V V V B V n V B V V B B B B B B v B N N N N N N N N d @ + X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X + d N M N M N N N N B B V & l &.&.&.&.&.&.&.$.$ . i Y V V Z Y 2 9 &.&.&.&.&.&.&.&.5 . 3 T I I Z Z Z Z Z V V Z V V V V B V B B V B B B B B B B B N N N N N N v N N @ X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X + c N N N N N N N N B N B Z 2 . 5 &.&.&.&.&.&.&.&.5 . 0 T Z V Z T y . = &.&.&.&.&.&.%.&.l . = T I I I I T Y Y Y Y Y I Z V V V V V V B V B B V B B n N B B N N N N N v N N % X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.+ X X @ c N N N v N N B v B B B B Z y . # %.&.&.&.&.&.&.&.k . : Y Z Z Z Y c X X | &.&.&.&.&.&.&.P . o V Q Y V n c z z z z x B V Z Y T Z Z V B V B B B B B B B B B B v v N v N N N N @ + X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X + c N v M v N N N N B B B B B V c X X { &.&.&.&.&.&.&.L . @ V Y I Y Y I # H &.&.&.&.&.&.&.@.# X : > & @ X X . X X X X @ # : 2 e z Z Y I V B V B V B V B B v B B B v B v N M N N # + X + *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X @ c N M N N N N N B N n B B B B V V % . S &.&.&.&.&.&.&...X X z T Y Y Y E 2 . f &.&.&.&.&.&.&.&.; . . . . . X X O * $ o X . . . . X # w v T V V B B B B B B B B v N B N N N M N M N @ + X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X + c N M N N v N B N B B B B B V B B Y 2 . 8 &.&.&.&.&.&.&.&.- . t Q T Q T Y 3 . - &.&.&.&.&.&.&.&.^ 4 9 A J ^ | ..@.%.$.@...{ K A 8 - X . . o 0 V Y V V V B V B B B B B N B N N N N N N N + X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.+ + X + t N v N v N N N B N B B B B B B V V Y t . * %.&.&.&.&.&.&.&.9 2 T x y > # X . O $.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.| l * . . # z T C B V B V B n B B B N N B v v v N N d + + X X *.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.X X + 0 B N N v v B v N B B B B B B V B V V Z c X X } &.&.&.&.&.&.&.D . @ # X . . . X ; H &.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.$.A o . X i T C B V B V V B B B B B v B B v N v N t X X X *.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.X + X & C M N v N N N B B n B B B B B V V B V I V # . H &.&.&.&.&.&.&.| . . . X - f J O.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.} - . . e T Z B V V B B B B B N B v N N v N c N , X X + *.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.X X X @ C M N N v v B B v B B B B B V B V V Z Z Y E 2 . 9 &.&.&.&.&.&.&.&.J f G ..%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.7 . . t T V V B B V B B B B B N B N N N N c B % X X X *.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.+ X X + d N c N v N N B B B B B B B V V V Y Y T C v s : . = &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.8 . X s T V B V B V B B B B N B N N N N M N c + + X + *.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.X X X 0 B c N N N N v B N B B B Z Z Y Z B z e 2 % X . . . - %.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.1 . o n Y V V V B V V B B n N B N N N N M N t X X X *.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.X X X % C v v v N N N N B V Z I Z v s w : @ X . X * 5 l .&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.@.# . : Y Z V B V B B n B B B B N N N N N M N & X X X *.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.X X X c M v N N B B C V B c t 3 & @ . . . . X - 9 G { $.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.K . X a T V V V V V B B B B N B B N N N N M N + X + *.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.+ X + , N M N N N N d w 2 % X . . . # ; g K ..%.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.4 . = Y Z V V V B V B B B B n B N N v v N N 0 + X X *.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.X X X @ C M M N N B 2 X . . X $ 4 A P @.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.{ X X c Y V V V V B V B B B N B B N B v N v C @ + X X *.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.X X X r N v c N N B : . # 9 G { %.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%...{ ^ K H H K { @.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.; w T V V V V B V B V B B B N v N N v N N a + X X *.*.*.*.*.*.*.", -"*.*.*.*.*.*.X X + # B M N N N N V q . 4 &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.| H f 1 $ o X . . . . . X # ; A O.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.k . = T Z Z Z Z V V B B B B B B B N N v N N N % + + X *.*.*.*.*.*.", -"*.*.*.*.*.*.X + X t N v M N N N C i X # #.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.%.&.&.&.&.&.&. .K 9 = X . . X o # % & & % @ X . O k %.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.L . @ V Y V V Z V V V B B B B B n B N v N v N a + X X *.*.*.*.*.*.", -"*.*.*.*.*.+ X X @ B v N N N N N B v o . / &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.G - o . X $ 2 i x m T ! ! ( ! ! E n e # . . ; | &.&.&.&.&.&.%.&.&.&.%.&.&.&.&.&.&.&...X X n Y I V V V V B B V B B B B B N B v v v N % X + X *.*.*.*.*.", -"*.*.*.*.*.X X X t N v N N v N B B B & . l &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&...X . X % 2 p I W _ ` ` _ ( ! ( ! ( ( ( _ ` W e X O | &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.#.# . z T I I V V V V V B B B B B B N B N N N v a X + X *.*.*.*.*.", -"*.*.*.*.*.X + @ N M v N v B v B B Z 2 . 5 &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.#.= . e ! ) ` _ ( ~ ( ! ! ( ! ( ! ! ! ! ! ! ( ] m # . - %.&.%.&.&.&.%.&.&.&.&.&.&.&.&.&.&.%.$ X z T I Z I I V V V B V B B B v B v N N v c B @ X X *.*.*.*.*.", -"*.*.*.*.+ X X 0 C M v N N N B B B Z i . $ %.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.u 6 ` ( ! ! ( ! ! ! ( ( ( ! ( ! ( ( ! ( ! ! ` I o D &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.- . z T Y Z I Z V V V V B V B B B B v B N N N N w + X X *.*.*.*.", -"*.*.*.*.X X + C M M N v N N N B B Z c X . { &.&.&.&.&.#.| { | #.&.&.&.&.&.&.&.&.%.&.&.%.&.&.&.&.&.&.&.H . % ! ( ( ! ( ~ ( ( ( ~ ( ( ( ( ( W ( ! ( ! ( ` w - &.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.%.* . z T Y I I Z V V V V V B B B B B B v N N v v B + + X *.*.*.*.", -"*.*.*.X X X & C M N N N v B B B B B V % . G &.$./ l 4 # X X X # 8 { &.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.{ X X U ) ( ( ( ( ( ~ ( ( ( ( ( ~ ( ~ ( ( ( ! ! ) I X X | &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.#.# . c T Y I I Z V V V V V B B B B v N B N v v N N : + X X *.*.*.", -"*.*.*.X + X t N c N N N B v B B B B Y 2 . - 9 $ . . . . X X X . . k &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.$ . x ` ~ ( ( ( ( ( ( ( _ ( ( ( ( ( ( ( ( ( ( ) ~ # K &.&.&.&.&.&.&.&.&.&.&.&.%.&.&.} X X V T Y Y I I V V V V V B V n B B B N B N N v N s + X X *.*.*.", -"*.*.*.X + @ N M N v N N v B B B V B I t . X . . + & w s n Z m s = . . G &.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.5 e ] ( ( ( ) ( ) ~ ( ( ( ~ ) ( ( ( ( ( ( ( ~ ) 2 k &.&.&.&.%.&.&.&.&.&.&.&.&.&.&.G % T T Y Y Y I I I V V V V B V B B B B N N v N M C @ X + *.*.*.", -"*.*.+ X X : N N N v N N B B B B B B Z n & # 2 i B Y T E T T T ! Q 2 . # #.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.A > ) ( ) ( ( ) ( ) ) ) ) ) ( ) ( ) ) ( ~ ( ( ' 3 g &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.7 3 Q Y Y Y Y I I Z V V V V V B B B B n B N v N M N : X X X *.*.", -"*.*.X X X t N v v N v B B B B B B V V Z I Z T T T Y Y Y Y T U T W I @ . K &.&.&.&.&.&.&.&.&.%.&.&.&.&.&.^ . @ W ) ~ ) ) ) ) ) ) ) ) ) ) ) ) ( ~ ) ( ( ( ) = S &.&.%.&.&.&.&.%.&.&.&.&.&.&.@.o . z E T Y Y I I I Z Z V V V B B B B B N B N N N N M a + + X *.*.", -"*.*.X X @ N c N N v B N N n B B B V B V Z I Z Z Y I Y T Y T T T T W 2 g &.%.&.&.&.%.&.&.&.&.&.&.&.&.&.@.@ . I ] ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ( ) ] V . . } &.&.&.&.&.&.&.&.&.&.&.&.&.&.A . @ T T Y T Y Y Y I I V I V V V B B B B B N N N N N M B + X X *.*.", -"*.*.+ X % N N N N N N B N B B V B V B V V I Z I Y Y Y Y U T T T T ! t . ; &.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.; h [ ) ) ) ) ) ) ' ) ' ) ) ) ) ) ) ) ) ) ' > . 1 &.&.&.&.&.&.&.&.&.&.&.&.%.&.#.# . w Q T Y Y Y Y Y I I I V V V V V V V B B B N N N N v C % + X *.*.", -"*.+ X X 2 N M M N N N B B B B B B V V V V I I I Y Y Y U Y T T E T ! n . X ..&.&.&.&.&.&.&.&.&.&.%.&.&.%.&.f 1 [ ) ) ) ) ' ' ) ' ) ' ) ' ) ) ) ) ) X.h . . / &.&.&.&.&.%.&.&.%.&.&.&.&.%.4 . o I E T T T U Y Y I I I V V V V B B B B B B N N N v N N 2 X X X *.", -"*.X X X a N N M N N B v B B B V B V V V Z Z I I Y Y Y T T T T T T Q T # . K &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.J . $ ) ' ' ) ' ' ' ' ' ' ' ' ' ) ) ' ) X.m X . f &.&.&.%.&.&.&.&.&.&.&.&.&.&.8 . . z ! T T T T Y Y Y Y I I I V V V B V B B B n N B N N N v s X X + *.", -"*.X X + N c M N N n N B B B B B V V V V V I I Y Y Y Y Y T T T T E E ! 2 . f &.&.&.&.&.%.&.&.&.%.&.&.&.&.&.| X X E [ ' ' ' ' ' ' ' ' ' ' ' ' ' ] [ b X . - $.&.&.&.&.&.&.&.&.&.&.&.&.&.g . X p ` ! W E T T Y T Y Y Y I V V V V V B B B B B B N v N v v N + X X *.", -"*.X + % N M M N N B B B B B B V V V V V I I I Y Y U Y T T T T T T E ( y . ; &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.= . b X.' ' ' ' ' ' ' ' ' ' ' [ o.W 3 . . - @.&.&.&.&.&.&.&.&.&.&.&.&.&.G . X @ e i s b Y Q W T Y Y I Y I I V V V V V B B B n B v B N N M N # X X *.", -"*.X + & C M M N N N v B B B V B V V V V Z I I Y Y Y T T T T E E E Q ! m X X ..&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.8 e [ ' ' ] ] ] ' ] ] [ o.X.W e o . . 7 #.&.&.&.&.&.&.&.%.&.&.&.&.&.&.8 . . . . . X @ 3 c T Q Y Y I I Z I V V V V B B B B B B v N M N C : X + *.", -"X X X , N v N v N N B B B B B V V V V V I I I Y T Y T T T T E T E E Q T # . L &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.A - [ ] ' ] ] ] X.o.o.) b < X . . * J &.&.&.&.&.&.&.&.&.&.%.&.&.%.&.&.O.G j u 9 4 - X . . . = c T T Y Y I I V V V V B V B B B N B N N M N 2 X X X ", -"X + X t N c N N N B N n B B B V B V Z Z I I I Y Y Y Y U T T T E T E W ( > . g &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.^ . o ~ X.X.o.o.X.) F 6 # . . . - S %.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%...H 4 X . . 3 Y T I Z V V V V V B B B B N B v N N M N t X + X ", -"X X X s N c N v N N B B B B V B V V V V Z I I Y Y T T T T E T T E E E _ t . ; &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.@.# . U o.~ F p < @ . . @ 8 P %.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&./ 1 . . = Z T I Z Z V V V B V B B n B v N v N M s X X X ", -"X + + M M N N N N B N B n B B V V V V Z Z Y Y Y U Y Y T U T E E E W Q ! n . O @.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.; . > - X . . # 5 H @.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.S X . # V Y I V V V V V B B B B B B N N v N N + X + ", -"+ + X N M M N N N B B B B V B V V V V I I Y Y Y T Y T T T E E T E E E ! T @ . P &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.g . . X # 4 k L @.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.^ o . % Y Y V Z V V B V B B N B v N v N v N + X X ", -"X + # N M M N N N v B B B B V B V V V I I I Y Y Y T Y T T T T E E E W Q ! - . l &.&.&.&.&.&.&.&.&.&.&.&.&.&.&...7 7 S / #.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.P X . > T Z V V V B B B B B B v N N N c N @ + X ", -"X X # N M M N N N B B B B B B V V V V I I I I Y Y T T T T T E E E E W Q _ w 4 &.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.G X . y T V V V V B B B B N B N v N v C # + + ", -"X + # N M M N N v B B B B B V B V V V Z I Y Y U U Y Y T E T T E Q W W Q ( x . $ %.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.8 . @ V I V V B V B B B B N N N N v N # + + ", -"X + @ C N M N N N B B B B B V V V V V I I I Y Y Y T T T T E E E E E Q W ! Y X X { &.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.@.# . w Y V V B B B B n B v N N N M N % X X ", -"X X % N M N N N B N v B B V B V V V V I I I Y Y T Y U T T T T E E E W Q ! ! % . G &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.%.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.l . @ V V V V V B B B B B N N M M C @ X + ", -"X + # C c v v N N B B B B V V B V V V Z I I Y Y T Y T T U E E E E Q W Q W _ 3 . 9 &.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.@.} { K K H K / ..%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.%.&.&.&.&.&.&.&.@.o . i Y V B B B B B N B v v N v N @ + + ", -"X + # N v N N N N N B B B B B V V V V I I Y Y Y Y T Y T T T T T E E W W W _ p . - &.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&...L S f 4 - @ X . . . . . X - u { &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.7 . 2 Y V V B V B B B N B v N v B % X X ", -"+ X @ C N N N N N B N B B B B V V V V I I I Y Y Y T U T T E E E E E W Q W ( V . o ..&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.} G 8 - X . . . . X # & & = $ # X . . X 5 | &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.G . # V Z B B V B n B v N B v v N % X + ", -"X X % N c c N N N N n B B V B V V V Z Z I I Y Y Y Y T T T T T E E E W Q Q ! W @ . K &.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&. .H u - X . X # < 5 h n R W ) ' ) ) ) ( R h = . . X D &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.| X X c Z V B B B B B B N v v v C @ X X ", -"X X @ N v N N N N B B B B V B V V V V V I I Y Y U Y T T T T E E E E W W Q ! ( > . k &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.f X . . & 6 l R ' X.o.o.o.X.[ ' ' ' ' ) ) ' ] ) n & . . j &.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.%.& . i I V V B B B B v N N N N N # + + ", -"+ X + N v v c N B N B N B B B V V V V I Z Z Y Y Y T T T T E T E E E E Q W W _ e 4 &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.$ . # 6 x W [ o.+.o.[ [ ' [ ' ' ' ' ' ) ) ) ) ) ( ) ] ! 6 . . D &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.4 . q Y B B V B B N B N N c c N + + X ", -"X + + M N c N N N N B n B B B V V V V I I Y Y Y Y Y Y T T T E T E E W Q Q ! _ x . # %.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.9 . 6 +.o.o.X.[ ] ] ] ] ] ' ' ' ' ) ) ) ) ) ) ( ( ( ( ) ] 3 . o O.&.&.&.&.&.%.&.&.%.&.&.&.&.&.&.&.&.&.k . > Y B B B B B N N N N N M M X X X ", -"X X + d N v v N N N B N B n V B V V V V I I I Y Y U Y T T T T E E E E E W Q ( U X X } &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.H . = ' [ ' ] ] ] ] ] ] ' ' ' ' ' ' ) ) ) ) ) ( ( ( ( ! _ ! # . l &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.G . % V V B B B N B N N v M M d + X X ", -"X X X r N M N N N B B B B B B V V V V Z V I I Y Y Y T Y T T E T T E W Q W W ! ! & . G &.&.&.&.&.&.%.&.&.%.&.&.&.&.&.| X X W [ [ ] ] ] ' ' ' ' ' ' ) ' ) ) ) ) ) ( ) ~ ( ( ! ! ` e - &.&.&.&.&.&.&.&.%.&.%.&.&.&.&.%.&.&.^ . % V B B B B v N B N N M N t + X + ", -"X + + , N M N N N v v B B B B V B V V Z Z I I Y Y Y T T T T T T E E E E Q Q W _ 3 9 &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.$ . b o.] ] ] ' ' ' ' ' ' ' ' ) ) ) ) ) ( ) ( ( ~ ! ( W _ m X X ..&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.{ X @ v V V B B B B v v N N N , + X X ", -"*.X X : B c M N N B B v B B B B V V V V Z I I Y Y U Y T T T T E T T W E E W Q _ p . - &.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.7 y X.' ' ' ' ' ' ' ' ' ) ' ) ) ) ) ) ( ( ( ! ( ( ( ! ( W @ . P &.&.&.&.%.&.&.&.&.&.%.&.&.%.&.&.&.{ X @ n V B B B n v B N N c B : X X *.", -"*.X + @ N M c v v B v B B B B V n V V V Z I I I Y Y Y T U T T T E E E E W Q W ( m X o ..&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.A > ' ' ' ' ' ' ' ' ' ) ) ) ) ) ) ( ) ( ( ( ( ( ! W ! ! ! : . H &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&./ . @ B B B B B N B N v N v N @ + X *.", -"*.X X + N M M N v B N B n B B V n V V V V Z I I Y Y Y Y T T T T E T E E Q W Q ! W @ . L &.&.%.&.&.&.&.&.&.&.&.&.&.&.&.^ . @ ~ ' ' ' ' ) ' ) ' ) ) ) ) ( ( ( ( ~ ( ( ! ( ! ! ! ! _ > . H &.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.H . $ V B B B B B v N N N M N + + X *.", -"*.X X X a N M M N N B N B B B B B B V V V I I I Y Y Y U Y U T T T E T E E E Q W W > . k &.&.&.&.&.&.&.%.&.%.&.&.&.&.&.@.O . I [ ' ' ' ) ) ) ) ) ) ) ) ) ( ) ( ( ( ( ( W ! ! Q ! W # . K &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.A . = V B B B N B N N N M M a X X X *.", -"*.+ X X 2 N M N N N N N N B B V V B V V V V I I I Y Y Y T T T T T E E E E E W Q _ e 4 &.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.; . h [ ) ) ) ) ) ) ~ ) ) ( ) ~ ( ( ( ~ ( ! ! ! ! ! ! _ x . X .&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.u 2 Z B B B B N N N M M N 0 X + X *.", -"*.*.+ + % N M M v N N B N B B B B V V V Z Z Z I I Y Y Y T Y T T T T T E E E E W ( x . $ #.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.f 3 ] ) ' ~ ) ) ) ) ) ) ( ) ( ( ( ( ( ! ( ! ! ! W ! ( & 5 &.&.&.&.&.&.&.&.&.&.&.%.&.&.%.&.&.&.; . w Y B B B N N N N N M B % X X *.*.", -"*.*.X X + N M M N N N B N N B B B B V B V V I Z I Y Y Y Y T T T E T E T E E E E ! Y X X / &.&.&.&.&.&.&.&.&.&.%.&.&.&.&.J . & ) ' ~ ) ) ( ) ( ) ( ( ( ( ( ( ! ( ! ! ! W ! ! ` w . . | &.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.@.# . s Z B B N N N N v N v N + + + *.*.", -"*.*.X X + t N M M N N N B B B B V B V V V V V I I I Y Y U Y Y T T T T E E E E W W W & D &.&.&.&.&.%.&.&.&.&.&.&.&.&.&.| X X U ' ) ) ( ) ~ ( ~ ( ( ( ~ ~ ( ( ( ( W ! ! ! _ p X j &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.L . @ v V B B B B N v N v N a X X X *.*.", -"*.*.+ X + & C M M N v N v B B B V B V B V V V I I I I Y Y T T T T T T E U E E E W ( q 8 &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.$ . x ] ( ( ( ( ) ( ( ~ ( ( ( ( ! ! ! ! ! Q ( ) p X 4 %.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.u . : V B B N B N N c N c N : + X X *.*.", -"*.*.*.X + + N M N M N N B v B B B B B V V V V V I I I Y Y Y Y Y T T T T E T E E E ! s . = &.&.&.&.%.&.&.&.%.&.&.&.&.&.&.&.5 . e ] ( ( ) ( ( ~ ( ( ( ! ( ! ! ( W W ( ` T 2 . . ; #.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.#.# . t Z B B B N N N N N v B @ + X *.*.*.", -"*.*.*.X + X t N c N v N v B B B B B B B B V V V Z I I I Y Y Y U T T T T T T E E E ! V X X | &.&.&.%.&.&.&.%.&.&.&.&.&.&.&.A - ) ( ( ( ( ( ( ( ( ! ( ! ! ! W ( ` W i o . . 9 $.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.A . @ v V B v B v N v v v M s X X + *.*.*.", -"*.*.*.X X X % C c v N N B v N n B B B V V V V V V Z I I Y Y Y T Y T T T T E T E T W W % D &.&.&.&.&.&.&.&.&.&.&.&.&.%.&.P X @ W ( ( ( ~ ! ! ! ! ! ! ! ( ` ) I e # . . $ H &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&...@ . q Y B B B B v N N N v N : X X X *.*.*.", -"*.*.*.*.+ X + N N c N v N N N B B B V B B V V V V I V I I Y Y Y U T T T T T E E E E ( 3 . 7 &.&.&.&.%.&.&.&.&.&.&.&.&.&.&.O.o . n ) ! ! ! ! ! ~ ! ( ) _ E z 2 X . . # j @.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.1 . @ B V B B B v B N v v N N + X + *.*.*.*.", -"*.*.*.*.X X X 2 N c v N N N N B B B n B V B V V V I I I Y I Y Y Y Y T T T T T T T E ! z . $ %.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.; p ` ( ! ! ( _ ` _ E x 3 @ . . . * l O.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.7 . X i Z B N B v B v v N v N q + X X *.*.*.*.", -"*.*.*.*.*.X X @ C M c N N N N B B N B B V B B V V V V I I I I Y Y Y T T U T T T T E Q I X . { &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.f 3 ` ` ` _ W m p > @ . . . O 8 L %.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.9 . . w Y B B B B N N N N N M C @ + X *.*.*.*.*.", -"*.*.*.*.*.X + X w N M M N v N N B N B B V B V B V Z V I Z I Y Y Y Y Y Y T T T T T T E E % . G &.&.&.&.&.%.&.&.&.&.&.&.&.&.&.H # U n y > # X . O 5 H @.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.@.5 . . 3 Z B B B B N N N N M M M t + + X *.*.*.*.*.", -"*.*.*.*.*.*.X X # C M M N N N N B B N B B V B V V V V V Z I I I Y Y Y U Y T Y T T E T ! 2 . j &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.} . X X . . . @ - f L @.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.{ * X w Y V B B B B B v N c M M N % X X X *.*.*.*.*.", -"*.*.*.*.*.*.+ X + r M M v v N N N N B B B B B V B V V V Z Z I I Y Y Y Y Y T T T T T T ! w . 7 &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.* . # 4 k L ..&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.A o . X t Z V B B B N N N N N N N M a X X + *.*.*.*.*.*.", -"*.*.*.*.*.*.+ X + @ N M v N v N N B N n B B V B V V V V V V I I I I Y Y Y T Y T T T T ! e . 1 &.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.| D / #.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.{ < . . % c Y B B B B B N B N v N v M N % X X + *.*.*.*.*.*.", -"*.*.*.*.*.*.*.X X + t N v v N N N N B B B B B B n V V B V V V I I I I Y Y Y T Y Y Y Q ( 3 7 &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&...u X . . 3 V Z B B B B B N B N N N N v M a + + X *.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.X + X @ N c N v N v B N B n B B V B V V B V V V I Z I I Y Y Y T T Q Q T i @ . D &.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.| f O . . & z Y V B B B B B v B N N N M v c C @ X X X *.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.X X + , N c v v N N N N N B B B B B B V V V V Z Z Z Y T Q T Y n d 3 % . . - %.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.@.H 4 X . # t C Y B V B B B B B B v N v N N v N q X X + *.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.X X X c M M v N N N N B B B B B B B V V V V V Z I V p 3 : # X . . . X 9 @.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.L 9 # . . . # e B T B B B B V B B N B N N v N N v c N + + X *.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.X X + @ B M M M N v N v N B n B B B V B V B V Z Y > . . . . X # 5 A .&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.#.K 8 $ . . . o 2 z I T Z V V B V B B B n B N N N N N v c N & X X X *.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.X X + 0 N M v v N N N B B N B B B B B B V V V Z % . < k K | #.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.l # X . X : t B Y Y Z B V B B V B B B N B N B N v N v M M t + X X *.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.+ X + X d N c v N v N N N B B N B B V V B B V I : . H &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.@.X . @ > i n T T I Z V V V B V B B B B B B B N N N N v v M c + + + X *.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.X X + @ C N M N M N N N B N B B B B B V B C Z : . l &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.#. .%.&.&.&.&.&.&.&.%.= . e Q T Y Z Z V V V B V B B B B B B B B N N N c N M M N & X X X *.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.X X X & B c M N N N N N n B v B B B B V B Y > . k &.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.%...K k 1 $ . 8 &.&.&.&.&.&.&.&.u 2 T Z Z V V V V B V B V B B B B B N N N N v N N M N , + + X *.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.X X X 0 N M M M N v N N N N B B B B B B Y 2 . g &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.H 8 - X . . . . X X O.&.&.&.&.&.&.&.G . % Y Z V V V V B V B B V B B B B N v N N N N c N M t X X X *.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.+ X X X t N M c N N v N N B N B n B B B Y 3 . 7 &.&.&.&.&.&.&.&.&.&.&.%.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.^ . . . X # > w s @ . L &.&.&.&.&.&.&.} X X x I V V B B V B B B n B B N B v B v N v v M c d + X + X *.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.X + X X d N c c M N N N N N B B B B B Z q . 4 &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.../ &.&.&.&.&.&.&.&.^ X X w v I T Q Q : j &.&.&.&.&.&.&.%.$ . i Y V B V B B B B B B v B N N N N v v v v M N + X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X + + + d N M M M N N N N N B B v B Z w . 1 &.&.&.&.&.&.&.&.&.&.&.&.&.$.| G u - X . l &.&.&.&.&.&.&.O.@ . x Q Y Y Y T q . 1 &.&.&.&.&.&.&.&.7 . 3 Y B V B V B B B B B B N N N N N N v N v N # X + + *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X + + c N M M N v N N N N B N B V a . - &.&.&.&.&.&.&.&.&.#./ A 8 * X . . X X ; &.&.&.&.&.&.&.&.1 . w T I Y Z T s X # #.&.&.&.&.&.&.&.S . & Z V B B B B B B B B v B N N N N M M c N % X X + *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X + @ d N M v N v N N N N n N V a . $ %.&.&.&.&.@.^ l 4 $ . . . . . % 2 y t X @ @.&.&.&.&.&.&.&.g . > Y I Z Z Y n + . ^ &.&.&.&.&.&.&.^ . + v Z B B B n B B B v B v N v N v c M N # X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X + X + d N c N c N N N N N N B s X O @.O.K g 1 # . . . . o % 3 t v Z Y T V X . ^ &.&.&.&.&.&.&.K . @ V Y V Z Z Y = . A &.&.&.&.&.&.&.#.# . a Z B B B B N B v N N v N M c M c N % X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X @ s N c v M N N N N N B d X X - @ . . . . @ & 3 i v V Y Y Y Z V V Z = l &.&.&.&.&.&.&...o X z Y V V Z Y 2 . 5 &.&.&.&.&.&.&.&.1 . 0 Z B B v B N N B v N N N c M c M % X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.+ X X X t C M M v N v N N B c X . . X @ : q s v Z Z Z V B B V V V V B Y 0 . 4 &.&.&.&.&.&.&.&.; . r Y V V B Y y . $ #.&.&.&.&.&.&.&.k . = V B N B v N N v N v v c M M d + X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X + X , B N c v v v v N N w : w s N V C V V B B B B B V B B B V V Y a . $ $.&.&.&.&.&.&.&.u . , Y B V B Z c X X { &.&.&.&.&.&.&.L . @ v B B v B N v v N v v c N t @ X X + *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X + X & N N c M c M N N N B C B B N B N B B B B B B B B B B B B Z v + . { &.&.&.&.&.&.&.J . @ B V B B V B & . D &.&.&.&.&.&.&.O.o X a B B N N N N M M c M N 2 + X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X X @ a C M M M N N N N N N N N B N B B N B B B B B B V V B B B % . D &.&.&.&.&.&.&.| X X z Z B V B Z 2 . 8 &.&.&.&.&.&.&.&.; . q B v N M M v c M M c & X X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X + X X + , N N M N M N N N N N N N N B B B B N B n B B n B B B Y , . 8 &.&.&.&.&.&.&.&.- . t Z B B B Z t . = %.&.&.&.&.&.&.&.g . > B N M N N M c N t + + X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X + @ s N M M M M N c N N v N N N N N B N B B B N B B B C e . = &.&.&.&.&.&.&.&.8 > Z B B B V d . X .&.&.&.&.$.} D < X @ c N M M M M N & + X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X X X : N N M c M M N v N v N N N N N B N B N B N B B V d X X .&.&.&.&.&.&.&.G . % N B B B B N % . H #./ A 5 $ X . . . % N M M M B q @ X X X + *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.+ X X + X + 0 N N M c M v v N M N v N N N N N N N B v B B N @ . J &.&.&.&.&.&.&.| X X d B B v B V : X # $ . . . . X % , q c M M N a @ X + + X + *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X X X @ q N N N v M M N N N N v v N v B N N N B N B : . f &.&.&.&.&.&.&.&.- . r B N N N C w . . X X % 2 r d M C B N N a % X X X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X + + + @ 0 N B N c M c v c N N N v v v N N N N V q . ; &.&.&.&.&.&.@.^ - . > B N N N N v 2 2 t c N B N N M N N a % + + + + X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X X X + @ : c N N M N M M v v N M N M N v N C t X + #.&.@.L j 1 # . X X : B N N M v N N B N N M c M N N q % X X + X + X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.+ + X X X + + % w M N N M v c M M c N c N N N M + X 5 1 o . . . X @ & 2 d N N c M c N M M c M N C a : + X X X X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X + X + X + % w M N N N M M M c N M M C & . X . X @ & 0 t c N N M M M M M M M N N N s : @ + X X X X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X + X X X + X X # : t M N N N N N M N t # & 0 t c N N N N c M M M N N C N s 0 % + + + X + X X + *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X + X X + X X X X @ % : q t M M N N C C C B N C N N N M d t , : # + X X X X X X X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X X + X X + + + + X X X + # # @ @ @ % # @ @ X + + + X + X + + X + X + + *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.X X + X X + X + X X + + + X X X X + + X X X X X X + X X X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.", -"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.+ X X X X X X + + X X + X + + X X + X X *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*." +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 q e e e e e e e e e e e e e e e e e e e e e e e e e e q 9 9 9 9 9 9 9 9 9 9 9 9 e e e e e e e e e e e e e e e e e e e e e e e e e e e 9 9 9 9 9 9 9 9 9 9 9 9 e e e e e e e e e e e e e e e e e e e e e e e e e e q 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 0 5 * * * * * * * * * * * * * * * * * * * * * * * * * & > 9 9 9 9 9 9 9 9 9 9 9 6 * * * * * * * * * * * * * * * * * * * * * * * * * * * 7 9 9 9 9 9 9 9 9 9 9 7 * * * * * * * * * * * * * * * * * * * * * * * * * & 5 0 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 0 5 a S Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z C D c 7 9 9 9 9 9 9 9 9 0 6 p A Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z y 7 9 9 9 9 9 9 9 9 7 u Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z C D s 5 0 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , q 9 9 9 9 9 9 9 w ; n $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.j , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e = B $...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O. .$.( , q 9 9 9 9 9 9 9 w ; v $.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.@.X.h , w 9 9 9 9 9 9 w , z @.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O. .$.H $ r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , z +.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.} $.G $ r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 w , x $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.J # r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 q 1 f / / / / / / / / / / / / / / / / / / / / / / / / ^ ` m : w 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 9 9 8 > > > > > > > > > > > > > > > > > > > > > > > > > > 6 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 9 9 9 w w w w w w w w w w w w w w w w w w w w w w w w w w 0 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.h , w 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.l 3 t r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r w 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.d @ o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o X > q 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.R L U I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I P Y J , w 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.! O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.[ $.T + r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; v $.o.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@. .$.R O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 w ; b $.@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.W O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 9 7 i M m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n N g 5 0 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 9 9 7 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; - 1 0 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 9 9 9 e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e q 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$.) , w 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$._ 1 r w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w q 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.o.$./ . < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > : 2 0 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.$.] ^ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / ~ ' K - e 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.Q O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.{ $.T O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.E O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e = B $...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.| $.T O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 e * B $.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.X.$.W O r 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 0 5 a S Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z V F k 4 q 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 0 5 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * % < q 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 q e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e q 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 " }; diff --git a/share/pixmaps/BGL16.png b/share/pixmaps/BGL16.png index a2929a5280e0b2f2bf197e3668a6abb2fcbf878a..29bf6986230ce400fbeb406ab7bb10f9f57c8785 100644 GIT binary patch delta 323 zcmV-J0lfZ&2h#$O8Gi!+001a04^sdD00VPENmK|32;1RL-~a#sT~JI^MQ%9dyP@;< z^!{`}=D?}+>*V`|Sm}IB=*zeEmT&C;|Nn40<$_b``}+QSO6T$H{ee>G&b;=BTk3g7 z=WaUXf>i0er1Nn-=EJP?&ARr6TIs!|^Kw1r{rmsHtM!fmKz~&L000SaNLh0L0a~O0 z0a~O1FdIhI0000SbVXQnQ*UN;cVTj606}DLVr3vkX>w(EZ*psMAVX6&=)AIw0001G zNklX%mZ0#y(e-2`W2X{ z02~P@V2{8FMm%G3Xyefc)uy#>GPs)sNWUO->S++D%WUZdCRWR^)bR(`bEyzM&!0k( V2m?_YIE(-Q002ovPDHLkV1n>Hla&Af delta 889 zcmV-<1BU$50)+>V8Gi-<001BJ|6u?C00eVFNmK|32nc)#WQYI&010qNS#tmY04D$d z04D(|36W0#00SpUL_t(IjcwE2Yg=_3$MN^?cTUd9IcXkF8rG&AOCM8GEp$k63X|bL zrrlrQyjZ|LKoCLj-V60Y@WRU$nc(eY6!Bs(Q0hf-j7e*jjDIdOU1K|QvLsW^ zW7M|&^OKY1Y$j7&mXd~PlCms*>-7%5tJNBNt}77Yb-!Be{$23r^X-d^i_^=Fle?Nq z@kzVQM^jUL-hXc6Sr)pcF=CqBYc`MX?CjJPT=J{ct^`1-jf<7aO!@5D+}_CvW0u9` zkr8s1#RsJl?>G*x#xX~(%gXGm{Ys@Wk5b# zW~al?{XUD?EEmSc@cMnWeV?g9A<^n|+V5>{1`?&Ny?M}6xir?iNcV@bQ(R181{NB z*)~YYw@;qng&{%+vbLQzb$w3ShB0ku8WJezIw{NI!O;=VI}VFc#Bvz&TA@H3MZCYX z#MMNCc7L~vWf&w)vm{TiAc`Uk)1*EakV+&-={nm{#21|oA2%8df`HXhiHRuUB#seE zA&0)d>qQZ$#nrp>pI6lz=`ia(!DTz*c}Y= z`D8Nd#W6Y4q!mTPQN)aGb8~NxtduN-A(u)eT7TUx^&r3x!=4w04|Rn2a=*H!nL&8{yc z$DI!EPE7Eq-v_1m#q(%+9ycC8=Bwe5-1s=PR_nOc=|q0Dx~~5rLcH;Pt#(^VIX&Yz zxpGer4rus3Z|Czg!;tO6LtaQGv83eg?(Xo;&Q1d%uKX{iqT>WB<#IWjN{vqp23S(E z<@?0Fo_qK3u)goQ3L&oi1Ji#v$MI@1kyuiiwjhOoIBuQY#|K|KVvi*I|7Fuji P00000NkvXXu0mjf|K70m diff --git a/share/pixmaps/BGL16.xpm b/share/pixmaps/BGL16.xpm index 21cf4a574e..26b8303a46 100644 --- a/share/pixmaps/BGL16.xpm +++ b/share/pixmaps/BGL16.xpm @@ -1,190 +1,53 @@ /* XPM */ static char *result[] = { /* columns rows colors chars-per-pixel */ -"16 16 168 2 ", -" c #059C9C", -". c #059D9D", -"X c #059E9E", -"o c #069E9E", -"O c #0BA1A1", -"+ c #0AA3A3", -"@ c #0CA1A1", -"# c #0DA1A1", -"$ c #0EA3A3", -"% c #0CA4A4", -"& c #0EA5A5", -"* c #13A6A6", -"= c #14A7A7", -"- c #15A7A7", -"; c #18A7A7", -": c #14A8A8", -"> c #1EAEAE", -", c #20AEAE", -"< c #21AFAF", -"1 c #20B0B0", -"2 c #40C4C4", -"3 c #42C6C6", -"4 c #42C7C7", -"5 c #44C7C7", -"6 c #45C7C7", -"7 c #49C2C2", -"8 c #4FC3C3", -"9 c #45C8C8", -"0 c #4ACBCB", -"q c #57CFCF", -"w c #50D0D0", -"e c #51D0D0", -"r c #57D3D3", -"t c #53D4D4", -"y c #58D0D0", -"u c #5AD4D4", -"i c #59D6D6", -"p c #5AD6D6", -"a c #5CD5D5", -"s c #58D8D8", -"d c #5FDDDD", -"f c #7ECECE", -"g c #66D1D1", -"h c #62D4D4", -"j c #66D5D5", -"k c #64D7D7", -"l c #6BD3D3", -"z c #6CD0D0", -"x c #68D5D5", -"c c #64D9D9", -"v c #66D9D9", -"b c #61DDDD", -"n c #62DFDF", -"m c #64DCDC", -"M c #67DEDE", -"N c #68DBDB", -"B c #6CD8D8", -"V c #68DEDE", -"C c #69DEDE", -"Z c #68DFDF", -"A c #6EDCDC", -"S c #6FDFDF", -"D c #71D2D2", -"F c #70D6D6", -"G c #74D6D6", -"H c #78D5D5", -"J c #7CD4D4", -"K c #7DD7D7", -"L c #72D8D8", -"P c #7EDADA", -"I c #7BDFDF", -"U c #7DDEDE", -"Y c #69E2E2", -"T c #68E3E3", -"R c #6EE1E1", -"E c #6CE3E3", -"W c #6FE2E2", -"Q c #6FE3E3", -"! c #72E0E0", -"~ c #76E2E2", -"^ c #72E4E4", -"/ c #74E6E6", -"( c #76E6E6", -") c #7AE5E5", -"_ c #79E6E6", -"` c #7AE6E6", -"' c #7CE6E6", -"] c #7FE6E6", -"[ c #74E8E8", -"{ c #76E9E9", -"} c #7AEAEA", -"| c #7BEAEA", -" . c #7DE8E8", -".. c #7EE9E9", -"X. c #80D6D6", -"o. c #85D6D6", -"O. c #88D2D2", -"+. c #8CD6D6", -"@. c #8DD7D7", -"#. c #88D8D8", -"$. c #88DBDB", -"%. c #8DDADA", -"&. c #97DBDB", -"*. c #99DADA", -"=. c #9BDCDC", -"-. c #9ADDDD", -";. c #9EDCDC", -":. c #A2DEDE", -">. c #A5DFDF", -",. c #A7DFDF", -"<. c #A8DBDB", -"1. c #AADDDD", -"2. c #ABDEDE", -"3. c #B0DFDF", -"4. c #85E3E3", -"5. c #81E6E6", -"6. c #8DE1E1", -"7. c #86E8E8", -"8. c #89EBEB", -"9. c #8CEBEB", -"0. c #8FEEEE", -"q. c #8FEFEF", -"w. c #92E7E7", -"e. c #98E0E0", -"r. c #9AF4F4", -"t. c #AFE0E0", -"y. c #AEE2E2", -"u. c #B0E0E0", -"i. c #B1E2E2", -"p. c #B4E0E0", -"a. c #B4E2E2", -"s. c #BEE3E3", -"d. c #BAE4E4", -"f. c #BAE6E6", -"g. c #BFE5E5", -"h. c #BDE6E6", -"j. c #AAF7F7", -"k. c #B8FFFF", -"l. c #C2E3E3", -"z. c #C4E6E6", -"x. c #C4E8E8", -"c. c #C8E9E9", -"v. c #CCECEC", -"b. c #D4EBEB", -"n. c #D5ECEC", -"m. c #D4EDED", -"M. c #D6EDED", -"N. c #D9EEEE", -"B. c #DCEFEF", -"V. c #E3EFEF", -"C. c #E4ECEC", -"Z. c #E6F2F2", -"A. c #E4F4F4", -"S. c #E5F4F4", -"D. c #E8F3F3", -"F. c #EBF3F3", -"G. c #EAF5F5", -"H. c #EBF6F6", -"J. c #F3F9F9", -"K. c #F4F9F9", -"L. c #F4FAFA", -"P. c #F6FBFB", -"I. c #FCFBFB", -"U. c #FBFEFE", -"Y. c #FDFCFC", -"T. c #FFFDFD", -"R. c white", -"E. c None", +"16 16 31 1 ", +" c #6E38E5", +". c #BBA1F3", +"X c #F7F4FE", +"o c #7440E6", +"O c #C0A9F4", +"+ c #EBE4FB", +"@ c #8558E9", +"# c #7C4CE8", +"$ c #CBB7F6", +"% c #966FEC", +"& c white", +"* c #703AE5", +"= c #8253E9", +"- c #FBFAFE", +"; c #7B4AE7", +": c #F1ECFD", +"> c #8152E8", +", c #CEBCF6", +"< c #885BEA", +"1 c #7947E7", +"2 c #6E3AE5", +"3 c #8254E9", +"4 c #BCA4F3", +"5 c #713DE6", +"6 c #C3ACF4", +"7 c #CDBAF6", +"8 c #865AE9", +"9 c #BDA5F3", +"0 c #723DE6", +"q c #FDFBFF", +"w c #C1ABF5", /* pixels */ -"E.E.E.E.E.X @ + * @ . E.E.E.E.E.", -"E.E.E.. ; 7 y O.c W a , . E.E.E.", -"E.E.. 4 L s.0 b.l m Z / 6 o E.E.", -"E.. 3 T q n.@.A.Z.m.1.j } 5 . E.", -"E.1 h <.N.U.G.y.:.S.R.2.V ( < E.", -". p B +.f.R.;.5.r.H T.x.S .u . ", -"O V ` | F I.c.4.w.>.R.f N ..C @ ", -"- R ' 0.I M.L.t.l.F.Y.P.p.v ^ : ", -"= R ' 9.5.i.R.d.e.6.#.H.R.X.Y - ", -"@ M ) 7.8.-.R.=.j.k.! g.R.%.d @ ", -". r _ ] q.P Y.h.A U *.R.V.x i . ", -"E.> Q ` ~ D I.L.z.D.J.u.g E < E.", -"E.. 2 [ z C.B.K.,.v.&.s { 6 . E.", -"E.E.. 3 k G w a.$.K 3.b 9 o E.E.", -"E.E.E.. > t n J o.e 8 > . E.E.E.", -"E.E.E.E.E. # % & $ X E.E.E.E.E." +" ", +" 5===*1==; >>>55", +" 3&&&*4&&, X&&3 ", +" 3&&&*.&&7 X&&3 ", +" =&&&*.&&7 :--3 ", +" =&&&*.&&$ ", +" =&&&*.&&+6OOO# ", +" =&&&*.&&&&&&&< ", +" =&&& O&&&&&&&< ", +" =&&&0%.......; ", +" =&&&@o ", +" =&&&---------@ ", +" 3&&&&&&&&&&&&8 ", +" 3&&&&&&&&&&&&8 ", +" 5============00", +" " }; diff --git a/share/pixmaps/BGL256.png b/share/pixmaps/BGL256.png index 35b48ac8bf8e176d74bad8d8eb0ff1615d84d556..ce80ac53139ec523b827abbebd9b4829accaf3c7 100644 GIT binary patch literal 1782 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911L)MWvCLm7~48 z&7N7MwhOM=GWc)1(f4@ys>jRKy5GKdI8U&5YViIKXCM6$w|;u%`<~p2O;2t5=4s5Y z&D<69<@*_l-nXlbZ}0!RMQ(bvjs2~2^7dwSKR@MceRJ3AHgna--A`|xfA(}qHuGHO zf@s}GH;k`-UY}#Sb?KtV6+gFbUUmK3-{qgPo>l+baVK|ckNSMQ_=>g5wM{o?oS7W^ zqw44Bqot8=KRTVbdrjN=lgr0PucO~K?7dX?BlYX|?eh8I#{Ii4XH>ppyp_B4rPMvz; z?ycK$_tR#bZ{NIrf8)L2H8bt%>7$J7tqcmig9hbpdC9q8xzd?4vu@d#*-o_vhTWlA zYUeXp8md31q)qF(`~Qn?;1kJqhJx)J(!FoL&wuTIZ~xY~w%^OtOO|J>ne%Ju=I+3! z7k^eafK`Ooz5Vp+aQVMCw{PC>+OX+U*0YO0KlLya@C%wr{eF17s`A(DnUO7}_y6@W zd;q4ZSHAv9|G$1>W4F*?VaOy2*$A5XyxaYsZOw1ygKiAXA=kIX9j%)B_NnFHDO~U4 zEEst%EIj=3!^EVj6Ya7G{)Am#b9R@h14HwrcOChA{$_kPUi{qV=I;Es{WW!wXRY?i zb^!C`9G+iy{)eCX$j!&d6EJP};d!S^>-`y+P2R}Ye|q$uVS?MBL1wqUu>4C0#ah+n z&l8@XR61_K@{RFfioA~(tIfkt7u^5SvSsJ( z-uTyxzVz{eWH%JP46lobwc7sV&HLt)I--m3c3-kpZfL(?7T{;`w|Zgb4i>8dL9siG z{2cbpPEw2xq@r1;lqb%sn11qt%jK_~6~P<}{`O4!yyK^Pa-ymK7rvt<+DikkKY!FN z@8Fe|=5HIm_t!P$r&ku={L(U^d3SAT+V5jqzh=CN-N)W0-=J>1d9nH_Ao4xWYB~3R z(eq!T(o^T|V`-Cj&^~nIcl(jaroEBR!%bGQJjgpI`(Z;$rM)D1jwaQU#H+uhaa!Zz zjG3mT(+)QL{+u!~d5#TZg^{s$>r$oD6$kzbhij2Y2)z4*}Q$iB}e?84_ literal 43098 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

#MfrC4)rU27d0@lh<>e8O7F8X-Y@mBw-})5Zd0 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 BaxVY? diff --git a/share/pixmaps/BGL256.xpm b/share/pixmaps/BGL256.xpm index 2d14aa7a29..ad88b551c6 100644 --- a/share/pixmaps/BGL256.xpm +++ b/share/pixmaps/BGL256.xpm @@ -1,361 +1,359 @@ /* XPM */ static char *result[] = { /* columns rows colors chars-per-pixel */ -"256 256 99 2 ", -" c #009797", -". c #049D9D", -"X c #0A9F9F", -"o c #07A0A0", -"O c #0CA2A2", -"+ c #13A5A5", -"@ c #1BA6A6", -"# c #15A9A9", -"$ c #1BACAC", -"% c #1FB0B0", -"& c #21A7A7", -"* c #23ABAB", -"= c #2BADAD", -"- c #31AFAF", -"; c #24B2B2", -": c #2BB5B5", -"> c #2DB9B9", -", c #34B2B2", -"< c #3BB3B3", -"1 c #34BCBC", -"2 c #3BBDBD", -"3 c #44B6B6", -"4 c #49B7B7", -"5 c #43BCBC", -"6 c #4BB9B9", -"7 c #53BCBC", -"8 c #5ABEBE", -"9 c #3BC1C1", -"0 c #43C5C5", -"q c #4BC6C6", -"w c #46C9C9", -"e c #4CCCCC", -"r c #51C7C7", -"t c #5EC0C0", -"y c #53CCCC", -"u c #5BCDCD", -"i c #54D2D2", -"p c #5BD4D4", -"a c #5ED9D9", -"s c #63C2C2", -"d c #6CC5C5", -"f c #61CECE", -"g c #71C7C7", -"h c #75C9C9", -"j c #7CCBCB", -"k c #63D4D4", -"l c #6BD5D5", -"z c #66DEDE", -"x c #69DFDF", -"c c #70D4D4", -"v c #73DCDC", -"b c #7BDDDD", -"n c #67E0E0", -"m c #6CE1E1", -"M c #74E3E3", -"N c #7BE6E6", -"B c #7EE8E8", -"V c #83CECE", -"C c #87D0D0", -"Z c #8CD2D2", -"A c #83DFDF", -"S c #94D5D5", -"D c #99D7D7", -"F c #9DD8D8", -"G c #A3DBDB", -"H c #ABDEDE", -"J c #B0DFDF", -"K c #81E7E7", -"L c #8BE5E5", -"P c #84E9E9", -"I c #8BEBEB", -"U c #93E7E7", -"Y c #93EEEE", -"T c #98EFEF", -"R c #95F0F0", -"E c #9DF1F1", -"W c #A0EEEE", -"Q c #B4E1E1", -"! c #BBE4E4", -"~ c #A3F3F3", -"^ c #ABF5F5", -"/ c #ADF8F8", -"( c #B2F7F7", -") c #B5F8F8", -"_ c #BAFAFA", -"` c #C2E7E7", -"' c #C6E8E8", -"] c #CCEAEA", -"[ c #D3EDED", -"{ c #D9EFEF", -"} c #C3FEFE", -"| c #CBFFFF", -" . c #DCF1F1", -".. c #E4F4F4", -"X. c #EBF6F6", -"o. c #EEF8F8", -"O. c #F4FAFA", -"+. c #FDFDFD", -"@. c None", +"256 256 97 2 ", +" c #591BE1", +". c #6329E3", +"X c #642AE3", +"o c #642BE3", +"O c #652BE3", +"+ c #652CE3", +"@ c #662CE3", +"# c #672DE3", +"$ c #672EE3", +"% c #672EE4", +"& c #682FE4", +"* c #6930E4", +"= c #6931E4", +"- c #6A32E4", +"; c #6A33E4", +": c #6B33E4", +"> c #6B34E4", +", c #6C35E4", +"< c #6C36E4", +"1 c #6C36E5", +"2 c #6D36E5", +"3 c #6E37E4", +"4 c #6E38E5", +"5 c #6F38E5", +"6 c #6F39E5", +"7 c #6F3AE5", +"8 c #703AE5", +"9 c #703BE5", +"0 c #713BE5", +"q c #713CE5", +"w c #723CE5", +"e c #733FE5", +"r c #733FE6", +"t c #7A48E7", +"y c #7B49E7", +"u c #7C4AE7", +"i c #7D4CE8", +"p c #7D4DE8", +"a c #8152E8", +"s c #8355E9", +"d c #8456E9", +"f c #875AE9", +"g c #895DEA", +"h c #8A5FEA", +"j c #8B5FEA", +"k c #8C61EA", +"l c #8F66EB", +"z c #9168EB", +"x c #9269EB", +"c c #946CEB", +"v c #946BEC", +"b c #966FEC", +"n c #9770EC", +"m c #9871EC", +"M c #9872EC", +"N c #9973EC", +"B c #9A74ED", +"V c #A786EF", +"C c #A887EF", +"Z c #A989F0", +"A c #AA8BF0", +"S c #AB8CF0", +"D c #AC8DF0", +"F c #AF91F1", +"G c #B295F1", +"H c #B69AF2", +"J c #B69BF2", +"K c #B79CF2", +"L c #B89DF2", +"P c #B89EF2", +"I c #B99FF2", +"U c #BAA0F2", +"Y c #BAA0F3", +"T c #BAA1F3", +"R c #BBA1F3", +"E c #BBA2F3", +"W c #BCA3F2", +"Q c #BCA3F3", +"! c #BDA4F3", +"~ c #BEA5F3", +"^ c #BEA6F3", +"/ c #BFA7F3", +"( c #C1AAF4", +") c #C3ACF4", +"_ c #C4ADF4", +"` c #DDD0F9", +"' c #F7F3FE", +"] c #F7F4FE", +"[ c #F8F6FE", +"{ c #F9F7FE", +"} c #FBF9FF", +"| c #FCFAFF", +" . c #FCFBFF", +".. c #FDFCFF", +"X. c #FEFDFF", +"o. c #FEFEFF", +"O. c white", /* pixels */ -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o o . . . . o o . . o . X o . . . o . . X . . o . . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . o . . . . . . o o . . . . o . o . . . o . o . o . o . o . o . . . o . o . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . . o o . o . . . o o . . . o . o . . o . . o . . X . . . . . o . . . . o . . . . o o . . o . o o o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . o . . . X . . . . . . o o . . . o . . o . o . . o . . . o . o . o o . . o . o o . o o . . . o . . o . . . . . o o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . . o . o . o . o o . . o o . o . o . . o o . . o . o o . o . . . o . . . . . . o o . o . . . . . o . o . o . o . o . . o . . . o o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o o . o o . . . o . . o . . o . . . X o . o o o O O # ; > : 9 0 w w e e i e e i e e w 9 > > > # # + o . . o . o o o . . o . . o . . o o . . o o . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . . . o . . o . . . o . . . . o o o O % : 9 e n m m M M M m m M m m n n m n n m m m m m m m M m m m M M M i w 1 ; # o . . o . o X . . o . . . . o . o . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . o . . o o . . o . . X o . . X o # ; 9 a m M m M n m n m n n n n n n n n n m m m m m n n n m n n m n n m n n n x n m m m M m z e 1 $ O . o . . . o o . . . o . X . o . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . o . o . . . . o . . o . . o . O $ 9 p m M M m m m n n x n n m n n n m n m n n m m n z z n m x m x m m x x m x n m m x x x x x x x x x n m M m z w > # . o o o . . . o . o . o . o . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . . . . o . o o . . X o . o $ 9 z m M m m n x n n n n n m n m n n m m n m m m M z a 9 : $ # > z n m n n x m n n m x m m x x m m x m n n x x x n n x m m M n e ; O . o o . . . . . X . . . o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o o . . X o . o . . . o . o + > i n M m n n x n n x n m m n n m n m x m m m M M x i 0 : # o . . . 1 M m m m m m n m m m m m m x m m x m n m m x m m m n n x x n x n M x 9 % . o . o . o . o . . o o . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . . . . . o . . . o . O > z m M m n x n n m n m n m n m n m n m m M M M n a 9 : $ o . . . . o . . . O p M m m m m m x x m x x m m x m m x m m x m m m n m n n x x n x x x x m n w ; o . . . o . . o . o . . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . . . o o o . o o o o > a M M m x x x x x n n m n m m n m m n m M M n a w > $ o . . . . o . o . . . . o . w M m m m m m M m m m m m m m x x m x x m x x m m m x m x m n n x x x x n x m x 9 # . o . . . . o . . o . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o o . . o o . . . o . o % e m M n n n n n x n m m m m m m n m m m M m z w > $ o . . . . o . . . . . @ o . . > M m m M M m m m x M m m m m m M m m m x m m x x m m n m x m x m m m n x x x x x m a 1 o o . . . o . . X o . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o o . . . . o . o o o O 9 m m m n n m n n m m m n x x m m x m m m m m a ; o . . . . o o . . . . $ 7 V ! ..3 o . # n m m m m m m m M x M x M x m m m m m M m m m m x m x m m m x x m x m m x n x x n n n M w $ o . . . . o . . . . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . . . o o . . o o # e M m m n m n n n n n n m m m m m x x m m m m m M > . . . X . . . . + 6 j Q ..+.+.+.+.h . . O z M M m M m M m x M m M x M M m m M m x M m m M m m M m m x M x n m m x m m m n n x x x n m a > . o o . . o . o o . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . o . . . o . o X % a M n n n n n m m m m M M M n m m m m M m M x m m M x # . . . o . + 3 j Q .+.+.+.+.+.+.+.+.H o . . w N m M M m m M M M M m M m m m m M M m m m m M x m m m m m m m x x m m m m x x m m x x x x x x z 1 O . X . . . . o . o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o o . o . . o o . . o ; x M m n n m m m m M m n i w 9 w z M m m m m m x M M m M x $ . o . o < d H .+.+.+.+.+.+.+.+.+.+.+.+.[ + . . . 1 M M m M M M m M x m M m m M M M m m m M m M m M m M m M m m m M m m x x m m m m x m m n m x x x x n 9 o . o o . . . . o o o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . o . . . . . . o : n m n m n m M M n a i w > # O o # a M m m m m M x M m M M ; . o * ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.3 . . $ M M M M m M x M M M M m M M m m M m M M m m m M m M x m m m m m m M m m m x m m x m x n m n x x x n x x 9 O . o . o . . . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . o . . o o o o ; n M n n M m m a e 9 ; # o . . . o o . . ; M m M M m x M m M m M 9 . . . o ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.d . . o z M M M v M M M x M M M M M M m M M M m M M m m M M M x M m M m m m m m m M x m m m x m x x m n n x x x x x 9 o . o . o . . o o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . . o . o o o o $ n M m m m a e 9 % O . . . . . o . o . . o . # n M m m M m M M m M M i . o . F +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.H . . . e N M M M M M M M M M M M M x M M M M M m m M M M m x M M M m m M m m m M m m m m m m m m m m x m x n x x x x x > . o . . . . o . o o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o o o . . o o o + i M m a e 9 % O . . . . . o . . o . . . . . o i M M M m M m m M M M x # . . s +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] O . . 9 B M M M M M M M M M M M M M M M M v M m M M m m M M M m m M M m M m M m M m x M M m m x m x x m m m m n n x x x a * . o o o . . . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . o . . . X . O 9 M M a ; O . . . . o . . . . . $ 3 C C . . . 9 N M M m M M M M M M M ; . . . = O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.< . . ; M N M M M M M M M M M M M M M M M M M M M M M M m v M m M m M m m M m m m m M x x m M m m x m m m x m x m n x x x n e + . . . o . o . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . . . o o . : n m n a # . . . o o o . . . o * 7 Z ! ..+.+.X.* . . . > M M M M m M M M M M B 9 o o [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.d . . O x K M M M M M M M M M N M M M M M M M M M M M M M M M M M m M M M m M m M m x M M x m m m M m x m x m m n n n x x n n x 9 o . o . . . o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . . . . o . . O i M m n M e . . . . . . + = t D ` O.+.+.+.+.+.+.+.6 o . # m M M m M M M M M M B y . . F +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F . . . o i B M M M N M M M N M M M M M M N M M M M M M M M M M M v M M M M m m M m M M m M m m m M m x m m m m m x m m m x x x x n p $ . . . . . o o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . o o . o o o > m m n n n m w . o o + , s F ] O.+.+.+.+.+.+.+.+.+.+.+.h o . O a N M M M M M M M M N z + . o g +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] o . . . 9 B M M M N M N M M M N N M N M M M M M M M M M M M M M M M M M M M M M M M m m m M m M m m M x m m m x m m x m m n x x x x n 9 o . X . . . . o o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . o o . . . O a M n n m n n m e o . . j O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q . o o e B M M M M M N M M B M ; o - O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.= . . : N B M M M M M N M M M M M M N M N N M M M M M M M M M M M M M M M v m M m M M M m M m M m m M m m M m m x m x m x m x x x n n z $ . . o . . o . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . o . . . o o > M m n n n n m m m z # . . d +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.{ O . o 9 M M M M M M M N M M B 1 . . + [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s . . + x B N N M N N M N N M M N M N M M M M M N M N N M M M N M M M M M M M M M m M M M m M m M M x m M m m m M x m x m n m m n x x n n 9 . . . o . o . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . o . o . . o e M x x n m n m n m m m ; o = O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.< o ; M N N M N M M M N M B y . . . . G +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S . . . p B N M N M M M N N N N M N M M N M N N M M M M M N M M M N M M M M M M M M M M M m m m M M m M x M x x m m m m x m m n m n x x x x i + o o . . o . X . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . o . o . . o $ n m x x x n n n m m m m M 9 . . . + [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s o . + m N M M N M N M N M B x O . o h +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` . . . w B N N N N N N N M M M N N N N M N M M M N N N M N M M N M M N M M M M M M M M M M M M m M M m M m M M m M x M m m n x m x m m x x x x ; . . . . o . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o o . . X . 1 M m n n x m m x m m m m m M e . . . G +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S . . o p B N M M N M N M N B M $ . < +.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+...* . . : B N M N N N N N M N N N N M M N N M N N M M N M M M M M M B M N M M M M M M M M M m M M x M m M M m x M m x m m M m m x m m m n x x x n 0 . o o . . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . o . . . o i m n n n n n x m m m x m m m m a O . o h +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! . . . . 0 B M N M M N M N M B B 1 . . . + .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.7 o . + M B N N N N M N N N N M N N N M N N N M N N M N M N N M M M M M M M M M M M M M M M M v M M M M m M M m M M m m m m m m m x x m m x x x n i O . . o . o o . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . o . . . O n m n x x m n x m m x x m m M m m m * . . . < +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...$ . 1 K M M N N N N M N M K r . . . o H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C o . o z K B B N N N N B N N N N M N N M N N M N M M N N M N M N M M N M M M N M N M M M M M M M M M m m M m m m M m M m m m m x m x m m m n x x x z $ . . . . o . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . X . . o ; M n x x x n m m m m x M m M m m m M M 1 o + .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.7 X . % M K N M M M N N N B P z o . . V +.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.! . . . . q P N N N B N N N N N N N N N N N N N N N N N M M B M N B M M N M N M M M M M M N M M M M M M M M M M M m M m M m m m m M x m m x x m n x x x x 1 . o o . . . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o o . . o . o 1 M n n x x n m x x m x m m m m m M m M N w . . . . Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.g . . O x K N N N N N N N B B M $ . . 3 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .@ . 1 P B B B K K N N N N N N N N N N N N N N N N N N M N N M N M M M M N M M N M N M M M N M M M M M m M m M m M m m m M m m m m m x m m x n x x x x 9 . . . o . o o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . . o . . 0 m n n n x x m x m m m m m m M m m m M m M a o . . j +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.H . . . . u P N N N N N N N N B K > . o @ ..+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.6 . o $ M K B B M N N K N K N N B N N K N N N N N N N N N N M N N N N N N M N N M M M M N M M N M M M M M M M M M m M M M M m M m x M m x x m n n x x x x w o . o . . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . . o o . o p m n n x n m x m m m m m m m m M x M m M M M n $ . o 3 +.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.[ o . . . 9 K N N N N N N N B B K q . . . ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.j . . o x K N B B K N K B B N N N N B N B N N N N N N N N N M N N M N M N N M N M N M M N M M N M M M M M M M M M x M m m m M x M x m m m m m x m n m x x n p o o . . o o o o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . X . . . o a n x n n m n n m x x m m m M M m M M m M m M M N > . . . $ ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o., . : B B B N N K N N N B P z o . . V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q . . o y I K B B K B B K K B K K B B B B N K B N N N N N N K N N N N N N N B M N M N N M N M M M N M M M M M M M M M M v M m M x M m M m m m x m x m n x n x p O o . . . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . o . o X O a n x x m n m x x x x m m m x m m M m M m M M M M N w . . . ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.t . . + v K B N K N B B B B K N # . . 7 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .+ . . 9 I K K K K K K N B B K K B N B B K N B N K N N N N N N N N N N M M N N M N N M N N M M N M M N M M M M M M M x M M m M m M x M m m m m m x m m n x x n i + . o . . . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o o . . . o O n n n x x n m m m m M m M m M M x M m m M M M m M M N p . . o Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z . . o z K B N B K B B B K K P > . * X.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.< . . ; B P K K K K K K K K K K K K P K K B K K K B N K N B N N N N N N N N N N M M N M M N M M M N M M M M M M M M M M M M M m m M m m m m M x m m x x m x n n x $ . . o o . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . o . . o + n n x x x n x m m m x M M x m M m M M M m M M M M M M N x $ . . 7 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! . . . . q P K B K B B B B K K I w . . . o ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.g o . O x I P P P I P I P I P K K P P K K K B K P P P K P K K B B B B B N N N N N M N M N M M M M N N M M M M M M M M M M m m M M m x M x M x m x M m m n m x x x x $ . . o . . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . X . o + n n n x x n m m m x m m m x M m m m M m M M M M M M M M M N : o $ X.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+. .+ . . . 2 P K K B K K K K K K P z o . . Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.G . . o p Y P K N x l a y w 1 1 : : ; ; ; : ; > 1 9 e p z k M N B P K K K N N N N N N N N M N N N M M M N M N M N M M M M M M M m M m M M m M x m x x m m n n x x x z $ o . . o . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . . o . . + m n m n x x m x m x m m m M M x M M m m M x M M M M M M M M B w . . . o ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.4 . ; B K B K K K B K P K I N # . o t +.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+. .O o . $ 1 : ; # o . . . . . . . . o # ; > 0 p l M K K K N N N N N N N N M M M N M M N M M M M M M M M m M x M m M m x M m m m m x x x x x x x a # . . o o o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. X . o . . O m n x x x m m x m x M m m m m x M m M M M M M M M M M M M N M B p o . . S +.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.g o . O x I K P K K P P K P K P : . . = X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O., . . . . . . . . . o o o . . . o . . o . . . . . . . . . o * 2 p m K K N N N M N M N N N M M N M M N M M M M M M M M M M M x M M m M m m m M x m m x x x x z # . . . . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . o . o . o a n x x x n m m x x m m M m m M M m M M M M M M M M M M N N M M N n # . o t +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.G . . o p I K P P K B K P K K I 0 . . . o ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s . o o . . o . o o . . . . . . . o . . . . . . + 1 p B K B N N N M N M N N N M M N M M M M M M M M M M x M x M m x M m m M x x m n n x x x i o o . . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . . . o o a n x x x x m m x M x m m m m m m m M M v M M M M M M M N M M N M N B ; . . = o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] o . . w I P K P P P P P P K I k o . o D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D . . . . + * * = < 7 s g d s 6 < = & $ + . . . o . . . . o ; i B K N N N N N M N M M N M M N M M M M M M M M M M M M m M x M x m m m m m x m x x x p O o o . . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . o o . . a m n x n m x x m m x m m m M m m M M m M m M M M M M M M M N M M N M P 9 . . o ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.= o > P P P K P P P P P I R K + . . s +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.8 O X + = 6 g C S F ! { X.O.O.O.+.+.+.+.+.+.O.o.X...` H D V 6 * + . . . o . . . ; p K B N N N N N N N M M N M M M M M M M M M M M x M M M x m M m m m x m x n m x x n p . . o . . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . X . . . w n n x x m n m m x m M m M M x M M m M M M M M M M M M M N M M M N M B B p o . . F +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.8 . . $ N I P P P I I Y K v i 1 o . . , O.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.[ ` .O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.{ H j < o . . . . . . o 1 M K N M N N M N N N M N M M N M M M M M M M M m m M M m M x M m m m m m x n x x n w o . . o . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . . . o 9 m x x x m m x x m m m m M x M m M M m M M M M M M M M N M M N M M B M N K v O . . d +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C o . . x I I I K M u 2 % o . . . . = ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.O.] C - . . . . . # p P B N N M N M N M M N M M N M b M M M M M M M m m M x x M x M n x x m x m x x x 9 . . . . . o o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . X . o o ; m x x x x n x x M m m m m x M m x M M M M M M M M M N M N M M N N N N N M K B ; . . - O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! . . . r B p 0 ; O . . . . . o X . 6 +.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.H 4 . o . o o w K K N N N N N B B M N M N M N M M M M M M M M M m M M x m m m M x M m x n x x x > . o o . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . o . . o + m x x x n x m m m m m m M x M m M M M M M M M M M M M N M M N N M M N M N N N P 2 o . o [ +.+.O.+.+.+.+.+.+.+.+.+.+.+.+...+ . . . + O o . . . . o . . . . < [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.H - . . . . . 1 M K B M N M N M M N M M M M M N M M M M M x M M M m M M x m m m x m x m n x x x $ . . o . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . . o o m n x x n m m m m x m m m m M m M M x M M M M M M M M N M N M M M N N M N N N N P i . . . . G +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.3 . o . . . . . . . . . + 4 h J o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.g o o . o : M K B N N N N N M N M N N M M M M M M M M M M m M M x M m m m m m m x m x x x x O o . o . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o o . . o o i n n n n x m m x m m m M x M m M M m M M M M M M M M M N M M N N M N N N N N N N K m O . . g +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.h . o o . . . . + < g H .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q = . . . ; M B B N N M N N N M N M M N M M N M M M M M M x M m x M m m m x m m x n x x x i o . o . . o o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . . o . 9 n n n m n m m x m m m m m M m M m M M M M M M M M N N M M N M M N N N N N N N B B B B % . . < O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` o . + < s H [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...6 . o o ; M K N N N N B M N M M N M M M M M M M M M M M M M M x m M m m m m x x m x x x 9 . . o . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . X o . ; m x x x n m m x m m m x M x m M m M v m M M M M M M M M N M M N N N M N N B N N B B B P 9 o . + { +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.H < = < s G [ O.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.d . . . ; M K B N N N M N N N M N M N M M M M M M m x M m M M m M x m m x m m n m x x z : . . o . o o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . o . . + n n n x x m x m x m m m M m M M m M m M M M M M M M N M N M M N N M N N N N M B B B K K I p . . . . H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C . . . . ; N B N N N N N M M N M N M M M M M M M M M M M M m M m m m M m m m x n x x x z # . o . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o o . . . i x x x x n m m x m m m m M m M m M M M M M M M M N M M N M M N M N N M B B N B K P P P N x w o . . h +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.S . . o . 9 K B N N N N M N N N M N M N M M N M M M M M M m M x M M m M x m x x m x x x i . . . X o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . . o 9 n n x x n m x m M x m M m M M m m M M M M M M M M M N N M N N N N N B B K K K K M z e > $ O . . o . s +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.j . . o . q P B N N N N M M N N M N M M M M M M M M M m M m M m x m m m m m m m n x x x 9 . . . . X o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o o . . . o + m n x x x m m x m m x m m m m m M M M m M M M M N M N M M N N M B K K K B m p 0 ; + . . . o . . 8 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s o . . o k P N N N N N N N M N M M N N M M M M M M M M M m M M m M x m x m x n n x x n $ o . o . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . . o x x n x x x x m m x m M x M M m M m M M M M M M M N M M N B B B K M x y 1 * O . . . . . o X . . . . H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.3 . . . $ M K K N N N N N M M N N M M M N M M M M M M m M m m M m m M m m x n n x x n a O . . . o o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o o . . . . 9 n n x x m m m m m m m m M x M m M M M M M M M M M B B B N x p w > $ o . . . . . o o . o . @ , t J +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .@ o . . 9 P B B N B M N N N M M N M N M M M M M M M M M m M x M x m M x m x m x x x x 9 . o . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . . o o # m n n x n m x x m m m M m m M m M M M M M N M B B M l i 9 : # . . . . . . . . o . o * 6 V H { +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.H . . o . O l K B B N N N N N N N M N M N M M N M M M v M M m M x M m x m x m m n m x n x $ . . o . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o X . . . a x n n x m m x m m m m m m M m m M M M N M m z y 1 ; + . . . . . . o . . . + - t Z ! X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s o . : K B N N N N N N M M N N M M M M M M M M m M m m M M m m M m m x m m n n x x i . o . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . . o o 1 n x x x n x m m m m m m M M M N N N n p w 1 $ o . . . . . o . o . . @ < d D ] O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.* . . . p P N K N N N N N N N M N M N M N M M M M M M M m M M m M m M x m x m m x n n 9 . o o . o o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . o O n n n x n m x m m m M m M M m z i 9 : # . . . . . . . . . X & 4 j H ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F . . o : P K N B N N N N N M N N M N N M M M M M M M v M M M M m m m m m x m m m x x z O o o . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . o . . o e n n n x x n m M x m m M i 9 ; O . . . o . o o . . + = t V ! X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O., . . . x P N N N N N N N N N M N M M M N M M M M M M M M m m M m m M m m x x n x x n e . . . o o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . . o . $ m x x x m m x M x m m M w o . . . o . . . . + , d F ] o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F . . o 0 P K B N N N N N N N N M N N M N M N M M M M x M m m m M m m m m m x m n x x x % . . o . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o o . . . a n x x x n m x x m m m n $ o o o . . . . $ 6 j H .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.= . $ B K K N B K N N M N N N M M N M M M M M M M M M M M M m m m m m m m n m x n n p . o . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . X . . : m x x x n m x m x m M M m % . . . . . o = t C ! ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.X...X...X.X.o.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.h o . . k P K B B N N N N M N M N N M N N N M M M M M M M v m M m m m m m m m x m x x x > . o o . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . . o o n n x x x x m m x M m m m m ; . . . O Z ] X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O...` F Z j d 4 - * * @ $ $ @ * - 6 d Z ' o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! X . . w I B K B K K N N B N N N M N M M M M N M M M M M M M m m M m M m x m m x m x x z O . . o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.. . o o o . 9 n n x x m m x m m m m M m N 9 . o . O { +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.O.[ G h 6 = @ o . . . . . O * 6 D ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.* . . : P B B B B N N N N N N M N M M N M N M M M M M M m m M M x M M x M x m x n x x x 9 . . . o o . @.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.o o . . . o m n n n n m x m m m x M x m N i . . . D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.' S 8 = + . . . . . . o o . . . o . o . . o o o . @ d [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.8 o . $ B K K B N K K N N N N N N M N M N M N M M M M M M M M m M x m m m m n m n n x x x O o . . . o @.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.. o . . . o 2 n x x x x n m x m M m M m m M x + . . s +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] F s = O . . o . . . o . . . . . . . o o . . + d { +.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.S . . o x P K B K K N K N N N N M N N N M M N M M M M M M M M x M m m m m m m x n x x x x 9 . . . . . o @.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.. o . o . o n x x x n m m x m m m m x M M M M ; o . = O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.{ H g < + . . o . . . . . . . o $ : 1 2 9 w q q q 0 9 9 > $ O . . . . . * G +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q . . o . i I K K K B K N N N N N N N N M M N M M M M M M M M M M m M x M m m m m m m n x n a o o o o . . @.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.. . . o . o 9 n x x x x m x x M m M x M m m M M 9 . . . O ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...j 3 @ . . . o . o . . . . + ; 9 r l M N I E ~ ~ ~ / ~ ~ ~ ~ / E E Y K k 1 + . . o o s ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.[ + . . q I P B K N K N K N B N M N N N N M N N M M M M M M M M m M M x m m m m m m m x x x 9 o . . . o . @.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.o o . . . o x n x x n m x m m m m x M m M M m N y . . . G +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.O.7 . . . . . o . # , r x P R ~ / ~ / ~ ~ ~ E E E E E ~ E E E E E ~ ~ ~ ~ K r $ . . . . = ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.: . . 9 I K P K B K B K N N N N N N M M N M M N M M M M M M M M m M M M m m m x x m n x x z o . o . o . @.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.o . . o . o > n x x x n m m m m x M M m M M m M N z o . o g +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q . . o . . . . + > q M I ~ ~ ~ ~ E E ~ E E E E E E E E E E E E E E E E E E E E ~ ~ I q O . . . o $ [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.< . : I K K K K K N B N N N N N M N M B N M M M M M M M M M M M m M m m m m m m m n x x x 1 . . o . . o @.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.. o . . o . z x x x x m x m m m m x x M M m M M M M ; . . < O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.H . . . . o O ; w l P ~ ~ ~ ~ ~ E E E E E E E E E E E ~ E E E E ~ E E ~ E E E E E E E E ~ / K : . . . - ..+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.3 . . ; K P K K K K K N K N K N B N N N M N M M N N M M M M v M x M m M m m m M x x m x x x a o . o . . o @.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.. . o o . : n x x x x n m m x M x M x M M m m M M N 1 . . . O { +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...$ . . * K E ~ / ~ E ~ E E E E E E ~ ~ E E ~ E E ~ E E E ~ ~ E ~ E E E ~ E E E E E E E ~ ~ E q . . . o 7 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.7 . o ; K P P K K K B K B K N N N N N N N B M M M M N M M M M M M m M m m m m x x m m n x x x > . . o . . @.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.. o . . . . a x n x x m m x x m m M m M x M M M M M N e . . . . Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.8 . . $ E ~ E E E E E E E E ~ E ~ E E E ~ E ~ ~ E ~ ~ E ~ E E ~ E ~ E E E E ~ E ~ E E E E ~ ~ k o . . . H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.d . . * P P K P K K K B K K N K N N N N M M N N N M M N M M M M v M m M m M m m m m x m x x x a . X . o . . @.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.o o . o . $ n n x x n x m m n m M x M M M m M M M M N z o . . j +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.S . . . M ~ E ~ E E E E E E E ~ E ~ E E E ~ E ~ ~ E E E ~ ~ E ~ ~ E ~ E E ~ E E ~ E E E E E ~ / u . . . , O.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.j . . $ K P P P P B K K B B B B B N N N N N M M M N N M M M M M M m M m M M x m x m x m n x x x % . . . X . @.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.. . . . . o w n x x x n m x x M m m M m m M v M M M M N M $ . o 4 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q . . . . f ^ E E E ~ E ~ ~ ~ ~ E W ~ ~ ~ ~ ~ ~ E ~ ~ ~ E ~ ~ T ~ E ~ E ~ E E ~ ~ E E ~ ~ E ~ R ~ E : . o H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.j . . . $ P P P K P K K K B K B N B K N N M N N N M M M N M M M M M M M M M x M m M m m x m x x x w o . o . . o @.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.. o . o o o n n x x x n m m x M m M x m M m M m M M M N B 1 . + .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...* . . 5 ~ ~ E E ~ E ~ E ~ E ~ ~ E ~ ~ ~ ~ E W ~ E ~ ~ ~ ~ ~ ~ W ~ ~ ~ ~ ~ E E ~ E E ~ E E E E ~ v o . o 7 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.d . . ; P I P K P P K K K B B N B N N N N M N M N M N M M M M M M v m m M M x M m m m m m n x n n o o . o . o @.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.o . . o . 1 n x x x n n x m m m M x M M M M M M M M M M B w o . . ! +.+.+.+.+.+.+.+.+.+.o. .! Z h g g j F ] X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.6 . . * R ~ ~ ~ E ~ E ~ ~ ~ ~ ~ ~ ~ ~ W ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E ~ E ~ ~ ~ E ~ ~ E E ~ E ~ ~ ~ : . $ .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.7 . . * P P P P P K P K K K B K N N N N N N N B M N M M N M M M M M M M m x M m m m x m x m x n n 1 . . o . . @.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.. . . . o o a n x x m m x m m m m m M m m m M M M M N M M B k o . o C +.+.+.+.+.+.O.[ S t : + . . . o * s Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.j o . O K ^ ~ E ~ ~ E ~ ~ ~ W ~ ~ ~ ~ ~ ~ ~ ^ ~ ~ ~ ~ ~ ~ ~ ^ ~ ~ ~ ~ ~ ~ E ~ ~ ~ E ~ ~ E ~ E ~ / p . . . H +.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.< . o ; I P P P P P P K B K K N B K N N B M N N M N M M M M M M M M m x M M x m M m x x x m n m x p . . o o . . @.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.. . o . . # m n n x n n x m m x M m m M M M M M M M M M N M M $ . o 6 +.+.+. .H g < O . . o o . . . . 6 ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.H . . . x / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W ~ ~ ~ W W ~ ~ ~ ~ ^ ~ ~ W ~ ~ ~ W ~ ~ ~ ~ ~ ~ ~ ~ E ~ E ~ ~ ~ L o . o g +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O., . . 1 I I P P P P K K P K K K K N N N N N N N M M N N N M N M M M M M M m M M x m m x M m x x x n # . . . . . @.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.. . o o . 9 n n x x m m m x m m m M m m M M M m M M M M M M B 1 . . @ F V 4 + . . . o o o . . . . . . . . . . o C +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.[ + . . r ^ ~ W ~ W ~ ~ ~ ~ ~ ~ W ~ ~ ~ ^ ~ ~ ~ ~ ~ ^ ~ ^ ~ ^ ~ ~ ~ W ~ ~ ~ ~ W W ~ E ~ E ~ ~ T ~ R ; o 3 +.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.{ + o w I P P P P P P P P K K K B K N N N N N N N N M M N M M M M M M M m M m M m m m m x n m x x x 9 o o . X o @.@.@.@.@.@.@.", -"@.@.@.@.@.@.o . o . . X a x x x m n x m M x M m m M M m M M M M M M N N M K w o . . . . . o . . . . . o O # # + o . . . . h +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.< . . : ~ ^ ~ ~ ~ ~ ~ W ^ ~ ~ ^ ~ ^ ~ ~ ~ ^ ^ ^ ~ ~ ~ ~ ~ ~ ~ ~ ^ ^ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / q o = ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.H . o . p R I P P P K K P K K K B K K N K N N N N M N B M M M N M M M M M M m M m m m M m x m x n x x z . . o . . . @.@.@.@.@.@.", -"@.@.@.@.@.@.o . . o . ; n n x x n x x m m m x M m M m M M M M M N M M M N K k . . o . . o . . . . . o O : 0 p v M M M N l w $ . . o . . . D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s o + T ^ ~ ~ ~ ~ ~ ~ ~ ^ ~ ~ ^ ~ ~ ^ W ^ W ^ ^ ~ ^ ^ W ~ ~ ^ W ~ ^ ~ ^ ~ W ~ W ^ W ~ ~ ~ ~ ~ / k . . O ] +.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.V . . o x Y I K P P P P P K K K K K K B N N N B N N N M N M M M M M M M M M M m M m m m m m m m n x x x ; X . . o . @.@.@.@.@.@.", -"@.@.@.@.@.@.o . . o . e x x x x m m m m m m M x M m M M M M M M M M N M M B M @ . . . . . . . o $ 9 p N P I I I I Y I I Y Y I p # X . + .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.F . . o b / ~ ~ ~ ^ ~ ^ ~ W ^ ^ W ^ ~ ^ ^ ~ ^ ~ W ^ ~ ~ ^ ^ ^ ~ ^ ^ ~ ~ ~ ~ ^ ~ ~ ~ ~ ~ ~ ~ W ~ / l . . . . ! +.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.< o ; P I P I I K P K P K P K K N K B K N N N N M N N M N N M M M M M M M M M M x m m M x x m n x n x e . o o o . @.@.@.@.@.@.", -"@.@.@.@.@.o . . . . . n x x x n x m m x m M x M m m M M M M M M N M M N M B K 0 . o $ 1 i x K I I I P P P K I P I I I I I R K * . . d +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` o . o k ( ~ ^ ~ ~ ^ ~ ^ ^ ^ ^ ^ ~ ^ ^ ^ ~ ~ ^ ~ ~ ^ ^ ^ ^ ~ ^ ^ ~ W ~ ^ ~ ^ ~ ~ W ^ ~ ~ ~ ~ ~ / x . . Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.[ + . . 2 I I I P I P I P P P P K K K N K B N N N N N M N M M N M N M M M M M m M m M x M m m x m m n x x x . . . . . o @.@.@.@.@.", -"@.@.@.@.@.. . o o . ; n n x x n x m m m m x M m M M M m M M M M M M N M B M B M 0 ; : q z N P I I P K P P P P I I P I P I I I I I R N + . . . @ .+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...= o 2 ^ ^ ~ ^ ^ W ^ ~ ^ ~ ~ ^ ^ ~ ~ ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ W ^ ~ ^ ^ ^ ~ ^ ~ ^ ~ ^ ~ ^ W ~ ~ ~ / l . . . ! +.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D . . . . p Y I P I P P P P P P K K K K B K K N K N N N N N N N M M M M M M M M M m M m M x m m m x m n x n n ; o . o . . @.@.@.@.@.", -"@.@.@.@.@.. . o o . 0 n x x x x m m m m M x M M m M M M M M M M M N M M M N M K P B K P P P K K P K K P P P P I P I I I I I I I I Y E q o o G +.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.6 o $ ~ ^ ~ ^ ^ ~ ^ ~ ^ ^ ^ ~ ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ ^ ~ ^ ^ ^ ^ W ^ ~ ~ ^ W ~ ^ ~ ~ ^ ~ ^ ~ ~ ^ r . . + [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.4 . . + M Y I I P I K I K P K P P K K K B B B N N N M N N M N N M M N M M M M m M M m m M m m m x x x x x x 9 . . . . . @.@.@.@.@.", -"@.@.@.@.. o . . . . a n x x x m m x m m m m x M m M M M M M M M M N N N N N N B B B B B B K K K K P P P P P P P P I P I L I I I I I R M O . o s +.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.O.+.+.+.+.+.+.+.+.+.+.+.C . . X L ^ ^ ~ ^ ^ ~ ^ ^ ^ ^ ^ ^ ^ ~ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ ~ ~ ~ ~ ~ ^ ~ ; . o - O.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.] o . . 1 Y I I I P P I P P P P K P K K K K K B K N N K N N N M M N M M M M M M M M M m M x m M x m m m x x x z . o o o . o @.@.@.@.", -"@.@.@.@.o . o . o + n x x n x m m m x M m m M m M M v M M N M N M M N M N N M N B N B B K B K K P K K P P P P I I P P I I I Y I I Y R I : . - O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q . . . . c ) ^ ~ ^ ~ ~ ^ ~ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ ^ ^ ^ ^ ~ ^ ~ ^ ~ ~ ~ ( b . . . d +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.g . . p R I P I I I K I P I P K P K K K K B B B N N B M M N N M M N M M M M M x M M m M x M m m m x m n x x n + . . o . . @.@.@.@.", -"@.@.@.@.. . o . . : n x x x n m x x m m M m m M m M M M M M M M M N M N M N N N N B B B B K K K P P P P P P I P P I I I I I I I I I I R q o . X ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .+ . . r ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ ^ ^ ~ ^ ^ ~ ^ ~ ^ 1 . . J +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...@ . . . # K Y I I I P I P K I P P P K K K K K K B B N N N K N N M N M N M M M M M M M M m M M m m m m m m n x n n > o . . o . @.@.@.@.", -"@.@.@.@.. o . . o e x x x x n n m x M m m M M M m v M M M M N M M N M N N N N N N K B N K K K K K I P P P I I P I I I I I I I I Y I Y R l . . . F +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.O.< . . : ~ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ ^ ^ ~ ( N . . . < O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.g . o q Y I I I I P I P I P P P P P P K K K N K B K B N N N N N N M M M M M M M M M x M M M x m M x m x m x x x e . o . . . @.@.@.@.", -"@.@.@.. . o o . o n x x n x n m m m m m m m m M M M M M M M M N N M M N N M N N K N B K K K K K P K P P I K P P I P L I I I Y I I Y Y R K + o t +.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.d X + T ( ^ ^ ^ ^ ^ ( ^ ^ ( ^ ( ( ^ ( ^ ^ ( ^ ^ ( ^ ^ ( ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ ^ ~ : o o F +.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q . . o . O N R I I I I I I I P P P I P K P K K K K B K N N N N N N N M N M N N M N M M v M M M x x M m m x m n x x x n . o . o . o @.@.@.", -"@.@.@.o . . o . $ n n x x n m x m m m M M M m m m M M M M N N M M M N N N N N N N K B K K K P K P P K I K P I I I I I I I I I I I Y I Y Y : . . = O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.G . . . b _ ^ ^ ^ ^ ( ^ ^ ( ^ ( ^ ^ ( ( ^ ( ^ ( ( ^ ( ( ^ ( ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ~ ^ ^ ) u . . , O.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .* . o q Y I I I I I I I K I P I K P P K P K K K K K N N N N N M N N M M M M M M M M M M m M m M x M m m x m x n x n $ . . o . . @.@.@.", -"@.@.@.. o . . . 1 n n x x x m m x m m m x M M M M M M M M M M M N N M N N N N B N K N K K K K P K P P P I P P I P I P I I I Y I I I Y Y E w . . . o ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' X . . f _ ^ ^ ^ / ^ ^ ( ^ ^ ( ( ( ^ ( ( ^ ( ( ^ ( ^ ( ( ^ ^ ( ( ^ ^ ( ^ ^ ^ ^ ^ ^ ) N O . . . H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+..., o o $ P Y I I I I I I I I I K I P P P P K K K K K K N N K N N N N M B B M N M M M M M M M m M x M x m m m m n m n n 1 o . . X . @.@.@.", -"@.@.@.o . . . o e x x x x n m x m m m m m M m M M M M M M N M N M N N N N N B N B B B K K K K P P P I P P I P I I I I I I I I Y Y Y Y Y R l . . o D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.X.= o 2 ( ( ^ ( ( ^ ^ ( ( ^ ( ( ( ( ( ^ ^ ( ( ( ( ^ ( ^ ^ ( ( ^ ( ^ ( ^ ^ ^ ^ ^ _ Y $ . . s +.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.6 . . . X l R I I Y I I I I P L P I I K P P P K K K K K B B K N N N N N M M M N M M N M M M M M x m x M M m x m m x x x x e o . . . o @.@.@.", -"@.@.. . . o . o n x x x x m m m m m M m M m M M M M M M M M M N M N M N N N M B B B K K K K K P K K P P P P I I I I I I I I I Y Y I I Y R K # . . t +.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.7 o . $ W ( ( ^ ^ ( ( ( ( ( ^ ( ^ ( ( ( ( ( ( ( ( ( ( ( ( ( ^ ( ^ ( ^ ^ ( ^ ^ _ Y $ . o * ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.7 o . . . r R Y Y I I I I I I I I I P K I I K P P P K K K B B N N K N N M N N M M N N M M M M M M M M M m m m x m x m x x x x . . o o . o @.@.", -"@.@.o o . . o + n n x x x m x m m m m m m M m M m M M M N N M M M M N N N N N B B B B K K P P K P I P P I P I P P I I I I I Y I I I Y Y T T : . . . = X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.C . . o U ) ^ ( ( ( ^ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ^ ( ( ( ( ( ^ ( ^ ( _ L $ . . o Q +.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s . . . . 0 R Y Y I Y I I I I I I P P I P P P P P P P K K K B B K N N N N N N M N M M M M M M M M x M m m M M x M m x x x x n m + o . . o . @.@.", -"@.@.. . o . . ; n n x x x m x m m m M m M m v M M M M M M M M N N N N N N N N B K N B B P P K P P K I P P I I P I I I I Y I I Y Y Y Y Y Y E r . . O ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! . . . . l _ ( ( ^ ( ( ( ( ( ( ) ) ( ) ( ) ( ) ( ( ( ( ( ( ( ( ( ^ ( ( ^ _ ) l + . o . . F +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.V . . . . 2 Y R Y Y Y Y I I I I I I I I P I P I P P K P P K K K K K N K N N N N N B M N M N M M M M M M M M x m x m x M x n x x n ; . o . . . @.@.", -"@.@.. . . . . 9 x x x x n m m m m M m x M M M M M M M M M N N M M N N N N N N K B K K K K P P K P P P I P I I I I I I I I I I Y Y I Y Y Y E x . . . . F +.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .@ . o r _ ( ( ( ( ( ) ( ) ( ( ( ( ) ) ( ( ( ( ) ( ( ( ( ( ( ( ( ( _ _ Y 2 . o o . C +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.D . . . o . # k N L I I I Y R R Y I I I I I I P P P P P P P K K K K K B N N N N N M N M M N M N M M M M M M x x M x M M x x n n x n x 9 . . . o o @.@.", -"@.@.o o o o . i x x x x n n m x m x m M m M x M M M M M M M M N N N M N N N N N N B K K K K P P P P I K P I P L I I I L Y Y I Y Y Y Y Y Y T L + . . s +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.< o : ^ ) ( ( ( ( ( ( ( ) ( ( ) ) ) ) ) ) ) ) ( ) ( ) ( ) ( _ _ ~ u + . . . . Z +.+.+.+.+.+.+.+.+.O.+.+.+.+.O.+.+.+.+.+.+.+.+.O.+.+.+.+...@ . . . . o o o O + $ : 0 e l P R R I I I P I I I P P P P K P K K B K N N K K M N N B M N M M M M M M M M M M M M x m m m m n x x x i o o . . . @.@.", -"@.@.. . . . o n n z x x m x x m m M M x M M m M M M M N N M N M M N N N B N N K K K K K P K P P P I K I I P I I I I I Y I I Y I I Y Y Y Y T T : . = O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s o . + T _ ( ( ( ( ( ) ) ( ) ) ) ) ) ) ( ) ) ) ) ) ) ) ) _ _ ~ u $ . o . + H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' . . . . . . . . . . . . o $ 1 k K Y I I P P P P P P P K P P K B N K N K N N N N B M M M N b M M M M M x M m x M m x m x n m x x n . o . . o @.@.", -"@.. o . . o O m x x x n n m m m m m m M m M M M M M M M N M M M M N N N N N N B K B K K K K P P K I P P P I I I I I I I I Y I Y Y Y Y Y Y Y ~ q . . . o ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.H . . . N _ ( ( ) ) ) ( ) ) ) ) ) ) ) ) ) ) ) ) ) ) _ } _ U r # . . . o . 6 [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...* . . . . . . . o . . . o . . $ q M R I I I P P P P P K K K K K B K N N N N M M N M B M M N M M M M M x M M x m M m x m n x x n O . o X . . @.", -"@.. . o . . $ n x x x m m x m m M x M m m M M M M M M M N M N N N N M K N K N K K K K K P P P P P I P I P I L I I I I Y I Y I I I Y Y Y Y T E x . . . . F +.+.+.O.+.+.+.+.+.+.O.O.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.] X . . u } ( ) ) ) _ ) ) ) ) ) ) ) ) ) _ ) ) _ | } ~ c 2 o . . . . . @ Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` 7 3 = + . . . . . . o o o . . O 9 M R I P P P P K P B K K K N N N K N N M N N M M N M M M M M M M m M x M m m m m m x x x n $ X . . . o @.", -"@.o . . o . 1 n x x x n x m x M m x m M M m M M M M M N M M M N N N N N N N N K K K K K K P P P P P I P I I P I I I I I Y I Y Y Y Y Y Y Y Y R L O . . d +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.: . 5 _ ) ) ) ) ! ) ) ) ) ) ) ) _ _ _ } } ^ A q $ . . o . . O d .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...[ ] ` ! Q F h t 4 * . . . o . . + q K I I P P P P B K K B K K N N N N N N M N M N M N M M M M x M m M m m m m x m x x x n 1 . o o . . @.", -"@.. o . o . 9 n x x x n x m x M m M M m m M M M M M M N M N N M N N M K B N B B B K K P K P P P P I I P P I I I I I I Y I Y I Y Y Y Y Y Y T R T : . , O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.7 o $ ~ _ ) ) ( ( ) ( ) } ) _ } _ } ( L u * . o . . . + d ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...! C < o o o . . % z Y P P P K B K K K B K N N N N N N M N M M M M M M M M M m m x M m x m x n m x n n 9 . . o . . @.", -"@.. o . . o e x x x x x m m x m x M x M m M M M M M M M M N M N M M N B N B B B B K K K P P P P P P P I P I I I Y I I I I Y Y Y Y Y Y Y Y T Y E w . . . O { +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C . . X U _ ) ) } ) ) ) } } | _ ~ L t : X . o . . . . * j [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` d @ . . . . . O e I P P P P P K K N B K N N N M M B M N M N M M M M m M M M M x M M m m m m x n n i o . . . o @.", -"@.o . . o o a x x x n m m x m m M x M M m v M M M N b N M N N M N N N N N N K K K K P P P K P I P P P I I I I I I Y L Y I Y Y I Y Y Y Y T Y T ~ l . . . H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! . . . l } ) _ } } } _ W L f < # . . . . . . . + 4 G ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .h + . . o . . 9 K I K K K K K B B B N B N N N N N N N M M M M M M m m M m M x m x x x m x x x p . . o o . @.", -"@.. o . . . n x x x x n n m m m x M x M M M m M M M M M M M N M N N N K N K B B B K B K P P P P P I I P P I P I I I I I I Y Y I I Y Y Y Y T R R K O . . g +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...@ . o q | _ ( T b r 1 $ . . . . . . . . . , j ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .s . . . . > B I K K K K B B B N N N N M N M M M N M M M M M M M M m m M m m m m m x x n m o . . . . @.", -". o . . o . n n x x x m m x M m M x M m m M M M M M N M N N N N M N N N K N N K K B P P K P P P P I P I I I I I I I I Y Y I Y Y Y Y Y Y Y Y T R Y ; . 3 O.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.3 . ; l 5 ; X . . o . . o . . * g ! O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.G * . o . . ; B I B K K K N N K N N N N N B M M M M M M M M M M m M m m m m m m x n x n m o o o . o . ", -"o . . o . $ m n x x n m x m m m m M m M M M M M M M M M M M N M N N N N N N B K K K K K P P P P I P I P P I I I I Y I I I Y Y Y Y Y Y Y T T Y E ~ 2 . o . + .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.d o o . . . o . . o . . X : d Q X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .4 . . . ; B P K K B K K N K N M M N M N M N B M M M M M m M M m m M m x x m n x n m $ . . . o . ", -". o o . . $ n n x x n x m m m m m m m M M M M M M M N N N M M B M N N N N N K K K K K K P P P P P P I P I P I I I I Y I I Y Y Y Y Y Y Y Y T R T ~ k . . . Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.H . . . . o . o . X & 7 S ' O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.s o . . : K P K B B N K N N N N M N M M N M M M M M M M m M m M m m m m x m x n n $ . . o . . ", -". . . o o ; n n x x m n x m m m m M m m m M M M M M M M M M N M N N N N K K K N K K K P K P P P I I P I I I I I I I I Y Y I Y I Y R Y T Y R Y T E K o . o j +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.{ X . . . . . . + , d D ' X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.d . o . . 9 P K N K N N N N N N N M N N M M M M M M M M m m M m m m m m m n x n n ; . o . . o ", -"o . . . . 9 n x x x n m m m m m M m m M M m M M M N M N N M N N N N N K N B B K K K P K P K P P K I P I I I I I I Y I I I Y Y Y Y Y Y Y Y T R T E Y $ . . 7 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.j X $ 6 j Q .O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s . . . . e I B K B K N N N N N N M N M M M M M M m M m M m m m m x x x n x m n 9 . . . . o ", -"o . o . . 1 x x x x m x m x m M m M M m M M M M M M M M M N M N N N N N N K N B K K P P K I P I P P I P I I I I I I Y Y I Y Y Y Y Y Y T Y T T R R ~ 1 . . * ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.H j Z ! ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.7 . o . O l P B B N N N N M B M N M M N M M M M M M m M m M x M x m m m x x n 9 . o o . . ", -". . . o o 9 z n z x n n x m M m m m M m m M M M M M M N M N N N M N N K N K K B K K K K P P P P I P I I P I I I I I I Y I Y Y I Y Y Y Y Y R T T R ~ y . . . . ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X., o o * B K K K N N N N N N M N N M M M M M M M x m v M m M m m m m x x x 9 o . . o . ", -". o X . o e z z x n m n x M x m m M M M M M M M M M M M M N M N N N N N N K B K K K K P P P I P P I I P I I I I I Y Y I Y Y Y Y Y Y Y T Y T T T T ~ b . . o . Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.O.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] + . o . w I K N N N N N N M N M M N M M M M M M M M M m m x x x x m x x x e . o . . o ", -". . . o . i z n x x n m m x m m x M m M m M M M M M N M M N N M N N N N N K N B K K P P P P P P K I P I P I I I I I I Y L Y Y Y Y Y Y T Y R T R R E I # . . s +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.G . . . . O x K N N N N N N M N N M M M M M M M M M M x m M M x m n n x n x i o . . . o ", -"o o . . . i z z x x m x x m m m m m M m M m M M M M N M M B M N N N N N N B K K K K P K P P P P I P P I I I I I I Y I I Y I Y Y Y Y T Y R Y T T R E E , o , O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.8 . o 2 K K N N B M N N M M M N M M M M M x M x M M x m m m x m x x x i . o o . . ", -". . . o . i x x x x m n x m m M M x M m M M M M M M M N M B N N N N N N N K K B K K P K P P P I I K I I L I I I I Y I Y Y Y Y I Y Y T Y R T T T R E ~ q o . O [ +.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+. .@ . o . . z P B B M N N N M N M M M M M M M M m M x x M x m x m m x n n i o . . . o ", -". o . o . i x x x x x m x m x M x M m M M v M M M M M M M M M N N N K N B K K K K K P K P P P P P I P I I P I I I I I Y Y I Y Y Y Y Y R R Y R T E R ~ l o . . . H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C . o , K K N B N M N N M N N M M M M M m M M M M x M x m m x x x n i . . o o . ", -". X . . o i n x x x n m M m M x M x M M m M M M M M N B N N M N M N K N N B K N K K P P P P P P I I P P I I I I Y Y I I I Y I Y R Y Y Y Y T R T R E ~ I O . . d +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.= . . O x K K N N M N M M N M M M M M v M M M x M x m x m x n x x x i o . . . . ", -"o . o . . i n x x x m n x x x M m M M m M M M M M M M M M N B M N N N N N K B K K P K P P P P I K I I I I I I I I I I Y Y Y Y Y Y Y T Y R T T T R E E Y ; . 4 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z . o . . 0 P N N N N N M N M M N M M M M M m M m m M m m m m n x x x i . o X . o ", -"o . . . . i z x x x m x x m m M m M m M M M M M M M M M N M M N N N B N N N B K K K K P P P P P I P P I I I I I I Y Y I Y I Y Y Y Y Y Y R Y T T R E E ~ 9 . . @ ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+...& o $ B B N N N N M M M N M M M M M M M M x M x m x x m n x x x i o . . o . ", -". . o o . i z z x x n m m x m m m m M m m m M M M M N N M N N M N N N N K B K K K K K P P K I P P P I I L I I I I I I Y I Y Y I Y Y T T T T R T T R E ~ u . . . ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...] Q H G C d 7 6 4 4 4 6 t g S Q ] X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s . o o z K N N M N M N M N M M M M v m M M x x M x M m x m x x x i . o . o . ", -"o . . . o i z z x x x m m x m m m M M M M M M M M M M M N M N N N N N N N K N K K K K P P P P I I P I P I P I I I Y I I Y Y Y Y Y R Y Y Y R R T T R T ~ K o . . V +.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...` Q S s 6 < = O . . . . O = 6 Z ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.Q o . o . 9 K N N M N N N M M M M M M M M M m M x M m m m m m x x x i o . o . . ", -"o . o . . i z x x x m m x m M m m m m M m v M M M N N M M N M N M N N N N B B B K P K P P P P P P I P I I I I I L I Y I Y I Y Y Y Y T Y Y T T T T E T E Y $ . o 8 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.] H V 7 < $ . . . . . o o o . . o . . o o . . o . + 7 Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.= . ; B B N N N M M M N M M M M M M m M m m m M x x m n x x x i . . . . o ", -". . . o o i x n x x m n x m M m M M m M M M M M M M N M M N N N N N N N K B N K K B K P P P P P P P I I I I I I I I Y I Y Y Y Y Y Y Y Y T Y R T T E R ~ E 1 . - o.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.! S t < + . . o . o o o o . . . . o . o . . 3 Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.O.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.t . O M B N M N M N N M M M M M M M M M x M x m m x m m x n n i . o o . o ", -". o . . . i z z x x n m x M x m m m M m m M M M M M N M M N M N N N N N N N K K K P K P P P P I P I P I P I I I Y I I Y I Y I Y Y Y Y T Y T T R T R T T ^ q . O [ +.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.' S t = o . o . . . o . . . o + $ ; : : : : : : ; * $ o . X . . . t [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F . o . o i K N N N M M M N M M M M M m m M M M m x M x m x x x n i o . . . . ", -". o o . . e x x x x m x n x m m x M m M M M M M M M M M N M N M N M N K B B B K K K P K P P P P P P I P I I I I I I I Y Y I I Y Y Y Y Y Y R T R T T E R ~ x o . . . G +.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.] F s : o . . . . o . . . o + * : 5 u l v L T ^ ^ ( ^ ^ ( ^ ^ ^ ~ T A k 2 $ . . . . . $ F +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] O . o 9 K N N M N N M M M M M M x M m M x m m m x m m n x n x e . . X o . ", -". . o . . 9 x x x x n m m m m m m m m M M M M M M M M N M M N N N N N N B B B B B B P P P P P P I I P I I I I I I I Y I Y I Y Y Y Y Y T Y T T T T R E T ~ I O . . d +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.] F s , o . . . . . . . . + * 2 u c N T ( ) _ } _ } _ _ ) ( ) ( ( ( ( ^ ^ ( ^ ) ) ( Y f : . . . o . d X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o., . . : B B M N N M M N M M M M M M M m M m m m m m x m x x x 9 o . . o . ", -"o . . o . 9 x z x x n m x m m m M m M m M x M M M M M M N M M N N N N N K N K K B K P P K P P I K I P I I I I I I I Y I Y I Y Y Y Y Y T Y R T T T R R T E T * o < +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .7 X . . o . o . . . @ < u b T ) _ | | } _ _ ) ) ) ) ( ( ( ( ( ( ( ( ^ ^ ^ ^ ^ ~ ^ ^ ~ ^ ( W c ; . o . . 3 X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.t o # M B M B M N M M M M M M M M m M m M m m m m x m x x n 1 . o . . o ", -"o . . o o 2 x x x x n m x m m m x M m M M M M M b N M N N M N N M N N N N K B K K K K P K P P P I K I I P I I I I I I Y I Y I Y Y Y Y Y T Y Y R T T E E E ~ w . . $ ..+.+.+.+.O.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.8 . . . o o . . # 2 k L ^ } | | } _ _ ) ! ( _ ) ) ) ) ) ( ( ( ( ( ^ ^ ( ^ ^ ^ ^ ^ ^ ~ ^ ~ ^ ~ ^ ( E u O . . . 3 o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C . . O x B M B M M M N M M M M M m M m M m m m m m m n n x n 9 . . o . . ", -". . . . . ; z n x x n n m m m M m M x m m M M M M M M N M M N M N M K N N N N K K K K P P P P P P I P K P I I I I Y I Y Y U I Y Y Y Y Y Y Y R T T T R T E / p . . . ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.= . . o + 1 f L ^ _ | | } _ _ _ _ ) ) ) ) } ( ) ) ) ( ( ( ( ( ( ( ( ( ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ ~ ~ ^ ~ ^ / L : . . . 7 O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.! . . . . y K M M N M N M M M M M M M m M x m m m m x m n x x n ; o o . o . ", -". o o . . $ n x x x x m m x m m M x M M M M M M M M M M M N N N N N N N N N B K K K K K K P P P I K I I I L I I I I I I I Y Y Y Y Y Y Y T Y T T T T E E R ~ b O . . C +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.< o . . , u K ~ _ | | } _ _ _ _ _ ) _ _ _ ) _ ) ) ) ) ( ) ) ( ( ( ( ( ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ ^ ^ W ^ ~ ~ ~ ~ ~ / T q . . . . S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.{ O . . 9 P N N M M N M N M M m M M m M M M m x m x m x x x n $ . . . o . ", -". o o . o $ n n x x n n x m x M m m m M M M v M M N M M N M M N M N N N K K B N B K K P K P P P P I P I I I P I I Y I I I Y I Y Y Y Y Y Y Y R R R T R T R ~ Y $ . . 7 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z o . o L | } } } _ _ _ _ _ _ ) _ ! _ ) _ ) ) ) ) ) ) ) ( ) ( ( ( ( ^ ( ^ ( ^ ^ ^ ^ ^ ^ ~ ~ ~ ^ ~ ^ W ~ ~ E ~ ~ / y . . . . + [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.O.= . . > K N N M M N M M M M M m M m m m m m m x m x x x n m $ o . o . . ", -". . . . . . n n x x x n m m x m M m M m m M M M M M M N M M B M N N N N N N K K B K K K P P K P P P P I P I I I I I I Y Y I Y Y Y Y Y Y Y T Y T T T R E E R ~ 1 o = O.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` o . . l | ) ) _ _ ) _ ) ) _ ) ) } ) ) ) ) ) ) ) ) ) ( ( ( ( ( ( ^ ( ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ ~ ~ ~ ~ ~ ~ ~ E ~ ~ ~ 1 . o g +.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.O.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.t o . % M N M N M M M M M M M M M M M x m m m m n x x x n m . . o . . o ", -"@.o . o o . m n x x x x n m m m m m m M M m m M M M M M M N M B N N M B N N N B K K K P P K K I P I I P I I I I I I I I I Y I Y Y Y Y Y T Y T R R T T E R E ~ y o . o [ +.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.$ . . 3 } ) ) ) _ ) _ _ ) _ } ) ) ) _ ) ) ) ) ) ( ( ( ( ( ( ( ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ ~ ^ ~ ~ ~ ~ ~ ~ E ~ ~ E E ^ K # . . $ .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.g o . + M B M N N B M M M M M m m M x M m x x M m m n x n m . X o . . @.", -"@.. . o . . a n x x x m m x m m m m m M m M M M M M M N M M N M N M N N K N N K K K K K P P P P P K K I P P I I I I I Y I I Y I Y Y Y Y Y Y T Y T Y T T E T ~ l . . . . H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.6 . = ^ } ) ) ) _ ) ) _ ) ) ) ) ) ) ) ) ) ) ) ) ( ( ( ( ( ( ^ ( ( ^ ( ^ ^ ^ ~ ^ ^ ^ ^ ~ ~ ^ ~ ~ ~ ~ ~ ~ E ~ E ~ ^ q . . . D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z . . o l B M M M M M M M M M M M m M x M M x x n n x n n a o . . . o @.", -"@.o . o o . i x x x x n n m x m m M m m M M M M M M M M M M N N N N N N B N K B K K K K K P P P P I K I P I I I I I I I I Y Y Y I Y Y Y Y T Y Y T R T E R E ~ L # . . . d +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.V o . o Y } ) ) ) ) ) _ ! ) ) ) ) ) ) ) ) ) ) ( ( ( ( ( ( ^ ( ( ^ ( ^ ^ ^ ^ ^ ^ ~ ^ W ^ ~ ~ ~ ~ W ~ ~ ~ ~ T ~ E E ~ I O . o 6 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.H . . . o z B N M N M M M M M M m m M m m m m m x n m x x x i o . o o . @.", -"@.. . . . . 9 x n x x n n m m m m m m M M m M M M M M M M N N M M N N N N N N K K N K K P K P P P P I P P I P I I I I I I Y I Y Y Y Y Y Y Y Y T Y T R T T E E Y ; . < +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.H . . . . v } ) ) ) ) ) ) _ ) ) ) ) ) ) ) ( ( ( ( ( ( ( ( ( ( ^ ( ^ ^ ^ ^ ^ ^ ~ ^ ~ ^ ^ ~ ^ ~ ^ W ~ ~ ~ ~ ~ ~ E E E E ~ 1 . . @ .+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] o . . o p B M M M N M M M M M M M m M M m m x m m n x x x 9 . . . . . @.", -"@.. o . . o 1 n z z x x m x m m M m m M m M M m M M M M M M N M M N N N N K N K B K K K K P K P P I K I I P I L I I I Y Y I Y I I Y Y Y Y T T Y R R R T E R E ~ q o $ .+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .+ o r _ ) ) ) ) ) ) ) ) ) ( ) ) ( ( ( ) ( ( ( ( ( ( ^ ( ( ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ ~ ~ ^ ^ ~ ~ ~ ~ ~ ~ E E E ~ E E E ~ k . . . H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.O.+.+.+.+.+.+.[ X . . . r B M N M M M M M M m M m M m m M m m n n n x x n 1 . o . o o @.", -"@.. o . . o $ n z n x x n m m x m m m m M m M M M M M M N M M N N N M N N N N N N K K K K K P P P K I P P I I I I I I I I I I Y Y Y I Y Y Y Y Y T Y T T R E R ~ p . . . ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.- o , ) ) ( ) ) ) ) ) ( ( ) ( ) ( ) ( ( ( ( ( ( ( ^ ( ^ ^ ^ ( ^ ( ^ ^ ^ ^ ^ ^ ~ ^ ~ ~ ~ ~ W ~ ~ ~ ~ E ~ E E E E ~ K O . o V +.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.[ + . . w B N M M N M M M x M M M x m M x m x m n x x x n $ . . . . . @.", -"@.o . . o . o m x x x x m x m m m m M m M m v M M M M M M M N M M N N N N N N K B B B K K P P P P P P I P I I I I I I I I I I Y Y Y Y Y Y Y Y T Y T T T R E T ~ b X o S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.d . $ T _ ) ( ) ( ( ) ( ) ( ( ( ( ( ( ( ( ( ^ ^ ( ^ ( ^ ^ ( ^ ^ ^ ^ ^ ~ ~ ^ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E ~ E E E E E E ~ Y * . 8 +.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.O.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.[ o . . . w B M M N M M M M M M m m M m m m m m x n x x n m O . . o o . @.", -"@.@.o . . o . n z x x x x m m x m m m M m m M M M M M M M B M M M N M N N K N N B K B K P K K K P P I K P I K P I I I I I I I Y Y I Y Y Y Y Y Y Y R Y R E R R ~ Y $ . . 7 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.F . o . A _ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ^ ( ( ( ( ^ ^ ^ ^ ^ ^ ^ ~ ^ ^ ^ ^ ~ ~ ^ ^ ~ ^ W ~ E ~ ~ ~ E ~ E E E E E E E , . . . : O.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .+ . o . 0 B M M M M M M M M m M M m m m M x m x m x x x n . o o . . @.@.", -"@.@.. . . X . i n x x x x m m x m m m M M m x M M M M M M M M N N M N N N B N K B K K K P K P P P I P K I P I I I I I I Y I Y I I I Y I Y Y Y Y Y T T T T T R E E 1 o . = O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] o . . . k _ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ^ ( ( ( ^ ( ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ ~ ^ ~ ~ ~ ~ ~ ~ ~ E E E ~ E ~ E E T R E w . & X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.[ X . . q K B M M N M M M v M M M m m m m x m m x x x x i . . . . o @.@.", -"@.@.. o o . . 9 z z x x x x m m m m m m m M M M M M M M M N N M M N N N M K N N B B B K K K K P K K I I K I P I I I I I I I I Y Y Y Y Y Y Y Y Y Y Y R Y T T R E ~ y . . . o ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.* o 2 _ ) ( ( ( ( ( ( ^ ( ( ( ^ ^ ( ( ( ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ ~ ^ ~ ^ ~ ~ W ~ ~ ~ ~ W E ~ ~ E E E E R E E E ~ k . . @ ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] o . . o p K M M M M M M m M M m m M m m x m m x x x x x 9 o X . o . @.@.", -"@.@.o . o . . ; n x z n x n n m x M m M x M m M b M M M N M M M N M N N M N N N B B K K K K K K K P P P P I P I I P I I I Y I Y I Y Y I Y Y Y Y T Y R T T T T R ~ x . . . . H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.6 . ; ^ ) ^ ( ( ^ ^ ( ( ( ^ ( ( ^ ( ( ( ^ ^ ( ^ ^ ^ ^ ^ ^ ~ ^ ^ ~ ^ ~ ~ W ~ ^ ~ W ~ ~ ~ ~ E ~ ~ E E E E E T E R ~ x . . @ X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.H . . . o k B M N M M M M M v m M m m M m m x x m x n n n ; . o . . o @.@.", -"@.@.. . . . o + n z z x x n x m m m m m x M M m M M M M M M N N M N M N N B N N N N B K B K P K P P I P I P I P I I I I I I I I I I Y Y Y Y Y Y Y T Y T Y R T E E L + o d +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C o . O L _ ( ( ^ ( ( ( ^ ( ( ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ W ^ ~ ~ ^ ~ ~ ~ ~ ~ ~ ~ E ~ E E E E E E T E E E ~ k . . @ ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.V o . o x B M N M M M M M M M m M m m m m m m n x n n n + . . . o . @.@.", -"@.@.. o . o o . n n x x x m m m m m m m M m M M M M M M M M M M N M N M N N N K K N K B K K K P P P K I K P I I P I I I I I Y I Y I Y Y Y Y Y Y Y Y Y R T R T T E T ; . < +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.Q . . o c _ ( ^ ( ^ ( ^ ( ^ ( ^ ( ^ ( ^ ^ ( ^ ^ ^ ^ ^ ~ ~ ^ ^ ~ ^ ^ W ~ ~ ^ ~ ~ ~ E ~ E ~ ~ E ~ ~ T E E E E R T E E w . o * ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.O.+.+.+.+.g o . + x N M M M M M M M x M M m m m m x m n m x x n n . . o o . . @.@.", -"@.@.@.o . . . o e n x n x x n x m m m m m M m M m M M M M M N M N M M N N N N N N N K K K K K K K P P P P I K I P I I I I I I I I Y I Y I Y I Y Y R T Y T Y T R R E q . . $ ..+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .+ . . . q _ ( ^ ^ ( ^ ( ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ ~ ^ ~ ~ ^ ~ ~ ~ W ~ ~ ~ ~ T ~ E E E E E E E T E T E E : . - O.+.+.+.+.+.+.+.+.+.+.O.+.O.+.+.+.+.+.+.O.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s o $ M N M M M M M M M M m x m M m m x m m x x x n e o . . . o @.@.@.", -"@.@.@.. o . . . > n n z x x n m x M x M M m m M M m M M M N M M M M N N N N N N N N B K K K K K K P P P P P P I I I I P I I I I I I Y Y Y Y Y Y Y Y Y Y Y T T R T ~ k . . . Q +.+.+.+.+.+.+.+.+.+.O.+.O.+.+.+.+.+.+.O.O.+.+.+.+.+.+.+.+.+.+.+.< o , ^ ^ ^ ( ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ ^ ^ ~ ^ ~ ^ W ^ ~ ^ ~ ^ ~ W ~ ~ E ~ E ~ ~ E E E ~ E E T T E T E ~ N o . . s +.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.O.< o > B N M M M M M M M M m M M m m x m m x x x x x 1 o . . o . @.@.@.", -"@.@.@.o . . o . $ n z x x x x m m m m m m m M m M v M M M M M N M N N M N N M B N B B B B K K K K P P P P I P P P I I I I I I I Y I Y I I Y Y Y Y Y T T Y R Y T R ~ M O . . Z +.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s o . $ T ) ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ ~ ^ ^ ^ ^ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E E ~ E E E R E E E R E R E 2 . o . H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+...+ . . 2 K M M M M M M M m M M x m x M M m x m x x x n $ . o . . . @.@.@.", -"@.@.@.. . o . o o n x x x x n m m x m m m M m M m M M M M M M N N M M B M N M N N N B B K B K K K P K I P P P I P I I L I I I I I Y I Y I Y Y Y Y Y Y Y Y Y R T T E I $ o 7 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.G . . . b _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ ^ ^ ^ ~ ^ ^ ~ ~ ^ ^ W ~ ~ ~ W ~ ~ E ~ E ~ E ~ ~ E E E T E E T R ~ b o . . * X.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] . . . . w B M M M M M x M M m M m m m m x m n n x x n n . . o o . o @.@.@.", -"@.@.@.@.. o . . . e x x x x x n n m m m m m M m M M m M M M M M M M N M N N N N N K B B B K K K P K P K P P P P I P I P L I I I I I I I Y I Y Y Y Y Y Y T Y R T T R E 1 o = o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' o . . p _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ W ^ ^ ^ ~ ^ ~ ~ ^ ~ W ^ ~ ~ ~ ~ W ~ ~ ^ W W ~ E ~ E E E E E E T E T E R E R 1 . o C +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D . . . a B M M M M M M M M M x M m m m m x m x x n n e o . . . . @.@.@.@.", -"@.@.@.@.. . o . . > x x x n x n n n m m x M m m M M M M M M M M N M N N N N N N N N N K K N K K K K P P P P P I K I I I I I I I I Y I I Y Y I Y Y Y Y Y Y Y T Y T T ~ u o . O ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.o.= o 2 ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ ~ ^ ~ ^ ~ ~ ^ ~ ^ W ~ ^ ~ ~ ~ ~ ~ ~ E ~ E ~ ~ E E E E E E T E R E T E ~ u o . . * ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s . . + x N M M M M M M M m M m x m m m x m m x x x x > o . o o . @.@.@.@.", -"@.@.@.@.o . o . . + n n x x x n m m m m M x m M M m m M M M M M M M M M N M M N N K N N B B K K K K K P K P P P I P P I I K I I I I I Y I Y I Y Y Y Y Y Y Y Y Y Y R ~ x . . . F +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.6 o ; ~ / ^ ^ ^ ~ ~ ^ ~ ^ ~ ^ ^ ^ ~ ^ W ^ ^ ~ ~ ~ ^ ~ W ~ ~ W ~ ~ ~ ~ E ~ E E E E E E E T T R E R R ~ v O . X . F +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.< . ; M N M M M M M M M M M m M m m m x m x x x n n O . . . . . @.@.@.@.", -"@.@.@.@.. . . o o . a x x n x x x m m x m M M m m M M M M M M M M N M M M B N N N N B N N K K K K K P P K P P I K I I P I I I I I I I I Y I Y Y I Y U Y Y Y Y T Y T E L + o s +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C . . O I ( ^ ^ ~ ^ ^ ^ ^ ^ ^ ^ ~ W ^ ~ ^ ~ ^ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E ~ E E ~ E E E E T E E E T E ~ K $ . . 7 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.[ O . o 9 B M M M M M M v M M x x M m m m m n x x x n a o . o o . o @.@.@.@.", -"@.@.@.@.@.o . . . o 9 n z z x x m m x m m m x M M m m M M M M M M M N N N M M N M N K N N B K K K K K P P P P P I P P I P I I I I I I Y I I Y I Y Y I Y Y Y T Y T R R Y ; . . , +.+.+.+.+.+.+.O.+.+.+.+.+.+.O.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q . . o l ( ~ W ^ ~ ~ ^ W ~ W ^ ~ ^ ~ ~ ^ ~ ~ ~ ~ ~ W ~ ~ ~ E ~ ~ T E ~ E ~ E E E E ~ T E E E T R ~ K $ . o . + [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D o . . y B M M M M m M M m M x M m m m x m n x x x n 0 . . . . . @.@.@.@.@.", -"@.@.@.@.@.. . o . . ; n z n x x n m m x M m M x M m M m M M M M M N M M N M N N N N N N N K B N K K K K P P P P K I P P I P I I I I I L I I Y Y Y I Y Y Y Y Y Y Y Y T E q o . + { +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+. .@ . o r ( ^ ~ ^ ~ ^ W ~ ^ ^ ~ ^ ~ ~ ~ ~ ^ ~ ~ ~ W ~ E ~ E ~ ~ E ~ E E E E E E E E E R R T R E ~ K $ o o X H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.7 . . O m B M M M m M M M m m x M m m x x m n x n x n ; . o o . . @.@.@.@.@.", -"@.@.@.@.@.o . . o . . n z z x x m x n m x m m m m M m M v M M M M N M N M N M M N N N K K N B K P K K P K P P P I K P I P I P I I I I Y Y I I I Y I Y Y Y Y Y Y Y T R E z . . . H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.< . : ^ ^ ~ ~ ^ ~ ^ ~ ^ ~ ~ ~ ^ W ^ ~ W ~ ~ ~ ~ ~ ~ ~ ~ ~ E ~ E ~ E E E E E E T T E E R ~ ~ v # . . . Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+. .+ . . : N M M M M M M m m M M m m m m m m m m x x x z . . o . . o @.@.@.@.@.", -"@.@.@.@.@.@.o . o . . w z z n x x m x x m x m m m M m M M M M M M M N M N M B N N N N N N K N K B K K K P K P P P I P I I P I I I I I I I I Y I I Y I Y Y Y Y Y Y T Y ~ N O . j +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.s o . $ Y ^ ^ ~ ~ ~ ^ ~ ~ ~ W ~ W ~ ~ ~ ~ ~ ~ ~ ~ ~ E E ~ E E E ~ E E E ~ E E T E E R E ~ R u o . . . . g +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z . . w B M M M M M M m M m x M m M m x m x x x x x w . . . o . @.@.@.@.@.@.", -"@.@.@.@.@.@.o . . o . % n z z x x n m m x M m M m m M M m M M M M M M M M N M M M N N N N N N K K B K K K P K P P P P P P I P I I I I I I I Y I Y I Y Y Y Y Y Y Y Y Y R Y * o . 3 +.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F . . . v ^ ~ ~ ~ ~ ~ W ~ ~ ~ ~ ~ ~ W ~ ~ ~ ~ E E ~ ~ ~ ~ ~ E ~ T E E E E E E E T T ~ ~ N : . . o . h +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O., . . + x N M M M M M M M M m M m m x m m n m x x x n ; o o . o . @.@.@.@.@.@.", -"@.@.@.@.@.@.o o . . . o z x x z x x n m m x m m m M M m M M M M M M M M M B N N N N N N N K N K B K K K K P K K P P P I P I I P I I I I I I I Y I I Y Y Y Y Y Y Y Y Y T R 2 . $ .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` . o u ^ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E ~ T ~ ~ ~ ~ E ~ E E E E ~ E E ~ E E E R E R R ~ ~ I q o o . o o Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.G . o . > B N M M M M M M m M M x M m x m n m x n n n a o . . o . . @.@.@.@.@.@.", -"@.@.@.@.@.@.@.. . o . . 9 n z n x x x x m m m m m m m m M m M M M M M N M M M N M M N N N N N N B B B K K K P P P P P P P I P I P I I I I I I I I Y Y I I Y Y I Y Y Y Y ~ k . . . H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.= o 9 ^ ~ ~ W ~ E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E ~ E E ~ ~ E E E E E E E E E E ~ ~ I r $ . o . . * H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.< . . o i B M N M M M M m M m m m m M x x m x x x n n 9 . o . . o @.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.. . X o . # n x x x x x m x m x M m m M M M m M m M M M N M M M M N N N N N N B B B B B K K K P K P P P P P P P I I K K I I I I I I I I I Y Y Y Y Y Y Y Y E B o . o g +.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.6 o . * E ~ ~ ~ ~ ~ ~ ~ ~ ~ E ~ E ~ E E ~ E E ~ E ~ E E E E E R E R ~ ~ ~ P q $ . . . . 7 .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S . . ; M M M M M M M M m M x M M m x m m n n x x x n $ . o o . . @.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.. o . o . o i x n n x x m m x m m m M x M m v M M M M M M M B M N N M M N N N M B N B B K K K K P P P P P P I P P I I I I I I I I I Y I Y I I Y I Y Y Y Y Y Y ; . < +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.O.+.+.+.+.+.+.V . . O K ^ ~ ~ ~ T E ~ W ~ ~ E ~ ~ E ~ E ~ E E E E E E E E E ~ ~ ~ R v 2 + . . o . . * F +.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.{ + o . . y B M M M M M M x M m M x m m m x m n x x x x p . X . . . . @.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.. . . o . 1 n n x x x n m m x m m M m M M M m M M M M M N M M M M N N M N N N N B K N K K K K K K P P P P P P I P I I I I I I I I I Y I I Y Y Y Y Y Y Y Y E 0 . . + [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.Q o . . l / E E ~ E ~ ~ E ~ E ~ E ~ E E E ~ E E E E E E E ~ ~ E I y ; o o o . . O h ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.3 o . > N M M M M M M M M m x m M m m x m m x x x x n 1 . . . o o @.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.. o . o . o m n x x x x x m m m m m m m m M m M v M M M M M N N M N N N N M N B N N B K B K K K P K K P P P I P I P P I P I I I Y I I Y I Y I Y Y I Y Y Y E l . . . . F +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.[ + . . q ^ E ~ E ~ E E E E ~ E E E ~ E E E E E E E ~ ~ ~ I k 1 O . o o . . O s [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.d . o . O z B M M M M m M m M M M m m M x m m n x x x x n o o o . . . @.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.. . . . . . w n x x x x m n m m m m M m m M M M M M M M M M M M N M M B N N N N N K N K K K K K K K P P P P P P K I I P I I I I L I I I I I Y Y I Y I Y Y R K # . . s +.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.< o : ~ ~ E ~ E E E E ~ ~ E E E E E E E ~ ~ ~ ~ I l 2 + . . . . . . + g [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.V . o . . w B N M M M M M M M M x M x M n m x x m x x x x w o . . o . o @.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.o o . o . $ m x x x n x n x x m m m m m m M m M M M M M M N M M N M M N M N N N N K N B N K K P P P K P P I P I K P I P I I I I I I I I Y I I Y I Y Y Y Y Y ; o = +.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.t o . # I ~ ~ T ~ E E E E E E E E E E ~ ~ ~ Y x 9 $ . . . . . . . , Z .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S . . . o > M N M M M M v M x M x M x m m m x m m x x x x n % o . . o . @.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.o . o o . . a z z x x x n m x m m m m m M M m M M M M M M M B M N M B M N N N N N K N N B N K B K P K P P P P I P P P P I L I I I I I I Y I Y I Y I Y I Y R q . . O ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D . . o v ~ E E E E E E E E E ~ / ~ E K u 2 $ . . . . . o . + t Q o.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D o o o % M B M M M M M M M M M x M m M x M x m n x x n x i . . o . . o @.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.. . . . . : n x z n x m x m m x m M M x m M m M m M M M M M M M N M N N N N N N N K K B K K K B P P P P P P K P I I I I P I I I I I I I I I I Y Y I Y Y E l . . o F +.+.+.+.O.+.+.+.+.O.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.` . . . y ^ E E E ~ ~ ~ ~ ~ E K z w * O . . . . . O 4 D .+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z . . . o + z B M M M M M m M m m M M m m m m x m n n x x x n > o o . o . @.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.o . o . . o a z x z x x n m m m m m x M M m M M M M M M M M M N M M N M M N N N N N N K B K K K K P K P P P P P I P P I I P I P I I I I I I Y I I Y I Y Y K O . . h +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.* . . 2 ~ ~ ~ ~ E R b u 9 * O . . . . . o o . X 3 V [ O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.V . o o . O p B N M M M M M M m M m M m m m m m x m n x x x n a . o . . o . @.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.. . o . . o > z z n x x n n x m m m m x M m m M m M M M M M M M M N M N N N N N N N N N B K B K K K P K K P P P P P P P I P I I I I I I I I I I Y I Y Y Y I ; . . 6 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.6 . . $ Y I x r 1 # o . . . . . . . . . o < j ' O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.X.t . o . O p B N M M M M M M M M m M x M m m x m m x n x n z n 1 . . . o . . @.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.. o . . . o n z z z x x n x m x M M M x M M m M M m M M M N M M M N M M N M N N N N N K N B B K K K K P P K P P I I K I I P I I I I I I I I I Y I Y I Y Y 1 . . = O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.j . . o $ + . . . . . o . . $ 6 C ] O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] < . o + k K M N M M M M M M M m M x M x m m m m n m x x x z a o o . o . . @.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.. . X o . . 9 x z n x n n n m x x x m M x m M M m M M M M M M N M N M N N N N N N N B N K B K B K K K P K I K P P P K I P I P I K I I I I I I I I I Y Y T r . . @ .+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.J . . o o . . . . . . . . + < d H .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.H @ . o o $ x K M N M M M M M m M M m x M x M x M m x m x x x z x 9 . o . . . o @.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.o . . . . o n x z z x x m m m m x M m m M m m M M M M M M N M N M M N N M N M K N N N N B B K B K K K K K P K P P I P I P I I I P I I I I I I Y I Y I Y z . . . o ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.[ X . . o o . . . * 6 h Q { +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.X.g . . . . . ; m B M N M M M M M M M M m M M m M x m x m n n x x x n z O o . . . o @.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.. . o o o . 9 n z n x x x x x m x m m m m m M m M m M M M M b M N M M M N N M N N N N N B B B K K K K K P P K P P P P K I P I K I I P I I I I I I I Y Y x . . . . F +.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.O.3 . O , t D ` ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! : . . . . . 1 M B N M M N M M M M M M m M m x M m m m x m n x x x x n 9 . . . o o . @.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.. . . o . o n z z z x x n m x m M x m M x M M m M v M M M M M M N N M M B N N N N N N N N K K B K K K K P K P P P P I P I P I P I I I I I I I I Y I R v X . . Z +.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.[ 3 + + < d H [ O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.d . . . o . o w B M M M M M M M M M M M m M m M m M M x x x m x n x x n a O o . o . . @.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . . o 1 n n z x x x n m m x n M m m m M m M M M M M M N M M M N M M M N N N N N N K N K B K K K K K P P P P P P P I I P I P P I I P I I I I I R v X . . Z +.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.O.[ .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.G * . . . $ z K B M M B N M M M M v M m M m M x M x m m m m n x x x z z 9 o . . . . o @.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . o . o n z z n x x n m m x x M m M M m M M m M M M M M M N M M N M N N N N N N B N N K N K K K K K K K K P P P P P P P P I P I I P I I I I I R c . . . D +.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] 6 . o o . . . 2 M B M M N M N M M M M M m M M m M m M m m x x m m m x x z x z o . o o . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . o o ; n z x x x x n m m x x m m x M m M M m v M M M M M N M M N N M N M N N N N N N N K K B K K K P P P K P K I P I I P I P P I I I I I I R i . . . o ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .d O . o . . # p K B N M M N M M M M M M M M m M M x m M m m m m x n x x x z z > o . . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o o o . o o a z n x n x x x x m m m m M m m M m M M M M M M M M M N M N M M N N N N N N N K N N K B K B P K P P K P P P P P I I P I P I I I I R K $ . . . $ X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+. .h @ . o . . o 9 M P N M N M N M M M M M M M M m M m x M x m m m m n n x x x z z i . . o o . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . X . o # n z x x x x m m m x x M m m M m M m M M M M M M M N M M M N N M M N N N N K N K N B K B K K K K P P P P P P P P P P P I I I R P p $ . . 8 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.` s + . . . o . . ; k B B M M N N M M N M M M M m M m M m M M m M x m x m m m x x x x z % . . . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . . . e z z x x x x m n m m x m m m m m M M M M M M M M N M N N M M N N N N N N N N N N K B B B K K K K P P P K P P I I I I R P c w * . . o o . . ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .D 3 o . . o o . # q N B B M N M B M M M M M M M M m M m M m M m m m x x m n n x x x x z e o . o . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o o . O n z z x x x x m x n m m m M m M m m m M v M M M M M M M M N M N M M N N N N N B B B B K B K B K P P P I I I I B v p 9 ; O . . . o Z +.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.J t & . . o . . O 9 M P B N M N N M M M N M M M M M M M M M M m m M m m M x m n n x x x x z # . . o . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . . o o 1 n x x x x x n n n m v m m m m M M m M M M M M M M M M M M N M N N N N N N N B N N N K K K P I P K M x y 0 1 # o . o . . . . X Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` j = . . . . . . . + 9 x K K N M N N N M N N M M M M M M M M m M m x M m m m x x m m n x x n x x 9 . o o . X o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . . . a x z x x x x n n m m x m M m m m M M m m M M M M M B M M M N M N M N N M K N N N B N K P v e 9 ; O o . . . o . o . . . 3 ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] Z < . . . . . . . $ 0 x P K K N N N N M M M M M M M M M M M M m M M m M M m M x m m m x x x x x n i . o . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o o . . o # m z z n x x x m n m m m m m m M m M m M M M M M M M M M B M M M N M N M N N N N B K P z + . . . . o . . o . . $ t Q O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.' Z < o o . . . . . O > u N P K B M N M B M M M N N M B M M M M M M M M M M M x x m m m m x n x x x x z x # . . o . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . X o . . 1 n z z x x x x m x m m m m M x M m M M x M M M M M M M M N M N M B M N N N N N B K K * o . . . . . . . O , d Q ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.Q h = X . . . o . . o * w x K P K B N N B N N M N M N M M M M M M M M M x x M m x x M x M m x m m m x x x z x 9 . o . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o o . o o a n n n n x x m x m n m m m m M m M m M M m M M M M M M M B M N M N M N M N N N B M $ . o . + , t j H .O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] d = . . . . . . . . $ 9 z N K K K B N N N N M N M N M M M M N M M M M M M x M M M x M M x m x m m m n x n x x n a o . o . . o o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . . . . # m z z z x x x n x m m m m x M M x M m M M M M M M M M M M M M N M N N N N N M B M $ . . . = d F ' .O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q + . o o . . . . + 1 i M P P K B N K M B B M N N N N M N N N M M M M M M M M M M m m M m m m m m m x x x x x x n z # . o . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . o o o . 1 n z n n x x m m m m m m m m x M m M m M M M M M M M M B M N M N M N N M N N B N ; o h +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+., o . . . . $ 1 i v P I K B N B N N N N N M N N M M M N M M M M M M M M M M x M m m M m m m m m x m n m x x x n n 9 . . o . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . . . o i x z z x x x n x x m m m m M m m m M M v M M M M M M M M M M N M N M N N M N N ; . o t +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...$ o . . o $ 0 k M I P K B B N N B N B N N N N B M M N M N M M N M M M M M M M M M m M M x M m m m m m x m x x z x n e . o . . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . o o . o n x x x x x n m x m m m m m M M x M m M m m M M M M M N M M N M M N M B M N B ; o < +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.< . . . # p B P P P K B N K N N N N N N N N N M N M N M N M M M M M M M M M M M m M m m m M x m m x m m n n x x n z a + . o . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . . o o % m x x x x x x n m x x m m m m m m M m M M M M M M M M M M N M N M N M N N B ; . o , +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.g o . O M I K K B K K K N K N N N N N N M B M M N M N M M N N M M M M M M m M M M m M m x M m m m n n x z x n z z ; o . o . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . . . . 9 n z z x x x m n n x m x M M m x M M m m M m M M M M M N M M M M N M N B B > o . = O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.X.` F d 3 = * 7 .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.G . . . p I K B B B N N B N N K N N B N N M N N M M M M M M M M M M M M M M m M x m m m M x x x m n x x x x z n 9 o . . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . o . . o . i x z n z x x x n m m x x m x M x m M M M m M M M M M b M M N M M N M M B 2 . . = o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.{ Q C 7 = X 6 +.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.{ + . . 9 P K B B B B N K M B M N N M M N N M N M N M M N M M M M M v m M m M m m M m m m x m x m n x x x n x e . . o o . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . o . o n z n n n x x n n m m m m M m M m x M M m M M M M M M M N M N M M M N B 0 . . . & o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.O.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...' F s < + . . . o . o o . O .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+., . ; K K N K N N N N N N N N N N B M N M M M N M M M M M M M M m M m M m M x m M m m m m m n x x x z n a O o . o . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . X . . o + m n n x x x x m x x m x x x M m M M m M M m M M M M M M M M M N M M K e . & ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.J 7 = X . . . o o o . . . . . . . H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s o . # M K K N N N N N N N M N M N M N M N N M M M M M M M m v M M m M M m m m m m x m x n n x x x x z z # o o . o . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . o . o o % m n z n z x x n m n m m x m m m x M M m m M M M M M M M M M N M M B i . . + ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q o . o . o . . . . o + $ o o . d +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S . o . k K N N N N N N M N N N N M M M M M N M M M M M M M M M m M M x x M m m M x m m n m x x x x n z > . . . . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . . . o > m z z z n x x x m x m M x M x M x m m M v M M M M M M M M M M M B i . . . . ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s . . . . . . o $ 1 q p B B $ o 3 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' O . . . q K N N N N N N N M M N M N M N N M M M M M M M m M M m M m M M m x M x x m m x n x x x x x x 9 . o . o o . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . o . . o . w n z z z x x x n x m m x x M m m M x M m M M M M m M M M M M M B i . . . . H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.t o . . o O ; 0 i x K I Y I P I 9 . . . + ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.= . : B N N N N N N N M M N M M M M M M M M M M m M M m m M m M x M m m x M m x m m x x x z x z 9 o . . . o o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . . . . . i n z x x x x x n m x m m x m m m m m M M m M m M M M M M M M B p o . . F +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O. .] .+.+.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.j . . o q B P I I I P P K P P Y q . . . . ! +.+.+.+.+.+.+.+.+.+.+.+.O.+.+.+.8 . . $ M N N N M N M N M N M M N M M N M M M M v M M M m M M M x m x M x x x n m x x x x x x z i . o o . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o o o . o . o p n x n x x x x m n m m m m m M m M m m m M M v M M M M M M N p o o S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.[ F d < + O + Z +.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.Q . . . . p R K P P P P K K P K I x o . o j +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.V o . o k B N M N M M N N M N M M M M M M M M M M M m M m M x m M m m m m x x m n n x x x n x i O o o . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . . o o a n z x x x x x n n x x m m m m x m m M m M m M M x M M M N z + . . D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.' Z s - O . . . . ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .+ . . . 2 I K P K K K P K K K P M $ . 6 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.J X . . . w B N N N N M M M M M M N M M M M M M M M M M M m x M m m M n x m M x x x x x x x n i O o . . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . o . o n x z n z x x x n m m m x M x m M m m m M M m M M M M M M m $ . . Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...! V 8 = X . . . o . . . o C +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.< . ; K P K K K K P K K K K P 1 . . * ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.* o > B N M M M N N M N M M M M M M M M M m M m m M m m m m m m x x m n n x x x z x n z O . . . o o . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o o . . . o O n n z x z x n x m x x m x m m m M M m m m M m M m M M M M % o h +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .H j 3 $ o . . . o . . . . . s +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.g . . O m P K K K K K K K K K I w . . . . ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.3 o . % M M M N M M M M M M M M M M M M M m M M m M M m M m m m m m m m n x x x x x n a $ . o . . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . . o o . O n n z z n x x x n m n m m x x m m M m m M m M M M M M M ; . . . t +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.[ G g < + . . . . . o . . . . O ; # . o , O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F . . . . p P K K K B K K B B B P z o . . Z +.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.j . . o z N M M N M M M M M M M M M M m m M M m m M m m m m x m x m n n x x x x n n a # . o o . o . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o o . . o o O n z z n z x x x x m m x m M m m m m m m M m m M m M M ; o < +.+.+.+.+.+.+.+.+.+.+.o.] F s , + . . . X . . . . . o # : 2 p M P 9 . . O [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.{ + . . 9 I B B B B B B B B B K v # . 7 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.G . . . . y B N N M M M M M M M M M M m M M m m M m m m m m m m m x m n x x n x n n a # o . o . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . . o o . + n n n x x x x x n n x m m m x m m m m m M m M m M M ; . . , O.+.+.+.+.+.+.X.! D 7 * O . . . . . o . . . . . $ : w k M B K K K I p o . . . G +.+.+.+.+.+.+.O.+.+.+.+.+.+.+.O., . . ; K K B B B B B B N N K B : o = o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .+ . . . 1 B M N M M M M M M m M m M M M m M x M m m m m m m x m n n x x x x z z a $ . . . . o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o o . . . . o p n x n x x x n x m n n m m x M m M m m M m M M M > . . = +.+.+. .Q C 4 * . . . o . o . . . . o $ > w l M B P P B B B N N P m O o . d +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.s o . + m P B B N B B N N N B P w . . o ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.< o ; M M M M M M M x M M M M m M x m m M x M m m x x m m x x n x x x x z i # . . o o . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . . o . o o p n n x x x x x x n n x m x x m m m m m M M m N 9 . o $ G j < @ . . . o . o . . . . O $ 1 y z M K K K K B M N N N B N B B B ; . o 3 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D o . . p K K N N N N N N N B P p . . . . F +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.d . . O n M M M M M M M M M m m M x M m m x m m m x m m m n x x x z z n n i o . o . o . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . o . . . o i m z z x x x x x n m n m m x x M m m m m M M 9 . . . . . . . o . . . . . . . O ; 9 y x M B B B B N N M B M N N N N M N N N K 1 . . + ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] O . . . 0 K N N B N N N N N M K x + . o s +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F . . . i B M M M M m m M M m M m M m m M m m x m m x x n x x x z n z x i O . . o . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . o o o . o 9 m n n n z n x x m n x m m m m m m m M m N 9 . . . o . . . . o . . o # ; 0 p x N B B N N M N M M B M N N N N N M N N N N N B e . . . . ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.= . . : B N B N N N M N N N N N ; . . , O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' O . o . 9 N M M M M M M x M m M x M m m m m m x m m m n x x z n x n z 9 o . . o . o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . . . o . . > m z n z x x x x x m n m x x m m m m m M w . X . . . . . o # > w p x M B N N M M M M N M M N M M M M M M N M N N M N M N B l o . . h +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.t . # M K M N N N N N N N N B 9 o . + [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.= . ; M M m M x M m M x M m m m m m m x m x m n x x x x x n z z 9 . o o . o . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . . o o . . % m n x z x x x x x m n m m x m m m m m a # . . O % > w a m N M B M M M M M N M M M M M N M M M N N M M N N M N N M N N B M # . o 6 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z o . o p K M M N N N N N M N B y . . . . H +.+.O.+.+.+.+.+.+.+.+.+.+.+.+.+.t . . # x M M m M x x M M x m m m m x x m m m n x x x x x z z z > . . o . . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o o . . . . o o O n n z z x x x x x x x m m n m m m m M p : ; 1 e p m M N M M M M M M M M M M M M M N M M M M N N M M N N M M N M N N M M B B 1 o . * X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! o . . q P N N M M N M M N M B x o . . g +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z . . X p M M m M x M x M m m M x m m m m x x x x x x x x x a # . . o . . o . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . o o . o e m n n n n z n x x n n m m x x m m M M m M M M M M m m M M m M M M M M M M M M M M M M M N M N M M M M N M M M N M M N B 0 . . . . ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.= . . > B M N M N N M N B M B v $ . . 3 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! . . o . w M m m m M x m m m x m m x n n n x x n x x x x n e O . . o . o o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . . . X . o 1 m n n n x x x x x n n m m m m m m m m m m M x M m M M m M M M m v M m M M M M M M M M M M M M M B M M M N N M N M M B p o . . . Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.7 . . # m B M M M M M M M M M B 1 o $ .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...* o > M M m m m M m m m x m m n m n x x x z x n x n 9 o . o . . o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . o . . . . $ n n n n x x x x x x n n n x m m m m m m m M m m M x M M m M M m M v M M M M M M M M M M M N M M M M N N M M N N M N x # . . 7 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C . . o p B N N M N N M M N M B e . . . . Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.4 . . . # n M m m m x m m x m m m x x x x x z x n n a ; o . o . . o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . . . o o . . o e m x x x n x x x x x n m x x m m m m m m m m m M x x M m m m M M M m M M M M M M M M M M M M M M M M M M M M N N M ; . o , o.+.+.+.+.+.+.+.O.+.+.+.+.+.+.+.Q . . o . w B M M M M N M M M M B z X . . V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.j . . o p M m m m M x m n m x x x x x z n z z n e # . . . o . . o o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . o . . o o . o > m n z n x x n x x x n m m n m m m m m m m m m m m m m m M M m M M M m M M M v M M M M M M M M M M M M M M M M B 9 . . o ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X.* o > B M M M M M M M M M M m # . . 6 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.H . . . w M m n m m m x m n x x x x n x z n x 1 . . . o . . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . X . . . . o O p n x z n z z x x x x n n m n x m x m m M m m M M M m m m M M m m M M x M M M M M M M M M M M M M M M M M M B i . . . . H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.6 o . # m N M M M M M M M M M M > . . * ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .@ . o 1 m m m m n n n x x x n z x x z z p $ o . o . o . o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . . o . o o o > m n z z n x x x x x x n n m n m m m x m m m m m m m M M x M M m M m M M M M x x M x M m M M M M M M M M M z O . . s +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.j . . o a N M M M M M M M M M B w o . . ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.< o . $ n n n m n x x x x x x x n n z 1 o o o . . o . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o o . . . . o o O i n z z x x x x x x n m x m m x x m x m m m m m m m x M x x M x m M m m M M M M M M M M M M M m M M M M M * . . . < +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q . . . w N M M M M M M M M M M p o . o Z +.+.+.+.+.+.+.+.+.+.+.O.[ G g < o . . . O p M n x n x x z n z n n n i # . o . . . o . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . . . o o . ; n m n n n n n x x x x n n m n n m m m x x M m M x M m m m M x M m M M m M m M M M M M m M M M M M M N 1 . . # { +.+.+.+.+.+.+.+.+.+.+.+.+.+.+...* . . > M M M M M M M M M M M n # . o 7 +.+.+.+.+.+.+.O.] D d , + . . o . . o i m n x x x x x x z z a 9 . . . o . . o . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . o o . . . o o o 0 m m x n n n x x x x x n m n m x m m m m x m m m m m m M M x M m M x m M M m m M m M m M m M m M B w . . . . ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.3 . . $ M M M m M m m M m m M M ; . . = O.+.+.O.` Z s = O . o . . . . . # x n x n x x n z z z w + . . o . . o . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . . o . . . . + i m n n n n x x x x x x x m m x m m x m m x m m m m m m m x M x M M m x M M m m M M M M M M M M a o . . j +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.j o . o a M m M m M M m m M M N 9 . . . o Z S 7 * o . . o o . . . . . . o % i n n z x z z z z i ; . . o o . . . o o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . . o o . . o % a m n z z x x x x x n x x n x n m x n M x m m m m m M m m M x x m M x m m M m m m m m m M M n # . o 6 +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.H . . . . e N M m M m M m M m m M i o . . . . . o . . . . . . . o % 1 w i n n x z n z z z a > X . o o . . . o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . o . o . . . . o ; z n z z z n n x z x x x x x n n n x x m x m x m x x m m M m m m m M m m M M m M m M m m m > . o $ ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .$ o 1 M m M m m m m m M m M z # . o . . o . o . . . . . O % 1 e p n m m m n x x z x z a 9 o o . . . . o . . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . . o . o . . o > x n z n n x x x x x x x x x x x m n m m m m x M m x x x M m m m m m m m m m M m M m N 0 . o o ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.< o . $ m M x M m M m m m m m n % o o . . . . . # ; 9 e p m m m n n n n n n n z z a 9 o . o . . o o . . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . o . . . o . o > z m n x x x z x n x x x n x n n m x m x m x x m m x m m x m m m m m m m m m m m N i o . . Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.j . . o a M m x m m m m m m m M e o . . o # > 9 e a m M m m m n n x n z n n z n a 9 o o . o . . . . o . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . . . o . o . . o . ; a m n z x z z n x z x x x x x x m m n x m x m m x x M m m m m m m m m m m m m x O . o 7 +.+.+.+.+.+.+.+.+.+.+.+.+.+. .! 7 . . o . w M m m m m m m m m m n m i > > 9 i n m M m m m n n n n n z x z x x x i 1 o o . . o . . o o . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . o . . . o . . o $ i m n n n z x n n z x x x x x x x m n m x n n m m m x x m m m x m x m m x M ; o = o.+.+.+.+.+.+.+.+.+.{ Q j 3 $ . . . o . 1 M m m m x m m m x m x m m M m M n n n m x x x z z n z x n x z z i > o . . . . o o . . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . o . o . . o o . # 9 n m x z x n n z n x n x x x x x x x n n m x n m m m x m x m m x x M M 9 . . . o ] +.+.+.+.+. .Q g < # . . . o . . . 9 M n m n m m x m m n m n n m n n x x n n x x z z z z z z x n w $ o . . . o o . . . . o o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o X . . o . . o . o . o % i m m n z z z z x x n n n x x x z n x x x n m x x m m x m m n n M e . . . G +.{ Q d < + . . . . . o . . . . $ a m m m n n n n n x x x x x x n n n x n z x x z z n n z i 1 O . o . o . o . . o . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . o . . . o . . o o O > a m n z z x x n n x x x x x x x x x x x x x x m n n n m n n z O . o . = < O . . . . . . . . . . o # > w x M n n m x x x x x x x x x x x x n z x z n x x z z a 9 # . . o . . . . o . . o . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . . o . . . o . o . . # 9 z m n n n n x z n n n n x n x n x x x x x x x x x x m n % . . . . . o . . . . . . o # > w a z n m m n x x z x x n z n n z x x x x z z x z z z z z w ; o . . o . o o . o . . o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o o . . o o . . o . o o . o # 1 a m m n z n n z n x n z z z n x x x n n x x x n m > . . o . . . . . . . o # 1 w i n m m m n x x n n x x x x x z z n z x z n x n z z z n a 9 ; o o . o . . o . . . . . o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . . . . o . . o . . . . o ; 0 n m m n z z n z n z z z x x x x z x n n M e o . . . . . . O # 1 w i x m m n n x x n n n x x x x x x x z z z z z z n n z n a e > + o . . . o . . . . . o o . o o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o o . . o . . . o o . . o . . O ; w a n m n z z z z z z x x x n n n n n 9 o . o % 1 w a z m m m n x n n x x x n x z x x n x n x z z z z z z n a e > # o o o . . . o . . . . o o . . . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . . . o o . . . . . o o . . o o $ > e a m m m m n x x z n n z n n i e a n m m n n n n n z z z z n x z z x z z n x z z x n n a i 9 ; O o . . . o . . . o o . . . o . o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o o . . . . o o . X . . o . . o o o o o o # ; > w i m m m m n m n m n n m n x n n n n z z z z z z n n z n n n n i e 9 > % O . . . o o . . o . . o o . . . . o o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.o . X . o . . . . . o . . . . . . . . o o o . o . # # $ > > 9 w e e i i i i i i i i i e w 9 9 1 ; $ $ o . . . o X . . o . o . . o o . . . o o . . o . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . o o . . X o . . o o . o . o o . o . . o o o . o o o . . . . . . . o . o o . . . o o . . . . o . . . o . . . o o . . . o o . . . o . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . o . . o . . o . . . o o . . o . o . . o o . . o . . X . o o . o . . o . o . . o . . . o o . . o . . . o . . . . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . . o . . o . . . . o . . . o o . . . o . . o . . . . o . o . . . o . o . . o o . . . o . . o . . . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. o . o . . o o . o . . . o . o . . o o . o . . . o . o . . . o . . o . . o . o . o @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.", -"@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.. . o . o . . . o . o . . . o . o . . . o . o . . o . . @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@." +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 9 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 - . X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X . = 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 : . X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X < 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 , . X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X . * 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 9 = c / L I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I L ^ b - 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 9 - k ~ P I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I P W a > 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 : d ! P I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I L ^ B - 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.E O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q + Z O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.X.O.v % 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % M O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O._ @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X H O.} ..................................................................................................} O.Y O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ V O.} .................................................................................................... .O.z & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % n O.| ................................................................................................} O.( @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % m O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.) @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % n O.| ................................................................................................} O.( @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 % M O.X.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O._ @ q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 : s T J K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K H Q N ; 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 , . X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X . * 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x & 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.x * w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.l O 3 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 4 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.B r u t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t q 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.{ ' ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] [ g = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ C O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q @ V O.} ................................................................................................................................................................................................................................................................o.h = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q + Z O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.k * 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 > f F A S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S D y 1 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 > o + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.R O q 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O...O.Q $ e q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O. .O.H # X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.X.O.` G P K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K L i , 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.k * 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.....................................................................................................................................................................................................................................................................................................................o.h = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.j = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X H O.} ............................................................................................................................................................................................................................................................................................................................................................................................................................o.h = 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 q X K O...O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.k * 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 9 = c / L I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I U p , 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 - . X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 9 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ", +"6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 " }; diff --git a/share/pixmaps/BGL32.png b/share/pixmaps/BGL32.png index 95b7e5ec8f4e991d2a1ce4aa5284cf0de4736755..9c85950fdc4518c32e01d96f65e453071f57c478 100644 GIT binary patch delta 722 zcmV;@0xkW`6yF7q8Gix*008_L?V|ty010qNS#tmZTBiU3TBiY>qGz}O00NOoL_t(Y ziLF+@YZO5keQ#!V?_z!^UQ8?484>HmPQ=DPLC{X@f*=U~2LT~{1hKJHt5{fAh)qZ% zSOhEt!ALOi67Mcv?sj)Ri`m<3_V)HRclU~Am~Up@%=f+@%YT)n9RL7G^g{$gt;HKn zZvsIenMG94ngGNijIvgxpfmwQp;((GFos}4AW#~$1(UuDiSDtq4lMwGiZd6qq$sG+ zZb`do0ZgCQ)fq~fL(r&4HUtPmA_%0mV4l9dYmeYWjFew{U#7-sWagQ-5vNV32u6jI z*ZIw95RWHCKm`CwBhf(V2@!~h@wodv{I=C;x8fKh5q|~Eqy&Lj_*49`-F^A29)wP<0Tnph>s1#64 z5Qg~I5C9@^?4JQS4JU0?0C45H|MoyF8aTF0Y!k=H^#Eu8FaXmlLfbjfD`aW^df6u7%vp&<&uK)l507*qoM6N<$ Ef*4*)TmS$7 literal 2637 zcmV-T3bOTyP)%a-c|u?yFMl{SfLGzPj+)B2&!TM9QpkcYG|dO;sjpiSW> zTO`QEunV{Wnlwe>%9d?8vUQ; zDiltj^>adqeVwt`dT%nB=<4i@l^YG&YBm|}=|M`#Mx&t@DwWL-ipBL(y&glUDWv=h zH=lpyR{{_!6n3Na_k|FHnPf7vBOW&gGa2?|vz)(jh2QJxVYOc8j1U|g7@+BS2qEy4 zqFk?Yadwue#l@=qR6i_~CRmnLLEn=R<|UiMs+2DinSn_~A%@ zf99Fv$2*da!vm=lC-&^&XgW>Hb#X0=OUuh-qER{lEd+7fCKe8p2#4t~O+42nVcVQM zcFZ_9IG6%nZ14Tc0klzm^Wg5?_G9wEWxfPcJ`iR~O{YyQsu{{GA-?z@k` z^9Y+JA=~E6<;%Qur$%MS+CdenoU%*NzM1^ zcN|`N=pj>*lRP>yLeOf_a$SxO4|B6zPOMZa zF9Jum83+{$CnWsSGslmoYmEl$OG}Kz7^q zGnwT2$_mf+^>K3Fz7HjfQVJ;qH)=JW9~+|tNZZD;ESj#1oSft@4 zG?U?YZ*Mze1Z#~3?RMF1fNdDVvV%p;Q2nij>8Sp#>kxFsygAe%T8*k9tXz-__qiC%`2+psqk(83N3;7N-0d(Mk}^TlT0MSMWrZiZjy;c0eGOho0s2xm-W?E2Et*!x^EvNnar(n zMk&QJxg5{raxB+s{PoxvZ*FdKWN;9-*#xDCghBw8DFLfpTDMj&KH1g$Kh`tdWg@TKFxdOGTB&+W)NT+22zNv zMx^fudOL_92uQ`_jFrnA@9Wz>rEQx0``jFtN+p(EmvyD^wT2+zli4hv-n)0}lF}L} zCC}z^{MpP5eTf7*2)1LG3hmu56^+%(OWV8HQPY-e1MrlpU^N1J*PmYfA)8%DoHzWYZvap4~4FZIe)LShycoL5~oy9awe60zT+R|Ss{I(3eot?}y8u&qg5L?O~?dsy~ z@o}zAPO{&1`FbwL3y(aq-4mpgOcjefefl)k&YkRtM$tlWVRja+)RddgU)s72g?Rq@ z($Wjd)oLaai{UGUPznqKLu)42*0{d9%CKo}cQUOtkN5ZUNH%+`srvf;W+FD_P)^3UP+7ty!BeKzGd_dk8?n5}#tQwU6C`4B}&F*v>r4)77B@_zr;@Pu$ zxm|KuJm-z4u;*QYl)l%ckcMwr$>=nqs+9sUYQNZ-w0k;O6u1Bg7Xb zZr*I2o|qtH+jv@Im?jsCMb0iP@ce}feBrIPc=F9R`P=bv0H!Jx61}~|G8x`pTB17^ zqt7(CQK``IJY21@Lm|%1%y52o)3f^EQ>d$rg-bxH4ml!=uW5f zzkGq4&;K*akbuQxZEO&-1feh%%~!%#X+hhY$wl9JZcnoU05*9VOTu}Fk- z#Ukex7Pz{$h5#DA&&zMWt=^rPsQ{mKPn{~<8Sk#F+0c$1T?YmSjV{N*G7Q3&#XIl4 z$LAb}UGX?yy>f-a2M#bZKToyU#14m9DV3O^UJK+-I-IRo(+`$4f-U9MImTB#|7`1-GGPJaQA11R;|z!ONh v9|##z3IPOLCF!Bm1WNq`(|qx6?fL%zByj-l!(sfB00000NkvXXu0mjf(Pa+^ diff --git a/share/pixmaps/BGL32.xpm b/share/pixmaps/BGL32.xpm index 9c4394feb0..a361c02b54 100644 --- a/share/pixmaps/BGL32.xpm +++ b/share/pixmaps/BGL32.xpm @@ -1,125 +1,133 @@ /* XPM */ static char *result[] = { /* columns rows colors chars-per-pixel */ -"32 32 87 1 ", -" c #059D9D", -". c #089F9F", -"X c #08A0A0", -"o c #17A9A9", -"O c #1BADAD", -"+ c #2AB5B5", -"@ c #2EB9B9", -"# c #34B6B6", -"$ c #3DB7B7", -"% c #34BCBC", -"& c #3DBDBD", -"* c #41B7B7", -"= c #43BCBC", -"- c #4BBBBB", -"; c #53BCBC", -": c #63BEBE", -"> c #36C1C1", -", c #3DC3C3", -"< c #44C3C3", -"1 c #4BC3C3", -"2 c #46CACA", -"3 c #4DCCCC", -"4 c #54C2C2", -"5 c #5CC3C3", -"6 c #55C9C9", -"7 c #5ACCCC", -"8 c #4ED0D0", -"9 c #53D1D1", -"0 c #5BD6D6", -"q c #5DD9D9", -"w c #63C3C3", -"e c #6BC5C5", -"r c #74C5C5", -"t c #7BC7C7", -"y c #73C9C9", -"u c #7CCACA", -"i c #61D1D1", -"p c #62DBDB", -"a c #69DCDC", -"s c #74D6D6", -"d c #73DFDF", -"f c #7ADBDB", -"g c #65E1E1", -"h c #6EE2E2", -"j c #73E4E4", -"k c #7AE6E6", -"l c #76E8E8", -"z c #7BE9E9", -"x c #85CDCD", -"c c #8ACFCF", -"v c #8CD1D1", -"b c #84DEDE", -"n c #95D2D2", -"m c #99D4D4", -"M c #A1D5D5", -"N c #A8D7D7", -"B c #A4D9D9", -"V c #ACDBDB", -"C c #B3DEDE", -"Z c #81E7E7", -"A c #84EAEA", -"S c #8BECEC", -"D c #95E5E5", -"F c #92EDED", -"G c #8EF0F0", -"H c #94F0F0", -"J c #9CF2F2", -"K c #B7E0E0", -"L c #BAE1E1", -"P c #A4F3F3", -"I c #AAF4F4", -"U c #ACF9F9", -"Y c #B6F7F7", -"T c #B3FAFA", -"R c #BDFDFD", -"E c #C4E4E4", -"W c #C9E6E6", -"Q c #CFE8E8", -"! c #D3EBEB", -"~ c #DBEEEE", -"^ c #CAFFFF", -"/ c #E3F2F2", -"( c #ECF5F5", -") c #F1F7F7", -"_ c #F5F9F9", -"` c #FEFEFE", -"' c None", +"32 32 95 2 ", +" c #5A1DE1", +". c #5F22E3", +"X c #662DE3", +"o c #672EE3", +"O c #672FE3", +"+ c #662DE4", +"@ c #672EE4", +"# c #682FE4", +"$ c #6830E4", +"% c #6930E4", +"& c #6931E4", +"* c #6A31E4", +"= c #6A32E4", +"- c #6B34E4", +"; c #6C35E5", +": c #6C36E4", +"> c #6D36E4", +", c #6D36E5", +"< c #6D37E5", +"1 c #6E37E5", +"2 c #6E38E5", +"3 c #6F38E5", +"4 c #6F39E5", +"5 c #6F3AE5", +"6 c #703AE5", +"7 c #703BE5", +"8 c #713BE5", +"9 c #713CE5", +"0 c #733EE5", +"q c #723DE6", +"w c #7440E6", +"e c #7743E6", +"r c #7745E7", +"t c #7845E7", +"y c #7846E7", +"u c #7A48E7", +"i c #7B49E7", +"p c #7C4CE7", +"a c #7E4EE8", +"s c #7F4EE8", +"d c #7F4FE8", +"f c #8050E8", +"g c #8051E8", +"h c #875AE9", +"j c #875BE9", +"k c #885BE9", +"l c #9973ED", +"z c #9A75ED", +"x c #9B75ED", +"c c #9B76ED", +"v c #9D79ED", +"b c #9E7BEE", +"n c #A481EF", +"m c #A584EF", +"M c #A686EF", +"N c #B69CF2", +"B c #B99FF2", +"V c #B9A0F2", +"C c #BBA1F3", +"Z c #BBA2F3", +"A c #BCA2F3", +"S c #BCA3F3", +"D c #CFBDF6", +"F c #CFBCF7", +"G c #CFBEF7", +"H c #D0BDF7", +"J c #D0BEF7", +"K c #D2C0F7", +"L c #D2C1F7", +"P c #D3C1F7", +"I c #D3C2F7", +"U c #D5C5F7", +"Y c #D9CAF8", +"T c #F1EBFD", +"R c #F5F3FD", +"E c #F6F4FD", +"W c #F8F6FE", +"Q c #F8F7FE", +"! c #F9F7FE", +"~ c #FAF8FE", +"^ c #FAF9FE", +"/ c #FBF9FE", +"( c #FBF9FF", +") c #FBFAFE", +"_ c #FBFBFE", +"` c #FBFBFF", +"' c #FDFBFF", +"] c #FCFCFF", +"[ c #FDFCFF", +"{ c #FDFDFF", +"} c #FEFDFF", +"| c #FFFDFF", +" . c #FEFEFF", +".. c #FFFEFF", +"X. c white", /* pixels */ -"''''''''''' XX '''''''''''", -"''''''''' Xo%2>@003%o '''''''''", -"''''''' O%9l*mx3zjlhq@ '''''''", -"'''''' O,wV-g1`(,kjjjjlpO ''''''", -"''''' %l8n`vq1Q`;zAzAzjjl% '''''", -"'''' %ljgw`V90v`u%1129klhz, ''''", -"''' @ljkA<(/#=V`(Q~~Wt&zlal% '''", -"'' Olhq31*/`/_````````V=AjjlO ''", -"'' p9-ym!_````(WCE`````rqzjdp ''", -"' @z '''", -"'''' %lj8xEcw#x`uq3C`5gjhl< ''''", -"'''''X@ja%29gj4`L3qv`v3lj%X'''''", -"'''''' o0zlljl<_`1g;E:9gO ''''''", -"''''''' +9hjz89>O. '''''''''", -"''''''''''' XXXX '''''''''''" +"4 4 4 6 6 6 6 6 6 6 4 4 4 6 6 6 6 6 6 6 4 4 6 6 6 6 6 6 6 4 4 4 ", +"4 4 3 - - - - - - : 4 4 1 - - - - - - > 4 4 > - - - - - - 3 4 4 ", +"4 3 8 a d d d d f u 2 2 w f d d d d g r 2 2 t g d d d d s 9 3 4 ", +"6 - a R _ ~ ^ W X.D & $ l X.Q ^ ^ W X.B @ @ V X.W ^ ~ _ E d - 6 ", +"6 - d ^ X...X.[ X.L & $ x X.{ X.X.[ X.Z @ @ S X.[ X...X.) f - 6 ", +"6 - d ~ X.| ..' X.K & $ x X.[ ....' X.C @ @ A X.' ..| X./ f - 6 ", +"6 - d ^ X...X.[ X.L & $ x X.{ X.X.[ X.Z @ @ S X.[ X...X.) f - 6 ", +"6 - d ^ X...X.[ X.L & $ x X.{ X.X.[ X.Z @ @ C X.( [ ' .! f - 6 ", +"6 - d ^ X...X.[ X.L & $ x X.{ X.X.[ X.Z @ @ S X.[ X...X.) f - 6 ", +"6 - d ^ X...X.[ X.L & $ x X.{ X.X.[ X.Z X = n Y J K K P F i ; 6 ", +"6 - d ^ X...X.[ X.L & $ x X.{ X.X.[ X.S o w > $ & & & & & 2 4 4 ", +"6 - d ^ X...X.[ X.L & $ x X.{ X.X.] X.N O + @ @ @ @ @ @ 1 4 4 ", +"6 - d ^ X...X.[ X.L & $ x X.{ X.X.} X.U b M m m m m m m m y , 6 ", +"6 - d ^ X...X.[ X.L & $ x X.{ X.X.X.X.X.X.X.X.X.X.X.X.X.X.k * 7 ", +"6 - d ^ X...X.[ X.L & $ x X.{ X.X.X.X. .[ [ [ [ [ [ [ [ } h = 7 ", +"6 - d ^ X...X.[ X.L & $ x X.{ X.X.X.X.X.X.X.X.X.X.X.X.X.X.k = 7 ", +"6 - d ^ X...X.[ X.L & $ x X.{ X.X.X.X.X.X.X.X.X.X.X.X.X.X.k = 7 ", +"6 - d ^ X...X.[ X.L & $ z X.` { { { { { { { { { { { { { .j = 7 ", +"6 - d ^ X...X.[ X.L & $ x X.{ X.X.X.X.X.X.X.X.X.X.X.X.X.X.k * 7 ", +"6 - d ^ X...X.[ X.L # 2 p v z c c c c c c c c c c c c c c e < 5 ", +"6 - d ^ X...X.[ X.I % 0 2 # $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 1 4 4 ", +"6 - d ^ X...X.[ X.G . % # & & & & & & & & & & & & & & & & 2 4 4 ", +"6 - d ^ X...X. .X.T H P K K K K K K K K K K K K K K K K P f - 6 ", +"6 - d ^ X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.k * 7 ", +"6 - d ^ X...X.X.X. .[ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ } h = 7 ", +"6 - d ^ X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.k = 7 ", +"6 - d ~ X.| ............................................X.k = 7 ", +"6 - d ^ X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.k = 7 ", +"6 - a R _ ~ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ) h = 7 ", +"4 3 8 a d d d d d d d d d d d d d d d d d d d d d d d d d q 2 4 ", +"4 4 3 - - - - - - - - - - - - - - - - - - - - - - - - - - 2 4 4 ", +"4 4 4 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 4 4 4 " }; diff --git a/share/pixmaps/BGL64.png b/share/pixmaps/BGL64.png index b7615cbfe09438b6d0c28c9664fda09e453b5404..7288fbdf0022b2075d61e3a5c18c58f28829f676 100644 GIT binary patch delta 853 zcmV-b1FHOtHQ@%38Gix*001Qm=7|6R010qNS#tmZTBiU3TBiY>qGz}O00R?AL_t(& zf$f^TZxb;XhkrlcSDIANf}j-(WnyAPD*Od3m6(`VnVCSaBLre$XJaXX0saF7143eA z0jWbJBwCf0svl~TCYSTea4k)I`M9K)xF_ACEJ^IxPi&vx_kVo6e`5uCM%nJbNy)u{ zoBW9Bq(lH|uSkID>gr(|O;j`mL=e`*EY%6erE=OnX@;VsRQ+&$vPCt0qeev-0wVBy z&dzlh76YZQy`lGawL1Few8r#|Q#qq_;!iRV!QYi;)I{7B5x5>^E_+NddYh|J*pSwe z$9<(jSd*DK_kZ!?#ooW7BPa)pPq#lV?oCdq_-%Dp-+DB4^L9CY+okUS5!U6&o%PMt zrsoqtGnDCB_u=acuFtqY51!v$|Mepb%KSfhRTf(if->K~++F%s4=TqgrG*io!j)_OptZDyQmC9& zI+E7iz<U-y+V-=+!iLBp_fEqRgBh5ve`(UmRuuUOgn?k@g+3f>7Jbf5CuI$Y? zHZnQ@pq%cv*H858K&Oo?8vzlx9+$s2f(h2ElJdN0&?dZqTYn;F6e*=>1QY!7VgJ+H zy@6uP!CDcN%JfTYJt@m<3W*>nvs4*b_v2QynSVlLxducJnqXzX@B&mLTd&>8as=vC z+1t_>*>y8XyaqD3FBC7+tJi}#%}X9WkAnC@_w(z)=4!LmVJHCw0P_pw`Gss*jkGY_Sn literal 6796 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 c #2CA9A9", -", c #33AAAA", -"< c #3CAEAE", -"1 c #24B3B3", -"2 c #2AB5B5", -"3 c #2EBABA", -"4 c #33B6B6", -"5 c #3CB3B3", -"6 c #33BCBC", -"7 c #3BBEBE", -"8 c #42AEAE", -"9 c #45B2B2", -"0 c #4CB3B3", -"q c #44BEBE", -"w c #52B6B6", -"e c #56B9B9", -"r c #5CBABA", -"t c #63BEBE", -"y c #69BFBF", -"u c #36C0C0", -"i c #3CC2C2", -"p c #42C4C4", -"a c #48C5C5", -"s c #47C9C9", -"d c #4BCBCB", -"f c #51C6C6", -"g c #54CCCC", -"h c #5BCECE", -"j c #55D2D2", -"k c #5AD4D4", -"l c #5ED9D9", -"z c #67C0C0", -"x c #6BC1C1", -"c c #63CFCF", -"v c #73C5C5", -"b c #7AC7C7", -"n c #7CC9C9", -"m c #67D2D2", -"M c #6DD2D2", -"N c #64DCDC", -"B c #6ADEDE", -"V c #70D6D6", -"C c #72DBDB", -"Z c #7BDEDE", -"A c #67E0E0", -"S c #6DE1E1", -"D c #73E4E4", -"F c #7BE6E6", -"G c #75E8E8", -"H c #7CE9E9", -"J c #84CBCB", -"K c #8DCECE", -"L c #8DD0D0", -"P c #94D2D2", -"I c #9CD5D5", -"U c #A1D7D7", -"Y c #A3D8D8", -"T c #ADDDDD", -"R c #B3DEDE", -"E c #81E6E6", -"W c #8EE2E2", -"Q c #84E9E9", -"! c #8BEBEB", -"~ c #92EDED", -"^ c #9AEDED", -"/ c #8FF1F1", -"( c #94F1F1", -") c #9BF2F2", -"_ c #9EF8F8", -"` c #B7E0E0", -"' c #BAE2E2", -"] c #A4F3F3", -"[ c #ABF4F4", -"{ c #A7F9F9", -"} c #ACFAFA", -"| c #B2F6F6", -" . c #B4FAFA", -".. c #BAFCFC", -"X. c #C3E6E6", -"o. c #C6E8E8", -"O. c #CDEAEA", -"+. c #D4EDED", -"@. c #D9EFEF", -"#. c #C3FEFE", -"$. c #C8FFFF", -"%. c #DCF0F0", -"&. c #D9FFFF", -"*. c #E4F4F4", -"=. c #EAF6F6", -"-. c #EEF8F8", -";. c #F4FBFB", -":. c #FEFEFE", -">. c None", +"64 64 80 1 ", +" c #5B1EE1", +". c #642BE3", +"X c #652BE3", +"o c #652CE3", +"O c #672DE3", +"+ c #672EE3", +"@ c #672FE3", +"# c #6930E4", +"$ c #6931E4", +"% c #6A31E4", +"& c #6A32E4", +"* c #6B34E4", +"= c #6C35E4", +"- c #6C36E4", +"; c #6D36E5", +": c #6D37E5", +"> c #6E37E5", +", c #6E38E5", +"< c #6F39E5", +"1 c #6F3AE5", +"2 c #703AE5", +"3 c #703BE5", +"4 c #713CE5", +"5 c #723DE5", +"6 c #733FE5", +"7 c #733EE6", +"8 c #7541E6", +"9 c #7642E6", +"0 c #7845E7", +"q c #7846E7", +"w c #7947E7", +"e c #7D4CE7", +"r c #7E4EE8", +"t c #7F4FE8", +"y c #7F50E8", +"u c #8557E9", +"i c #8558E9", +"p c #8658E9", +"a c #875AE9", +"s c #885AE9", +"d c #885BE9", +"f c #885BEA", +"g c #895DEA", +"h c #8F65EB", +"j c #9973ED", +"k c #9A74ED", +"l c #9F7BEE", +"z c #A07DEE", +"x c #A381EF", +"c c #A482EF", +"v c #A583EF", +"b c #A584EF", +"n c #A685EF", +"m c #A787EF", +"M c #A887F0", +"N c #C4ADF5", +"B c #C5AFF5", +"V c #C5B0F5", +"C c #C6B1F5", +"Z c #C7B2F5", +"A c #CAB7F6", +"S c #CCB9F6", +"D c #D9CBF8", +"F c #D9CCF8", +"G c #DACDF8", +"H c #DED2F9", +"J c #E0D5F9", +"K c #F9F6FE", +"L c #FAF8FE", +"P c #FBF9FE", +"I c #FBF9FF", +"U c #FBFAFF", +"Y c #FBFBFF", +"T c #FDFBFF", +"R c #FDFCFF", +"E c #FDFDFF", +"W c #FEFDFF", +"Q c #FEFEFF", +"! c #FFFEFF", +"~ c white", /* pixels */ -">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.X X X @ @ @ @ X X @ @ X X X >.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.X @ X X X @ # $ & * * $ & $ @ X X X @ @ >.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.@ X X X # = i l D G D k d G D S S S N s 1 # @ X X X >.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.X @ @ # 2 l S G G N i * o % X s G S S S S S D S N 6 # X X X >.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.X @ X # s D l j S S S # > b ` -.x * H D B S S S S S D D D j $ X @ X >.>.>.>.>.>.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.>.>.>.>.X X @ i s 1 # % d F G $ I :.:.:.Y # G D D D D D S B B S B S D j # X X >.>.>.>.>.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.>.>.X X X 3 D * - v T *.t 1 H Q 3 w :.:.:.%.o B F D F D D D D D S S S S D D i @ X X >.>.>.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.>.X X o j G D # U :.:.:.Y # H H j % :.:.:.:.; d E F D D G D D D G D S S S B D N $ @ X >.>.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.X X & S G A G 2 e :.:.:.+.# B Q D # O.:.:.:.t 2 ! F G G F G G D F D C D D S S S D 1 X X >.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.X X 1 D S S S F d ; :.:.:.;.- j Q Q $ P :.:.:.I $ ! ! ! ! ! Q E H F D D D D S S S S G 6 X X >.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.X X 1 G S B S S G B o @.:.:.:.0 7 ! ! 3 r :.:.:.+.X j j p 7 7 p g B H Q F D D D S S S S D 6 X X >.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.X X 1 G S S B D G G H $ I :.:.:.J = ( ( k % :.:.:.:.< % > 5 e 0 < > O # 7 F Q G D D D S S S G 6 X X >.>.>.>.>.>.>.", -">.>.>.>.>.>.@ X * G S S D B D D G Q 2 r :.:.:.` X d 2 o - ;.:.:.:.;.-.:.:.:.:.:.:.%.I > o m ! D G D D B S S G 1 X @ >.>.>.>.>.>.", -">.>.>.>.>.>.X # S S S B D D D F Q ! j ; :.:.:.-., > x R -.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.n k Q D F D D S S B G # X >.>.>.>.>.>.", -">.>.>.>.>.X @ k D S D D H H Q F B d : X *.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.I B E F F C D S S S N # X >.>.>.>.>.", -">.>.>.>.X X 6 D B G G S k i * # O , t T :.:.:.:.:.:.:.:.:.:.:.:.:.:.:.;.:.:.:.:.:.:.:.:.:.:.x # E H D G D S S S G i X X >.>.>.>.", -">.>.>.>.X # D S B i * o % < b R *.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.;.:.:.:.:.:.;.% d ! G D D C D B B G # X >.>.>.>.", -">.>.>.X X d S D k b X.-.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.O.U n x t x I *.:.:.:.:.:.:.:.:.:.:.b : ! F F D D D D S S j X X >.>.>.", -">.>.>.X # G S S S # +.:.:.:.:.:.:.:.:.:.:.:.:.:.:.=.I w % O % 1 6 7 4 $ . J :.:.:.:.:.:.:.:.:.` # E H F F D D D S B G & X >.>.>.", -">.>.X X d D S S F * J :.:.:.:.:.:.:.:.:.;.:.;.:.:.J q B ~ { [ } } } { C o t :.:.;.:.:.:.:.:.@.o F E H F F D D D S S j X X >.>.", -">.>.@ # G S S S H 6 0 :.:.:.*.=.:.:.:.:.:.:.:.:.:.R $ } | ] ] ] ] ] ] ^ .! ` :.:.:.:.:.:.:.%.% D Q E H F D C S S S G # X >.>.", -">.>.@ 3 S S S S H j + Y x > $ $ 0 @.:.:.:.:.:.:.:.=.% E [ ] ] ] ] ] ] ] ] .6 t :.:.:.:.:.:.:.O.o E Q H H F F D D S S D i X >.>.", -">.@ @ l S S D D D F $ # 1 g C C > % -.:.:.:.:.:.:.:.< c .] ] ] ] ] ] ] ] .f 8 :.:.:.;.:.:.:.P & ! Q E F F F D D D S S A X X >.", -">.X $ D S S S D G F F Q ! / ! ^ ) o U :.:.:.:.;.:.:.t 4 ..] [ [ [ [ [ [ ] .q w :.:.:.:.:.:.:.< p ^ Q Q E F F D D S S S D $ X >.", -">.X 2 D B D D D D F F E ! E ! ! ) 4 r :.:.:.:.:.;.:.U % .| [ [ | [ [ ] ..~ ` :.:.:.:.:.:.T H ! Q Q E F F F D D B S D 2 @ >.", -"X X d S S B D D F F E E E E ! ! ) k > :.:.:.:.:.:.:.+.o ^ | | | | | | $.] % r :.:.:.;.:.:.X.o m { ^ ! Q E H F D F D D S D d X X ", -"X @ A S S D C F F F H E ! ! ! ~ ) E o %.:.:.:.:.:.:.:.- Z #.| .#.$.| c X w :.:.:.:.:.:.:.- > 3 g ! ( E E H F D G D B S N X X ", -"X @ S A S D D D F H E E E Q ! ! ~ ) $ Y :.:.:.:.:.:.:.0 f &.$.| P p O - U :.:.:.:.:.:.:.:.X.U K y - o g ( E H F F C B D S S # X ", -"X $ S S S D F D F F E E ! ! ! ~ ~ { 4 t :.:.:.:.:.:.:.J $ c 4 % % w T :.:.:.:.:.:.:.:.:.:.:.:.:.:.:.P . 7 ! E F D D D D S D $ @ ", -"@ * S S S S D D F F E Q E ! ! ~ ~ ] g , :.:.:.:.:.:.:.O.> 8 n R -.:.:.:.:.:.:.:.:.:.:.;.:.:.:.:.:.:.:.+.. i ! F F D D S S S * @ ", -"X * G A S S G F F F E E Q ! ! ~ ~ ) F O =.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.X. N E D D D S S S * @ ", -"X * G A D D D D F F E E ! ! W ~ ~ ) ^ $ R :.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.;.:.:.:.:.:.:.:.:.:.y * Q F F S S S G * @ ", -"X = S S B D C D H H E E Q ! ! ! ~ ( { : n :.:.:.:.:.:.:.:.:.:.:.:.*.` P b e 0 0 r P -.:.:.:.:.:.:.:.:.:.:.%.o B H D D S B D = X ", -"X * G S S D F F F E E Q Q ! ! ~ ~ ^ [ a 9 :.:.:.:.:.:.:.:.-.T x , % % > 6 a f f q % + I :.:.:.:.:.:.;.:.:.:.> s Q D D C S D * X ", -"X * S S S D D D F F E Q ! ! ! ~ ~ ~ ] C - ;.:.:.:.:.:.:.:.> O 5 M ^ | $.$.#.#... . .m L :.:.:.;.:.:.:.:.:.t 3 Q D D D S G * X ", -"@ # D B B D D F F F E E E W ! ~ ! ^ ) ~ # O.:.:.:.:.:.:.:., c &.$.#. .| | | | ] ] { ..C X @.:.:.:.:.:.:.:.:.K * H D D B A S $ X ", -"X @ S S S D D D F F E E E ! ! ! ~ ^ ( ] * P :.:.:.:.;.:.:.v 4 $.| | | | [ [ [ [ ] ] ] } % K :.:.:.:.;.:.:.:.T # F G D S S S @ X ", -"X X N S B S D D D F E E W ! ! ! ! ( ~ { 6 z :.:.:.:.:.:.:.T $ .| | | [ [ [ [ ] ] ] ^ [ 7 t :.:.:.:.:.:.:.:.T # F D S S S A X X ", -"@ @ s S B D D D D F F E E Q Q ! ! ~ ^ ] j > :.:.:.:.;.:.:.*.o ^ ..| [ | [ ] ] ] ] ) ) } 7 e :.:.:.:.:.:.:.:.K * H D D S S d X X ", -">.@ 1 G B S S C F F H E E Q ! ! ~ ! ( ) L O *.:.:.:.:.:.:.:.> M .[ [ [ [ ] ] ] ] ) ] ) X I :.;.:.:.;.:.:.:.y > H D S S S 3 X >.", -">.X # D S S S D F F F F E E Q ~ ! ! ~ ^ ~ $ R :.:.:.:.:.:.:.r q ..[ ] ] ] ] ^ ) ) ] } 2 , :.:.:.:.:.:.:.:.:.< i H S S S D # @ >.", -">.X X N S S S S D D F F E E Q Q ! ! ~ ~ ] 1 b :.;.:.;.:.:.:.K : | ] ] ] ] ] ] ] } ^ : + %.:.:.:.:.:.:.:.:.@.X N D D S S A @ X >.", -">.>.X 3 S S S D D G D F E E E ! ! ! ! ! ] d < :.:.:.:.:.:.:.X.o ^ ] ] ] ] } [ Q q X 8 *.:.:.:.:.:.:.:.:.:.e * H D B S S 7 X >.>.", -">.>.X # S S S S C D F F H E E E Q ! ! ~ ( C % *.:.:.:.:.:.:.;.+ F . .] ~ h : o 8 R :.:.:.:.:.:.:.:.:.:.P B F B D B D # X >.>.", -">.>.X X d S S S D D D F F F E E E ! Q ! ~ ! $ ` :.:.:.:.:.:.:.< q C 7 % O ; b O.:.:.:.:.:.:.:.;.:.:.:.K g H S S A S j @ X >.>.", -">.>.>.X $ G A S S D D D F F H E Q E ! ! ! ) : K :.:.:.:.:.:.:.J . > r P O.:.:.:.:.:.:.:.:.:.:.:.:.-.e k H D D S A G & X >.>.>.", -">.>.>.X @ s S S S S D D F F F F H E ! ! ( _ & J :.:.:.:.:.:.:.;.@.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.I + % S H D D S S S j X X >.>.>.", -">.>.>.>.@ # G A S C D D D C F H H ! Q B g * O +.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.@.J ; o s Q H D D S S N G $ X >.>.>.>.", -">.>.>.>.X X 6 G A S S D D D F F Q p O % ; y @.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.*.K < O % s F Q D D D S S B S i X X >.>.>.>.", -">.>.>.>.>.X X j S B S S S D D D H $ b *.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.*.O $ 7 B Q Q F D D D S S S S N @ X >.>.>.>.>.", -">.>.>.>.>.>.X # S A A S S D D F H * I :.:.:.:.:.:.:.:.:.:.:.:.:.:.;.O.P e v :.:.:.-.% N ( Q F D D D C D S A N G $ @ >.>.>.>.>.>.", -">.>.>.>.>.>.X X * G S S S S C D H : J :.:.:.:.:.:.:.:.:.:.:.:.:.@.> # % 2 X %.:.:.:.9 7 Q G F D D D D S S S G 2 @ @ >.>.>.>.>.>.", -">.>.>.>.>.>.>.X X = D A S S S D H 1 b :.:.:.:.:.-.X.K 9 x :.:.:.+.X N ~ / $ U :.:.:.J * Q D D D D B S S A D 6 X X >.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.X X 1 D S B S S G 2 x :.=.' b 9 % o * 3 X *.:.:.:., d ! ! 1 z :.:.:.` # D G D D D S S A G u X X >.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.X @ = S S B S F 6 % 9 % o * i k D Q Q # R :.:.:.z 2 ! Q s , :.:.:.=.% l F S S B S S G 3 X X >.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.X @ * S S B D j 2 u k D G Q H F F Q * n :.:.:.I $ G H N $ *.:.:.:., i G S S B B S 2 @ X >.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.>.X X # j D A S G G D D S D C D G Q 7 9 :.:.:.@.o N G G $ R :.:.:.J * G A A S N $ X X >.>.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.>.>.X X X 3 S S A S S S S S S D D G j % ;.:.:.:.> s H H & b :.%.` 0 # S S G s @ @ X >.>.>.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.>.>.>.>.X X @ s S D A A S S S S S S S X X.:.:.:.z 2 F F i O 5 O @ = d G j $ @ X >.>.>.>.>.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.X @ @ # p S G S A S S S S G $ L :.-.O.w # D D N 3 u l D H k & @ @ X >.>.>.>.>.>.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.X @ X @ 2 l S S S S S G 3 - e % # * s S A S G G S i # X X X >.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.X X X X # 1 p l A S N 2 u j S G G S A d 3 $ X @ X X >.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.X X X X @ @ # * * = = * & $ @ X @ @ X X >.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.", -">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.X X X X X X X X X X X X X @ >.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>." +"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<", +"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<", +"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<", +"<<<<<<33333333333331<<<<<23333333333333<<<<<<3333333333333<<<<<<", +"<<<<<,&&&&&&&&&&&&&;<<<<<=&&&&&&&&&&&&&,<<<<,&&&&&&&&&&&&&,<<<<<", +"<<<<,7pppppppppppps0:<<<:espppppppppppu4,<<,5upppppppppppp7,<<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*22*yP~!~~~~~~~~~~d$3<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*22*yP~!~~~~~~~~~~d$3<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*22*yP~!~~~~~~~~~~d$3<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*22*yP~!~~~~~~~~~~d$3<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*22*yP~!~~~~~~~~~~d$3<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*22*yP~!~~~~~~~~~~d$3<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*22*yP~!~~~~~~~~~~d$3<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*22*yP~!~~~~~~~~~~d$3<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*22*yP~!~~~~~~~~~~d$3<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*22*yP~!~~~~~~~~~~d$3<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*22*yP~!~~~~~~~~~~d$3<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*22*tKQTRRRRRRRRRWa%3<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*22*yP~!~~~~~~~~~~f$3<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*2<>8xbvvvvvvvvvvvq;1<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*2<<,ooooooooooooo:<<<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*2<<<44444444444441<<<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lr*2<<<<<<<<<<<<<<<<<<<<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Ly-433333333333333331<<<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~!~Lwo&$$$$$$$$$$$$$$$$:<<<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~~~WHFGGGGGGGGGGGGGGGDJh#3<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~~~~EEEEEEEEEEEEEEEEEY~j+4<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~R~no4<4XB~R~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~R~no4<4oN~IRRRRRRRRRRRRRRRRRRRRRRRRRRRRU~j+4<<<", +"<<<3&i~~~~~~~~~~~R~no4<4oV~R~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~R~no4<3$xSBCCCCCCCCCCCCCCCCCCCCCCCCCCCCVAg&3<<<", +"<<<3&i~~~~~~~~~~~R~no4<<2$.oooooooooooooooooooooooooooooo.=2<<<<", +"<<<3&i~~~~~~~~~~~R~no4<<<3444444444444444444444444444444442<<<<<", +"<<<3&i~~~~~~~~~~~R~no4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<", +"<<<3&i~~~~~~~~~~~R~m@64444444444444444444444444444444444442<<<<<", +"<<<3&i~~~~~~~~~~~R~z @ooooooooooooooooooooooooooooooooooo.=2<<<<", +"<<<3&i~~~~~~~~~~~W~ZlnvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvcMt=2<<<", +"<<<3&i~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~~~WRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRU~j+4<<<", +"<<<3&i~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<3&i~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~E~kO4<<<", +"<<<<,7pppppppppppppppppppppppppppppppppppppppppppppppppppa9><<<<", +"<<<<<,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&><<<<<", +"<<<<<<33333333333333333333333333333333333333333333333333331<<<<<", +"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<", +"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<", +"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" }; diff --git a/share/pixmaps/nsis-header.bmp b/share/pixmaps/nsis-header.bmp index 73feb940d4c5d74409575f8d1cb84c7d0b89557a..c3a866025aab02889596ca357298b2221d6f0a98 100644 GIT binary patch literal 25818 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 E07cmEssI20 diff --git a/share/pixmaps/nsis-wizard.bmp b/share/pixmaps/nsis-wizard.bmp index c7f43b97c9bdaaac3cde23a599d893c25888c147..643c90188c54fc2e9fa5748bea4369c5c128f92e 100644 GIT binary patch literal 154542 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 diff --git a/src/qt/res/icons/BGL.icns b/src/qt/res/icons/BGL.icns index a0bd0b0760ea4c116a4432438c47032eead5c2af..4f8b3c89030d9be5890f92adcd541b4661859950 100644 GIT binary patch literal 23358 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 Eg66>Mz5oCK literal 153728 zcmeEtW2`Vd)8?^l+qP}nwr$(CZQaMVZQDNgvAxgxWwY7r?(fYe`!sFmnrS;tn@O&u znOYj#IRgM`1Xvm~aQ-7b0001BtP}_cV4=dH{=q0_E}jln4on39V1WNF<^Pcu|EOq| z7A8&r06_o1e;Nol_#r^V3gG|I3iN-p0{`#U z1c3is7mzypKU*a4g+&Em(c}ucpQt!^)uM||xWNyxmzUutrnO2cZ&+oO%-_XsKZVdO z?y4RB&5s1wb*7F<=O{=(AeB(+XSe}Kc8+M;eD3b=GYKIok@HMn zNMCm(Nc%db9kS90jun?_#syCJdOw2rZWUf;F1~(pkZ(0}tE>8A^=ZpEXVq7rYl;yu zElcH#4XaJS#A}H8VQ&tZNw&nt`z_vFGNZ>xFeKP*70q*eh2*H`>G%y zKHJ+X20SPZc_;Z8+Z%-^BD3ARX22l6k4%}z?)(LJK*gA+h3`=Y43E*6ocAi0AnW%R zA%6|Fa(Xc-CgAB)%#eDpe+TfrLL8tv@`gOi{&+`sY>!Rm)Lms~XDN;YHJ0QigU0qERzjJ3aAaoU2-4xHRsmBt1! z2YxSy2z8WGbGHtq5B)he_>~`e#?K2uK7C|KgnU9!F{M?jY7gmu!iIqU)I@Aw zT8CMcGJ(Y{dRhO2_((f|sr5Z=jXLTl-6 zc6yUY#IG$=-yKTRCWj?}fH;_S(SH4SMdU%tYT-Hctn&%k2X_wNAAZxpJoZ6~7&VDY z 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 z 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 diff --git a/src/qt/res/icons/BGL.png b/src/qt/res/icons/BGL.png index 358f8d2b3fd6aa1446cc384096822033d2d84849..3f4fd67eedbf89650882c80aa99e6c35370bdb55 100644 GIT binary patch literal 4442 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7+9ErRIjnw1|Y>;?Bp53!NGC+q5lIQ*C4F4)O>_%)l761cVt4q}{Fp1!YQHBT9nv(@M${i&7aJQ}UBi72Gn5Qp@v; zvWpd*gUw#-+0?_pATZO@#WAE}&f7~Hdlg&+TrLU=Dkw$7vb0>dIK`JEIdQ%>(`077 ziH)TZ5?3!xnYQ}B(u{RKX&Z`M)*48I+q&ZtDBFZFbF_ z^Y?Do_1os0x$3jg+J(V7d0kr9T}7rFlEtRMZ}R?vL)o#Ivm(2lSvD9y z%UX6rR;gjGVYu+|*h{oVaU z6`bzheO78HVhQMDI3?&{$)w@V@RVbL4C55#QNhswK~D@{**-j%|8aahDEXY1VPG1u zDP=kjgZ6!n1=6GWWVGNQsnGmx*0BD^8@qXIl#dGlP57|?oB3hMUH6vmd87w2(9_k= JWt~$(69C#^_tgLZ literal 149510 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%0D>AR?8sJ%euvWF9r$==;pgZP&H62~};6fDv%Q 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

3x#DtM63(fzwFG9 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

    uOqpslQqJ;0Cdb=;^9`-yl_O? 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 V2m?_YIE(-Q002ovPDHLkV1n>Hla&Af delta 889 zcmV-<1BU$50)+>V8Gi-<001BJ|6u?C00eVFNmK|32nc)#WQYI&010qNS#tmY04D$d z04D(|36W0#00SpUL_t(IjcwE2Yg=_3$MN^?cTUd9IcXkF8rG&AOCM8GEp$k63X|bL zrrlrQyjZ|LKoCLj-V60Y@WRU$nc(eY6!Bs(Q0hf-j7e*jjDIdOU1K|QvLsW^ zW7M|&^OKY1Y$j7&mXd~PlCms*>-7%5tJNBNt}77Yb-!Be{$23r^X-d^i_^=Fle?Nq z@kzVQM^jUL-hXc6Sr)pcF=CqBYc`MX?CjJPT=J{ct^`1-jf<7aO!@5D+}_CvW0u9` zkr8s1#RsJl?>G*x#xX~(%gXGm{Ys@Wk5b# zW~al?{XUD?EEmSc@cMnWeV?g9A<^n|+V5>{1`?&Ny?M}6xir?iNcV@bQ(R181{NB z*)~YYw@;qng&{%+vbLQzb$w3ShB0ku8WJezIw{NI!O;=VI}VFc#Bvz&TA@H3MZCYX z#MMNCc7L~vWf&w)vm{TiAc`Uk)1*EakV+&-={nm{#21|oA2%8df`HXhiHRuUB#seE zA&0)d>qQZ$#nrp>pI6lz=`ia(!DTz*c}Y= z`D8Nd#W6Y4q!mTPQN)aGb8~NxtduN-A(u)eT7TUx^&r3x!=4w04|Rn2a=*H!nL&8{yc z$DI!EPE7Eq-v_1m#q(%+9ycC8=Bwe5-1s=PR_nOc=|q0Dx~~5rLcH;Pt#(^VIX&Yz zxpGer4rus3Z|Czg!;tO6LtaQGv83eg?(Xo;&Q1d%uKX{iqT>WB<#IWjN{vqp23S(E z<@?0Fo_qK3u)goQ3L&oi1Ji#v$MI@1kyuiiwjhOoIBuQY#|K|KVvi*I|7Fuji P00000NkvXXu0mjf|K70m diff --git a/src/qt/res/src/BGL.svg b/src/qt/res/src/BGL.svg index b2a3140352..777795ca5f 100644 --- a/src/qt/res/src/BGL.svg +++ b/src/qt/res/src/BGL.svg @@ -5,166 +5,388 @@ 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" - xml:space="preserve" - enable-background="new 0 0 1024 1024" - viewBox="-34 -34 580 580" - height="1024px" - width="1024px" - y="0px" + version="1.1" + id="Layer_1" x="0px" - inkscape:version="1.0 (4035a4fb49, 2020-05-01)" - sodipodi:docname="BGL.svg" - id="svg2" - version="1.1">image/svg+xml - - + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - - - - - + - - - - + + - - - - - - - - - - - - + + - - - - + values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0" + id="feColorMatrix942" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="Clip-4"> + + From ae6aae53bfc00343085d1771977c513071df58e7 Mon Sep 17 00:00:00 2001 From: VanOrton <> Date: Tue, 5 Apr 2022 15:03:35 +0200 Subject: [PATCH 016/144] Branding updates, version updates, build fixes, package updates --- build_msvc/BGL_config.h | 14 +++--- build_msvc/libBGL_qt/libBGL_qt.vcxproj | 2 + build_msvc/libsecp256k1/libsecp256k1.vcxproj | 45 ++++++++++--------- debian.minimal/build-in-docker.sh | 8 ++-- debian.minimal/files | 2 +- debian.qt/build-in-docker.sh | 8 ++-- debian.qt/changelog | 2 +- debian.qt/files | 2 +- src/chainparams.cpp | 11 ++++- src/consensus/params.h | 1 + src/deploymentinfo.cpp | 4 ++ src/init.cpp | 2 +- src/qt/platformstyle.cpp | 10 +---- src/qt/res/icons/add.png | Bin 1222 -> 1324 bytes src/qt/res/icons/address-book.png | Bin 1660 -> 1660 bytes src/qt/res/icons/clock4.png | Bin 16482 -> 16906 bytes src/qt/res/icons/clock5.png | Bin 13834 -> 14077 bytes src/qt/res/icons/configure.png | Bin 989 -> 1381 bytes src/qt/res/icons/connect1.png | Bin 810 -> 1333 bytes src/qt/res/icons/connect2.png | Bin 833 -> 1338 bytes src/qt/res/icons/connect3.png | Bin 823 -> 1337 bytes src/qt/res/icons/connect4.png | Bin 794 -> 1337 bytes src/qt/res/icons/debugwindow.png | Bin 1887 -> 1829 bytes src/qt/res/icons/edit.png | Bin 1847 -> 1831 bytes src/qt/res/icons/editpaste.png | Bin 1191 -> 1255 bytes src/qt/res/icons/eye.png | Bin 1083 -> 1033 bytes src/qt/res/icons/eye_minus.png | Bin 1163 -> 1110 bytes src/qt/res/icons/eye_plus.png | Bin 1223 -> 1173 bytes src/qt/res/icons/filesave.png | Bin 1284 -> 1259 bytes src/qt/res/icons/hd_disabled.png | Bin 13992 -> 15236 bytes src/qt/res/icons/hd_enabled.png | Bin 8402 -> 8804 bytes src/qt/res/icons/history.png | Bin 4587 -> 4803 bytes src/qt/res/icons/info.png | Bin 2105 -> 2065 bytes src/qt/res/icons/key.png | Bin 1723 -> 1775 bytes src/qt/res/icons/lock_closed.png | Bin 1681 -> 1738 bytes src/qt/res/icons/lock_open.png | Bin 1691 -> 1738 bytes src/qt/res/icons/open.png | Bin 12738 -> 13736 bytes src/qt/res/icons/overview.png | Bin 7695 -> 7514 bytes src/qt/res/icons/receive.png | Bin 7997 -> 8358 bytes src/qt/res/icons/send.png | Bin 8502 -> 8607 bytes src/qt/res/icons/transaction0.png | Bin 2726 -> 2781 bytes src/rpc/blockchain.cpp | 3 ++ 42 files changed, 64 insertions(+), 50 deletions(-) diff --git a/build_msvc/BGL_config.h b/build_msvc/BGL_config.h index 2b96d6edb4..152172cecc 100644 --- a/build_msvc/BGL_config.h +++ b/build_msvc/BGL_config.h @@ -6,16 +6,16 @@ #define BGL_BGL_CONFIG_H /* Version Build */ -#define CLIENT_VERSION_BUILD 6 +#define CLIENT_VERSION_BUILD 0 /* Version is release */ #define CLIENT_VERSION_IS_RELEASE true /* Major version */ -#define CLIENT_VERSION_MAJOR 22 +#define CLIENT_VERSION_MAJOR 1 /* Minor version */ -#define CLIENT_VERSION_MINOR 1 +#define CLIENT_VERSION_MINOR 8 /* Copyright holder(s) before %s replacement */ #define COPYRIGHT_HOLDERS "The %s developers" @@ -27,7 +27,7 @@ #define COPYRIGHT_HOLDERS_SUBSTITUTION "BGL Core" /* Copyright year */ -#define COPYRIGHT_YEAR 2021 +#define COPYRIGHT_YEAR 2022 /* Define to 1 to enable wallet functions */ #define ENABLE_WALLET 1 @@ -180,13 +180,13 @@ #define PACKAGE_NAME "BGL Core" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "BGL Core 22.99.0" +#define PACKAGE_STRING "BGL Core 0.1.8" /* Define to the home page for this package. */ -#define PACKAGE_URL "https://BGLcore.org/" +#define PACKAGE_URL "https://bitgesell.ca/" /* Define to the version of this package. */ -#define PACKAGE_VERSION "22.99.0" +#define PACKAGE_VERSION "0.1.8" /* Define this symbol if the minimal qt platform exists */ #define QT_QPA_PLATFORM_MINIMAL 1 diff --git a/build_msvc/libBGL_qt/libBGL_qt.vcxproj b/build_msvc/libBGL_qt/libBGL_qt.vcxproj index a979135f37..0418681317 100644 --- a/build_msvc/libBGL_qt/libBGL_qt.vcxproj +++ b/build_msvc/libBGL_qt/libBGL_qt.vcxproj @@ -35,6 +35,7 @@ + @@ -89,6 +90,7 @@ + diff --git a/build_msvc/libsecp256k1/libsecp256k1.vcxproj b/build_msvc/libsecp256k1/libsecp256k1.vcxproj index 39ad64fc9f..71e90cdbf7 100644 --- a/build_msvc/libsecp256k1/libsecp256k1.vcxproj +++ b/build_msvc/libsecp256k1/libsecp256k1.vcxproj @@ -1,22 +1,23 @@ - - - - - {BB493552-3B8C-4A8C-BF69-A6E7A51D2EA6} - - - StaticLibrary - - - - - - - ENABLE_MODULE_ECDH;ENABLE_MODULE_RECOVERY;ENABLE_MODULE_EXTRAKEYS;ENABLE_MODULE_SCHNORRSIG;%(PreprocessorDefinitions) - ..\..\src\secp256k1;%(AdditionalIncludeDirectories) - - - - - - + + + + + {BB493552-3B8C-4A8C-BF69-A6E7A51D2EA6} + + + StaticLibrary + + + + + + + ENABLE_MODULE_ECDH;ENABLE_MODULE_RECOVERY;ENABLE_MODULE_EXTRAKEYS;ENABLE_MODULE_SCHNORRSIG;%(PreprocessorDefinitions) + ..\..\src\secp256k1;%(AdditionalIncludeDirectories) + 4146;4244;4267;4334 + + + + + + \ No newline at end of file diff --git a/debian.minimal/build-in-docker.sh b/debian.minimal/build-in-docker.sh index 598403cfc0..df793a13bf 100755 --- a/debian.minimal/build-in-docker.sh +++ b/debian.minimal/build-in-docker.sh @@ -20,8 +20,8 @@ docker exec $container useradd user docker exec $container mkdir /home/user docker exec $container chown user.user /home/user docker exec $container sudo -u user mkdir /home/user/build -docker cp ../bitgesell_0.1.7.dsc $container:/root/repo/ -docker cp ../bitgesell_0.1.7.tar.xz $container:/root/repo/ +docker cp ../bitgesell_0.1.8.dsc $container:/root/repo/ +docker cp ../bitgesell_0.1.8.tar.xz $container:/root/repo/ # docker exec -w /root/repo $container sh -c "dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz" docker exec -w /root/repo $container sh -c "apt-ftparchive sources . > Sources" docker exec $container sh -c "echo deb-src [trusted=yes] file:/root/repo ./ >> /etc/apt/sources.list" @@ -30,5 +30,5 @@ docker exec $container apt-get -y build-dep bitgesell docker exec $container chmod a+rX /root docker exec $container chmod -R a+rX /root/repo docker exec -w /home/user/build $container sudo -u user apt-get -y source bitgesell -docker exec -w /home/user/build/bitgesell-0.1.7 $container sudo -u user debuild -b -docker cp $container:/home/user/build/bitgesell_0.1.7_amd64.deb bitgesell_0.1.7_amd64.deb +docker exec -w /home/user/build/bitgesell-0.1.8 $container sudo -u user debuild -b +docker cp $container:/home/user/build/bitgesell_0.1.8_amd64.deb bitgesell_0.1.8_amd64.deb diff --git a/debian.minimal/files b/debian.minimal/files index c95e82ded9..b14bace826 100644 --- a/debian.minimal/files +++ b/debian.minimal/files @@ -1 +1 @@ -bitgesell_0.1.7_source.buildinfo misc optional +bitgesell_0.1.8_source.buildinfo misc optional diff --git a/debian.qt/build-in-docker.sh b/debian.qt/build-in-docker.sh index e896167896..521c25d100 100755 --- a/debian.qt/build-in-docker.sh +++ b/debian.qt/build-in-docker.sh @@ -21,8 +21,8 @@ docker exec $container useradd user docker exec $container mkdir /home/user docker exec $container chown user.user /home/user docker exec $container sudo -u user mkdir /home/user/build -docker cp ../bitgesell-qt_0.1.7.dsc $container:/root/repo/ -docker cp ../bitgesell-qt_0.1.7.tar.xz $container:/root/repo/ +docker cp ../bitgesell-qt_0.1.8.dsc $container:/root/repo/ +docker cp ../bitgesell-qt_0.1.8.tar.xz $container:/root/repo/ # docker exec -w /root/repo $container sh -c "dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz" docker exec -w /root/repo $container sh -c "apt-ftparchive sources . > Sources" @@ -32,5 +32,5 @@ docker exec $container apt-get -y build-dep bitgesell-qt docker exec $container chmod a+rX /root docker exec $container chmod -R a+rX /root/repo docker exec -w /home/user/build $container sudo -u user apt-get -y source bitgesell-qt -docker exec -w /home/user/build/bitgesell-qt-0.1.7 $container sudo -u user debuild -b -docker cp $container:/home/user/build/bitgesell-qt_0.1.7_amd64.deb bitgesell-qt_0.1.7_amd64.deb +docker exec -w /home/user/build/bitgesell-qt-0.1.8 $container sudo -u user debuild -b +docker cp $container:/home/user/build/bitgesell-qt_0.1.8_amd64.deb bitgesell-qt_0.1.8_amd64.deb diff --git a/debian.qt/changelog b/debian.qt/changelog index ac298db471..60a8f64246 100644 --- a/debian.qt/changelog +++ b/debian.qt/changelog @@ -1,4 +1,4 @@ -bitgesell (0.1.8) UNRELEASED; urgency=low +bitgesell-qt (0.1.8) UNRELEASED; urgency=low * Codebase synced to Bitcoin Core up to 31 Oct 2021 * New logo and logo icons diff --git a/debian.qt/files b/debian.qt/files index bc4becaf9b..d30c81d6b3 100644 --- a/debian.qt/files +++ b/debian.qt/files @@ -1 +1 @@ -bitgesell-qt_0.1.7_source.buildinfo misc optional +bitgesell-qt_0.1.8_source.buildinfo misc optional diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 978beb7724..de280525d3 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -94,12 +94,21 @@ class CMainParams : public CChainParams // By default assume that the signatures in ancestors of this block are valid. consensus.defaultAssumeValid = uint256S("0x000000000000055e5a25481d6b90bc943f36d5f2b3ca0ecf4f4b4ea3241a3168"); + // Deployment of Taproot (BIPs 340-342) that did not pass + // we would be keeping this information here for now, because blocks contain this version bit + // and on relaxed conditions for window/treshold (that are set for now) + // the blocks would signal that bit=2 unknown rule was activated + consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT_DISCARDED].bit = 2; + consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT_DISCARDED].nStartTime = 1621589357; // May 21th, 2021 + consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT_DISCARDED].nTimeout = 1623715200; // June 15th, 2021 + consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT_DISCARDED].min_activation_height = 66000; // Approximately July 1st, 2021 + // Deployment of Taproot (BIPs 340-342) consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].bit = 2; consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nStartTime = 1626307200; // July 15th, 2021 consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = 1629936000; // End of day Aug 25th, 2021 consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 74574; // Approximately Sep 1st, 2021 - + /** * The message start string is designed to be unlikely to occur in normal data. * The characters are rarely used upper ASCII, not valid as UTF-8, and produce diff --git a/src/consensus/params.h b/src/consensus/params.h index 6a72df845a..0d079819b2 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -27,6 +27,7 @@ constexpr bool ValidDeployment(BuriedDeployment dep) { return dep <= DEPLOYMENT_ enum DeploymentPos : uint16_t { DEPLOYMENT_TESTDUMMY, + DEPLOYMENT_TAPROOT_DISCARDED, DEPLOYMENT_TAPROOT, // Deployment of Schnorr/Taproot (BIPs 340-342) // NOTE: Also add new deployments to VersionBitsDeploymentInfo in deploymentinfo.cpp MAX_VERSION_BITS_DEPLOYMENTS diff --git a/src/deploymentinfo.cpp b/src/deploymentinfo.cpp index 030a7806de..02265dd06a 100644 --- a/src/deploymentinfo.cpp +++ b/src/deploymentinfo.cpp @@ -11,6 +11,10 @@ const struct VBDeploymentInfo VersionBitsDeploymentInfo[Consensus::MAX_VERSION_B /*.name =*/ "testdummy", /*.gbt_force =*/ true, }, + { + /*.name =*/ "taproot_discarded", + /*.gbt_force =*/ true, + }, { /*.name =*/ "taproot", /*.gbt_force =*/ true, diff --git a/src/init.cpp b/src/init.cpp index de4886a172..b0ac63540f 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -573,7 +573,7 @@ void SetupServerArgs(ArgsManager& argsman) std::string LicenseInfo() { - const std::string URL_SOURCE_CODE = ""; + const std::string URL_SOURCE_CODE = ""; return CopyrightHolders(strprintf(_("Copyright (C) %i-%i").translated, 2009, COPYRIGHT_YEAR) + " ") + "\n" + "\n" + diff --git a/src/qt/platformstyle.cpp b/src/qt/platformstyle.cpp index 9750e07ca5..212ef7cf91 100644 --- a/src/qt/platformstyle.cpp +++ b/src/qt/platformstyle.cpp @@ -83,14 +83,8 @@ QColor PlatformStyle::TextColor() const QColor PlatformStyle::SingleColor() const { if (colorizeIcons) { - const QColor colorHighlightBg(QApplication::palette().color(QPalette::Highlight)); - const QColor colorHighlightFg(QApplication::palette().color(QPalette::HighlightedText)); - const QColor colorText(QApplication::palette().color(QPalette::WindowText)); - const int colorTextLightness = colorText.lightness(); - if (abs(colorHighlightBg.lightness() - colorTextLightness) < abs(colorHighlightFg.lightness() - colorTextLightness)) { - return colorHighlightBg; - } - return colorHighlightFg; + // return BGL accent color, it should be contrast enough for both light/dark color schemes + return {111, 57, 229}; } return {0, 0, 0}; } diff --git a/src/qt/res/icons/add.png b/src/qt/res/icons/add.png index 746f580671f6befc396db2970b5038d495b2c8cf..5cd0b7558afd5e8d817405161669bfee82311175 100644 GIT binary patch delta 1306 zcmV+#1?Bq239Jf`BYyx1a7bBm000XT000XT0n*)m`~Uz1-bqA3R9JTs@|vGsygRfad+mu zo~mBDC?elOT)-h1B1ou^SV4#`8>6k)f4}pipUoRn<^}jpdU5H(cOU-n;-$yW#5y1j zrr-*i!LwirfBnNp+rNC~m2bSc_2c*Ei5uo61v&H8uYaLewSt?IyK;}mPB%8jozabr z2hN>tfrsXent$f~Fal;p%raomb>*2mKpoAX+2+q_5dZ~DjhqXBXHaGOo)ySoc0vH) zs2X`}Gvbb`kY|8Y=WptT0HQdm=GqyW9h(Sx1~-|Mp}3^X4>31D#xOOyPN&&=E|Xvx zOa;r(WhKho`U{jm3{^!t!?L3)*u)7}DWj-@sl!P);C~pZ>f^CaXaC*=FzEw9v*8N> z$hYfXe61Zc&p+|xm(GaeY9J2o4i4Gf#Q?YX*oCj0d+?Fdt<6|pGH2?<#+_~Z)w92T zCrQ{Xy2?&CDsgFzE-j)CTAW87cKm7TV7an@#RO#~UWtPq9vZ19_Yg6 zrb+jPxI5okdHM-lzE~n2v6U5<&Q`K~xslUnkAkb4L|avKVW(T$c>gEB)noFxd3E&M z+X>*U(NEt#F8gn;Tsn8uCe!v4Z9mcU6IDuhFj?E+>ebP6zd0@@EVv!Z41fqM4}WX= zD>c1-MY~i{H<7&)I}^H6w#9NSuQsf#HVlRh{gsNgS5fsMTRVC(0JGQ9O3h%kVR*Ws zKWtbYHuRPfZNDOo@&f0f&jC=?f&QRkX;9N&nYeJOnU=!ic%gU;1GN1_+pFj;SM&!J z%fqIW<5WX$P&3xulLe@nMAM5jy?Oj**>RzN>s^|}DhNl{O{c53v76G_z((Orr5QUfmF$GczRCT0jBTc{Jzqdxaz{m3j zo%`n4R%MXBm2y*7oaNm92}2rs4)^HiHWY+=b>q@W^8t3lOH@S$TNZoW;jzENPloh26#-Gi>*%=kG}BM zW}g{0ed8PN4?p$5{&!w_B>>5u(AqJ9gH9dw^{QFih zr6P*({eM4AzMGi?=a2-}Zy}h0h+wHY4*{GT3z(IvV_$Xb2Gj~5RZgs`_tg+LlJdos zSkaoe95f0b~juy_s_r_XTJ?M5*MGSNr~aJf!a}RcZC^D>O0^q7NOi4( zz>GjjEXM?}q3URcsxiB`#QE!Ue0ybv>q{%p-DF*Ry8$yPa|5srLi+dj`+)Jy<-a(1 z*PfpJi|r1-&o{U@-{8`GlRp|wTJ5;DfKyuYpgx4GReh^;RIk_|nt1PrpZM_H1!~@t z%zwDnTH4ghX+sE+^#NBysIa?Dc)n^a7)dmbUG(P^Z1ctqlaGp%tZE9wX(5N z*ds$bCK=zkXQS(dK<*u~veao@{q3m0>3`e!H?uH3btV8bP8>UPJGV!lKfI3(EE>u} zZ)RCQM5O_z7pA8^-}cw>Y5)Poik#6}&Ty77lxGyd6B*biSt^@;HOA`&6Sab|qF^L1 z0qViC)N2CU{zbGZ9YxM~tze=k7_S$M)e45Qz)+si&?o~1$h~7E&loLo#_B~0QhzHL zt>p}58NSmVtOG-#R63kzjN}<(wbF%&qF|(!lU9}o3s7W%dhk7v9hDp7^%CU9Vm`PO zI1w`E$h;@_j+*z>gD>4Eawdv`*(@8F1GB`=iWBfo2+s9p?mac{87eZaEi{&aOWO{x zFg?{8J9PN)mGeJ8I~#)gC3wlbmn>Qct_VSDdFH%x^5f;JA1zEzo!jhl{{wh54Ug|^ RP{RNK002ovPDHLkV1gL>M;QPB diff --git a/src/qt/res/icons/address-book.png b/src/qt/res/icons/address-book.png index 7bb740be6e716a8425291a4638466ee4b697d70d..acfde540708675623975c13123e1137970f47e40 100644 GIT binary patch delta 1636 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 irr!#1sdUMIPX7zqFx1pL*=uY70000)` diff --git a/src/qt/res/icons/clock4.png b/src/qt/res/icons/clock4.png index a322af6aa40368df15ceb002a66d969cc88f52c2..14c026229b37a91c764f7ec08a8c08b519a0556f 100644 GIT binary patch literal 16906 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 literal 13834 zcmV+lHucGgP)bVG7wVRUbD004NLb4y-7D@iR*SF( z_~lDsP!1$#gJ3v?UDBdJSJ!TWuhv23u>|UyEYvmT(b_%(hjS(#PYEf>gUB0Vq#zdt z4GROoQiHFi7AmVfR8`l}+`0>saVu%5 z-_t*9KRKCAW}C$t8)9 zWj`vISM`X*cGjOA2J9 z!GJ6nn1hg;&(y>eE;X8Q02_U7tPM3tM{B4)Udz+A7FxD$cCmT;9=zT!89ww2P8(a! z_~K^D#(6L&0G=O*k0Fx4*#!+X(A)~+eyTur&r-;=Kw37K%$!=_1%I+TVaqNvUwuE2 z@7A9~b^XQoq{&PyO-q`6Huq)>U{L;048w<;ki#BmAnkZ6XaL`Y2rOA11I7Wr`rjEzquF+UffbR^=Kaom!W zPOfNVjn_$6)nU309OmKnCTcf+Z}n~7xsk+#rOceXk{J`LDJ|?GEr)J*@FT^NP8-x6 zhvrrVx^=7l8vkRM`j$?CeHF=k@$E3ytUrsIhM$mbnaG7_$1N%-WlUiq{fde>C%zx6 zeQv%wvKPm?%{1-V&o^CGy6TQYbuH92g3IOSu@qpm)>e-MA#&d!LRJP0%0U=Bgfq-3 z3@I3fIDG=AjT+14@ky-pxoJOifW!L_^6b%aU)!p+`>}Ps#k6tDnKQkDlHr|xA^5Q@ zfdr0DsI5^T>@EjGLioT>W+yO!-6^o=Kq?=9R>zWQq16-S`90o?9Dl~Q-rVaL4yAG-OVwG{=(Oo!n^$?HFa z$+@}2&z{C*#S<7Cm&m$~Mr_-6b6?#tseZ+ZYK~OD!_=`KF#o)Ait?-^SY*67m6pH< z_6`O3QspV^fGAMYkitQmXZ0x^Dn(jxUHy!tnuSH&z#J|ZYzynte|rJ zW;WGS;VeG@O|9LgI|5iV@@0U>3O+;^06|tRH5rPAGj8BeMokiGf0whTRgpWu;h%M$YD?ffmEimEbIJgArK8~N1yV^!2@*e+zE$|g2$r|W?uszBsCWx-wKLz zq6mWrU>Y-q3-j|yntu@w3>ir|KI*q_;rEpXef1xHxEsm$5B~7WPZ^chKtkdv4+2gh z_yQmpX=%6c*C$5v_4*s}aRFCfW_fVJbn>T7=k&y6{$5`}&HJD5>E2z~Ht&F@7V!Br zz}5g=t&B21S{_8YKP@3pvjV|wYBEeH{-mu7{EhaEgXOI z9hPt3jBV34f0V9_%1;Dzt-M&y1u3cp&=G>N-&)72^_zHa z`O=z>nwqD1@u9`!WHf^0^{+smTsjrt8vqN>{(CSl{`*%L4VNU`c!TAy(`ImS@ffxl z1ioJS0dK8eN9T9z{F*KYJyxHt+*eX8;PzE4peF>D6ym2%W!~x2`1wVbGc+-YUAwmP zs~zhdO-n!f50{5D!8c*W5mtO*`*pOwr_9=3f~%dG1`! z?w87wd$;iQ`~P9@nl-qORQr8;s4ps@M~m9^z*CxVt+KtTQ&#{~Vgf;cp@Wz(`7{b| zxQfRL$FtVa!LqgMeV@Gdc6q0Pzw*-meu4j9!bzi(2)>v^ZDTq=x#eo=n{VWrONTu? z=R)!F@l*KD0ADXz%+l4X{3hPv)R~qk@}dE+HcgFX>Ke^;s0l&T7(hn|1OZGYm@<}2 zX3gftD;AKGl){$Ho22_z{HLjD+s^0t*I)lhPDX>j@xFHh;rBT1|5abrYoV$pjZ1%V zCr_rwiJ5TMO5Mv-}HuEp7fN z9uxr64Rkc%<@rI1Ixmj_e0h205S4uh;EMu?X}tR0K>qghU&tGB(XW4byXBYjE*9(w z@%-b}mw0E%61p}9%sj*nx~eOXHLd1Tdz$3egZi2k4^B((@(Mb&9`t?9qSJ2^nh0;(AGM6WE~BBG2nOA5`sF|YNRIsy$MF;LQvnt zzKTOsSlc1NR^Ra*~2VBj>2T5tJMNtKOWI~{E-d};f#w(BY z))T_cMH4L9`Swl@S5$DQxsj5w<2YwjiRjJB9DLy87YGM7 zv@gpS#Ypf&*Q-p+f_;E+R}+>Ws{n*fYK%qJrrkkx#bFLLH86PmIOdKl7N!2#0}s6W zVSytpbpv@rPB;cQ0q{jYNMz^!EEfLu4~#0fknAMMnB{fB4OBEw|5@ zB|PeA<)w!o#`>Sn{0~kjf%hqZ4G94nzFx7_^XsAlc=>TsKR0(TtbKao>CMy9GOdP$ z1i|fgnYOpIn18otV`l5~ujO#O&Vbj~-6x;V-(R1vJLw5-h>r@+s#zJiRf^`S63vv% zzl?|OzL(5Y3%^?ZrEBL4FaF#4kNfT;C!>yDt^@Q|^FGJ5nhcQsW&|rBz;De+Id;ok=gyF-w?tSvfgA3QoAf@`T4jEK)=ia%;vDsjhEQ-C(Y}gBQU<3=k_&>?Y(-WiJipro)Kpe- zIKjXT#buNZA8z`trmDoY^o#wRGouOwmkO73sR!VP0=z_?U6RMr&mS_}eoN^SS6nTc z5)=8`bI)*e$y@kTgF6NALG!655TR@6-j_2&9<}SGpb#wjx&67z7bG1Lg}4uK{^J$e zKllRcmT&0V|0%ZppJT6ZVmNBYSaxaFfQ-WYeAe#VAv#)HWwR3$VDk=>?!Q_0@~gO-TeVHS8t|&VlkRIZ8AK$|!N5+Q#uRxT|IP2ow`9hD zfc=$k=zO~!PjhfE0j_o(#Cf;@!|@{sVcyWp`|^I1&iim zv0V12pWkS@F>@gQyLk;O7B9vToX5ukyw9f%yrxiSFg1*Ega=CJoheMrsE)(1?k1(Os{}iv*3SiV(0o^>%vV!thCoI5J1eMCz2w?Yq zK78zPRl&yd5hy>q_92`978M(LmR;3_);;3q{Fj6xU;~K8{BVc+sCE$%DN~@cAT0 zj1-8Ek90BeHq`nPi$#b<;FWGsEv@{Pr(b;uv(?7qbLPcm4eWm#|9o>24riSI?X&0< zEBFEjsxnyl?aj=en}652b7_b-@y@f)VO{qFI9-YXq9VCO4p7Sl$m@!gRHlGpS{6P* z6yp$@K>i9)5b#h6_zo!J zWrGe0fMT$Eb9*J|YK&A;$Sn$C+A5gh1C~;9%1QWNbUc%oT zt$ez8367=~b!}BkYL*}ttk9e{59H$MF_OU6wL}oxB`U$0Q|6% z=iXXOKU)_MpL#jFlV9DUo-J59s z_|tH6uhwbJDV@sT)R++q=vpAiG*%DI!t=OpT6er*q6%MjdMBojNuE%Phpoq;L{gh z!CqJ2y#OK~jNX#1rWMcuJ63ZaF;~_uDchk5keSpC18)W)nA14QFr@cI>B zbKjngjQ7FhpI$jIc~`|;$`57sPV-yZ1Xivspu_f)UtIY!VN6OI&wl?EZ5y_zNB6P# z@17(rhG~%+Sc(#gt>T=9uZU*m_1e_CE+zrcG51Q|+q(GTmDf4k-p1W!lSvsg;0iYF z97S7)QA_)^!QZhjiSO2*&DqmOTtBjub%KxeuP?#b-mWlTsB}_oFtR~wnLs_}^n|pT zt`q>JTBrnk8Zm`d6Fs#8@@;TmSE)4e0KVVM1A8}9;PsJr#TA1R_EetTt^JWCcDE_v zzb`EL-;w`j!w?!2&U}4yuXlx7 zTWZ44lb}$k`O0&#Sk+)zhm%#WFQK-hgZoM+kRBiZ6MiTkj>D;{1uw(ICxH>x2!HU^LX?0v)mkML_NH6G%ogy7$RLxfbST8W_i7-S>D&>N- z_6P1eevnc`;x4_QfV~yd*>%98)|3K#tADe3S0*)e7v}%$XNKXa7M|L>h1Oktp!Hh7 zM=&5ZK1I+8&cH%VtAVNobTlD}snIAdPRnJg@!8>I#ryBkWwrAAsWZi#_Re|iIXF1625@(8I^OCo425;5sbts}^sCQIZ$El%MkWl!1RDeZxi~?-* z1*fmIUs*PIynGc)I$F8FoQio;*?20CkEFgnp?lHC-;YSMzjaRndk@Xx(sM1Rr&xHf ztC{9aif8ThBu`Jv!v?1^;NDX7NI!H&KTq;6YX+yWv6y}3d1YB;pQ2fWo@jrVBFT8# z(#Ff1zQyfyFzVt<68lv*Ok-PldiQWu!55+YKn88?bLO9YK1qp*EdTOzY%Q(f^ZHnV zkZ6_x#d*DfpFC2clZYVTbJ#%gg`bMhazP_stDK53=vf3!YpS7eit{yZe?VtvC%+k1 zM7mcxi;C*O;U-H7{*Jw{`@ksjhKyaP}Ub}xhJkbz8^)Yc9iq5t&L*Qh+%SBF-MLU zaZY} zanb`)4{YUAxv{tjJyJ98VdqfiuglFxo4?2AbdYoY+_<>6)oM7hr)nDVVStElqO^xn>2|ooUzB{yu1$Y?}f-Fl8s;B^0?Savrx`5sYfv#2U z76iwKALFxHxi`0vEW2wQRn<9iPZt7T5Co`e%p$p8>77}*2%-V+vM(cV;6yY+q~z)O zC^#j+N1^VhCv0Dm34k1U70s8w7od7B1`80)C8$wPO#k+BmUme>T{IDwpIeNzYakA1 z=w?s2<{zsqWXia#(fyM6m)k~LCBlakeJ9v6}z!H?2#rvtP^S-QL_#j zKIT7_ENU(4L#)}2S1K3 z$Jp5;OEH_`u&!B)&u))wNKez1CMm2l`km}k>Uo{Y5WL$N$h9~^n|mMtJ+T6Mf}l1w zz2N)nbx2(f7N!p-y~A2Wb!|pa#^o<~B?3i@`el$Lh)8RH=w8^-Yve>UTi(f@nm)CD z^^VjV4g&4-`M1G#{15sD3i*KGgPuNrO+Kmn`rsYT;5CvYTQ89`n~okV2QCfPsmHtW zgY0wKnQ6!*E;V^1HfMJ5YPsg8P%vabNxYf0J{MibYW&{-h?RP3@=twC5UoLZ5EvQo z$u-wt(AIE+*nK{W(RSH+!DYh>NTUie@p{tyPxyqJ{XvW=G8z)% zdEVJUyW1UQRS$K5A$F7B7o-)FND?-mH}L+FWFjE#8nr|QdrEV!H2DUDEQ#IwApsCo z1VC0tSOAH-xsMhD1h-M}SlxI8yVs30W|RS2*8nQ3;~^aU;fyIliZfAu><})u;%S{| zbfVL^zOn?edR%TNfaLLi)3oO*6b8J|4W_{m4rE9G#7Lo#3xJvx&!YT@ZQ}2&jb^>Ufyf6HZTcD6lVB3i5rBb7=~PcD!xMa7F<4hHl2?0DN$u6D>N-E; zUG6}iy{HO+yiNgsw|Y8j(wiC{twHd3nIp#YlGBw%duI}KgKq$mP8Us>1=0TtE_tM{ z){m2|*}bKn^($CV0HXvxn*hE)C8ir1uDZ_W^Lo20(zAAfeMyo+GcW=0wY5vX-Mf{h zSKkt;Z3v(o5P*8CzWz$yw7)Lx;wx>5`n@5bXz3|TBgpSqgjM%yaf9xO^0K&nS^GJ|c0j=>za}7=xH9ij`1OfV)&4>mQ zg!}w{@j#8_#Vh}#g|ZB&Z}&w(rL0*KDirj>rDkkIq9>e z*M`3O0qU!ICxIFQe-D-7}x-2hNVeqcRx>rJSQ8L;>LLcf`jKa}h5dA*h?r`Jtx}h6cMzih2#q3w7jsg4=q_PzsF!$TBVZH+ zM7P_CV01#b=Gy^=2_hz~8cqd8TO?9jOw!W)-Q|Mdc1z<(E*ngI@SkOBAp2xV>wGj} z(CalI#rY&j^m#RAQYV=P3L*vsusNJaJ_m$rzRdw-i$)A_asM3}uSIfg*8<)r!LpU& zUTY^eV;+)-?>ZofaFDe?RXeXHAX;UWsox!>pB5*Gacug*8u~P?ay%!Cj7CNnObC*M z*kSELlI+k8z6Y@H^LhLcN=D#oRC3b2<0LE7m!zfL@^fLJ2abbFrMvd=;D_%>c}}Jx-HtuK?jqhox zBpVF=X}sIzK=j9V!Fj$1uzu@vbEf2jLH%Lp?(XOH70V$JbJUY9xf0>CaXIjzd4B+O zL3Sg??&SM7{%yFUu)y=&jB}Ev8B!Kj2)?p*ye`70WFhelY`ZjiB0nDlSKiCuwhIIg z;Cq0q*%Kt=c}6gQu=tJk&YgQwak(P}xi`z@vCIkt0S5O+G8$RubJHb?U6@RE=muW` zDnIu+XWRpjH^l$jFXdxgv34kIc@l--#2_rOu4+jV{->=K=3bBq!_niyhfh9Z6k1x{ z^UuF{{0uQ^lxQ-#L{aofGLe#Gois)Hh_Mk|g2J!Mk4*?JQIaID$72{`Fy(E-YkY0- z8(mE=zn(&;RS5M{D~OFoLFJ3c7f`j(`MC%tBg?%`Yzc8qq$b+};|S5-%BE`E1w}Ao z7?@PP->wIUat&Ipl_x@SLC`djLb&$$0#;WL{QFyX3m3J1g(W-L4^23L5&xJAkfbk7dm6}x{+#+__n;W)U$8t$BC}`MgfmUhGa6bucaDCys?hdXR~=Ox;h|1j{JLWsE~mRRn=}(SQ)> zlhfnF8|H4Xg_a=g%`^HXi?ytP+Wo#7mxeEK71zQak4Waz^`D}exyrX zOzuCFI-?0kPc`^t`TuCz4}S9>)Fi;~(tY9Q>zkmVN%8oU5H8Tcaj0$O%_;jA*gBL; z%#sudbSNpcU7_`{@={G1Wi++_P!fzLq@DY~oKQ{v5Eq1lU(43r9-J=Yt;y+pYcxeJ z`Gqk`iaeIkumTEh#VRCv+OK9+g3m^TgdiXQlGJ?%O%y@$MKVikjXjjF)kj5twWgi& zS%@5Xt)EMsXp|p3Wi+zTY#~(;5x19n=$EjMyulKLKUQL+x~^`c)63H~V*mgZfJsC_ zRL&UDNPK>7xZjUu7N^F*zMB3i&AalPQq$y2mYZ6yH;{a?8h?imWnz2+Tf8ouwe<}om};=30O8;}fbu80TChnH!t@FLzfUO}(o4$D z=-sf0m9*x(v1pk*$$`)ngg{aPs}vAb(3SPb%E?W=+Bf!nD&y1>1SOxfusD4(CbOBR zx>{&67!H!2+8i`ja`0UwCT!iddmAp76T_@oU^Z*|5%mtKbS#$6N23T$m*r~-Kr|tc zYocaS2!pETD}+T&P=eqpg)iDisMUBTpXTY|6392roP}UEvwhcAx)S5|FnB=dx9s6} z7_u_fNUOe)q^>S*9a2cDDNa!#3JF77^CSFdc&B}(TlQ5m!uZ-Met06-+Dejn0N6UQj+@dL{k;5PS;*?GHOVO z4_y|n`6KeIBqwd&`0Z+(4hLt=n1$J#sBO|?HT_!Cr`}Lc1wf1Wu?m77uxjU2%PNE~ z7SNSbS-I;B%h%@rWm9L8lwfA_*I(0>XxhTC!L7*dM2CYvsnkVY?l&x3X|M0>HT{9O%g^_le!T^e6V?8{6acNr zS#=FSZT|$5mY}K5>wDnel{}T_sqy~Gi^xk!<&oCov^BNtV&t$rb|EySn(r%yUUeN>+3tN(Z7%Mfy7O5AMej2&w@RG3Qp%R4pH_b)8z7-Uf7P zvn4&HGnu$;`dOqVm|3&z6RiErt0*dHB79L=1^n?PHbxF#&&OZ1Z|G=eLD~RPrcERi zD5z<)R%fGWzjC0xA+4!Vw`>}^ax+ik=Q+8olRP*+ z|GI;L*~^$P+M{GlG53~iFdmxxb_-MDJl9=7jdj3nQD@(-0uk~ z8K|@Z(F7ry5X73I`Sw^zjgNBvsKr&X{Rs;e&_5-W=eMn+qqS`_Wh3{KlY{?OjyJ>% zmB&aW7+ccFfc~Fsd-H8?V@C&nEE-E%QDNkqKN{FtaX{#L)bo2wYE~djC}c@~J{HT+ z*GY|H4f3>tY=F@txwm*64x^Fsx8C#G)05w$WJH@Y9&o`bn*2?rrKd^1jo=OZlzrp%Oi9b& z;p%;~?LAP=_>#{k8>QMgvAazH|6eo(Fvt6tJ?#jo$?tsr=3Bn@jt(B0at4`&1zfcUlsc2l?=o#%EeVQc z`T%LaJy15PjWecx!`I(e{I0fw(?t`>x84k?z0`g!u>0EoD=C^*o(!#4ZAWpe=?Yc+ zc#QlWe9KLopO(o(jg_>l-(11?lJ^*0sQAQ6H)(^PZgDVY#&L||`yapdy42j+$^T9} zlgzQBAx`mHhakl8rAduWhX$!&ijom0N+$~D$uR#t23aR>TnT@kJ_}!b9LrvPolcSW zIeo$rEXioShN<)3kPpg6H8Xw63RbPD{A0xq&J>JHz2z3-Q&S^5pd5t!E0fVaLL9nQ z!4xHv`jSqDcFXHll6(ldK3;`Sn&0*hlrtEZbJI=COUvZpiXF7BS$CN6qu*e3Vepe` zs@>E9UxIW?7gt_*l*IVgm%aR|duMAicTG5rw0UPkqFKB1n$O7Tq)=T7rl>LOWYNhq z`$1CEcKJC?v#ymdz(r?s`_wZyY%;L?mDfGiIO7}4KlgCA*7q2EAK;THEo|nh%RXV< z)*l}HZY70o4|iR2J*k5Sg}>FKWs;PFp!MBZr2w34H_%h+i4a6sE=9g7=uv==(Eh-+ zSsDEHXV)<;C5@-P{esrbJGXGr>{lts4gLy^UV<-yIl;!T+~sL4*0W?tv8hz6PUX4$xE;3N(kb(UE`kS~SEsIAteM{Z4`Fnh1kIdb3z+` zy7Mpz=4Y3`@JjomO|@J!qL?Z7+(leQx_SrIv_Dn>&~gKMLZD>!iBc?e>1lf`CSLh( z9wqQ$AAk5^xkbsuYQ+V zrwdwBVg--HJ8t35^Dm?(-o!i4Kkx25aQG9R`SUASQe1k`y^_LT!oUAlIz=TwaA8R` z;dJk{f3$r3k$7>?^~GgE>8O#cZmPw8u+sm{-Y}-9Xs`S@#3Z^0sHBKGbSyz%X}ww> z)BsoZL9H)Zrdtd6h`)Qt%3XdwkKA$_=cHwE|9fvryWV+kv*+pyf6dHk)!nbC^*Q*# z5lT)@8w;y9R2|v)!}OyCgHjgd7YhXi!&!6mF!t&i|8s1y3V@Y0*Uef#&9RZSS3cxzq}Im3pr;oyE84Nd-AqR|9ER|pj4RqIe_n!H|BnTiph zi0f49jn%w|0G5HP_Pu@OU%QmR7mwhNzrLGAW2f+7eFd*Q{g0N;w$|r(`^h&!a`woB z2dFpT19(7?n0@*|{+RpQ@XCF9zyfAsfc+(XlMiHMogdGR=;nEWTIYW`OwJxljqK>HG$EewA zZK++;Q_!`vUH-e42yGX`fgd`ETkpPyJ7=HA8wM}`eDXNA-U@ikZ*IeD1jOE^eQ5KFf^~&p!RMvw6jrUr2xaJ`muE z^agl1A@GABNDhh$Bz(fwj`u$~#`zl^&9FsT8lYNoZA z7Q9pelyZ9_;K!uV8dFg@=z7|&_E%0pcC8@5xDxKU?M@b*eLkO=;JIg>an&qaw$^*? zCHHXoxrabJ;k!*IV)o_aVA5DGwGBJkKU-CBu(oE9Fn+9YL18fk!-lcW){5ikaYEnl z4-HgSgA!yx(Sn*K5CR4JQUKI|)dX7}rK#+uPlC}t#iwcfAj2L?&q|z z)xBB7i3PE4k}CVKYJ-`o>MX9l?OHM{3okfp&VXyK`-NDPVqwdcAGmkT3Yr(c5AB_S zwq*}XND{hVs|Xzvo~O4B8>ddJBnaBanihsgKtV&GWamvLxaLwGK5H)XCQW0n$-qZT z-taA3@ma04qw}A<_4o@|Qkwl8R{2iC3DQXfUjzgb2pRlr(G;rd|1f6KlyN1u-(q@f za3SBf)bZB3b$q#GG4}1d{r3dafKv(qTE|3QE8l|pu^OoXF5g!I9?a7OU!`2paOPgQ zfVp$dVnNPO{?>Ao)vqk^lz;Q>PUoPk2YKbumH2;ra?K_v1`(>ABo{+AM~jc?OqSviRTTBW!>5P1bK%cf{fG{DYStTue@8vwter z_hvp~cwt8;6?_p8479de_@Bp1S-<@jN=xQlHgQtYtShf#Zb~{EYmc&F%QjwH{|%j= zu7VD$h80j~cW=RuMm+*w*yJ+IKwuXYWofokH*>Ld%hMX95Q+vv}a|)9LKGBX3mk#L07JnSOfKd5kjm zV_S74+js2Zh3y;Y_;eLCH2ar`K^@R&!k{c43u&5vg&WWkhLj|jJBwS!PG#JLvCJG+ zNQEe{Y|SdZ`sy1`<@T*RJ&6g=^OxH{rXaV4gv36N=A+Rm1Yb!8fvW0cKKpVgZ!No& z49hRZ=Z_pRa^4)_s%d9Yl#s}#x?|MuEaz|42Wk28E7-QXdyy#AXFY94y=*KL0lrGU z8t}y<;N02#dDtk1l$9`ZP##qReDuS2Y+doSw0+;6BhL1YSNX|#?{N0CBjgSUJbk12 zR@F%&hZ6h)_Z={a^`e#!dd5VRZ<$? z+S}>cyPt2Xj__f{E^Mp6*Z$MD)^ShGek@bIAPpS^v!*hyu#EGDz0?Dzf*Gg_W!GS+jX2Dak+29Wt!wwBk{QgbU8$o`D4*i0o*t#kIeJb#-;TTUUW~ z>rU9Z+aDkJG%V+dym6xh8vI`=88ZqdkK@uo!j{_YQ9K!31gfq1I_u_Y3) z1Ol73rSi?%p{(6<27-7Qc|#|jla`&7J#`{+v(DnTN$GfiZPpf?N2_rksb-n2gRh#Z zaa0_J{fFV`aj9t+agq z9c^niu&SlL({}XOR(#$Mm_A`8)5aa6WO$b!^dCdhgXD#dW~i=#l1o+W`<{>d0+5;o z;*TYrfZYSzb|hP$-_Qd z8=l4{|9AD9TiIc^vDxcptE&r#wG|p0!RdmQHvcv#6ec62Tl~|p%uIxobcz#_m}rP& zO1znPOA6#pxDk!ITcs*sKx)?h2N8+0r1%R)qg`$f?x!RH4o{#(jV9ES(Vt@!T z00LAU6Ij2oAC<>4sB0R?k(xs6j`3JhCy<(4nA|Tly+n*NO#9FPqIb09kdGSeX? z1tBq+goJ)5f0N>H+L0Vqq>grIY4`t;qplIEYpL$Evdic8w76_7-p^?VXvlb>vXrJQ%k(mqhb065@vtZ_1`$Vj`xv1PrExc+qG=!X$aUae~3% zLKNL@$>Z|*JWgCr2M(tlx4Ryvs~W4V5`%bz%(NqP6G4c_ z?Kb1_nDF`xc)cb(UIRvh7lXlzL3Cp@x-gj>h=Plhq%P7eU1X=*$sgjPWVp8*X!!30 zTSk%{T3g_F9gLZ;S|oNP>sCWrI>aUS=(7JuKLUAd(9#4sGj)soAE5_>JlrV)uK)l5 M07*qoM6N<$f@Oa#p8x;= diff --git a/src/qt/res/icons/configure.png b/src/qt/res/icons/configure.png index abbbbc27cf4024b96e42bd40f2bf6c206a7d7b57..f4eaf89e02473338994094fa2ad4615947013394 100644 GIT binary patch delta 1038 zcmcc1{*-Hiay>IcfKP~P-@@J%J66nCHGSr)855UIIC}obzkmPQX18|E>6o>8=B!mS zCoP@WFtx66T0_^o&h7=By$gDprZ?<3x}&tKIKM5gyt}k@R!i&5rjEI-mu_9kY0j>m zP*K`bJZ0JB-0X&8ojoba>*{@X6w97X7T;OxcrZz7TeZX9u)^Tzda2bB#bG{aUSX08 ze8eXEW_Wv~xH-n#J0w^K%g=O9baYC!bqfxNlwBMpw>VIKYKZ&{FZnKC`Cb>f1~<7T zTba_8+g5DYyZ-w9>sRkwJ$&}is_iT1uA8%Pl^2+nVr{~Q$M-()Rj}SSI;WxF8~_RIk%&*v!HQiP4kSV z%ISr?kvEoBN^#U}X+FLsn@ww5UbT6X8*o!`HIU$}PR^}E;aKD}GAW$}-nKfeF? z{`~dx1E=NyfZ@OQvV~E7m(7nByifAQkWhbK=SJ!0dk`1qly>UT+L$?s1exjDEt8vgjn-QB_V zrQ{16TW6=Y$0oxstnD7HZD0Lg@b*ubHZe6hxnqumsBPw_`Y9_fCp~#0D$>Zb@pAf^ zIi}U;?o<|j^g5;G(Ae^m`?Qae3YWu4UId9^b0boiQ>tyO1lmA<}gYGfp7 zvUSs@;-b%HId`^Hde=2><7-~FZeHC&$H0%*a&K>Yuc2wm!YLs+d&ab>@9%7_K7X&v zYemD%%FwU-{<8DQt!m^niio&&P1dgHON4FAfm6E{e*Don*_VS+`u4MF*S3{02=+#{ U2e4a90t17=)78&qol`;+019zBe*gdg delta 846 zcmV-U1F`(&3f%{gBYy&3P)t-sp_+}jv#6@1m#UvhJJ30gms#egqe_not1{$*wTZ0YmkU} zjD&Qipp$EWeJq;1B$2L8qPQKT%@~)tLZ`tSm$pEny>Vw$8-I|ib7@v*T}m2;pcZ|T zX@s(&7Ifgq2$8`T6+y`1kAT=gP*v_4M)X z?CJ9G?cv|s=jGzt*wV?xz3ArS<>TPw><$@e*gdg07*qoM6N<$g6bvCjsO4v diff --git a/src/qt/res/icons/connect1.png b/src/qt/res/icons/connect1.png index daeedd51f6217a9ab2b569ffbc6dc783b12a3286..c7ab33031e36874f53c0ed59c848caab3f2ec337 100644 GIT binary patch delta 786 zcmZ3*wv}swG7~eyMAa`mXY-EiGF`XJV9n*qQ_AJ zlM8^%KE>v#T3wT;Fsg7C8Ri7BcoiGvPCm$}Sbw7Yz@glo`z6-xkz8|Hde;e=?F{q; z_4Kq1i(P?O#K;qxq%*&Tfq{`>@*l?O_5ZQNyMdW>zM`$mge*XVKn1y}v!)A%H_qK}ShT zO;1siReZvR#^JDfPJNx zQ&LcomsW99m77|znDe(QnU*_W`Bna8ZFN1Wx-^yN>E-m0kg(9}SFT+(H!(BaZm?zB o)~)3wWu@Q0eEas*e})AoLy52<`?kvqHi3f4)78&qol`;+0KpHGssI20 delta 260 zcmV+f0sH>73aSQ>BLV@-ktOsDZhp-*OS>^gx_XJzlO+Km1~o~nK~u1kOaUGS7%iC| zGn$7gm6MbKBndG*as&}lGCgyX!2ux}c!kJqd%_tszZx~X968G!Immut z8@>Pl0F#q31DAi9PNt*)004VQL_t&-S7T&A0*oMlEWpH!CcuHLf`^guA2YImFe4Pe z1f)s0_d;+Lc8s^w!JHR-++YEBn1T0z0s%12C4C4T zZ^C#6%$S!9Bxa>EW@|BCW85XJ15?OYuE6+!5gD{HGC&wv5E=mca}w>fpg4m70000< KMNUMnLSTaUrDJ9Q diff --git a/src/qt/res/icons/connect2.png b/src/qt/res/icons/connect2.png index bd24b1c37e9a44026c8a884c22dbabc93e136022..9a6079d3786fdbdd0c43ae309351734e7a556720 100644 GIT binary patch literal 1338 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl4m>B|mLR^8||JcC4fB&98e-4p> zGl1M}+qOXjj~zSq_wQc_`_G?0y}i8<_NrB@e*gXrVSoPoIVUFv!k#o~(w#eZfb0_| zPK1PnKm;>0Gpo%Xr74_ARXEdV`)vF6?LhG*OO^x%1_Bwjwze5+XEN1KLJY63ueY|g zhG_Kl^-WON9jmZ2FE0-w;_dBiWMl+n`}p`o$ghh~Se=!X1(8xwQ2|Pw%{#Koblon4 zHJ2+-1<5WBQJC-KhG=nfALhv@S6_Xk=EVJ9ai_bE0{)#`E-Z*Z1qjEsx~h9nRK1qA`! z3{eC0b&+9C5Q|r_QLYL{pdgc)AhWtAM-(tFfPj&aQ3M7=MMYbkUN+gjXs~`+Z~mge z;zfhyR*jRd4=xt{Sxc;NUkZ@eqN^a?6mZ*6EfQ?4IV*E8zu3F z!0X8&_km%~P!i+^%o9qw+6F6TyC_a-F=b?7R;ev8_o*y&R?m*NGVX0q(uxVN)2~p` z_wzK5nl&p(H%-G_PJibTqew$DS!wH?OH6&;waw&hcP_DYk~)X3r-0^g7I;J!Gca%qfiUBxyLEqnf>%6U9780gCMP&B`JB;NbE1YV&8&>i zpjnW^!9-o$oIj>vdjI@zhX4-=Jq0B#H9bX5RbKH46Q@oN4+sfr<6g1CYt_o^jI2i1 zEu|%2zwnCi_L}ti9$;E_*Ea2$nAEheYi8RL7Zt7dmsPZtl*Hs8=t{hx*3Uq4?y zenP|idWVDyM?4QI9$T3BP;g=(&&A2hj~wxvD<*z^(u5gP&P+Nq!K&6R>erb_$(fNi zEq7M_WaVky{9Huz{M_iEsIa)e$k5os0ny>%_b=SIa_7>mTi5PgyvfRNXO{6lUb+7o PpuqEV^>bP0l+XkK!Vu3n delta 541 zcmdnRb&zd>G85yiiK?yj=BFMhZa$;9<&53AXWO@L|NsC0k|j$50|S8!TU%STt!LCX zo$BrF1#;`_>#eP=feaw<_4QR;vRiS<&b+)lh={khw~>(%knQ8+BR^}M!t~WySy>P% z6%`erR9@X#Q}5k|?z^fwFUw9?tkAo_$;s(|{r~?K78aJ4mJp>ti%mV(I0kQ!X`dm{ zJQZjtP~6qk)!Eq@$cT=Pme8FkXFOZHx>usAJ3KrbqRZdkA80Ftot&JkWYVW?GgZ8> zL9(bZGBWZX7z70c0UZrdlbM-mXj8-@7-VFdT+HDf$gHTwtfbE27sUVujEsyTFd!-_ z>U8Oq?S+>%7hjs6e`#_4rOAbtrsrQ8oqt);dLp;_kjc3hx@TWVn(UV{-J^Z>h1Qwp zGM1-hEl(Jpc+_Q(^cZMh_hdun{(6&&852MpPZ!4!iSX1@8*>i@h&Ws|)#44lm^NvP&jcnnhZZF+k%$-GJD*-WyCQ3X=?q^5r945y_5Bm~NAhy_ z&%5xi{qv6&(I0RBPGO&7K0hY$QK%<73mWSg+Ywe_mr! rS4hnPKfcTfhBHn*lvq4joaqjuTbST`=ijcB|mLR^8||JcC4fB&98e-4oW zGO`6eLD05s+aQ9+jvZ^a|J>>Hxwp3$BC=}Ls!H8gMXJwoa&jOdlO|0nRDGDOa3>@r z1R|1|nOSZAC{5u^s=}E@+h-Ya*HdK92L=WLWo>P3Gt|yxs-H}fIG-SO%-Y%-qQ%$O zH$h={tisM{(W9Y)JB^HtfZ{$rJ`wWkA{16fitYE~*a8$hn|EZF>AGD8Yc5xw3X)wM zqA)*@dxszII!jASh&e!8)|f8b;IPzJdWM(8)Ik2tegdnUot=TQ(b3T}Bzk7a^}CDr zx=C~giLUh%TLiQMqA@u+xlgfqs#ceyc!RShyR*jRd4=xtJdw{i!k_m`tlJ~Grd<1Znbxx+*-u3>pHEBgIw7;Y(%@00=En;4 zPr$ey1!y6ldsl&*fq{{sB*+h#CzN!x4OYx{QJmCb$|KLAQd?lYd7655yw(2sS}_53 z`{(QXd74MfniaHvzPX(K&L#Wjo5@OBgK2qN5M>^)cySnrVWF&GKYu=m<)r5cVfb2_ zhs>F~WAWa(VIHoLD$(l32?@GJ@$s5MzWy?hv_u4n=6tGhA06@32O7v(;1OBOz`!j8 z!i<;h*8KqrUiNfx43U_coZ!IZb4F*)i5j*vvobz|W`Sz6p4=3Y=Bdb;|#taD0e0ssxj&YJ)L delta 661 zcmdnVwViE(GAHAk0G|+71_p-78<|Dx|NZ;-{Q2|$U;tzYT>Jz<+qP|k2p&6j%>L$Q z=Ubn9dwU@wt5&Vjz3^J~%=4U_9EixINt0BMKT> zdnUKYlt3SUth%~yA_x06kT&vXyHyH zBO{==kB^W1taS?0SBov*&pCSwP%y9Vtf}{IL-$=(otI@NELP}Uz%zdb?~L`9mX;86 zfYz9Lu5k?BAk#iWqIs&ooXvt$RyjL617)M5qa}1_${EiVukMwo>K2_|zgDb&G0+Z( z&gA4|C6hjFo2lZ34U$ETl9QH6_RI%53nB~jlc7x!i(rtEZ83*?AhV(xvywW8UldzL z1+#?%vza}6Nt*}^h>D7O-udEu>r2FgZ-Mu}x!?I}fBUP|t*^#6zc^ibWqaYJ;mt2v z*T2NuTzqMM{-xH9FB(@rS)6}qa^a=g)lY(F-k6?$X>|T2--VBS7e7|Cp2)2}WOD9> z?%5Zjmp_YK`7CL&U&?fk_SqL&XP(Pm{Va3kvyA0wS<4fKCmv~D`=oyL)1M;?76PNV zda@yNef{izAL4YgL7B3g!m(% PTNpfD{an^LB{Ts5CXZ0o diff --git a/src/qt/res/icons/connect4.png b/src/qt/res/icons/connect4.png index 0eb2b848c90c02449489742fdc5f205b565d87bd..52fced326f43d89c84e99c55dac80cce477bb096 100644 GIT binary patch literal 1337 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl4m>B|mLR^7d=Yr4H`JXNGK6{pa z@hW)hl>5>$>A8N~<7|OX5TqUcL_PdoyZz@*r_aj%_mqQfR_eYgQhg@tdtKh|QlaX@ zY=t}Gj%USec2%1{N>ezKs&J;!_F0D9^%R-&Vh$%cbk=96oyk-`nIv&OLFyQn!7eVn zjR^|7V-T?T6|SDp%z zT^yn?KahKeAMZL2^|f3Y%hs4K+~Ba(S9*q*#MD6k&3*!_xU@D3=q#Th(KAb~-(9@d zO`7JN-Xn}m@jL-Ox}EMkzq~{i&wExt_nw> zAd{LPv$`fnlrdX{6tjagv%M928;e*TGrt=%zYCjWW%s=IwUgc#cfC!ndmB^o#xL_t zug8~er!StFudO3rPmlOEDd3w$=qoMH7rky@JM6w{`MuC|f7)vKwZZ6%ru!oS{d28O zFPm&%)ERuK*8IY)dxJ~odV}@Ldh-`mnqMk4K5^;ZZm@V!WAd^>^;4$cYcAb8wWcqs zjb3E&eaz(h$fbAhMEQY3xjSo2o>%BT&lCBaBm9}$@D;bgi~SPo_DHTN*M456^{hzt zQ<2PPL9Zr~z0%-OrRK*9^-mfeZ`Ix303&@AKtkZ+!IJX~42%pVL4Lsu zDf8zC@1MVaK94-d{`s4yftU~&HEUK7h_!PGIvKEdaTr8&K2#P)&zZYp@!q+6=c+`j z8z&^_8pX$Jg7ANe0nMVW{6)h|py8Ya9+AZi4BSE>%y{W;-5;RfWltB!5Q(YD2@Xs> zK4)}J)UaKc{W)FT{7BK^i=c{*VNFi1jePWq*ABevI^b$i>-7+gIn_CWnsnL+x)Wk>P0xL zUmJUW!Q#soR;<1^W#=yQDJ`36c6aK* z++#lF{gIn(_dYxG_1jGI`_m8RA9VWP;M&d9ET+%N7r9GkilUBx1B;C+|KFbj1*oU1pUXO@geCyh-^(`u delta 671 zcmV;Q0$}~Q3YrFxBYy$)P)t-s0000)^O-yIk2&*=O7xsd?VUpElR4;-FXM#}(ee<{ z@(|JTEaZtO-hV&Y^F!M6B;JA}*?KL|>m|(R9oKdr(sU)q;vm7?7tM1Px@kAc;vuul zA+*ds&gLGz*c`Ud7Rhi4uV5y%%qOzS8MV(Ft;P$wXA7}nA%CR1A*8t#ti=+cxe2pl z3aeiqnyw(1s}`rf37fPDuV4$PVQzlSHA}lON4k26(;bkbAdR35pSTT}uL-SW3#MQ- zNvuIrupEb&7=x7%oU;*>std7Z5vODrEtwuOn-_bH7$7g zl^1b<8FGOcl7FTdjGrB*Xdj(qF+6ev5mGWea|lOK10f~@A}0t=S_Wu%12{kfHa`b+ zh6Qdx14bwVL?;G$NR02peeb+;?zd#^uU+h~Pwc5l-1I}*^h)cZJnNuX;Pz49_BiXG zD(RR<-1R@(^(yI;Ddv_s+VwNp^eN+%5zc->(&|0X>3=cV^eWf%3)z7S*ML0H={L{m zD%kWW)$$A5f;i9VG|=fL)$$R{>>2q(3i-k?91y?Gyii#QSs(auZVUhb002ovPDHLk FV1icxJA(iK diff --git a/src/qt/res/icons/debugwindow.png b/src/qt/res/icons/debugwindow.png index 2a67085870b9821276625f5560d5019abf32f6ea..44565eea0cd0114ef157abf56836409028d61e4a 100644 GIT binary patch delta 1807 zcmV+q2k`jc4y6u|D}M_T000XT0n*)m`~Uz3*GWV{R9J<@mc5UpM-j${c217&P;DVPgm7bRpRb^nvZ^}=zoAbc>e5 z9d>qhmbSgU&DPe|(l$0Wm`o;2CKFOhHx9}Cc!o}O}Y za>B{U38$y093CFBwzkG|&pjuf(!H-AdFiE>e!aiHe;>%B(MYgjL3hX95fS>n=lJ-T`Fu{Tm0IhP;DThWl~-SVm1t)6@Zm%D{_;D?b0;Q26hdgL zs-P-}3L1vbf#n_zf+}bbtU8b0pL2ftF62W-IM7JSN`Jlw?Ku77PyFiYipZb@H*gk` zl=deLJS3JNAr5P3dzy@elf%q^{`)V^`+ozV5?3R=@DuKadBMy?M2HLbS#2(?6#`HT z5U&sLculSrW13mI{KNm9ax{Gh^B$Engyb6D>8U`JK+qB6xJ#Z)sI@i-Gow_;tf9II z8XPwWsej$j9P(VK)vyX73RdCp>flW zn}KYOXJ>Y0OQkFc;8UsEHaG4e z0%zxyY)){n3T{HJ6*FrDYONHTVO|gumbr+c5)c%Tf)JSI$6S?1gPWBnu*KNyKF1^- zQ0F~}BLbPkTm>oME|gNPJ&<#zujf?jaY=Lfud{)xxD$r*oU zum2V=ZvK!``zLwwg73 z9{~k`jsw=Wm3}%xbhX5`a&G2WWgt>9sRS}+74wWrkI=elDP@I#PFkp}a(MMO9`i>o zcpImXxXV3$z-K0}u>bT1B9J;kv<2TyS{l|yqE^SMQfr`Qr_>Q9xe@Sy(7Nh;K5qm< z2y|hCc{$_l`Om4GpltCJ-{!O9Z+~&`nFA(UVF2*f8E*-}to>%@)B?2{HABfx$xh8m zE(x)KN^9v$541TTk}a{z*EopZ;NDYTVCNvA+78E|8wnw4YsVr>CAcpd8dx0wi!8xQ z@04t4uk`Z~AqXLaYXTtzViGoVi?81O5#3mD2djn#Wjs-05@M&s1R*lCYkwOEC|02s zqvk*@Hh>$scT^ow5H;M|St4?sgsSb!s_h1~KsQ!Wr=*e4jRI*5X#}w|Qm3r%Ku8MS zdP&Vn$x5EV`H|93+tAW9YAmW}?Ti@ZW(a^5SBH=wrZ#ZIG+1Y(k^?j)fMx8!8B)W%6PK(_thFQ3;M}>1Rgnjeh3jxiOy^On>2Q;|zw1eyOUH zy}iBVL_8XeZj9uMHO9Cc%iDj;vI?$Fzh?G{BYEHV+SbXdgNo?Z?6G(B#Rq}$P<&z>#x7AZ@u+aJU%|w*=!a{DOzh)cUN~8cV7i^5pfZ* z5Q4=RZ9E>={r&y=+J9@W)i>UF!xk8;s{p&e7BCrXZLl$rXtQyk=}3ngtlFwqhLW|^ zUL7n0GhjN{6>tfh$@lryuXN(HhVqgc1k^LJ>k1LQahOb@ucB0YQx{&T8Q^?*IS*00>D%PDHLkV1gmTX$JrR delta 1865 zcmV-P2e$a74&M%tD}Mk1000010XQP`KmY&$Bzja>bVG7wVRUbD004NLb4y-7 zD@iRm1PNIL!JXhjP$DAkR9uAM#(%-38$rRPB7cHQ88dD~#E(%VMj}Z} zLhMO@ci(&8syfF-z4!L*o@AYZL)GQhd!AEIojT_ccjto~`hlVYa`Wa*y?y((#~9hz z*kFBqeQs-OYpkxW&TV;lnbBy(Xfz_mc*arAnelkc@$oT7M@NjuV-61w+27x1e}A97 zy*>8!_SoOwXMcNpo28{Cu3ft(AJDl^hupq>`zM>5n^%F zF=8SFcMNE7aKQzp2*r)!5Jf1!?rX1+-hK<31{nlgDQ1R;fc42%tg^D0WK9T+r+-sU{{0GecsK`Mtg2ozas490Ymf0z zjI6|fsgtsEQf&TG<^lNe7)u#71653vVg_#YJR#JqZyLsXdrV({t)8%Hc%Yn{F?i%r zR<1mP0Eb>Mb38!-455^QnbiPFDcEFElcST<`x8Y%097Psh=KI(yX5V6`oER)okZLi zTz|Pjvw4}xxI^4)4#ozJLN4GUO_-}n}G|33WlA8_xl@T*_o zF_Ip?1y4N1;3FTMzjc{^S!s5wg$6e$rLOzg-RnAMyqnT>-6;dAiVl}>K%0hUV}ApA z{FC^Xze2vhP5I*=;H5k8=ReUs^DL`hd!F2N5A*^tI|D|^cqv#ekQ1IWCQ=Jt-y%g$}-|Gh{Eg<8Uiz5ptw_1 zDIt*D$=)I<;VI!UK;KoT(`gMLgg{tcCLbIy{oxN_Zx2>i;fr5l_{_6hdFV2$A@nD6 zROJCJXZ?SMlO0OmFOqvTRZ`PnAs~H~oim`S3}VCv4SeRa#Ls=6habDn<$png_Rbw> zMQEZDq;|@M8^CdjLcvMqWS0tTPUlWCqf=$lwnPy^2&Vyr5ULJXS>;2|f0LosYFNw& zs*F@=L>NeI&9Q$0B0hUR6of2JLhC#O6-UjhwlKq}zC`3S3AG2%{{FJVP?doytq83u zL!cEH;0zGf1sZCgCQd>~E`Lmb9fWc35AV~{6ch$-M3J*s09ENY&R2bm2 zA`F2gs^cI1^k?wO%g_#M$p**?*4FvLcfZFnf~jBzCPERX%#>BEcX#F$1gV)klVCHc z6{)Hv0u3+_CnB^@JW0Cov09XJ1}j*X(6(iS5XFfu851))GbZj#OZ`0tmJbe~ z7i-5Mgwdr-m*$GNZQC=Fd^X1z=d!$hE%Pe4sD91teI1*`jc;ST?^zPlead&rDCzDCYIcq6J-Cf;X z-2F^b6cHB@3n5sH(T2le+1%VL&pr2CdGW;;ZHBQp3vdxw1xCFs^)`h0vkz4HuKfuX zZIP8(&6>4_(p#dY$hfx?;21a%p8xTPH}4JD|6jx8uwgQ8utI4h=ZNP>DFL&9yCSZ* zod>T0xH^jC;)oVh4ABCb2_ZwMa|nqL60z-A-Aw-n3B?Sa7*AC100000NkvXXu0mjf DhDUU> diff --git a/src/qt/res/icons/edit.png b/src/qt/res/icons/edit.png index 4562787d8aca5d22f019976cc72db7089c6565aa..e7fcbacd498ffb62a19c28c44ac3ba974198bc65 100644 GIT binary patch delta 1809 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 diff --git a/src/qt/res/icons/filesave.png b/src/qt/res/icons/filesave.png index 3421e30eaf8508c85eadacb3bce3420d97ef3cad..fdd3ff5937f092b53952eded9f34194f3a9b600a 100644 GIT binary patch delta 1232 zcmV;>1TXu93hN1wD}M_T000XT0n*)m`~Uz1ok>JNR9J=Wmb;EzMG%I+sy?$9#(T32 z$Z`e&0%QpgB1HHVAmtH22$ApxJOF|i`2`?F1SB8}gg{&*1j+h>4fZ0h_u`#7r@N{M z`pkO0Gi$~HB7l-c)90v8*WZ8re|N)wJ!CS72%eI+J{Xc-`F|%0wY03V`rV~??{$&G zvNT7NhNKIN&G6~r>M2Bmg{44HjOan$%he;_`SIrnR0J2N?1On?XLOr`vb%8{Saa-I zHqJf98}GcynR7cl`>HZz1#_SP0byXJr%pkVqpGM*p6^X|mocAzc%98ppXB2&-e>3b z)q}qSK;YO2=zo+r2(mg+6db~xFeMD!96~`Mr8*Qn0w#e_Xl%gum$um7X^)qhVse6j za7Pk|3QbZZIietgq{fq0eU7OlclLGK)nJ;wH?yi zuj$+2lYfFyh5VqH$$%RyBt`WYZKB8klJu+UTc8b?*Kz9GVFr$nnkv#bfq@e=;K%@i z+32MKkw9Dtt(y~G+YthyT3K+=ROd*u^*#;2!Ui&?>hhrcY#}aT2 z&UVn8HM|oPumC2L#Sw7@=)l>#qHJG+bQ-pw088~OnVSJc5!dQxgY)nH$s;cdk|7dE zfq$@=)VwcZIdSWv^7U6Mh$|@|LaR>ZWx%4^(9DSfN!cf=s* z3ZxCtjjEUEkMOxSq9lr&Bc}D}ZH-RH{P6YyzntIT*NZ_(9kvrwzkJX^3DP<&tkm{s zuM?YH|0D(!^Xdj0JGm4_*A}p{&2SrX&VQuw^j2x(LbgO&13d+?51j#}(l0ZJn*xyN zFC5`m1{)hTDug;C0=J-y3Ne~qQ(kO|Xjt3;h7h}s7e!1-^PYy*Z^epI9IP{Po1t|C zq3a5{?U2#*1tSkS+?Hw9fn|u_K;1EaNE?b*qlLqGzmRT@SbyzzmR?xo)H5S=bAOT6 zx@iE>l8d2h5R1JCdkxHKL%{*7TEaWXJDIe(%$eu!vUlM+YquU}|5i)rw5-#e0hTih z8(<2Sojg`7J0<2~AYy-Si_gCOh;Tti!H=IDpkF#EPf~xHIT3)RLbu(3FXIvH{vqU2 z?{95)1D^rnJ^+b)rQ8_}uk8MO_(|^a%@Yj#!06@Pf9e9^IT`Kd37PcbVG7wVRUbD004NLb4y-7 zD@iRj%~LS5o$5CR0<2NMG@5?M=J*}21hUC*Qf2s8NsN5lvr z7!fPG1k8+p%FfL&gfj+5cP|`pD2#dH<#Xp)@Ac;bn15vea2b_Z0bvlZvYHuYr4$wb z8A*^SA_hZNVogR?BnDUqD*RCZKn#YNIsl*mQ34qikSTxwvI-N{>B7x031Nf~NYHV( z5P*OK5d$mIuB`0Vxi5B6N`M*2$P(FX5?~m)OCSM@GvH*07>zK6x(blSYjoI>45J7T z8HwT&1b>7AvWkIh54iNicIUj3L5y?I+E^39DC)1eMWR6^Fw|+HT;ZfI7i0j41k4_w z%?b$fLa%iVr=mEAFjWo}R8_~y!x)&a0g0t?XPGl%0PAcQC@yeHIgH|(OtEI1=wd+; z3db>G2;4im$1xd4xCs|1Ici1Dj#nb*(x4=fvVV|@hH@p=j`!&GHYUt2$N(U?+*VxS zY^f(8gj6h+dxdhTh`=?DDfaZvF}D0T0_sMKGhmdOZ3~jbVK&-aD9&Q?UC3jaf$Zgd zk`c}5$Fjy446;XKAeo2(uHS~{COom~G#Gfd*3{Qgow{VOWa8Sfapewdt-{5pAx4q1 zEq~4c1l)~mWoI9r`-@keGEyqmOsRZ`CUi}W!7_aL%M#yhui?GYvgOwGh6Nc=XTvO! z3`WstyyC`@sH0eEjrHaE?pR791=w7H%|R)f#@~v$Gv@GOgyLh2ETgV7!E4_8zQ^;I zHu&PIh-%m$YUVmVZb(^d3}CI#A|$k_p`_TUJ}2B|CAJPdO+P$(0v!Kld$hlwDEzQ`_yqr|YuGcyOdMY&?L4=X)5 z=$w%;q=iN3MKoRx8cma_>z2B4z-V%!u3Lun>;Yq7iR{is50?AzhbRXWe?%LOYk%f~ zqc*W~x8cpTo4oj3pJ(HctGhk2H8b-pwIniUSE1kUnwG|?7h=G`py@hWBiKJ|`Mv7# zLKyP;)@^PyTiiaZ2{xQ- Tv2*Na00000NkvXXu0mjfclt|R diff --git a/src/qt/res/icons/hd_disabled.png b/src/qt/res/icons/hd_disabled.png index e24be62d8a773b474be44a07d41a8b48bb4f9258..bd369320f33f00130e4a764a878e0f590011300d 100644 GIT binary patch literal 15236 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 KMNUMnLSTX*zw_Dv literal 13992 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 O0000Mch@WgcMrO_T;BT! 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

    IwLh!o+ITOhwNeR7qD+wc)3%W;ZEUJZc0L zJ{3ohOr%9l{*nn_gg-z1mJSQa^Y}#GPVRrTqVtv;^phv)&S}YhD>4l!E@84(a1(8l ze^S16MEF3%IwR!gCy8-FIPQI#1?XGh0uA6+QnXa8sQMn}tD4-oYPg8dOc+&n$2RnrSvG z=tsNomLdk8G)JYCwwK;tAoQqDs)NICQ_vii!UOiLGlr~54LmYfPi+fALc_*BH!q{p zQ|U3f*zk#D?XRFF@lbp;F=)Xz<98A`{KrnruC1rcX8I`rTsI!;Qp#&fg*1q?5D z!)boB8I)rR%;0L1PHXS*br?^o^spDowv)})j@}05b8=zJ%#5Zi8(vRt-m_Mo3VD{g zbhwWGBT_yzX>e=857W)speeo@OHQ;gW6OL$#ORaA z07QT(?-)CcWq;6YXB2_|ryv(4rCoXmkL3DiUDPOn{DU8Th)mfFE^Ve6$ygRj z1OSMb|8W7D^2nB2lNFFe{ys_PSEHfi?cv)kOi0vZH|^!rj!FD2e9oR?O97HO<}a_Y zQDjRI+!%uHiXTIZN*8{>j8wz&CL)zj#h4xP(BGUqP|b zQsx@Ye;G2Zo|e?!$^Vwt@>~4}DOp^CRE$*autqmn6P9_NyTOIUb@FKHBTvo%*`%!| zoBk)o{~&LSIdm5VqC`FoS}tVQG0Iq_nMAN9=v&GAcd?_6BjYtA-$;5 zvW-;T<=Z!9apyWsY2e@c+%rIl7O6lSEfbjQRT1f$s(%95zZDSCFFI4rgvf&T-&nHYBf literal 8402 zcmb7q^;gti(Epp2lCA|ozy%e7C6orqrMp2uQc_~+TwrNbQt1ZimXt0*B$n<*Qo4J2 z_SbMD-^=gzsW*L+e_ktM{V!2#E2SJGaaV%iHA9!m%59+oCgut^-{<|AbxZ%|2DB(TsB z!@-X3cx9d7v~Rt7#%A+DK9nA-#Z4I9%}-Pv<>ItQCQOl!97tZ%zj;L;Zpn+|NcJSO z;iND9hRbEif5GrZ*5lr9VnX}Q+1QfjLUi+V?^@eKSL951$vdN;XIPT^4gy;+!Uf z@Ny2R@8lyRr1&y&;@yO*G({U5YSq<+Gt}b)5kiQwD6BWl+p%zl#wOB*1(>_r^TtM! z^z?9)%9b@mNQk606AW&pxyup1{`b>-@D#LQK@Jt&u(xb$+&B9N(y62 z%J`6ivZ~8viZKhqZ>-Bda%&gn>haviJ7jB5`t-c#?85zd(?7l|t1vBKh#Z7;9w(If$c2ET$QMNNvlKNJ?rd?(XUI~rOkpRC=iPqPM8v$Jc6 zOK_bkBZ-MdP(pwU#>1DB^WzD{Z}?4_K6p(A1D(L`X=P8b*i(JPPdJ-V^xST)C0XV% zu~Zw*T?oVgm-r+v6B{4${=(C?>1fiS=c(A2!->C)wDe50g6eZ3Yi#Xa_dG9}2UBAg zLI$*2bb8e2LN_(<&Bn|oHS_k$eVngWw%AsFdZh5*0lxxGJlYP$;P95~VOSS?$GRel7U z-Xlp`L|AuOqhoyUcU=zo;iTxvGEZA>%W3nD8#-F*R|2jvhrOg=dNCPKvm|o=!`6XEe!p!wVCPnycB!2upd7sT>=_wp z1>-^s*6*zA@e7)iYsnie9}y;^nOA#o8maTs;oV)boRRF{%*?9`x;{=&2MiB!caj|SBCTsNQSabiwC%5v76r%MeZz5!XB z#kN{N#9nLrBN=X}()ra2+Jy;I*~lTMNwkx2bzSQtqhftom~W@s7-1(m;8r(+0QBPP zxrz<)**#ri`|A_`$Z7xlo$Np_pyIe}0j8y46n3Y`^j63u#w})U2=BYBN-sIou3gMI z-grw^b;qIkv(|%Z{6kCI-)2IH)UiSBd!%A72Zle&C&CGv;yf0mZCK z*nw5kS?y${Vayb(usq>Cvv|o>%GQzqX~L?<4D3_Fx)^`W-Ua4xQEK?neKS6D6bX8n z{#ViiLpz>>eTo4Z(HJ>8Qapwz9o4`v5iMuPV{K_80vM0`>LyqsTv23O5?M1(G*>nn za4}CLs<(-XncMI<-FmSySZ#FE-IV>od2{>Gv~E;^Sp%Rgh5Ec55Tq032*zKof)zZ) zw4m&t!_Gl1M|C~P5vh^P)jzsYS#b2uuaonbcr(ut~m3 zHM8UT2{=ox=kT=iL#Y}=_G1b7tQ`RQ3#Mch0Sl3(#M zIy2bc?a^9dHyfEU%#|&+`}ylT!Anz2Vql2@#qZCW`>Lf12+e*MSqOEF!;Zhe-SXP5&z);ry;nKO))`U;bM-nIjo z!O0grCYR5by{f8;os+6~Ez)8=CO$zH@PJ|8qwYVAKBPlzd^EiQ0q!;mBR|}rKJEuH zd^By;om6kdgWbnxOOf$m%-Bdk!1MTp$L@58to~a!sb-t!GrO@4c-zx;kzs9@-R<9w z=|~Z%LIe2QomCr+9?=u(#p97^%i8buT%^~b~^#@(3YWo4`-a0mH+g($Ey=aG6k4~s)RWpMJC~e&1TV%7qaeM=w#{!J1 zBn!JE8GaW7uP5JsKJ_4}S>wGr>{1dvCDCfik3!CH%wdJU2q*Lk1bRU>LcE#Hw-h6tis@d|gv z*ENusML*kFsoy_s-i=Lw-|T(#PezQ|Te4)D_O30q+;+ilv8@(d$t%SC()?nEy0qKy zmX210XB}pq@8oRXviLPUi)AdAQWu5WG@^z9lTQW(@z5$#+yRTUQ5Hfs-Qghqr!_rv$1?< zfI}elW##&-7;C8U!KWlk0WUt#jCyr_A_hbg9)Of43;*O!Ck?T#hiA*OK4NDl(|xI= zH{+S`^$*UowM2MpvTB-8cl_{~z%F(zr16+BJm+9VQUS-r=`$~x&**2ypm%(`3O@*8`9ie7Sj#GfY6;kE2fEV|!8 zXzFCphm3K;U`ozXcd&D475y3xGqW4}*&%AOMmO&&COjcaajXn5gx$Lv`i<|34 zqesSfR?`wXD;v$92Xmm6I05CZlL?J+dzHBQL$%2!shrg^^?i0RguxDqx%lnwy#w6R z8+4a*7p+uC-{D)n0bwF;;`VXP*Wc*HLK_~DM9{#uQ5U{wPsf<=&u$_0!lxwZaL*va zI`12@ELlxW#BPFtry#B;#iaaC-jBa!EW$X#I^mef!~*-QM;`im#dPL*oE%w;QZd6c zA9a-iI@#>GsCoCJlwF|wwU{=3u&J)5oVAxR%t`JO3hg+ggM$lbwe6v;&K>6*;Onu8 z{}D#^?-pDI*5O-&9SCK1^g_%aTNZkY|1g5(RjJ(9Q@3N-m`{Dq(ZUFPlLMc{pnA*5 z1u}8`(~sUMsj{+~8%ru8P_-G*Pu?;L6tS|+3D9ScQQU}W6ZiLg5dZRgrIQX4*ntkuMZaP3s!GAd4wBGH-MMGKMT+MnJQJOI1LYFWD zi!O5@!*r$WX=2#qfYjKSlLOZ4mlB4tOZ+~~Wf!u@&ydTiI1irq)hm3?+>^5kkCPar z>Bfu|#wFdmg4*tn$8Xm7;lTJ^doFQjy=;*i(aP^lNnqsi5;0RDTQ=1Cu|;go4~toE zamR3bk~GX6aqs5h5+)S9yt&_8Js6}yvuu^=g^e`GPCQQ;RB&ov^@UESwTyaUk#@XA zO6)~BWL3NK%Cmb6p-{@Z3s3!Phfl}4C&i83)=-?FpIAVGI#Q5;XHyWe#4vhAnkV!Y zj&nXgvou6l*ATArIB;uCJ|jK#Z*l$%qbEdzo{A?J|m)(%}o9?pN#7*a@C*lEm}+BD*f6D#;TK5fGIuhXEt1Gu}P4j;*|}g=xc2v zd~esau7KB`K$wTS%OVo{S4oD^uYHhnC+j0|(?eaE4;S-Ywg)YV8MYPnr-mMew~@xa z-U0-lR5IAuf6G*hUB^Pkjo6c0a)p^3^*|SoQjXp5KCG8O-jWRmn52To!K44K{*<;! zCHjV(BU~&)#b}?1w|lXcAfDD9e*sL!Dm8aly;3c>O7ioQ=BvXVI)PHLkz-{7PG))1 z^?Fl4R-!HI5*HQnrcw`R+1FZ8=g!#Gz#Esy>vRb@Tw6AwJ)mgzrxx*}<+B3>>IXG8 zB3`zQzOJ0d`$?f8(|vN@JrsWwmtT$6r{0_&3t0z`rx0Nk`MpcD#g7bA3m0G~p^buhhS$6oaK3|LAxKf@Ho*x0R4c z?bJ1xqeJC~+8Q)^A-lEO&3;Dmu?ulY8D-ndTAUA76VlF-ucxyK`_Uqm)pox37q~E5 zH>iOxG_YYk-6bU6&QmDIM8 zwHH8Yi337@>lC9s|L}^np--`J^@$magc{GOMwE|T+n(lPdFMBAr};hS(i%q~jtzTz zwl#g9zva(ego;A8rPbWYA>U`l{I(mzl$&#lerOf*tRl;twrnGpV9$d0T3G~QYKErB zs`p*wc%Mq?ucGs<95QVTWNJ1Zrx|)LOf+}ju=b<6&%D^8tLEtxH}|~TlCQJbP=*FQ ztybnMI%^qU(eO&c@;&BNiFc!WR;;~xFPR1;>XN*5T` zW!HQ=&p_zj;T$!OZ2I_ATzB!77uVHbwsY{|6=JWv{V!M`n$_b2^4GT&~sb318 zfV{ZMI_XUY!JD0_M~9%~^xg7UnJ;~8$T?l=h?z;Ob3=cTiX&l(+w*;5tYlvdi*HN5K85hLU6jEOSm~J%b+F(Zt@}=AG_oXT?HAK9pkn=ueCKAy&>n% zf(k1aSk6%5=3nGeisw(7YtoDi4aW0XpXDXO-d{!+<|DFX=(%3gWZZSGlIWRlhy(P-R=Dw^=jQ#fD zPyeLgpPJYBYQDTtqQCc2$ZE5Bsh<3?<19vfZ`$=9db)Eu*2HrUS1F&sLdGrMXJ~jZ zV!q8pRE^)>Y-aSg?d)&J?V4te{QL2zNQa=(Iu0am5ntiokb?&d7=hbDf=go(9Erqn zO`lpTJ~KDrY+i5etsnV^jd|O#2RjuNWk69Q}) z$yv2#JzA}{KctS|>4?Lq3R`K*a{Znr>Nf}y)b{;|r37HYc;OMezA_Eclv!?+l{<=+ z8{LrQk&8Al;zj~n`GYpJH^;H>evo`DAuxDd>ZP~?n&mBdU2!V}42Nl4t!os43+n{N z%k4Z`JJc81b2p4_pgz4(clLd9@hY9$HyJ_oAiK5;qZH1THCKsiSmKwZI|l%bo8b_6 zJWtvFkE|~tI9Vz2n1bz`{no4YV|1g5`bQ?QCBC^NVf<3Ys%VggGmDt6 zHO0*xaT|&MR=`OH;;W|d)#nxz#qOVmzk&FkW(z`=f1wxQh;$B;8UTQ^ zdDjMt0i&2YsNMWmtrO$=tG}ut=sHCft>Zh|0&ry$1J#TnvWwXNOfz#;)nm`hCB(!V z|1$X#H;W*B=d6%$qnnwbs>Kt}N3_w)K2>G6RYsXkvf5^V#Vv}v zFxkMuNYT%xOFR|pb(jL|tyOy2j4feDO{uuIvY0I)|L8ucc))h%9r}X$=SIrq0|1mb zwtwVVqFaAFzRNbUX5RdYk-)``Ic!v$LW1Ir=bZiR!u1(}qyWZ2NBJQmerh$)uwmf0 z8CMbaxy{#rqKK&t#C5ajmN&sx*TFQj52Be@%lZ)@B z!7NH`vAb0?eaCLEpSH(ULB&4n_Z>8B(3~%LmwZ>0^ev4pq?fdcy^yPV5h^An~a*-iF)LYKx*j%6>bMn)*ZE{xG+j^zq^i zU;V)hU_9ETW|(b%B3*dui?sZ7TE)}Xgk%ILSQg@q0VM2O1;yfQt=(;ZoB2{tBw!bm z8SMDI?y26A&3ki0m-Jam%$)Ux0lB)1mw~9=8}9eW2%icx@pC0zwQdk|QP4|55O1hK zwd*W?Hbr0i~~fZ+M^j^CQg{IbnF<=*tlM4T)8ERiHooJ+ z0T~>A`_(JAZ|Em7VtH_?f)d~47hrJ$*!WUYL2P`#z2Xr2loPM9w_vY44Ek9Lt*jub1AaF6U6M4twA^4HuvGq^BZ!g z1-S2F_(j?B1oOSiA>&K_A~bCt*!tw$u0a9@a|y0wImSUN>X*=E#rAj7JvBK7o3zGc^#1fl228`Gxc+o1 zX~7kRp7Za|r9abU2B>Zq3gE72b7|T zA1h1nZOnNN(Uc=9-#YQw&{<_in+Z^Ys$pXwZ112nW4hZ%98_}(I}%xokhw=T0hZs3L0POWOq|!*Q`x`SESr~Ci}2D} zfUPz|$@St*g+82{Cgf?T>uniyL90?(;@Yi+jf!MovEs&}Iw}rF+Q&g$f8U_+xFo-1 z(iAk87gMF8sXbHovu}39j>)Xsr*`i0>(AJ$LrHX}=LT$6a=RP6EhDZTvLM#^?XJ}$0XzcDUu zABEuy&4S|&QLr6XN+3j8m-Of0=}#I<@=&7$l<`PFEMI@2B>tN#me+>n)vj*uVaYjA z=(8&LBYR8!m#M2Im$Ox&$rnjOc>N7ZNBG-!EbO5(_3B_~OvV?aNxz4P)#RK4zp-dS zH6Y!~OI?AFWW-ixGCWImYl>@qBGTqy1a`&{SJmC)(T;bBcXD)0T8@8&n(8pY3Fbf; zvOEB}u5}`C7c9$0g=O7DO3fpti65974WFwNQmx~1UX45B=$sCwZ; zf^NLnTnm17j`P1sb@TP&{LQiCSyBIcb)vMkH!cespi@^p)%s-Xr`k5=GcM&j78rJh z#iJQQM_*O6*FK=jKQg4*OayPB89K9dDK_B)T5C9AGDkytWnyd2I45~k8Af@x#fT(i z8gaZH0*Y3X?dPnmvgl>+)Jx%{)HQrh}oUzRxMYC_uU$) zXOzk6Mha5)6Hfm#j&Lr1Z#;akyd|(QOwuvZ^^i;2)-T6$n3#a48mV+4goMsuhzp+; z6u4Lar8uQEXXgZ?OJi6=FZ}8!j;#?7;Yzk7rfig>^=}J2Ka^h4GkOsM_3)2;@hR!x z2TH1Uf6^^6Is{)h=)?prCf4_-7 z#9DzbM%1@*dcaNPPj;}}Fzb^@ugugYgf{V`^i6P8mB{JEdZ2T4lf|4DLO&bsUxJlY zaQzYFi}}^DEoJTrR~^M*&QS3LM&@eu*sqCPB&7(r0GG0Wu#&4;lH*#i+1#W)!5Tn9 zFBG1Vq4jZunvo<|IlO ztsMs?euVLeO1nCzStHUOzWLyEn$2D}UC!`NqxORx0g0bvWaDV*rHBZ^v-}}CQgGwu z(+0&~OYqt^Wk|hn%MCMWRn^*fQQo}q0iLi5-!CN}u_|p2_&+EPF9dCElUCIekIX%t zTAKTypWmI&ZHb}L|3q0Ohv`-Lf5IeCbH^2bS1*qLT?5}_G#{sp8rs_QbY$Y?|08@c zT8Xb!(q2npVeq6DHt0RDy&BcrwCFP^)vv?+uxHUb`}>qtB~M2dLLNw09--`!aIYib z;LX|#w%lB;QjNUcExwrw&QYvG`hxZQ;u44skBjp7{CmUz>es%bB{nbj;P6x9wp>Ul zAu`kbKek)i;0ha%1F|yZ#i3X*xx*K|nBp0UxqpR)so|ldT#MN;e)U?a7wIpob5a5{1_g=QCN7uo6qW8*Z7R{)53>Vu|IGpbm9Vp|8W}C< o>6k1Oc(+jlLRzT&pPc(=y5&|?O3VWv_(}#RZ%O_QoATM zYLB3H#YjWQ|Gq!K^Wr(zb8`)n`Y9h4L-{Bj%(5A8g4@00F3 z#OyVB?22YGu6WYoSMhKXWo@uclt?VO>9Fl-==DDD5HnW{gb`%yeM$x`}y_{Q&hbQ=}X z$$-`8p_JR40_34VX7l-bEf@*4l`p~*<@Hop^8Bd9q)$yV$UMGu z*cYxY6v$x`7Pfr~_ot2#`%ccR4Z;_mXYf|uNFT_-8;3O+eI0`f>iRzer1wVxgqT3F z>amaez)u1CyeNH$z%MRwCVixMkfn*^_(aNhs0nQ)#+KVwJX?@uW+bFCH(VFpN7#A$ zY195@HlJ;@=3zO&l=ds1{Sq^lCz%^;2;jmAKm9K3^O+0x-fuGX9_yrgPt41Clt$i# zlERrXXj305Wd(Vq$4w(t2wVd^70B^ar_p>!NoP6Yf{0)|nB=y9;n5A~BU4)#___30(tIJ_9o@eT-u(lLHa21!8l0D=J z?HgCQ&ry*aiFgMv7ZotAOZpCU40!7+MY{b!NMl?yHoXDjV;p5Q;0b=`$x<_E%VE&3 zl|+Ul1=FwH)BdPcA@pihXfg}@`z7Udzt9bZfqYYt!$iX53m5yz7HGJVVzzZJBvZQ} zx7qP_jO7d8Arp~@TRsouNV7q5uN5rHS*W>)%n^7kW7Yno_Vm(xaVr`xop$+?$dbq^ zcCiwf7aOg4Usc>g2Bzau)9MWE=-zG=FFOOvhjpopxbzNYQ?p0fe<}6K2KP@L5zZ=w zJ)eD1A;8nh5vyxPExyulR9|ixMst3z0MGU?RY9^tGjXOcI`_P z%&-vViaWR2sUj}(VV#y{1xi`X3spW&u!?3OBZ%i5hDhts^@%E5eW-7XlJtZYvKiY{ z(NA+PPB>lAHtV|?9{>)F1O@ahM_s!G%l z5mhs2r`Ur)waAx|#CLAj{sP=f=7FDQPWeue&5KcgRY+U#S0ap0Xb`2Ko>(vne|3n* z7$_#%)v^)Ag~$DYQQPCt{qK) z7e}730{W@Y!85IX^wSF+YC80CDNSfy7joGx2PZ!75-9cb8y5FWZ5`ygyS!v=zvoAW z>4I@~{WzO8y4SgjTaeG^;>?etp4#W=?uPvSxb;>`_U{QWyx1Xz3($B9lq+`pR=;#a zdli{2II@t)`a!~#`~FzZbKNM;#iLj!se$8$^GkMl?J%QHcL-yKH#Pq_pf*@2?xX_9 znX#AprrYDBxSB?gfT)m$bz%5hrH(acwH5ixEvgg{!_-ln^}LDg7&So19qSSbxw3La zshrqWK%5PebAuye<~a3|UBX~Dv;?vt#4PQmiJ;xx>Y&}N2{ik1&yX2_f90H0m!7@8 zFX9F>*U*9#%YLHBZrUBazbuOJ57CoMiC0Xv!O7yOxZGUXIRrny#_{;}=F_uwPBsGC zFxJi$S}Ow(D8@;!0*jhW>*^VC8ql&m$eTns&{!zgVLa!hp_*@98-J^zlLHa8mbIAitaCmwuAPKX9KJkK!3;ECxQ=?60^&)eCP zQYf-8g}Ks2v)tF$0E@$Vv@#qV0!C9Hh;x#9Cfhx3n;&pc(l7BQa<;A^uLrX3Y)VL6 zE>Ao&qt%J|n$-rvh=Wx1RpQHaQj)wI_$~xnbtTV&ZEI>9C`Z`o?)EA7Z%;t6A3hmK zl=cFSJUu=Z2WL!uQwCR4K9e~I4p=y+eUF*`nPhkKYRkHX^{Y=u!N9^-{V9o8sc(a)CL$!__ld? z(ilx85H0E5vut8@p475mD>H$fc1~)nesOr5Xmw-H%R-d_wYa`8=hIw_Ihg$N0Y>rs zz!=Z1y1~3S3Q|Y0R0yvE_z0Ja)r)B~m)p+2*Iyo?J&8b&2ZOz{maAjw(#25NS|hVg z$`QN<=PU(|v?-E%)8%%~d8m8y^?*0p~97W8=K62#XS7I5ZU+doLK)1>^21}d?d!Harvu}(1W$6r7MQOoVPc76RLtM8nUA!%shlGuu@BT9_kKh zxjbsYybsyW$}-w@&KwE_Jpg%G4Wjcu#9h8DUHn+%Vla}RLPjCZtvaarFaPSSZ<`QC zOF9zt&NHA-S0_b#o?1dR((@XSXq&oeo>%pHP(zP==-lMA+$yskDQb9R&v=8fVvP{Z z*fdbd1}XIRpR`b&Og94a=yv}3J4&H)MeLGH0#X7aPdqyggu~pQE%wr>9U z%h{#zI!jx;#U<-Xj=jjpZ(9UZo-8|3@^HWwkUy{){Buc(@&zIW-;f)w-Qe<8!gsPj zM2beeSv`uj$eO?O!H1;5vwQRc!zx;Y8Sb4mgbBofWyZoM4Exm>FsHN&X}C>rtD@M88$`gn?AkvOu4N-^_$N zA)_z?@3d#hN}XrRYXez0Jl+SCXY)UA8vw;@ZDAb6o=0k7Emcn1IArei4ux4*q&Tp3 z7S&gMwLbmzFk;`D~~UOM#T^&J+TZ{$*qhtU&6;Mn(Q zP3BKt?8~ zpZCYmm7xpIl!_#npGO*%!t1t))2qjbB3XS9>9KYovF^z&9x$eIQ>886H8B#V5$3uf zlAlCeb8Fo6`_x2-AbAd2DQ}y-7!}r2t+MO1sc{j1EqM)RoT^$7WYOh+$BM{;S)aqh zX20Q)j#s+q%azeFCdwh*!q21~Qj9FHVr6$Ng)(aUPkn|?f!i7X;FO#E6-e7IJU#?C zq3PyF-3we7bJjyN=g+>#r5m~RmD7qOP4`aMJ*5b==_|XRQ}uf~E5?<@eo⋘WL-c z!4h7|arWE%vV`GRp=`OX6&)p*edp(qo$`hSs*W-5H3unaiM*VcNsj-vpkqKS8ybZ` z0)k&k+x8x@*2{`5NgR0oy!O7HA=hY@og?5v_aE|)fXlam!$bL7wbD9&UMiL7W)=%E zW4m;?<3+`>P5b|56keEbvBi1fZ0n$JR8vU zauWt-HVQx55Az5k7QSH&i88YX`<@@Qu1Dk4u!Ju45Hjnjb7y>v3M`wdW}#U+4bl zOySgmUvI-HNg(Y8`zRSZ}V+F_lI?PR%qY&yJvK! z4^ikKS6*`$$rN4+pb?nYq(}o|*01^X@;WI;OVbh>2`Oz6rrGG)-PX&$nh$Ok5Q|ed zvaZ#>kK+q-WIw3_Al^8Yd=8aVH9yKMz&L8w=hkV*=P8OUS*m?&G?MDgKH#dEg7vzi zg_Z>4ZAc42--&Qp{dlcdNuR-?ve|;9g!NozaS}j*w`Z~=(n87!dx(E6FnT6qp-WF7 zpmFT+v`;=#f5;XsV~~#y4d|8d&x3>AT3W=Gu0IGJnA+N2yW`iAMRreY_#R%>`Si*r zew`E+floVc-^okd%n-osbCnc_UGCQX9hFDYjLPU}V}2ArOZwIsB1zJ)iPbff*`H&K zSxKDM)2do%7W|57Eim`Jyx)+*fvZ6EZvJGr)gLh`&-Z0TIPj~Ve90YcQ+7zitDT)Y z$B3=bx}3J+4-}jb6K@A=IROELM&YlLm#vo41NBa%uCmGKq%B7nCIz&_cen84EL!*! z#%6ybE>^)`Frmh_Ec$gZsOV}Yiu+c8GiP+6aQRZ!)F#^qSdBi^*tHo?u_%gcC)=r#RFmSlgzs=g|JkSd zy||sidDW6oq(HLZB?i10XlV#myg2f6taY+_ndGu2oN%_-a5Gbl z-j_ltuA^uCg(=5=(&48mHZ=;RcaN0E#*HkD(Zm$j%bOha;?c$a2e#}3cmv)?jx8cKx>(b^dq$?Ll zQxYCFSBH8)?-qKqyX6JNWoUp~RFzaXZNL8p!%M0PybIA~$N$>$90(ge(7^XGMeLm# zbvzFtOAK?~owT9l*VX68F#(c&5@7OCy?1hf5g!%}dK+zStAzgn&dBiIveBOqXiKQP zQxpJPZ2Kb!0$-ee)59WJ5KJX~HJeesE6iAxDFpw{@j8jlG56u+!)T=goj}d8oxIb< zkQbFC_{U&mZuAOMk|b~DKC&=5sP%`D{{Krj9!3hY=1MpJhd5Q>zpoU)#LyCgx$PGB EKO03*9RL6T literal 4587 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 diff --git a/src/qt/res/icons/info.png b/src/qt/res/icons/info.png index 5c5d0cddce2b721bef50e7ed313765ff88784e8b..1b2707a3d9194d4566850b156556e6b48f94ba91 100644 GIT binary patch delta 2044 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 P00000NkvXXu0mjfW={PU diff --git a/src/qt/res/icons/key.png b/src/qt/res/icons/key.png index 734f5e43380ad7c7ac8d77e7ba27230639dd4715..8cdb5969681cf46d062f82723023335633e38fde 100644 GIT binary patch delta 1760 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 Rv&8@a002ovPDHLkV1jd>Q9=L! delta 1665 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 REM@=z002ovPDHLkV1jr;QZE1i delta 1676 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 diff --git a/src/qt/res/icons/receive.png b/src/qt/res/icons/receive.png index 295571cb98db3d8a7a5df6921c909f88b75b4298..75d6e543175840831b6ce40186ebc19b8559d2ea 100644 GIT binary patch literal 8358 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 literal 7997 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 diff --git a/src/qt/res/icons/send.png b/src/qt/res/icons/send.png index bbbb3bf87de9759fab20f831e624c4521fef4958..aaf18db74758cb944f86b302bb7b1c014faaaf71 100644 GIT binary patch literal 8607 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 R?LWl@KwbF>xRc*3x~>{(Y8t$pSO6J+tg*eH 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 Q{^bo&QP7mHl|_X8A4qxdz5oCK diff --git a/src/qt/res/icons/transaction0.png b/src/qt/res/icons/transaction0.png index 4b06d86b83e1c48e964200c1e2c873cfce2513f7..a51d8d857b8906da193f7cfae49bd6a610fc4300 100644 GIT binary patch delta 2766 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 RkU; Date: Tue, 5 Apr 2022 15:56:59 +0200 Subject: [PATCH 017/144] Add missing include file (OSX compilation) --- src/mapport.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mapport.cpp b/src/mapport.cpp index 3b3074d43d..0885d4371a 100644 --- a/src/mapport.cpp +++ b/src/mapport.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #ifdef USE_NATPMP #include From 76a046dd96fa3564a667b8dea5533cadb33dbbc2 Mon Sep 17 00:00:00 2001 From: nadyka Date: Fri, 8 Jul 2022 11:55:05 +0400 Subject: [PATCH 018/144] actualize functional tests --- src/rpc/client.cpp | 2 + test/functional/feature_addrman.py | 4 +- test/functional/feature_asmap.py | 7 +- test/functional/feature_bind_extra.py | 4 +- .../feature_blockfilterindex_prune.py | 67 ------------------- test/functional/feature_cltv.py | 13 +--- test/functional/feature_csv_activation.py | 2 +- test/functional/feature_fee_estimation.py | 6 ++ test/functional/feature_nulldummy.py | 4 +- .../feature_presegwit_node_upgrade.py | 4 +- test/functional/feature_segwit.py | 5 +- test/functional/feature_syscall_sandbox.py | 4 +- test/functional/interface_BGL_cli.py | 8 +-- test/functional/mempool_accept.py | 2 +- test/functional/mempool_accept_wtxid.py | 4 +- test/functional/mempool_package_limits.py | 4 +- test/functional/mempool_updatefromblock.py | 3 +- .../p2p_compactblocks_blocksonly.py | 4 +- test/functional/p2p_dns_seeds.py | 4 +- test/functional/p2p_eviction.py | 7 +- test/functional/p2p_invalid_block.py | 41 ++++-------- test/functional/rpc_blockchain.py | 13 +++- test/functional/rpc_createmultisig.py | 2 +- test/functional/rpc_fundrawtransaction.py | 3 +- test/functional/rpc_generateblock.py | 4 +- .../functional/rpc_invalid_address_message.py | 18 ++--- test/functional/rpc_net.py | 4 +- test/functional/rpc_packages.py | 4 +- test/functional/rpc_rawtransaction.py | 4 +- test/functional/rpc_scantxoutset.py | 33 +++++---- test/functional/rpc_signmessagewithprivkey.py | 7 +- test/functional/test_framework/blocktools.py | 3 +- test/functional/test_framework/messages.py | 3 +- .../test_framework/test_framework.py | 1 - test/functional/test_framework/wallet.py | 20 ++++++ test/functional/wallet_basic.py | 19 +++--- .../wallet_bumpfee_totalfee_deprecation.py | 4 +- test/functional/wallet_disable.py | 4 +- test/functional/wallet_importdescriptors.py | 2 +- test/functional/wallet_importmulti.py | 18 ++--- test/functional/wallet_labels.py | 4 +- .../wallet_multisig_descriptor_psbt.py | 4 +- test/functional/wallet_multiwallet.py | 2 +- test/functional/wallet_orphanedreward.py | 8 +-- .../wallet_signmessagewithaddress.py | 4 +- test/functional/wallet_taproot.py | 4 +- .../wallet_transactiontime_rescan.py | 4 +- test/functional/wallet_txn_clone.py | 16 ++--- test/functional/wallet_txn_doublespend.py | 18 ++--- 49 files changed, 187 insertions(+), 242 deletions(-) delete mode 100755 test/functional/feature_blockfilterindex_prune.py diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp index 438d21e0ac..93e49cb9a8 100644 --- a/src/rpc/client.cpp +++ b/src/rpc/client.cpp @@ -127,6 +127,8 @@ static const CRPCConvertParam vRPCConvertParams[] = { "gettxout", 1, "n" }, { "gettxout", 2, "include_mempool" }, { "gettxoutproof", 0, "txids" }, + { "gettxoutsetinfo", 1, "hash_or_height" }, + { "gettxoutsetinfo", 2, "use_index"}, { "lockunspent", 0, "unlock" }, { "lockunspent", 1, "transactions" }, { "lockunspent", 2, "persistent" }, diff --git a/test/functional/feature_addrman.py b/test/functional/feature_addrman.py index 14a4f8abb7..ec1b307d5c 100755 --- a/test/functional/feature_addrman.py +++ b/test/functional/feature_addrman.py @@ -10,7 +10,7 @@ from test_framework.messages import ser_uint256, hash256 from test_framework.p2p import MAGIC_BYTES -from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_framework import BGLTestFramework from test_framework.test_node import ErrorMatch from test_framework.util import assert_equal @@ -48,7 +48,7 @@ def write_addrman(peers_dat, **kwargs): f.write(serialize_addrman(**kwargs)) -class AddrmanTest(BitcoinTestFramework): +class AddrmanTest(BGLTestFramework): def set_test_params(self): self.num_nodes = 1 diff --git a/test/functional/feature_asmap.py b/test/functional/feature_asmap.py index a7f5b76b88..ed6d34ccb0 100755 --- a/test/functional/feature_asmap.py +++ b/test/functional/feature_asmap.py @@ -67,7 +67,6 @@ def test_asmap_with_relative_path(self): name = 'ASN_map' filename = os.path.join(self.datadir, name) shutil.copyfile(self.asmap_raw, filename) - with self.node.assert_debug_log(expected_messages(filename)): self.start_node(0, [f'-asmap={name}']) os.remove(filename) @@ -82,7 +81,7 @@ def test_default_asmap(self): os.remove(self.default_asmap) def test_asmap_interaction_with_addrman_containing_entries(self): - self.log.info("Test bitcoind -asmap restart with addrman containing new and tried entries") + self.log.info("Test BGLd -asmap restart with addrman containing new and tried entries") self.stop_node(0) shutil.copyfile(self.asmap_raw, self.default_asmap) self.start_node(0, ["-asmap", "-checkaddrman=1"]) @@ -90,8 +89,8 @@ def test_asmap_interaction_with_addrman_containing_entries(self): self.restart_node(0, ["-asmap", "-checkaddrman=1"]) with self.node.assert_debug_log( expected_msgs=[ - "Addrman checks started: new 1, tried 1, total 2", - "Addrman checks completed successfully", + "CheckAddrman: new 1, tried 1, total 2 started", + "CheckAddrman: completed", ] ): self.node.getnodeaddresses() # getnodeaddresses re-runs the addrman checks diff --git a/test/functional/feature_bind_extra.py b/test/functional/feature_bind_extra.py index 6802da8d48..4892d85d3b 100755 --- a/test/functional/feature_bind_extra.py +++ b/test/functional/feature_bind_extra.py @@ -14,7 +14,7 @@ get_bind_addrs, ) from test_framework.test_framework import ( - BitcoinTestFramework, + BGLTestFramework, SkipTest, ) from test_framework.util import ( @@ -24,7 +24,7 @@ rpc_port, ) -class BindExtraTest(BitcoinTestFramework): +class BindExtraTest(BGLTestFramework): def set_test_params(self): self.setup_clean_chain = True # Avoid any -bind= on the command line. Force the framework to avoid diff --git a/test/functional/feature_blockfilterindex_prune.py b/test/functional/feature_blockfilterindex_prune.py deleted file mode 100755 index 6d45815f50..0000000000 --- a/test/functional/feature_blockfilterindex_prune.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2020 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -"""Test blockfilterindex in conjunction with prune.""" -from test_framework.test_framework import BGLTestFramework -from test_framework.util import ( - assert_equal, - assert_greater_than, - assert_raises_rpc_error, -) - - -class FeatureBlockfilterindexPruneTest(BGLTestFramework): - def set_test_params(self): - self.num_nodes = 1 - self.extra_args = [["-fastprune", "-prune=1", "-blockfilterindex=1"]] - - def sync_index(self, height): - expected = {'basic block filter index': {'synced': True, 'best_block_height': height}} - self.wait_until(lambda: self.nodes[0].getindexinfo() == expected) - - def run_test(self): - self.log.info("check if we can access a blockfilter when pruning is enabled but no blocks are actually pruned") - self.sync_index(height=200) - assert_greater_than(len(self.nodes[0].getblockfilter(self.nodes[0].getbestblockhash())['filter']), 0) - # Mine two batches of blocks to avoid hitting NODE_NETWORK_LIMITED_MIN_BLOCKS disconnection - self.generate(self.nodes[0], 250) - self.sync_all() - self.generate(self.nodes[0], 250) - self.sync_all() - self.sync_index(height=1000) - - self.log.info("prune some blocks") - pruneheight = self.nodes[0].pruneblockchain(1000) - assert_equal(pruneheight, 506) - - self.log.info("check if we can access the tips blockfilter when we have pruned some blocks") - assert_greater_than(len(self.nodes[0].getblockfilter(self.nodes[0].getbestblockhash())['filter']), 0) - - self.log.info("check if we can access the blockfilter of a pruned block") - assert_greater_than(len(self.nodes[0].getblockfilter(self.nodes[0].getblockhash(2))['filter']), 0) - - self.log.info("start node without blockfilterindex") - self.restart_node(0, extra_args=["-fastprune", "-prune=1"]) - - self.log.info("make sure accessing the blockfilters throws an error") - assert_raises_rpc_error(-1, "Index is not enabled for filtertype basic", self.nodes[0].getblockfilter, self.nodes[0].getblockhash(2)) - self.generate(self.nodes[0], 1000) - - self.log.info("prune below the blockfilterindexes best block while blockfilters are disabled") - pruneheight_new = self.nodes[0].pruneblockchain(1400) - assert_greater_than(pruneheight_new, pruneheight) - self.stop_node(0) - - self.log.info("make sure we get an init error when starting the node again with block filters") - self.nodes[0].assert_start_raises_init_error( - extra_args=["-fastprune", "-prune=1", "-blockfilterindex=1"], - expected_msg="Error: basic block filter index best block of the index goes beyond pruned data. Please disable the index or reindex (which will download the whole blockchain again)", - ) - - self.log.info("make sure the node starts again with the -reindex arg") - self.start_node(0, extra_args=["-fastprune", "-prune=1", "-blockfilterindex", "-reindex"]) - - -if __name__ == '__main__': - FeatureBlockfilterindexPruneTest().main() diff --git a/test/functional/feature_cltv.py b/test/functional/feature_cltv.py index a35727824f..a5b1b9fd0e 100755 --- a/test/functional/feature_cltv.py +++ b/test/functional/feature_cltv.py @@ -3,7 +3,6 @@ # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test BIP65 (CHECKLOCKTIMEVERIFY). - Test that the CHECKLOCKTIMEVERIFY soft-fork activates. """ @@ -67,10 +66,6 @@ def cltv_invalidate(tx, failure_reason): cltv_modify_tx(tx, prepend_scriptsig=scheme[0], nsequence=scheme[1], nlocktime=scheme[2]) - TODO: test more ways that transactions using CLTV could be invalid (eg - locktime requirements fail, sequence time requirements fail, etc). - ''' - cltv_modify_tx(None, tx, [OP_1NEGATE, OP_CHECKLOCKTIMEVERIFY, OP_DROP]) def cltv_validate(tx, height): # Modify the signature in vin 0 and nSequence/nLockTime of the tx to pass CLTV @@ -124,10 +119,7 @@ def run_test(self): tip = self.nodes[0].getbestblockhash() block_time = self.nodes[0].getblockheader(tip)['mediantime'] + 1 - block = create_block(int(tip, 16), create_coinbase(CLTV_HEIGHT - 1), block_time) - block.nVersion = 3 - block.vtx.extend(invalid_cltv_txs) - block.hashMerkleRoot = block.calc_merkle_root() + block = create_block(int(tip, 16), create_coinbase(CLTV_HEIGHT - 1), block_time, version=3, txlist=invalid_cltv_txs) block.solve() self.test_cltv_info(is_active=False) # Not active as of current tip and next block does not need to obey rules @@ -138,8 +130,7 @@ def run_test(self): self.log.info("Test that blocks must now be at least version 4") tip = block.sha256 block_time += 1 - block = create_block(tip, create_coinbase(CLTV_HEIGHT), block_time) - block.nVersion = 3 + block = create_block(tip, create_coinbase(CLTV_HEIGHT), block_time, version=3) block.solve() with self.nodes[0].assert_debug_log(expected_msgs=[f'{block.hash}, bad-version(0x00000003)']): diff --git a/test/functional/feature_csv_activation.py b/test/functional/feature_csv_activation.py index a04ea16c1d..f6a077d641 100755 --- a/test/functional/feature_csv_activation.py +++ b/test/functional/feature_csv_activation.py @@ -91,7 +91,7 @@ def all_rlt_txs(txs): CSV_ACTIVATION_HEIGHT = 432 -class BIP68_112_113Test(BitcoinTestFramework): +class BIP68_112_113Test(BGLTestFramework): def set_test_params(self): self.num_nodes = 1 self.setup_clean_chain = True diff --git a/test/functional/feature_fee_estimation.py b/test/functional/feature_fee_estimation.py index 58f76cb9f3..270241d0e8 100755 --- a/test/functional/feature_fee_estimation.py +++ b/test/functional/feature_fee_estimation.py @@ -116,6 +116,9 @@ def split_inputs(from_node, txins, txouts, initial_split=False): txouts.append({"txid": txid, "vout": 1, "amount": rem_change}) +def check_raw_estimates(node, fees_seen): + """Call estimaterawfee and verify that the estimates meet certain invariants.""" + delta = 1.0e-6 # account for rounding error for i in range(1, 26): for _, e in node.estimaterawfee(i).items(): @@ -151,6 +154,9 @@ def check_smart_estimates(node, fees_seen): assert_greater_than_or_equal(i + 1, e["blocks"]) +def check_estimates(node, fees_seen): + check_raw_estimates(node, fees_seen) + check_smart_estimates(node, fees_seen) def send_tx(node, utxo, feerate): """Broadcast a 1in-1out transaction with a specific input and feerate (sat/vb).""" diff --git a/test/functional/feature_nulldummy.py b/test/functional/feature_nulldummy.py index 217a38050d..91b54f8d5a 100755 --- a/test/functional/feature_nulldummy.py +++ b/test/functional/feature_nulldummy.py @@ -23,7 +23,7 @@ ) from test_framework.messages import CTransaction from test_framework.script import CScript -from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_framework import BGLTestFramework from test_framework.util import ( assert_equal, assert_raises_rpc_error, @@ -45,7 +45,7 @@ def trueDummy(tx): tx.rehash() -class NULLDUMMYTest(BitcoinTestFramework): +class NULLDUMMYTest(BGLTestFramework): def set_test_params(self): self.num_nodes = 1 self.setup_clean_chain = True diff --git a/test/functional/feature_presegwit_node_upgrade.py b/test/functional/feature_presegwit_node_upgrade.py index aac42d4dbf..a3bab95cd0 100755 --- a/test/functional/feature_presegwit_node_upgrade.py +++ b/test/functional/feature_presegwit_node_upgrade.py @@ -4,7 +4,7 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test a pre-segwit node upgrading to segwit consensus""" -from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_framework import BGLTestFramework from test_framework.util import ( assert_equal, softfork_active, @@ -12,7 +12,7 @@ import os -class SegwitUpgradeTest(BitcoinTestFramework): +class SegwitUpgradeTest(BGLTestFramework): def set_test_params(self): self.setup_clean_chain = True self.num_nodes = 1 diff --git a/test/functional/feature_segwit.py b/test/functional/feature_segwit.py index c1186d216e..07a08c8677 100755 --- a/test/functional/feature_segwit.py +++ b/test/functional/feature_segwit.py @@ -48,6 +48,9 @@ assert_raises_rpc_error, try_rpc, ) +from test_framework.wallet_util import ( + get_generate_key, +) NODE_0 = 0 NODE_2 = 2 @@ -128,7 +131,7 @@ def run_test(self): self.log.info("Verify sigops are counted in GBT with pre-BIP141 rules before the fork") txid = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 1) tmpl = self.nodes[0].getblocktemplate({'rules': ['segwit']}) - assert_equal(tmpl['sizelimit'], 1000000) + assert_equal(tmpl['sizelimit'], 100000) assert 'weightlimit' not in tmpl assert_equal(tmpl['sigoplimit'], 20000) assert_equal(tmpl['transactions'][0]['hash'], txid) diff --git a/test/functional/feature_syscall_sandbox.py b/test/functional/feature_syscall_sandbox.py index caf7f1e7fc..7c27dd9113 100755 --- a/test/functional/feature_syscall_sandbox.py +++ b/test/functional/feature_syscall_sandbox.py @@ -4,10 +4,10 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test bitcoind aborts if a disallowed syscall is used when compiled with the syscall sandbox.""" -from test_framework.test_framework import BitcoinTestFramework, SkipTest +from test_framework.test_framework import BGLTestFramework, SkipTest -class SyscallSandboxTest(BitcoinTestFramework): +class SyscallSandboxTest(BGLTestFramework): def set_test_params(self): self.num_nodes = 1 diff --git a/test/functional/interface_BGL_cli.py b/test/functional/interface_BGL_cli.py index c88018c2af..5b0c1a64a8 100755 --- a/test/functional/interface_BGL_cli.py +++ b/test/functional/interface_BGL_cli.py @@ -21,7 +21,7 @@ # COINBASE_MATURITY (100) blocks. Therefore, after mining 101 blocks we expect # node 0 to have a balance of (BLOCKS - COINBASE_MATURITY) * 50 BTC/block. BLOCKS = COINBASE_MATURITY + 1 -BALANCE = (BLOCKS - 100) * 50 +BALANCE = (BLOCKS - 100) * 200 JSON_PARSING_ERROR = 'error: Error parsing JSON: foo' BLOCKS_VALUE_OF_ZERO = 'error: the first argument (number of blocks to generate, default: 1) must be an integer value greater than zero' @@ -64,7 +64,7 @@ def cli_get_info_string_to_dict(cli_get_info_string): return cli_get_info -class TestBitcoinCli(BitcoinTestFramework): +class TestBGLCli(BGLTestFramework): def set_test_params(self): self.setup_clean_chain = True self.num_nodes = 1 @@ -155,8 +155,8 @@ def run_test(self): wallet_info = self.nodes[0].getwalletinfo() assert_equal(int(cli_get_info['Keypool size']), wallet_info['keypoolsize']) assert_equal(int(cli_get_info['Unlocked until']), wallet_info['unlocked_until']) - assert_equal(Decimal(cli_get_info['Transaction fee rate (-paytxfee) (BTC/kvB)']), wallet_info['paytxfee']) - assert_equal(Decimal(cli_get_info['Min tx relay fee rate (BTC/kvB)']), network_info['relayfee']) + assert_equal(Decimal(cli_get_info['Transaction fee rate (-paytxfee) (BGL/kvB)']), wallet_info['paytxfee']) + assert_equal(Decimal(cli_get_info['Min tx relay fee rate (BGL/kvB)']), network_info['relayfee']) assert_equal(self.nodes[0].cli.getwalletinfo(), wallet_info) # Setup to test -getinfo, -generate, and -rpcwallet= with multiple wallets. diff --git a/test/functional/mempool_accept.py b/test/functional/mempool_accept.py index a658f7c63c..cf67020eef 100755 --- a/test/functional/mempool_accept.py +++ b/test/functional/mempool_accept.py @@ -6,7 +6,7 @@ from decimal import Decimal import math - +from test_framework.key import ECKey from test_framework.test_framework import BGLTestFramework from test_framework.messages import ( BIP125_SEQUENCE_NUMBER, diff --git a/test/functional/mempool_accept_wtxid.py b/test/functional/mempool_accept_wtxid.py index 4767d6db22..5a1702e85a 100755 --- a/test/functional/mempool_accept_wtxid.py +++ b/test/functional/mempool_accept_wtxid.py @@ -29,12 +29,12 @@ OP_TRUE, hash160, ) -from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_framework import BGLTestFramework from test_framework.util import ( assert_equal, ) -class MempoolWtxidTest(BitcoinTestFramework): +class MempoolWtxidTest(BGLTestFramework): def set_test_params(self): self.num_nodes = 1 self.setup_clean_chain = True diff --git a/test/functional/mempool_package_limits.py b/test/functional/mempool_package_limits.py index 89a5c83826..2a8a68828e 100755 --- a/test/functional/mempool_package_limits.py +++ b/test/functional/mempool_package_limits.py @@ -7,7 +7,7 @@ from decimal import Decimal from test_framework.address import ADDRESS_BCRT1_P2WSH_OP_TRUE -from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_framework import BGLTestFramework from test_framework.messages import ( COIN, CTransaction, @@ -29,7 +29,7 @@ DEFAULT_FEE, ) -class MempoolPackageLimitsTest(BitcoinTestFramework): +class MempoolPackageLimitsTest(BGLTestFramework): def set_test_params(self): self.num_nodes = 1 self.setup_clean_chain = True diff --git a/test/functional/mempool_updatefromblock.py b/test/functional/mempool_updatefromblock.py index cdf722c44a..3520782aff 100755 --- a/test/functional/mempool_updatefromblock.py +++ b/test/functional/mempool_updatefromblock.py @@ -116,8 +116,7 @@ def transaction_graph_test(self, size, n_tx_to_mine=None, start_input_txid='', e assert_equal(entry['ancestorsize'], sum(tx_size[0:(k + 1)])) def run_test(self): - # Use batch size limited by DEFAULT_ANCESTOR_LIMIT = 25 to not fire "too many unconfirmed parents" error. - self.transaction_graph_test(size=100, n_tx_to_mine=[25, 50, 75]) + self.transaction_graph_test(size=90, n_tx_to_mine=[15, 30, 45, 60, 75]) if __name__ == '__main__': diff --git a/test/functional/p2p_compactblocks_blocksonly.py b/test/functional/p2p_compactblocks_blocksonly.py index ae5b6a9069..ab49b377b6 100755 --- a/test/functional/p2p_compactblocks_blocksonly.py +++ b/test/functional/p2p_compactblocks_blocksonly.py @@ -17,11 +17,11 @@ msg_sendcmpct, ) from test_framework.p2p import P2PInterface -from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_framework import BGLTestFramework from test_framework.util import assert_equal -class P2PCompactBlocksBlocksOnly(BitcoinTestFramework): +class P2PCompactBlocksBlocksOnly(BGLTestFramework): def set_test_params(self): self.extra_args = [["-blocksonly"], [], [], []] self.num_nodes = 4 diff --git a/test/functional/p2p_dns_seeds.py b/test/functional/p2p_dns_seeds.py index 254f9af445..2b02e35fa3 100755 --- a/test/functional/p2p_dns_seeds.py +++ b/test/functional/p2p_dns_seeds.py @@ -5,10 +5,10 @@ """Test ThreadDNSAddressSeed logic for querying DNS seeds.""" from test_framework.p2p import P2PInterface -from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_framework import BGLTestFramework -class P2PDNSSeeds(BitcoinTestFramework): +class P2PDNSSeeds(BGLTestFramework): def set_test_params(self): self.setup_clean_chain = True self.num_nodes = 1 diff --git a/test/functional/p2p_eviction.py b/test/functional/p2p_eviction.py index 2eda1e214c..7110fdbb75 100755 --- a/test/functional/p2p_eviction.py +++ b/test/functional/p2p_eviction.py @@ -82,16 +82,11 @@ def run_test(self): prevtx = node.getblock(node.getblockhash(i + 1), 2)['tx'][0] rawtx = node.createrawtransaction( inputs=[{'txid': prevtx['txid'], 'vout': 0}], - outputs=[{node.get_deterministic_priv_key().address: 50 - 0.00125}], + outputs=[{node.get_deterministic_priv_key().address: 200 - 0.00125}], ) sigtx = node.signrawtransactionwithkey( hexstring=rawtx, privkeys=[node.get_deterministic_priv_key().key], - prevtxs=[{ - 'txid': prevtx['txid'], - 'vout': 0, - 'scriptPubKey': prevtx['vout'][0]['scriptPubKey']['hex'], - }], )['hex'] txpeer.send_message(msg_tx(tx_from_hex(sigtx))) protected_peers.add(current_peer) diff --git a/test/functional/p2p_invalid_block.py b/test/functional/p2p_invalid_block.py index c01d47d3a6..4093d57df0 100755 --- a/test/functional/p2p_invalid_block.py +++ b/test/functional/p2p_invalid_block.py @@ -15,14 +15,18 @@ import copy import time -from test_framework.blocktools import create_block, create_coinbase, create_tx_with_script +from test_framework.blocktools import ( + MAX_FUTURE_BLOCK_TIME, + create_block, + create_coinbase, + create_tx_with_script, +) from test_framework.messages import COIN from test_framework.p2p import P2PDataStore +from test_framework.script import OP_TRUE from test_framework.test_framework import BGLTestFramework from test_framework.util import assert_equal -MAX_FUTURE_BLOCK_TIME = 2 * 60 * 60 - class InvalidBlockRequestTest(BGLTestFramework): def set_test_params(self): @@ -66,16 +70,10 @@ def run_test(self): # For more information on merkle-root malleability see src/consensus/merkle.cpp. self.log.info("Test merkle root malleability.") - block2 = create_block(tip, create_coinbase(height), block_time) + tx1 = create_tx_with_script(block1.vtx[0], 0, script_sig=bytes([OP_TRUE]), amount=200 * COIN) + tx2 = create_tx_with_script(tx1, 0, script_sig=bytes([OP_TRUE]), amount=200 * COIN) + block2 = create_block(tip, create_coinbase(height), block_time, txlist=[tx1, tx2]) block_time += 1 - - # b'0x51' is OP_TRUE - tx1 = create_tx_with_script(block1.vtx[0], 0, script_sig=b'\x51', amount=50 * COIN) - tx2 = create_tx_with_script(tx1, 0, script_sig=b'\x51', amount=50 * COIN) - - block2.vtx.extend([tx1, tx2]) - block2.hashMerkleRoot = block2.calc_merkle_root() - block2.rehash() block2.solve() orig_hash = block2.sha256 block2_orig = copy.deepcopy(block2) @@ -95,19 +93,13 @@ def run_test(self): block2_dup.vtx[2].vin.append(block2_dup.vtx[2].vin[0]) block2_dup.vtx[2].rehash() block2_dup.hashMerkleRoot = block2_dup.calc_merkle_root() - block2_dup.rehash() block2_dup.solve() peer.send_blocks_and_test([block2_dup], node, success=False, reject_reason='bad-txns-inputs-duplicate') self.log.info("Test very broken block.") - block3 = create_block(tip, create_coinbase(height), block_time) + block3 = create_block(tip, create_coinbase(height, nValue=400), block_time) block_time += 1 - block3.vtx[0].vout[0].nValue = 100 * COIN # Too high! - block3.vtx[0].sha256 = None - block3.vtx[0].calc_sha256() - block3.hashMerkleRoot = block3.calc_merkle_root() - block3.rehash() block3.solve() peer.send_blocks_and_test([block3], node, success=False, reject_reason='bad-cb-amount') @@ -126,15 +118,10 @@ def run_test(self): # Complete testing of CVE-2018-17144, by checking for the inflation bug. # Create a block that spends the output of a tx in a previous block. - block4 = create_block(tip, create_coinbase(height), block_time) - tx3 = create_tx_with_script(tx2, 0, script_sig=b'\x51', amount=50 * COIN) - - # Duplicates input - tx3.vin.append(tx3.vin[0]) + tx3 = create_tx_with_script(tx2, 0, script_sig=bytes([OP_TRUE]), amount=200 * COIN) + tx3.vin.append(tx3.vin[0]) # Duplicates input tx3.rehash() - block4.vtx.append(tx3) - block4.hashMerkleRoot = block4.calc_merkle_root() - block4.rehash() + block4 = create_block(tip, create_coinbase(height), block_time, txlist=[tx3]) block4.solve() self.log.info("Test inflation by duplicating input") peer.send_blocks_and_test([block4], node, success=False, reject_reason='bad-txns-inputs-duplicate') diff --git a/test/functional/rpc_blockchain.py b/test/functional/rpc_blockchain.py index 1ad7dc7fe4..da35c9a402 100755 --- a/test/functional/rpc_blockchain.py +++ b/test/functional/rpc_blockchain.py @@ -182,6 +182,17 @@ def _test_getblockchaininfo(self): }, 'active': False }, + 'taproot_discarded': { + 'type': 'bip9', + 'bip9': { + 'status': 'defined', + 'start_time': 1621589357, + 'timeout': 1623715200, + 'since': 0, + 'min_activation_height': 0 + }, + 'active': False + }, 'taproot': { 'type': 'bip9', 'bip9': { @@ -254,7 +265,7 @@ def _test_gettxoutsetinfo(self): node = self.nodes[0] res = node.gettxoutsetinfo() - assert_equal(res['total_amount'], Decimal('8725.00000000')) + assert_equal(res['total_amount'], Decimal('34900.00000000')) assert_equal(res['transactions'], HEIGHT) assert_equal(res['height'], HEIGHT) assert_equal(res['txouts'], HEIGHT) diff --git a/test/functional/rpc_createmultisig.py b/test/functional/rpc_createmultisig.py index fcc6c841c9..a31279bda0 100755 --- a/test/functional/rpc_createmultisig.py +++ b/test/functional/rpc_createmultisig.py @@ -125,7 +125,7 @@ def checkbalances(self): height = node0.getblockchaininfo()["blocks"] assert 150 < height < 350 - total = 149 * 200 + (height - 149 - 100) * 100 - decimal.Decimal("0.00038295") + total = 149 * 200 + (height - 149 - 100) * 100 - decimal.Decimal("0.00037504") assert bal1 == 0 assert bal2 == self.moved assert bal0 + bal1 + bal2 == total diff --git a/test/functional/rpc_fundrawtransaction.py b/test/functional/rpc_fundrawtransaction.py index 57fe78422f..7f71ff383e 100755 --- a/test/functional/rpc_fundrawtransaction.py +++ b/test/functional/rpc_fundrawtransaction.py @@ -974,7 +974,8 @@ def test_transaction_too_large(self): wallet = self.nodes[0].get_wallet_rpc(self.default_wallet_name) recipient = self.nodes[0].get_wallet_rpc("large") outputs = {} - for _ in range(4000): + rawtx = recipient.createrawtransaction([], {wallet.getnewaddress(): 147.99899260}) + for _ in range(1500): outputs[recipient.getnewaddress()] = 0.1 wallet.sendmany("", outputs) self.generate(self.nodes[0], 10) diff --git a/test/functional/rpc_generateblock.py b/test/functional/rpc_generateblock.py index 03297b8547..7f26384a79 100755 --- a/test/functional/rpc_generateblock.py +++ b/test/functional/rpc_generateblock.py @@ -38,7 +38,7 @@ def run_test(self): self.log.info('Generate an empty block to a combo descriptor with compressed pubkey') combo_key = '0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798' combo_address = 'rbgl1qw508d6qejxtdg4y5r3zarvary0c5xw7kahx879' - hash = node.generateblock('combo(' + combo_key + ')', [])['hash'] + hash = self.generateblock(node,'combo(' + combo_key + ')', [])['hash'] block = node.getblock(hash, 2) assert_equal(len(block['tx']), 1) assert_equal(block['tx'][0]['vout'][0]['scriptPubKey']['address'], combo_address) @@ -46,7 +46,7 @@ def run_test(self): self.log.info('Generate an empty block to a combo descriptor with uncompressed pubkey') combo_key = '0408ef68c46d20596cc3f6ddf7c8794f71913add807f1dc55949fa805d764d191c0b7ce6894c126fce0babc6663042f3dde9b0cf76467ea315514e5a6731149c67' combo_address = 'Emahd6fU8JwGq9VrknyDkSkj8vtiNQSsoZ' - hash = node.generateblock('combo(' + combo_key + ')', [])['hash'] + hash = self.generateblock(node,'combo(' + combo_key + ')', [])['hash'] block = node.getblock(hash, 2) assert_equal(len(block['tx']), 1) assert_equal(block['tx'][0]['vout'][0]['scriptPubKey']['address'], combo_address) diff --git a/test/functional/rpc_invalid_address_message.py b/test/functional/rpc_invalid_address_message.py index 6a63b48a7a..4c4fed1d67 100755 --- a/test/functional/rpc_invalid_address_message.py +++ b/test/functional/rpc_invalid_address_message.py @@ -11,15 +11,15 @@ assert_raises_rpc_error, ) -BECH32_VALID = 'bcrt1qtmp74ayg7p24uslctssvjm06q5phz4yrxucgnv' -BECH32_INVALID_BECH32 = 'bcrt1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqdmchcc' -BECH32_INVALID_BECH32M = 'bcrt1qw508d6qejxtdg4y5r3zarvary0c5xw7k35mrzd' -BECH32_INVALID_VERSION = 'bcrt130xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqynjegk' -BECH32_INVALID_SIZE = 'bcrt1s0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v8n0nx0muaewav25430mtr' -BECH32_INVALID_V0_SIZE = 'bcrt1qw508d6qejxtdg4y5r3zarvary0c5xw7kqqq5k3my' -BECH32_INVALID_PREFIX = 'bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx' - -BASE58_VALID = 'mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJRfn' +BECH32_VALID = 'rbgl1qtmp74ayg7p24uslctssvjm06q5phz4yrlr4q2x' +BECH32_INVALID_BECH32 = 'rbgl1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqsjdr7p' +BECH32_INVALID_BECH32M = 'rbgl1qw508d6qejxtdg4y5r3zarvary0c5xw7kgtktm8' +BECH32_INVALID_VERSION = 'rbgl130xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqe68dw0' +BECH32_INVALID_SIZE = 'rbgl1s0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v8n0nx0muaewav253wkc50' +BECH32_INVALID_V0_SIZE = 'rbgl1qw508d6qejxtdg4y5r3zarvary0c5xw7kqqdx75yt' +BECH32_INVALID_PREFIX = 'tbgl1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7khvqghp' + +BASE58_VALID = 'MAMYWDWqd46sYwL7h9ExCpzaPba53HhMh8' BASE58_INVALID_PREFIX = '17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem' INVALID_ADDRESS = 'asfah14i8fajz0123f' diff --git a/test/functional/rpc_net.py b/test/functional/rpc_net.py index a3e39d0ada..7f38bde434 100755 --- a/test/functional/rpc_net.py +++ b/test/functional/rpc_net.py @@ -259,7 +259,7 @@ def test_addpeeraddress(self): self.log.debug("Test that adding a valid address to the tried table succeeds") assert_equal(node.addpeeraddress(address="1.2.3.4", tried=True, port=8333), {"success": True}) - with node.assert_debug_log(expected_msgs=["Addrman checks started: new 0, tried 1, total 1"]): + with node.assert_debug_log(expected_msgs=["CheckAddrman: new 0, tried 1, total 1 started"]): addrs = node.getnodeaddresses(count=0) # getnodeaddresses re-runs the addrman checks assert_equal(len(addrs), 1) assert_equal(addrs[0]["address"], "1.2.3.4") @@ -272,7 +272,7 @@ def test_addpeeraddress(self): self.log.debug("Test that adding a second address, this time to the new table, succeeds") assert_equal(node.addpeeraddress(address="2.0.0.0", port=8333), {"success": True}) - with node.assert_debug_log(expected_msgs=["Addrman checks started: new 1, tried 1, total 2"]): + with node.assert_debug_log(expected_msgs=["CheckAddrman: new 1, tried 1, total 2 started"]): addrs = node.getnodeaddresses(count=0) # getnodeaddresses re-runs the addrman checks assert_equal(len(addrs), 2) diff --git a/test/functional/rpc_packages.py b/test/functional/rpc_packages.py index 4f5c360cf7..4326a5f1a3 100755 --- a/test/functional/rpc_packages.py +++ b/test/functional/rpc_packages.py @@ -8,7 +8,7 @@ import random from test_framework.address import ADDRESS_BCRT1_P2WSH_OP_TRUE -from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_framework import BGLTestFramework from test_framework.messages import ( BIP125_SEQUENCE_NUMBER, COIN, @@ -28,7 +28,7 @@ make_chain, ) -class RPCPackagesTest(BitcoinTestFramework): +class RPCPackagesTest(BGLTestFramework): def set_test_params(self): self.num_nodes = 1 self.setup_clean_chain = True diff --git a/test/functional/rpc_rawtransaction.py b/test/functional/rpc_rawtransaction.py index fe19261641..3f0d4cb5dd 100755 --- a/test/functional/rpc_rawtransaction.py +++ b/test/functional/rpc_rawtransaction.py @@ -489,7 +489,7 @@ def raw_multisig_transaction_legacy_tests(self): self.sync_all() self.generate(self.nodes[0], 1) self.sync_all() - assert_equal(self.nodes[0].getbalance(), bal + Decimal('50.00000000') + Decimal('2.19000000')) # block reward + tx + assert_equal(self.nodes[0].getbalance(), bal + Decimal('200.00000000') + Decimal('2.19000000')) # block reward + tx # 2of2 test for combining transactions bal = self.nodes[2].getbalance() @@ -534,7 +534,7 @@ def raw_multisig_transaction_legacy_tests(self): self.sync_all() self.generate(self.nodes[0], 1) self.sync_all() - assert_equal(self.nodes[0].getbalance(), bal + Decimal('50.00000000') + Decimal('2.19000000')) # block reward + tx + assert_equal(self.nodes[0].getbalance(), bal + Decimal('200.00000000') + Decimal('2.19000000')) # block reward + tx if __name__ == '__main__': diff --git a/test/functional/rpc_scantxoutset.py b/test/functional/rpc_scantxoutset.py index c44aa45301..bf11ff5036 100755 --- a/test/functional/rpc_scantxoutset.py +++ b/test/functional/rpc_scantxoutset.py @@ -36,18 +36,21 @@ def run_test(self): self.nodes[0].sendtoaddress(addr_BECH32, 0.004) #send to child keys of tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK - self.nodes[0].sendtoaddress("mkHV1C6JLheLoUSSZYk7x3FH5tnx9bu7yc", 0.008) # (m/0'/0'/0') - self.nodes[0].sendtoaddress("mipUSRmJAj2KrjSvsPQtnP8ynUon7FhpCR", 0.016) # (m/0'/0'/1') - self.nodes[0].sendtoaddress("n37dAGe6Mq1HGM9t4b6rFEEsDGq7Fcgfqg", 0.032) # (m/0'/0'/1500') - self.nodes[0].sendtoaddress("mqS9Rpg8nNLAzxFExsgFLCnzHBsoQ3PRM6", 0.064) # (m/0'/0'/0) - self.nodes[0].sendtoaddress("mnTg5gVWr3rbhHaKjJv7EEEc76ZqHgSj4S", 0.128) # (m/0'/0'/1) - self.nodes[0].sendtoaddress("mketCd6B9U9Uee1iCsppDJJBHfvi6U6ukC", 0.256) # (m/0'/0'/1500) - self.nodes[0].sendtoaddress("mj8zFzrbBcdaWXowCQ1oPZ4qioBVzLzAp7", 0.512) # (m/1/1/0') - self.nodes[0].sendtoaddress("mfnKpKQEftniaoE1iXuMMePQU3PUpcNisA", 1.024) # (m/1/1/1') - self.nodes[0].sendtoaddress("mou6cB1kaP1nNJM1sryW6YRwnd4shTbXYQ", 2.048) # (m/1/1/1500') - self.nodes[0].sendtoaddress("mtfUoUax9L4tzXARpw1oTGxWyoogp52KhJ", 4.096) # (m/1/1/0) - self.nodes[0].sendtoaddress("mxp7w7j8S1Aq6L8StS2PqVvtt4HGxXEvdy", 8.192) # (m/1/1/1) - self.nodes[0].sendtoaddress("mpQ8rokAhp1TAtJQR6F6TaUmjAWkAWYYBq", 16.384) # (m/1/1/1500) + self.nodes[0].sendtoaddress("rbgl1qx3x8pd2j82774x9v5jtrt67v6eq0xg33h9wtfn", 0.008) # (m/0'/0'/0') + self.nodes[0].sendtoaddress("rbgl1qysufe22kf66mz3jtq33f0d88arruws4ye5egv0", 0.016) # (m/0'/0'/1') + self.nodes[0].sendtoaddress("rbgl1qan5n5jj47futj90060396taeegswnhusutx05j", 0.032) # (m/0'/0'/1500') + + self.nodes[0].sendtoaddress("rbgl1qdny83c9q5x3glq86aa68gevelzqwwu9qhdhxqa", 0.064) # (m/0'/0'/0) + self.nodes[0].sendtoaddress("rbgl1qfs4pjvfdkscn82qraqvvwahw0fyd20ykgp4hjd", 0.128) # (m/0'/0'/1) + self.nodes[0].sendtoaddress("rbgl1q8pvg59ekgx6lryuysvqf4ljtgyjr8nsl3kl00s", 0.256) # (m/0'/0'/1500) + + self.nodes[0].sendtoaddress("rbgl1qy7u0mmtl4qz4833p8f43v63m7nqmscls6jgxc8", 0.512) # (m/1/1/0') + self.nodes[0].sendtoaddress("rbgl1qqt5rga2600fjzhlvh89p8qy7nyrp9e6807hwha", 1.024) # (m/1/1/1') + self.nodes[0].sendtoaddress("rbgl1qt0c33ft6cfw852p6chqvqpkwxvmfl8vnzy02zv", 2.048) # (m/1/1/1500') + + self.nodes[0].sendtoaddress("rbgl1qjqmxmkpmxt80xz4y3746zgt0q3u3ferrg2ss57", 4.096) # (m/1/1/0) + self.nodes[0].sendtoaddress("rbgl1qhku5rq7jz8ulufe2y6fkcpnlvpsta7rqv2cz5w", 8.192) # (m/1/1/1) + self.nodes[0].sendtoaddress("rbgl1qv9hs5rhkgcx0ef6f9g26k3k83hmhugjtart6dr", 16.384) # (m/1/1/1500) self.generate(self.nodes[0], 1) @@ -84,7 +87,7 @@ def run_test(self): self.log.info("Test extended key derivation.") # Run various scans, and verify that the sum of the amounts of the matches corresponds to the expected subset. - # Note that all amounts in the UTXO set are powers of 2 multiplied by 0.001 BTC, so each amounts uniquely identifies a subset. + # Note that all amounts in the UTXO set are powers of 2 multiplied by 0.001 BGL, so each amounts uniquely identifies a subset. assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0'/0h/0h)"])['total_amount'], Decimal("0.008")) assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0'/0'/1h)"])['total_amount'], Decimal("0.016")) assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0h/0'/1500')"])['total_amount'], Decimal("0.032")) @@ -112,10 +115,6 @@ def run_test(self): assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/*)", "range": 1500}])['total_amount'], Decimal("28.672")) assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/*)", "range": [1500,1500]}])['total_amount'], Decimal("16.384")) - # Test the reported descriptors for a few matches - assert_equal(descriptors(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0h/0'/*)", "range": 1499}])), ["pkh([0c5f9a1e/0'/0'/0]026dbd8b2315f296d36e6b6920b1579ca75569464875c7ebe869b536a7d9503c8c)#dzxw429x", "pkh([0c5f9a1e/0'/0'/1]033e6f25d76c00bedb3a8993c7d5739ee806397f0529b1b31dda31ef890f19a60c)#43rvceed"]) - assert_equal(descriptors(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/0)"])), ["pkh([0c5f9a1e/1/1/0]03e1c5b6e650966971d7e71ef2674f80222752740fc1dfd63bbbd220d2da9bd0fb)#cxmct4w8"]) - assert_equal(descriptors(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/*)", "range": 1500}])), ['pkh([0c5f9a1e/1/1/0]03e1c5b6e650966971d7e71ef2674f80222752740fc1dfd63bbbd220d2da9bd0fb)#cxmct4w8', 'pkh([0c5f9a1e/1/1/1500]03832901c250025da2aebae2bfb38d5c703a57ab66ad477f9c578bfbcd78abca6f)#vchwd07g', 'pkh([0c5f9a1e/1/1/1]030d820fc9e8211c4169be8530efbc632775d8286167afd178caaf1089b77daba7)#z2t3ypsa']) # Check that status and abort don't need second arg assert_equal(self.nodes[0].scantxoutset("status"), None) diff --git a/test/functional/rpc_signmessagewithprivkey.py b/test/functional/rpc_signmessagewithprivkey.py index 8c3718acbc..0a88d2b2b6 100755 --- a/test/functional/rpc_signmessagewithprivkey.py +++ b/test/functional/rpc_signmessagewithprivkey.py @@ -5,7 +5,10 @@ """Test RPC commands for signing messages with private key.""" from test_framework.test_framework import BGLTestFramework -from test_framework.util import assert_equal +from test_framework.util import ( + assert_equal, + assert_raises_rpc_error, +) class SignMessagesWithPrivTest(BGLTestFramework): def set_test_params(self): @@ -36,7 +39,7 @@ def run_test(self): assert_raises_rpc_error(-5, "Invalid private key", self.nodes[0].signmessagewithprivkey, "invalid_key", message) assert_raises_rpc_error(-5, "Invalid address", self.nodes[0].verifymessage, "invalid_addr", signature, message) # malformed signature provided - assert_raises_rpc_error(-3, "Malformed base64 encoding", self.nodes[0].verifymessage, 'mpLQjfK79b7CCV4VMJWEWAj5Mpx8Up5zxB', "invalid_sig", message) + assert_raises_rpc_error(-3, "Malformed base64 encoding", self.nodes[0].verifymessage, 'Ejt5fCe8NyLDC3nRk5ptc85PWSubNDUY4D', "invalid_sig", message) if __name__ == '__main__': SignMessagesWithPrivTest().main() diff --git a/test/functional/test_framework/blocktools.py b/test/functional/test_framework/blocktools.py index 518cea9014..59db67f55d 100644 --- a/test/functional/test_framework/blocktools.py +++ b/test/functional/test_framework/blocktools.py @@ -57,8 +57,7 @@ # Coinbase transaction outputs can only be spent after this number of new blocks (network rule) COINBASE_MATURITY = 100 -# Coinbase transaction outputs can only be spent after this number of new blocks (network rule) -COINBASE_MATURITY = 100 +MAX_FUTURE_BLOCK_TIME = 2 * 60 * 60 # From BIP141 WITNESS_COMMITMENT_HEADER = b"\xaa\x21\xa9\xed" diff --git a/test/functional/test_framework/messages.py b/test/functional/test_framework/messages.py index e14ae738e0..327e2ef19b 100755 --- a/test/functional/test_framework/messages.py +++ b/test/functional/test_framework/messages.py @@ -18,6 +18,7 @@ Classes use __slots__ to ensure extraneous attributes aren't accidentally added by tests, compromising their intended effect. """ +from codecs import encode from base64 import b32decode, b32encode import copy import hashlib @@ -588,7 +589,7 @@ def serialize(self): return self.serialize_with_witness() def getwtxid(self): - return hash256(self.serialize())[::-1].hex() + return sha256(self.serialize())[::-1].hex() # Recalculate the txid (transaction hash without witness) def rehash(self): diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py index 10bcdc8da3..b37f515b2f 100755 --- a/test/functional/test_framework/test_framework.py +++ b/test/functional/test_framework/test_framework.py @@ -100,7 +100,6 @@ def __init__(self): self.rpc_timeout = 60 # Wait for up to 60 seconds for the RPC server to respond self.supports_cli = True self.bind_to_localhost_only = True - self.set_test_params() self.parse_args() self.disable_syscall_sandbox = self.options.nosandbox self.default_wallet_name = "default_wallet" if self.options.descriptors else "" diff --git a/test/functional/test_framework/wallet.py b/test/functional/test_framework/wallet.py index c562f79c5c..2ac766eb71 100644 --- a/test/functional/test_framework/wallet.py +++ b/test/functional/test_framework/wallet.py @@ -270,3 +270,23 @@ def create_raw_chain(node, first_coin, address, privkeys, chain_length=25): chain_txns.append(tx) return (chain_hex, chain_txns) + +def bulk_transaction(tx, node, target_weight, privkeys, prevtxs=None): + """Pad a transaction with extra outputs until it reaches a target weight (or higher). + returns CTransaction object + """ + tx_heavy = deepcopy(tx) + assert_greater_than_or_equal(target_weight, tx_heavy.get_weight()) + while tx_heavy.get_weight() < target_weight: + random_spk = "6a4d0200" # OP_RETURN OP_PUSH2 512 bytes + for _ in range(512*2): + random_spk += choice("0123456789ABCDEF") + tx_heavy.vout.append(CTxOut(0, bytes.fromhex(random_spk))) + # Re-sign the transaction + if privkeys: + signed = node.signrawtransactionwithkey(tx_heavy.serialize().hex(), privkeys, prevtxs) + return tx_from_hex(signed["hex"]) + # OP_TRUE + tx_heavy.wit.vtxinwit = [CTxInWitness()] + tx_heavy.wit.vtxinwit[0].scriptWitness.stack = [CScript([OP_TRUE])] + return tx_heavy diff --git a/test/functional/wallet_basic.py b/test/functional/wallet_basic.py index f66a043567..abd2b0c8e8 100755 --- a/test/functional/wallet_basic.py +++ b/test/functional/wallet_basic.py @@ -89,10 +89,10 @@ def run_test(self): assert_equal(txout['value'], 200) # Send 21 BGL from 0 to 2 using sendtoaddress call. - fees=0 + fees = 0 balance=self.nodes[0].getbalance() self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 11) - fees+= balance - self.nodes[0].getbalance()-11 + fees += balance - self.nodes[0].getbalance()-11 balance = self.nodes[0].getbalance() mempool_txid = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 10) fees += balance - self.nodes[0].getbalance() - 10 @@ -203,7 +203,7 @@ def run_test(self): # node0 should end up with 100 BGL in block rewards plus fees, but # minus the 21 plus fees sent to node2 - assert_equal(self.nodes[0].getbalance(), 400 - 21 -fees*Decimal("0.9")) + assert_equal(self.nodes[0].getbalance(), 400 - 21 - fees * Decimal("0.9")) assert_equal(self.nodes[2].getbalance(), 21) # Node0 should have two unspent outputs. @@ -230,7 +230,7 @@ def run_test(self): self.generate(self.nodes[1], 1, sync_fun=lambda: self.sync_all(self.nodes[0:3])) assert_equal(self.nodes[0].getbalance(), 0) - assert_equal(self.nodes[2].getbalance(), 394-fees*Decimal("0.9")) + assert_equal(self.nodes[2].getbalance(), 394 - fees * Decimal("0.9")) # Verify that a spent output cannot be locked anymore spent_0 = {"txid": node0utxos[0]["txid"], "vout": node0utxos[0]["vout"]} @@ -242,7 +242,7 @@ def run_test(self): self.nodes[2].settxfee(fee_per_byte * 1000) txid = self.nodes[2].sendtoaddress(address, 10, "", "", False) self.generate(self.nodes[2], 1, sync_fun=lambda: self.sync_all(self.nodes[0:3])) - node_2_bal = self.check_fee_amount(self.nodes[2].getbalance(), Decimal('84'), fee_per_byte, self.get_vsize(self.nodes[2].gettransaction(txid)['hex'])) + node_2_bal = self.check_fee_amount(self.nodes[2].getbalance(), Decimal('384') - fees * Decimal("0.9"), fee_per_byte, self.get_vsize(self.nodes[2].gettransaction(txid)['hex'])) assert_equal(self.nodes[0].getbalance(), Decimal('10')) # Send 10 BGL with subtract fee from amount @@ -447,9 +447,6 @@ def run_test(self): # This will raise an exception for importing an invalid pubkey assert_raises_rpc_error(-5, "Pubkey is not a valid public key", self.nodes[0].importpubkey, "5361746f736869204e616b616d6f746f") - # Bech32m addresses cannot be imported into a legacy wallet - assert_raises_rpc_error(-5, "Bech32m addresses cannot be imported into legacy wallets", self.nodes[0].importaddress, "bcrt1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqc8gma6") - # Import address and private key to check correct behavior of spendable unspents # 1. Send some coins to generate new UTXO address_to_import = self.nodes[2].getnewaddress() @@ -640,9 +637,9 @@ def run_test(self): # Test getaddressinfo on external address. Note that these addresses are taken from disablewallet.py assert_raises_rpc_error(-5, "Invalid prefix for Base58-encoded address", self.nodes[0].getaddressinfo, "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy") - address_info = self.nodes[0].getaddressinfo("mneYUmWYsuk7kySiURxCi3AGxrAqZxLgPZ") - assert_equal(address_info['address'], "mneYUmWYsuk7kySiURxCi3AGxrAqZxLgPZ") - assert_equal(address_info["scriptPubKey"], "76a9144e3854046c7bd1594ac904e4793b6a45b36dea0988ac") + address_info = self.nodes[0].getaddressinfo("rbgl1qdny83c9q5x3glq86aa68gevelzqwwu9qhdhxqa") + assert_equal(address_info['address'], "rbgl1qdny83c9q5x3glq86aa68gevelzqwwu9qhdhxqa") + assert_equal(address_info["scriptPubKey"], "00146cc878e0a0a1a28f80faef74746599f880e770a0") assert not address_info["ismine"] assert not address_info["iswatchonly"] assert not address_info["isscript"] diff --git a/test/functional/wallet_bumpfee_totalfee_deprecation.py b/test/functional/wallet_bumpfee_totalfee_deprecation.py index 64f01f7d90..f09b6a8737 100755 --- a/test/functional/wallet_bumpfee_totalfee_deprecation.py +++ b/test/functional/wallet_bumpfee_totalfee_deprecation.py @@ -22,11 +22,11 @@ def skip_test_if_missing_module(self): def run_test(self): peer_node, rbf_node = self.nodes - peer_node.generate(110) + self.generate(peer_node,110) self.sync_all() peer_node.sendtoaddress(rbf_node.getnewaddress(), 0.001) self.sync_all() - peer_node.generate(1) + self.generate(peer_node,1) self.sync_all() rbfid = spend_one_input(rbf_node, peer_node.getnewaddress()) diff --git a/test/functional/wallet_disable.py b/test/functional/wallet_disable.py index fe2440ff87..931fe961f7 100755 --- a/test/functional/wallet_disable.py +++ b/test/functional/wallet_disable.py @@ -29,8 +29,8 @@ def run_test (self): # Checking mining to an address without a wallet. Generating to a valid address should succeed # but generating to an invalid address will fail. - self.nodes[0].generatetoaddress(1, 'rbgl1qmevj8zfx0wdvp05cqwkmr6mxkfx60yezhdmczp') - assert_raises_rpc_error(-5, "Invalid address", self.nodes[0].generatetoaddress, 1, '3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy') + self.generatetoaddress(self.nodes[0],1, 'rbgl1qmevj8zfx0wdvp05cqwkmr6mxkfx60yezhdmczp') + assert_raises_rpc_error(-5, "Invalid address", self.generatetoaddress, self.nodes[0], 1, '3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy') if __name__ == '__main__': DisableWalletTest ().main () diff --git a/test/functional/wallet_importdescriptors.py b/test/functional/wallet_importdescriptors.py index fbd1d61be1..fe326a97d8 100755 --- a/test/functional/wallet_importdescriptors.py +++ b/test/functional/wallet_importdescriptors.py @@ -365,7 +365,7 @@ def run_test(self): # # Test importing a descriptor containing a WIF private key wif_priv = "cTe1f5rdT8A8DFgVWTjyPwACsDPJM9ff4QngFxUixCSvvbg1x6sh" - address = "2MuhcG52uHPknxDgmGPsV18jSHFBnnRgjPg" + address = "MAMYWDWqd46sYwL7h9ExCpzaPba53HhMh8" desc = "sh(wpkh(" + wif_priv + "))" self.log.info("Should import a descriptor with a WIF private key as spendable") self.test_importdesc({"desc": descsum_create(desc), diff --git a/test/functional/wallet_importmulti.py b/test/functional/wallet_importmulti.py index a504d1f04e..75527bccae 100755 --- a/test/functional/wallet_importmulti.py +++ b/test/functional/wallet_importmulti.py @@ -579,8 +579,8 @@ def run_test(self): # Test ranged descriptor fails if range is not specified xpriv = "tprv8ZgxMBicQKsPeuVhWwi6wuMQGfPKi9Li5GtX35jVNknACgqe3CY4g5xgkfDDJcmtF7o1QnxWDRYw4H5P26PXq7sbcUkEqeR4fg3Kxp2tigg" - addresses = ["2N7yv4p8G8yEaPddJxY41kPihnWvs39qCMf", "2MsHxyb2JS3pAySeNUsJ7mNnurtpeenDzLA"] # hdkeypath=m/0'/0'/0' and 1' - addresses += ["bcrt1qrd3n235cj2czsfmsuvqqpr3lu6lg0ju7scl8gn", "bcrt1qfqeppuvj0ww98r6qghmdkj70tv8qpchehegrg8"] # wpkh subscripts corresponding to the above addresses + addresses = ["MNdrJxcCUdaezMGfPHRUx5yqtsK9FyJXV1", "M7wuDjWEmiAFaAHiucfay543yFCvpH2FCd"] # hdkeypath=m/0'/0'/0' and 1' + addresses += ["rbgl1qrd3n235cj2czsfmsuvqqpr3lu6lg0ju7f8j03e", "rbgl1qfqeppuvj0ww98r6qghmdkj70tv8qpchewx9t3d"] # wpkh subscripts corresponding to the above addresses desc = "sh(wpkh(" + xpriv + "/0'/0'/*'" + "))" self.log.info("Ranged descriptor import should fail without a specified range") self.test_importmulti({"desc": descsum_create(desc), @@ -618,7 +618,7 @@ def run_test(self): # Test importing a descriptor containing a WIF private key wif_priv = "cTe1f5rdT8A8DFgVWTjyPwACsDPJM9ff4QngFxUixCSvvbg1x6sh" - address = "2MuhcG52uHPknxDgmGPsV18jSHFBnnRgjPg" + address = "MAMYWDWqd46sYwL7h9ExCpzaPba53HhMh8" desc = "sh(wpkh(" + wif_priv + "))" self.log.info("Should import a descriptor with a WIF private key as spendable") self.test_importmulti({"desc": descsum_create(desc), @@ -749,7 +749,7 @@ def run_test(self): self.log.info("Bech32m addresses and descriptors cannot be imported") self.test_importmulti( { - "scriptPubKey": {"address": "bcrt1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqc8gma6"}, + "scriptPubKey": {"address": "rbgl1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq9wa0mr"}, "timestamp": "now", }, success=False, @@ -860,11 +860,11 @@ def run_test(self): assert_equal(wrpc.getwalletinfo()["private_keys_enabled"], False) xpub = "tpubDAXcJ7s7ZwicqjprRaEWdPoHKrCS215qxGYxpusRLLmJuT69ZSicuGdSfyvyKpvUNYBW1s2U3NSrT6vrCYB9e6nZUEvrqnwXPF8ArTCRXMY" addresses = [ - 'bcrt1qtmp74ayg7p24uslctssvjm06q5phz4yrxucgnv', # m/0'/0'/0 - 'bcrt1q8vprchan07gzagd5e6v9wd7azyucksq2xc76k8', # m/0'/0'/1 - 'bcrt1qtuqdtha7zmqgcrr26n2rqxztv5y8rafjp9lulu', # m/0'/0'/2 - 'bcrt1qau64272ymawq26t90md6an0ps99qkrse58m640', # m/0'/0'/3 - 'bcrt1qsg97266hrh6cpmutqen8s4s962aryy77jp0fg0', # m/0'/0'/4 + 'rbgl1qtmp74ayg7p24uslctssvjm06q5phz4yrlr4q2x', # m/0'/0'/0 + 'rbgl1q8vprchan07gzagd5e6v9wd7azyucksq2l8nj0d', # m/0'/0'/1 + 'rbgl1qtuqdtha7zmqgcrr26n2rqxztv5y8rafjc6j5xk', # m/0'/0'/2 + 'rbgl1qau64272ymawq26t90md6an0ps99qkrsedckjv9', # m/0'/0'/3 + 'rbgl1qsg97266hrh6cpmutqen8s4s962aryy77t7zp39', # m/0'/0'/4 ] result = wrpc.importmulti( [{ diff --git a/test/functional/wallet_labels.py b/test/functional/wallet_labels.py index 9b15f4d438..d76ee9d8ac 100755 --- a/test/functional/wallet_labels.py +++ b/test/functional/wallet_labels.py @@ -34,7 +34,7 @@ def run_test(self): # the same address, so we call twice to get two addresses w/50 each self.generatetoaddress(node, nblocks=1, address=node.getnewaddress(label='coinbase')) self.generatetoaddress(node, nblocks=COINBASE_MATURITY + 1, address=node.getnewaddress(label='coinbase')) - assert_equal(node.getbalance(), 100) + assert_equal(node.getbalance(), 400) # there should be 2 address groups # each with 1 address with a balance of 200 BGLs @@ -152,7 +152,7 @@ def run_test(self): for l in BECH32_VALID: ad = BECH32_VALID[l] wallet_watch_only.importaddress(label=l, rescan=False, address=ad) - node.generatetoaddress(1, ad) + self.generatetoaddress(node, 1, ad) assert_equal(wallet_watch_only.getaddressesbylabel(label=l), {ad: {'purpose': 'receive'}}) assert_equal(wallet_watch_only.getreceivedbylabel(label=l), 0) for l in BECH32_INVALID: diff --git a/test/functional/wallet_multisig_descriptor_psbt.py b/test/functional/wallet_multisig_descriptor_psbt.py index ed855d2525..e4ad24259d 100755 --- a/test/functional/wallet_multisig_descriptor_psbt.py +++ b/test/functional/wallet_multisig_descriptor_psbt.py @@ -8,14 +8,14 @@ """ from test_framework.address import base58_to_byte -from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_framework import BGLTestFramework from test_framework.util import ( assert_approx, assert_equal, ) -class WalletMultisigDescriptorPSBTTest(BitcoinTestFramework): +class WalletMultisigDescriptorPSBTTest(BGLTestFramework): def set_test_params(self): self.num_nodes = 3 self.setup_clean_chain = True diff --git a/test/functional/wallet_multiwallet.py b/test/functional/wallet_multiwallet.py index 1e85903832..3a449f35d5 100755 --- a/test/functional/wallet_multiwallet.py +++ b/test/functional/wallet_multiwallet.py @@ -230,7 +230,7 @@ def wallet_file(name): w1, w2, w3, w4, *_ = wallets self.generatetoaddress(node, nblocks=COINBASE_MATURITY + 1, address=w1.getnewaddress(), sync_fun=self.no_op) - assert_equal(w1.getbalance(), 100) + assert_equal(w1.getbalance(), 400) assert_equal(w2.getbalance(), 0) assert_equal(w3.getbalance(), 0) assert_equal(w4.getbalance(), 0) diff --git a/test/functional/wallet_orphanedreward.py b/test/functional/wallet_orphanedreward.py index ff1d1bd49b..48b48ccd23 100755 --- a/test/functional/wallet_orphanedreward.py +++ b/test/functional/wallet_orphanedreward.py @@ -4,10 +4,10 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test orphaned block rewards in the wallet.""" -from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_framework import BGLTestFramework from test_framework.util import assert_equal -class OrphanedBlockRewardTest(BitcoinTestFramework): +class OrphanedBlockRewardTest(BGLTestFramework): def set_test_params(self): self.setup_clean_chain = True self.num_nodes = 2 @@ -32,8 +32,8 @@ def run_test(self): # the existing balance and the block reward. self.generate(self.nodes[0], 150) self.sync_blocks() - assert_equal(self.nodes[1].getbalance(), 10 + 25) - txid = self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), 30) + assert_equal(self.nodes[1].getbalance(), 10 + 100) + txid = self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), 105) # Orphan the block reward and make sure that the original coins # from the wallet can still be spent. diff --git a/test/functional/wallet_signmessagewithaddress.py b/test/functional/wallet_signmessagewithaddress.py index bf6f95e3f1..5a2b5cd6bc 100755 --- a/test/functional/wallet_signmessagewithaddress.py +++ b/test/functional/wallet_signmessagewithaddress.py @@ -4,12 +4,12 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test Wallet commands for signing and verifying messages.""" -from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_framework import BGLTestFramework from test_framework.util import ( assert_raises_rpc_error, ) -class SignMessagesWithAddressTest(BitcoinTestFramework): +class SignMessagesWithAddressTest(BGLTestFramework): def set_test_params(self): self.setup_clean_chain = True self.num_nodes = 1 diff --git a/test/functional/wallet_taproot.py b/test/functional/wallet_taproot.py index b22c171374..1c05c26412 100755 --- a/test/functional/wallet_taproot.py +++ b/test/functional/wallet_taproot.py @@ -7,7 +7,7 @@ import random from decimal import Decimal -from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_framework import BGLTestFramework from test_framework.util import assert_equal from test_framework.descriptors import descsum_create from test_framework.script import (CScript, OP_CHECKSIG, taproot_construct) @@ -169,7 +169,7 @@ def compute_taproot_address(pubkey, scripts): assert tap.scriptPubKey[1] == 0x20 return encode_segwit_address("bcrt", 1, tap.scriptPubKey[2:]) -class WalletTaprootTest(BitcoinTestFramework): +class WalletTaprootTest(BGLTestFramework): """Test generation and spending of P2TR address outputs.""" def set_test_params(self): diff --git a/test/functional/wallet_transactiontime_rescan.py b/test/functional/wallet_transactiontime_rescan.py index afa5139da7..cb4e974295 100755 --- a/test/functional/wallet_transactiontime_rescan.py +++ b/test/functional/wallet_transactiontime_rescan.py @@ -8,13 +8,13 @@ import time from test_framework.blocktools import COINBASE_MATURITY -from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_framework import BGLTestFramework from test_framework.util import ( assert_equal ) -class TransactionTimeRescanTest(BitcoinTestFramework): +class TransactionTimeRescanTest(BGLTestFramework): def set_test_params(self): self.setup_clean_chain = False self.num_nodes = 3 diff --git a/test/functional/wallet_txn_clone.py b/test/functional/wallet_txn_clone.py index c4958ee31a..a9415ea4a8 100755 --- a/test/functional/wallet_txn_clone.py +++ b/test/functional/wallet_txn_clone.py @@ -46,15 +46,15 @@ def run_test(self): else: output_type = "legacy" - # All nodes should start with 1,250 BTC: - starting_balance = 1250 + # All nodes should start with 5000 BGL: + starting_balance = 5000 for i in range(3): assert_equal(self.nodes[i].getbalance(), starting_balance) self.nodes[0].settxfee(.001) node0_address1 = self.nodes[0].getnewaddress(address_type=output_type) - node0_txid1 = self.nodes[0].sendtoaddress(node0_address1, 1219) + node0_txid1 = self.nodes[0].sendtoaddress(node0_address1, 4969) node0_tx1 = self.nodes[0].gettransaction(node0_txid1) self.nodes[0].lockunspent(False, [{"txid":node0_txid1, "vout": find_vout_for_address(self.nodes[0], node0_txid1, node0_address1)}]) @@ -97,11 +97,11 @@ def run_test(self): tx1 = self.nodes[0].gettransaction(txid1) tx2 = self.nodes[0].gettransaction(txid2) - # Node0's balance should be starting balance, plus 50BTC for another + # Node0's balance should be starting balance, plus 200 BGL for another # matured block, minus tx1 and tx2 amounts, and minus transaction fees: expected = starting_balance + node0_tx1["fee"] + node0_tx2["fee"] if self.options.mine_block: - expected += 50 + expected += 200 expected += tx1["amount"] + tx1["fee"] expected += tx2["amount"] + tx2["fee"] assert_equal(self.nodes[0].getbalance(), expected) @@ -140,11 +140,11 @@ def run_test(self): assert_equal(tx1_clone["confirmations"], 2) assert_equal(tx2["confirmations"], 1) - # Check node0's total balance; should be same as before the clone, + 100 BTC for 2 matured, + # Check node0's total balance; should be same as before the clone, + 400 BGL for 2 matured, # less possible orphaned matured subsidy - expected += 100 + expected += 400 if (self.options.mine_block): - expected -= 50 + expected -= 200 assert_equal(self.nodes[0].getbalance(), expected) diff --git a/test/functional/wallet_txn_doublespend.py b/test/functional/wallet_txn_doublespend.py index 683c31b456..b6bcc64a6f 100755 --- a/test/functional/wallet_txn_doublespend.py +++ b/test/functional/wallet_txn_doublespend.py @@ -37,8 +37,8 @@ def spend_txid(self, txid, vout, outputs): return self.nodes[0].sendrawtransaction(tx['hex']) def run_test(self): - # All nodes should start with 1,250 BTC: - starting_balance = 1250 + # All nodes should start with 5,000 BTC: + starting_balance = 5000 # All nodes should be out of IBD. # If the nodes are not all out of IBD, that can interfere with @@ -66,7 +66,7 @@ def run_test(self): # Coins are sent to node1_address node1_address = self.nodes[1].getnewaddress() - # First: use raw transaction API to send 1240 BTC to node1_address, + # First: use raw transaction API to send 1240 BGL to node1_address, # but don't broadcast: doublespend_fee = Decimal('-.02') rawtx_input_0 = {} @@ -84,7 +84,7 @@ def run_test(self): doublespend = self.nodes[0].signrawtransactionwithwallet(rawtx) assert_equal(doublespend["complete"], True) - # Create two spends using 1 50 BTC coin each + # Create two spends using 1 50 BGL coin each txid1 = self.spend_txid(fund_foo_txid, find_vout_for_address(self.nodes[0], fund_foo_txid, node0_address_foo), {node1_address: 40}) txid2 = self.spend_txid(fund_bar_txid, find_vout_for_address(self.nodes[0], fund_bar_txid, node0_address_bar), {node1_address: 20}) @@ -95,7 +95,7 @@ def run_test(self): tx1 = self.nodes[0].gettransaction(txid1) tx2 = self.nodes[0].gettransaction(txid2) - # Node0's balance should be starting balance, plus 50BTC for another + # Node0's balance should be starting balance, plus 50BGL for another # matured block, minus 40, minus 20, and minus transaction fees: expected = starting_balance + fund_foo_tx["fee"] + fund_bar_tx["fee"] if self.options.mine_block: @@ -134,14 +134,14 @@ def run_test(self): assert_equal(tx1["confirmations"], -2) assert_equal(tx2["confirmations"], -2) - # Node0's total balance should be starting balance, plus 100BTC for + # Node0's total balance should be starting balance, plus 400BGL for # two more matured blocks, minus 1240 for the double-spend, plus fees (which are # negative): - expected = starting_balance + 100 - 1240 + fund_foo_tx["fee"] + fund_bar_tx["fee"] + doublespend_fee + expected = starting_balance + 200*2 - 1240 + fund_foo_tx["fee"] + fund_bar_tx["fee"] + doublespend_fee assert_equal(self.nodes[0].getbalance(), expected) - # Node1's balance should be its initial balance (1250 for 25 block rewards) plus the doublespend: - assert_equal(self.nodes[1].getbalance(), 1250 + 1240) + # Node1's balance should be its initial balance (5000 for 25 block rewards) plus the doublespend: + assert_equal(self.nodes[1].getbalance(), 5000 + 1240) if __name__ == '__main__': From 1733768acedc407d4e84fa5a604dc8638a385a8c Mon Sep 17 00:00:00 2001 From: nadyka Date: Fri, 8 Jul 2022 13:43:29 +0400 Subject: [PATCH 019/144] mempool_ * test updates and fixes #50 PR --- test/functional/mempool_accept.py | 2 +- test/functional/mempool_spend_coinbase.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/test/functional/mempool_accept.py b/test/functional/mempool_accept.py index cf67020eef..cd3c1f78c2 100755 --- a/test/functional/mempool_accept.py +++ b/test/functional/mempool_accept.py @@ -38,7 +38,7 @@ class MempoolAcceptanceTest(BGLTestFramework): def set_test_params(self): self.num_nodes = 1 self.extra_args = [[ - '-txindex', + '-txindex', '-permitbaremultisig=0', ]] * self.num_nodes self.supports_cli = False diff --git a/test/functional/mempool_spend_coinbase.py b/test/functional/mempool_spend_coinbase.py index b1b49184ac..f79afc6387 100755 --- a/test/functional/mempool_spend_coinbase.py +++ b/test/functional/mempool_spend_coinbase.py @@ -20,7 +20,6 @@ class MempoolSpendCoinbaseTest(BGLTestFramework): def set_test_params(self): self.num_nodes = 1 - self.setup_clean_chain = True def run_test(self): wallet = MiniWallet(self.nodes[0]) From 5a5c764e829bfc4b51b16a51ea0adecc5c8c36eb Mon Sep 17 00:00:00 2001 From: nadyka Date: Fri, 8 Jul 2022 19:01:15 +0400 Subject: [PATCH 020/144] resolve incorrect merge --- src/util/system.cpp | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/util/system.cpp b/src/util/system.cpp index 797833604d..96a2dcf545 100644 --- a/src/util/system.cpp +++ b/src/util/system.cpp @@ -244,22 +244,6 @@ static std::optional InterpretValue(const KeyInfo& key, con return value; } -/** - * Check settings value validity according to flags. - * - * TODO: Add more meaningful error checks here in the future - * See "here's how the flags are meant to behave" in - * https://github.com/BGL/BGL/pull/16097#issuecomment-514627823 - */ -static bool CheckValid(const std::string& key, const util::SettingsValue& val, unsigned int flags, std::string& error) -{ - if (val.isBool() && !(flags & ArgsManager::ALLOW_BOOL)) { - error = strprintf("Negating of -%s is meaningless and therefore forbidden", key); - return false; - } - return true; -} - namespace { fs::path StripRedundantLastElementsOfPath(const fs::path& path) { From 742c1f630c7bad5acb8b3a32c5cfab139eb26af2 Mon Sep 17 00:00:00 2001 From: wu-emma <63286384+wu-emma@users.noreply.github.com> Date: Fri, 5 Aug 2022 21:23:35 +0000 Subject: [PATCH 021/144] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 58bf5b3d70..8c19c3d5c6 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Features: * Optional module for ECDH key exchange. * Optional module for Schnorr signatures according to [BIP-340](https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki) (experimental). -Bitgesell is a fork of BGL with the following changes:
    +Bitgesell is a fork of Bitcoin with the following changes:
    * Block Reward [Burn rate is 90% of tx fees] ```sh nFees*0.1 + GetBlockSubsidy() From 0d3b95091d9bca912ed553654a9b1266c856bbd7 Mon Sep 17 00:00:00 2001 From: nadyka Date: Mon, 22 Aug 2022 18:48:59 +0400 Subject: [PATCH 022/144] generate seeds update --- contrib/seeds/asmap.py | 807 ++++++++++++++++++++++++++++++++ contrib/seeds/generate-seeds.py | 29 +- contrib/seeds/makeseeds.py | 177 ++++--- 3 files changed, 927 insertions(+), 86 deletions(-) create mode 100644 contrib/seeds/asmap.py diff --git a/contrib/seeds/asmap.py b/contrib/seeds/asmap.py new file mode 100644 index 0000000000..f0efc9aad5 --- /dev/null +++ b/contrib/seeds/asmap.py @@ -0,0 +1,807 @@ +# Copyright (c) 2022 Pieter Wuille +# Distributed under the MIT software license, see the accompanying +# file LICENSE or http://www.opensource.org/licenses/mit-license.php. + +""" +This module provides the ASNEntry and ASMap classes. +""" + +import copy +import ipaddress +import random +import unittest +from enum import Enum +from functools import total_ordering +from typing import Callable, Dict, Iterable, List, Optional, Tuple, Union, overload + +def net_to_prefix(net: Union[ipaddress.IPv4Network,ipaddress.IPv6Network]) -> List[bool]: + """ + Convert an IPv4 or IPv6 network to a prefix represented as a list of bits. + IPv4 ranges are remapped to their IPv4-mapped IPv6 range (::ffff:0:0/96). + """ + num_bits = net.prefixlen + netrange = int.from_bytes(net.network_address.packed, 'big') + + # Map an IPv4 prefix into IPv6 space. + if isinstance(net, ipaddress.IPv4Network): + num_bits += 96 + netrange += 0xffff00000000 + + # Strip unused bottom bits. + assert (netrange & ((1 << (128 - num_bits)) - 1)) == 0 + return [((netrange >> (127 - i)) & 1) != 0 for i in range(num_bits)] + +def prefix_to_net(prefix: List[bool]) -> Union[ipaddress.IPv4Network,ipaddress.IPv6Network]: + """The reverse operation of net_to_prefix.""" + # Convert to number + netrange = sum(b << (127 - i) for i, b in enumerate(prefix)) + num_bits = len(prefix) + assert num_bits <= 128 + + # Return IPv4 range if in ::ffff:0:0/96 + if num_bits >= 96 and (netrange >> 32) == 0xffff: + return ipaddress.IPv4Network((netrange & 0xffffffff, num_bits - 96), True) + + # Return IPv6 range otherwise. + return ipaddress.IPv6Network((netrange, num_bits), True) + +# Shortcut for (prefix, ASN) entries. +ASNEntry = Tuple[List[bool], int] + +# Shortcut for (prefix, old ASN, new ASN) entries. +ASNDiff = Tuple[List[bool], int, int] + +class _VarLenCoder: + """ + A class representing a custom variable-length binary encoder/decoder for + integers. Each object represents a different coder, with different parameters + minval and clsbits. + The encoding is easiest to describe using an example. Let's say minval=100 and + clsbits=[4,2,2,3]. In that case: + - x in [100..115]: encoded as [0] + [4-bit BE encoding of (x-100)]. + - x in [116..119]: encoded as [1,0] + [2-bit BE encoding of (x-116)]. + - x in [120..123]: encoded as [1,1,0] + [2-bit BE encoding of (x-120)]. + - x in [124..131]: encoded as [1,1,1] + [3-bit BE encoding of (x-124)]. + In general, every number is encoded as: + - First, k "1"-bits, where k is the class the number falls in (there is one class + per element of clsbits). + - Then, a "0"-bit, unless k is the highest class, in which case there is nothing. + - Lastly, clsbits[k] bits encoding in big endian the position in its class that + number falls into. + - Every class k consists of 2^clsbits[k] consecutive integers. k=0 starts at minval, + other classes start one past the last element of the class before it. + """ + + def __init__(self, minval: int, clsbits: List[int]): + """Construct a new _VarLenCoder.""" + self._minval = minval + self._clsbits = clsbits + self._maxval = minval + sum(1 << b for b in clsbits) - 1 + + def can_encode(self, val: int) -> bool: + """Check whether value val is in the range this coder supports.""" + return self._minval <= val <= self._maxval + + def encode(self, val: int, ret: List[int]) -> None: + """Append encoding of val onto integer list ret.""" + + assert self._minval <= val <= self._maxval + val -= self._minval + bits = 0 + for k, bits in enumerate(self._clsbits): + if val >> bits: + # If the value will not fit in class k, subtract its range from v, + # emit a "1" bit and continue with the next class. + val -= 1 << bits + ret.append(1) + else: + if k + 1 < len(self._clsbits): + # Unless we're in the last class, emit a "0" bit. + ret.append(0) + break + # And then encode v (now the position within the class) in big endian. + ret.extend((val >> (bits - 1 - b)) & 1 for b in range(bits)) + + def encode_size(self, val: int) -> int: + """Compute how many bits are needed to encode val.""" + assert self._minval <= val <= self._maxval + val -= self._minval + ret = 0 + bits = 0 + for k, bits in enumerate(self._clsbits): + if val >> bits: + val -= 1 << bits + ret += 1 + else: + ret += k + 1 < len(self._clsbits) + break + return ret + bits + + def decode(self, stream, bitpos) -> Tuple[int,int]: + """Decode a number starting at bitpos in stream, returning value and new bitpos.""" + val = self._minval + bits = 0 + for k, bits in enumerate(self._clsbits): + bit = 0 + if k + 1 < len(self._clsbits): + bit = stream[bitpos] + bitpos += 1 + if not bit: + break + val += 1 << bits + for i in range(bits): + bit = stream[bitpos] + bitpos += 1 + val += bit << (bits - 1 - i) + return val, bitpos + +# Variable-length encoders used in the binary asmap format. +_CODER_INS = _VarLenCoder(0, [0, 0, 1]) +_CODER_ASN = _VarLenCoder(1, list(range(15, 25))) +_CODER_MATCH = _VarLenCoder(2, list(range(1, 9))) +_CODER_JUMP = _VarLenCoder(17, list(range(5, 31))) + +class _Instruction(Enum): + """One instruction in the binary asmap format.""" + # A return instruction, encoded as [0], returns a constant ASN. It is followed by + # an integer using the ASN encoding. + RETURN = 0 + # A jump instruction, encoded as [1,0] inspects the next unused bit in the input + # and either continues execution (if 0), or skips a specified number of bits (if 1). + # It is followed by an integer, and then two subprograms. The integer uses jump encoding + # and corresponds to the length of the first subprogram (so it can be skipped). + JUMP = 1 + # A match instruction, encoded as [1,1,0] inspects 1 or more of the next unused bits + # in the input with its argument. If they all match, execution continues. If they do + # not, failure is returned. If a default instruction has been executed before, instead + # of failure the default instruction's argument is returned. It is followed by an + # integer in match encoding, and a subprogram. That value is at least 2 bits and at + # most 9 bits. An n-bit value signifies matching (n-1) bits in the input with the lower + # (n-1) bits in the match value. + MATCH = 2 + # A default instruction, encoded as [1,1,1] sets the default variable to its argument, + # and continues execution. It is followed by an integer in ASN encoding, and a subprogram. + DEFAULT = 3 + # Not an actual instruction, but a way to encode the empty program that fails. In the + # encoder, it is used more generally to represent the failure case inside MATCH instructions, + # which may (if used inside the context of a DEFAULT instruction) actually correspond to + # a successful return. In this usage, they're always converted to an actual MATCH or RETURN + # before the top level is reached (see make_default below). + END = 4 + +class _BinNode: + """A class representing a (node of) the parsed binary asmap format.""" + + @overload + def __init__(self, ins: _Instruction): ... + @overload + def __init__(self, ins: _Instruction, arg1: int): ... + @overload + def __init__(self, ins: _Instruction, arg1: "_BinNode", arg2: "_BinNode"): ... + @overload + def __init__(self, ins: _Instruction, arg1: int, arg2: "_BinNode"): ... + + def __init__(self, ins: _Instruction, arg1=None, arg2=None): + """ + Construct a new asmap node. Possibilities are: + - _BinNode(_Instruction.RETURN, asn) + - _BinNode(_Instruction.JUMP, node_0, node_1) + - _BinNode(_Instruction.MATCH, val, node) + - _BinNode(_Instruction.DEFAULT, asn, node) + - _BinNode(_Instruction.END) + """ + self.ins = ins + self.arg1 = arg1 + self.arg2 = arg2 + if ins == _Instruction.RETURN: + assert isinstance(arg1, int) + assert arg2 is None + self.size = _CODER_INS.encode_size(ins.value) + _CODER_ASN.encode_size(arg1) + elif ins == _Instruction.JUMP: + assert isinstance(arg1, _BinNode) + assert isinstance(arg2, _BinNode) + self.size = (_CODER_INS.encode_size(ins.value) + _CODER_JUMP.encode_size(arg1.size) + + arg1.size + arg2.size) + elif ins == _Instruction.DEFAULT: + assert isinstance(arg1, int) + assert isinstance(arg2, _BinNode) + self.size = _CODER_INS.encode_size(ins.value) + _CODER_ASN.encode_size(arg1) + arg2.size + elif ins == _Instruction.MATCH: + assert isinstance(arg1, int) + assert isinstance(arg2, _BinNode) + self.size = (_CODER_INS.encode_size(ins.value) + _CODER_MATCH.encode_size(arg1) + + arg2.size) + elif ins == _Instruction.END: + assert arg1 is None + assert arg2 is None + self.size = 0 + else: + assert False + + @staticmethod + def make_end() -> "_BinNode": + """Constructor for a _BinNode with just an END instruction.""" + return _BinNode(_Instruction.END) + + @staticmethod + def make_leaf(val: int) -> "_BinNode": + """Constructor for a _BinNode of just a RETURN instruction.""" + assert val is not None and val > 0 + return _BinNode(_Instruction.RETURN, val) + + @staticmethod + def make_branch(node0: "_BinNode", node1: "_BinNode") -> "_BinNode": + """ + Construct a _BinNode corresponding to running either the node0 or node1 subprogram, + based on the next input bit. It exploits shortcuts that are possible in the encoding, + and uses either a JUMP, MATCH, or END instruction. + """ + if node0.ins == _Instruction.END and node1.ins == _Instruction.END: + return node0 + if node0.ins == _Instruction.END: + if node1.ins == _Instruction.MATCH and node1.arg1 <= 0xFF: + return _BinNode(node1.ins, node1.arg1 + (1 << node1.arg1.bit_length()), node1.arg2) + return _BinNode(_Instruction.MATCH, 3, node1) + if node1.ins == _Instruction.END: + if node0.ins == _Instruction.MATCH and node0.arg1 <= 0xFF: + return _BinNode(node0.ins, node0.arg1 + (1 << (node0.arg1.bit_length() - 1)), + node0.arg2) + return _BinNode(_Instruction.MATCH, 2, node0) + return _BinNode(_Instruction.JUMP, node0, node1) + + @staticmethod + def make_default(val: int, sub: "_BinNode") -> "_BinNode": + """ + Construct a _BinNode that corresponds to the specified subprogram, with the specified + default value. It exploits shortcuts that are possible in the encoding, and will use + either a DEFAULT or a RETURN instruction.""" + assert val is not None and val > 0 + if sub.ins == _Instruction.END: + return _BinNode(_Instruction.RETURN, val) + if sub.ins in (_Instruction.RETURN, _Instruction.DEFAULT): + return sub + return _BinNode(_Instruction.DEFAULT, val, sub) + +@total_ordering +class ASMap: + """ + A class whose objects represent a mapping from subnets to ASNs. + Internally the mapping is stored as a binary trie, but can be converted + from/to a list of ASNEntry objects, and from/to the binary asmap file format. + In the trie representation, nodes are represented as bare lists for efficiency + and ease of manipulation: + - [0] means an unassigned subnet (no ASN mapping for it is present) + - [int] means a subnet mapped entirely to the specified ASN. + - [node,node] means a subnet whose lower half and upper half have different + - mappings, represented by new trie nodes. + """ + + def update(self, prefix: List[bool], asn: int) -> None: + """Update this ASMap object to map prefix to the specified asn.""" + assert asn == 0 or _CODER_ASN.can_encode(asn) + + def recurse(node: List, offset: int) -> None: + if offset == len(prefix): + # Reached the end of prefix; overwrite this node. + node.clear() + node.append(asn) + return + if len(node) == 1: + # Need to descend into a leaf node; split it up. + oldasn = node[0] + node.clear() + node.append([oldasn]) + node.append([oldasn]) + # Descend into the node. + recurse(node[prefix[offset]], offset + 1) + # If the result is two identical leaf children, merge them. + if len(node[0]) == 1 and len(node[1]) == 1 and node[0] == node[1]: + oldasn = node[0][0] + node.clear() + node.append(oldasn) + recurse(self._trie, 0) + + def update_multi(self, entries: List[Tuple[List[bool], int]]) -> None: + """Apply multiple update operations, where longer prefixes take precedence.""" + entries.sort(key=lambda entry: len(entry[0])) + for prefix, asn in entries: + self.update(prefix, asn) + + def _set_trie(self, trie) -> None: + """Set trie directly. Internal use only.""" + def recurse(node: List) -> None: + if len(node) < 2: + return + recurse(node[0]) + recurse(node[1]) + if len(node[0]) == 2: + return + if node[0] == node[1]: + if len(node[0]) == 0: + node.clear() + else: + asn = node[0][0] + node.clear() + node.append(asn) + recurse(trie) + self._trie = trie + + def __init__(self, entries: Optional[Iterable[ASNEntry]] = None) -> None: + """Construct an ASMap object from an optional list of entries.""" + self._trie = [0] + if entries is not None: + def entry_key(entry): + """Sort function that places shorter prefixes first.""" + prefix, asn = entry + return len(prefix), prefix, asn + for prefix, asn in sorted(entries, key=entry_key): + self.update(prefix, asn) + + def lookup(self, prefix: List[bool]) -> Optional[int]: + """Look up a prefix. Returns ASN, or 0 if unassigned, or None if indeterminate.""" + node = self._trie + for bit in prefix: + if len(node) == 1: + break + node = node[bit] + if len(node) == 1: + return node[0] + return None + + def _to_entries_flat(self, fill: bool = False) -> List[ASNEntry]: + """Convert an ASMap object to a list of non-overlapping (prefix, asn) objects.""" + prefix : List[bool] = [] + + def recurse(node: List) -> List[ASNEntry]: + ret = [] + if len(node) == 1: + if node[0] > 0: + ret = [(list(prefix), node[0])] + elif len(node) == 2: + prefix.append(False) + ret = recurse(node[0]) + prefix[-1] = True + ret += recurse(node[1]) + prefix.pop() + if fill and len(ret) > 1: + asns = set(x[1] for x in ret) + if len(asns) == 1: + ret = [(list(prefix), list(asns)[0])] + return ret + return recurse(self._trie) + + def _to_entries_minimal(self, fill: bool = False) -> List[ASNEntry]: + """Convert a trie to a minimal list of ASNEntry objects, exploiting overlap.""" + prefix : List[bool] = [] + + def recurse(node: List) -> (Tuple[Dict[Optional[int], List[ASNEntry]], bool]): + if len(node) == 1 and node[0] == 0: + return {None if fill else 0: []}, True + if len(node) == 1: + return {node[0]: [], None: [(list(prefix), node[0])]}, False + ret: Dict[Optional[int], List[ASNEntry]] = {} + prefix.append(False) + left, lhole = recurse(node[0]) + prefix[-1] = True + right, rhole = recurse(node[1]) + prefix.pop() + hole = not fill and (lhole or rhole) + def candidate(ctx: Optional[int], res0: Optional[List[ASNEntry]], + res1: Optional[List[ASNEntry]]): + if res0 is not None and res1 is not None: + if ctx not in ret or len(res0) + len(res1) < len(ret[ctx]): + ret[ctx] = res0 + res1 + for ctx in set(left) | set(right): + candidate(ctx, left.get(ctx), right.get(ctx)) + candidate(ctx, left.get(None), right.get(ctx)) + candidate(ctx, left.get(ctx), right.get(None)) + if not hole: + for ctx in list(ret): + if ctx is not None: + candidate(None, [(list(prefix), ctx)], ret[ctx]) + if None in ret: + ret = {ctx:entries for ctx, entries in ret.items() + if ctx is None or len(entries) < len(ret[None])} + if hole: + ret = {ctx:entries for ctx, entries in ret.items() if ctx is None or ctx == 0} + return ret, hole + res, _ = recurse(self._trie) + return res[0] if 0 in res else res[None] + + def __str__(self) -> str: + """Convert this ASMap object to a string containing Python code constructing it.""" + return f"ASMap({self._trie})" + + def to_entries(self, overlapping: bool = True, fill: bool = False) -> List[ASNEntry]: + """ + Convert the mappings in this ASMap object to a list of ASNEntry objects. + Arguments: + overlapping: Permit the subnets in the resulting ASNEntry to overlap. + Setting this can result in a shorter list. + fill: Permit the resulting ASNEntry objects to cover subnets that + are unassigned in this ASMap object. Setting this can + result in a shorter list. + """ + if overlapping: + return self._to_entries_minimal(fill) + return self._to_entries_flat(fill) + + @staticmethod + def from_random(num_leaves: int = 10, max_asn: int = 6, + unassigned_prob: float = 0.5) -> "ASMap": + """ + Construct a random ASMap object, with specified: + - Number of leaves in its trie (at least 1) + - Maximum ASN value (at least 1) + - Probability for leaf nodes to be unassigned + The number of leaves in the resulting object may be less than what is + requested. This method is mostly intended for testing. + """ + assert num_leaves >= 1 + assert max_asn >= 1 or unassigned_prob == 1 + assert _CODER_ASN.can_encode(max_asn) + assert 0.0 <= unassigned_prob <= 1.0 + trie: List = [] + leaves = [trie] + ret = ASMap() + for i in range(1, num_leaves): + idx = random.randrange(i) + leaf = leaves[idx] + lastleaf = leaves.pop() + if idx + 1 < i: + leaves[idx] = lastleaf + leaf.append([]) + leaf.append([]) + leaves.append(leaf[0]) + leaves.append(leaf[1]) + for leaf in leaves: + if random.random() >= unassigned_prob: + leaf.append(random.randrange(1, max_asn + 1)) + else: + leaf.append(0) + #pylint: disable=protected-access + ret._set_trie(trie) + return ret + + def _to_binnode(self, fill: bool = False) -> _BinNode: + """Convert a trie to a _BinNode object.""" + def recurse(node: List) -> Tuple[Dict[Optional[int], _BinNode], bool]: + if len(node) == 1 and node[0] == 0: + return {(None if fill else 0): _BinNode.make_end()}, True + if len(node) == 1: + return {None: _BinNode.make_leaf(node[0]), node[0]: _BinNode.make_end()}, False + ret: Dict[Optional[int], _BinNode] = {} + left, lhole = recurse(node[0]) + right, rhole = recurse(node[1]) + hole = (lhole or rhole) and not fill + + def candidate(ctx: Optional[int], arg1, arg2, func: Callable): + if arg1 is not None and arg2 is not None: + cand = func(arg1, arg2) + if ctx not in ret or cand.size < ret[ctx].size: + ret[ctx] = cand + + for ctx in set(left) | set(right): + candidate(ctx, left.get(ctx), right.get(ctx), _BinNode.make_branch) + candidate(ctx, left.get(None), right.get(ctx), _BinNode.make_branch) + candidate(ctx, left.get(ctx), right.get(None), _BinNode.make_branch) + if not hole: + for ctx in set(ret) - set([None]): + candidate(None, ctx, ret[ctx], _BinNode.make_default) + if None in ret: + ret = {ctx:enc for ctx, enc in ret.items() + if ctx is None or enc.size < ret[None].size} + if hole: + ret = {ctx:enc for ctx, enc in ret.items() if ctx is None or ctx == 0} + return ret, hole + res, _ = recurse(self._trie) + return res[0] if 0 in res else res[None] + + @staticmethod + def _from_binnode(binnode: _BinNode) -> "ASMap": + """Construct an ASMap object from a _BinNode. Internal use only.""" + def recurse(node: _BinNode, default: int) -> List: + if node.ins == _Instruction.RETURN: + return [node.arg1] + if node.ins == _Instruction.JUMP: + return [recurse(node.arg1, default), recurse(node.arg2, default)] + if node.ins == _Instruction.MATCH: + val = node.arg1 + sub = recurse(node.arg2, default) + while val >= 2: + bit = val & 1 + val >>= 1 + if bit: + sub = [[default], sub] + else: + sub = [sub, [default]] + return sub + assert node.ins == _Instruction.DEFAULT + return recurse(node.arg2, node.arg1) + ret = ASMap() + if binnode.ins != _Instruction.END: + #pylint: disable=protected-access + ret._set_trie(recurse(binnode, 0)) + return ret + + def to_binary(self, fill: bool = False) -> bytes: + """ + Convert this ASMap object to binary. + Argument: + fill: permit the resulting binary encoder to contain mappers for + unassigned subnets in this ASMap object. Doing so may + reduce the size of the encoding. + Returns: + A bytes object with the encoding of this ASMap object. + """ + bits: List[int] = [] + + def recurse(node: _BinNode) -> None: + _CODER_INS.encode(node.ins.value, bits) + if node.ins == _Instruction.RETURN: + _CODER_ASN.encode(node.arg1, bits) + elif node.ins == _Instruction.JUMP: + _CODER_JUMP.encode(node.arg1.size, bits) + recurse(node.arg1) + recurse(node.arg2) + elif node.ins == _Instruction.DEFAULT: + _CODER_ASN.encode(node.arg1, bits) + recurse(node.arg2) + else: + assert node.ins == _Instruction.MATCH + _CODER_MATCH.encode(node.arg1, bits) + recurse(node.arg2) + + binnode = self._to_binnode(fill) + if binnode.ins != _Instruction.END: + recurse(binnode) + + val = 0 + nbits = 0 + ret = [] + for bit in bits: + val += (bit << nbits) + nbits += 1 + if nbits == 8: + ret.append(val) + val = 0 + nbits = 0 + if nbits: + ret.append(val) + return bytes(ret) + + @staticmethod + def from_binary(bindata: bytes) -> Optional["ASMap"]: + """Decode an ASMap object from the provided binary encoding.""" + + bits: List[int] = [] + for byte in bindata: + bits.extend((byte >> i) & 1 for i in range(8)) + + def recurse(bitpos: int) -> Tuple[_BinNode, int]: + insval, bitpos = _CODER_INS.decode(bits, bitpos) + ins = _Instruction(insval) + if ins == _Instruction.RETURN: + asn, bitpos = _CODER_ASN.decode(bits, bitpos) + return _BinNode(ins, asn), bitpos + if ins == _Instruction.JUMP: + jump, bitpos = _CODER_JUMP.decode(bits, bitpos) + left, bitpos1 = recurse(bitpos) + if bitpos1 != bitpos + jump: + raise ValueError("Inconsistent jump") + right, bitpos = recurse(bitpos1) + return _BinNode(ins, left, right), bitpos + if ins == _Instruction.MATCH: + match, bitpos = _CODER_MATCH.decode(bits, bitpos) + sub, bitpos = recurse(bitpos) + return _BinNode(ins, match, sub), bitpos + assert ins == _Instruction.DEFAULT + asn, bitpos = _CODER_ASN.decode(bits, bitpos) + sub, bitpos = recurse(bitpos) + return _BinNode(ins, asn, sub), bitpos + + if len(bits) == 0: + binnode = _BinNode(_Instruction.END) + else: + try: + binnode, bitpos = recurse(0) + except (ValueError, IndexError): + return None + if bitpos < len(bits) - 7: + return None + if not all(bit == 0 for bit in bits[bitpos:]): + return None + + return ASMap._from_binnode(binnode) + + def __lt__(self, other: "ASMap") -> bool: + return self._trie < other._trie + + def __eq__(self, other: object) -> bool: + if isinstance(other, ASMap): + return self._trie == other._trie + return False + + def extends(self, req: "ASMap") -> bool: + """Determine whether this matches req for all subranges where req is assigned.""" + def recurse(actual: List, require: List) -> bool: + if len(require) == 1 and require[0] == 0: + return True + if len(require) == 1: + if len(actual) == 1: + return bool(require[0] == actual[0]) + return recurse(actual[0], require) and recurse(actual[1], require) + if len(actual) == 2: + return recurse(actual[0], require[0]) and recurse(actual[1], require[1]) + return recurse(actual, require[0]) and recurse(actual, require[1]) + assert isinstance(req, ASMap) + #pylint: disable=protected-access + return recurse(self._trie, req._trie) + + def diff(self, other: "ASMap") -> List[ASNDiff]: + """Compute the diff from self to other.""" + prefix: List[bool] = [] + ret: List[ASNDiff] = [] + + def recurse(old_node: List, new_node: List): + if len(old_node) == 1 and len(new_node) == 1: + if old_node[0] != new_node[0]: + ret.append((list(prefix), old_node[0], new_node[0])) + else: + old_left: List = old_node if len(old_node) == 1 else old_node[0] + old_right: List = old_node if len(old_node) == 1 else old_node[1] + new_left: List = new_node if len(new_node) == 1 else new_node[0] + new_right: List = new_node if len(new_node) == 1 else new_node[1] + prefix.append(False) + recurse(old_left, new_left) + prefix[-1] = True + recurse(old_right, new_right) + prefix.pop() + assert isinstance(other, ASMap) + #pylint: disable=protected-access + recurse(self._trie, other._trie) + return ret + + def __copy__(self) -> "ASMap": + """Construct a copy of this ASMap object. Its state will not be shared.""" + ret = ASMap() + #pylint: disable=protected-access + ret._set_trie(copy.deepcopy(self._trie)) + return ret + + def __deepcopy__(self, _) -> "ASMap": + # ASMap objects do not allow sharing of the _trie member, so we don't need the memoization. + return self.__copy__() + + +class TestASMap(unittest.TestCase): + """Unit tests for this module.""" + + def test_ipv6_prefix_roundtrips(self) -> None: + """Test that random IPv6 network ranges roundtrip through prefix encoding.""" + for _ in range(20): + net_bits = random.getrandbits(128) + for prefix_len in range(0, 129): + masked_bits = (net_bits >> (128 - prefix_len)) << (128 - prefix_len) + net = ipaddress.IPv6Network((masked_bits.to_bytes(16, 'big'), prefix_len)) + prefix = net_to_prefix(net) + self.assertTrue(len(prefix) <= 128) + net2 = prefix_to_net(prefix) + self.assertEqual(net, net2) + + def test_ipv4_prefix_roundtrips(self) -> None: + """Test that random IPv4 network ranges roundtrip through prefix encoding.""" + for _ in range(100): + net_bits = random.getrandbits(32) + for prefix_len in range(0, 33): + masked_bits = (net_bits >> (32 - prefix_len)) << (32 - prefix_len) + net = ipaddress.IPv4Network((masked_bits.to_bytes(4, 'big'), prefix_len)) + prefix = net_to_prefix(net) + self.assertTrue(32 <= len(prefix) <= 128) + net2 = prefix_to_net(prefix) + self.assertEqual(net, net2) + + def test_asmap_roundtrips(self) -> None: + """Test case that verifies random ASMap objects roundtrip to/from entries/binary.""" + # Iterate over the number of leaves the random test ASMap objects have. + for leaves in range(1, 20): + # Iterate over the number of bits in the AS numbers used. + for asnbits in range(0, 24): + # Iterate over the probability that leaves are unassigned. + for pct in range(101): + # Construct a random ASMap object according to the above parameters. + asmap = ASMap.from_random(num_leaves=leaves, max_asn=1 + (1 << asnbits), + unassigned_prob=0.01 * pct) + # Run tests for to_entries and construction from those entries, both + # for overlapping and non-overlapping ones. + for overlapping in [False, True]: + entries = asmap.to_entries(overlapping=overlapping, fill=False) + random.shuffle(entries) + asmap2 = ASMap(entries) + assert asmap2 is not None + self.assertEqual(asmap2, asmap) + entries = asmap.to_entries(overlapping=overlapping, fill=True) + random.shuffle(entries) + asmap2 = ASMap(entries) + assert asmap2 is not None + self.assertTrue(asmap2.extends(asmap)) + + # Run tests for to_binary and construction from binary. + enc = asmap.to_binary(fill=False) + asmap3 = ASMap.from_binary(enc) + assert asmap3 is not None + self.assertEqual(asmap3, asmap) + enc = asmap.to_binary(fill=True) + asmap3 = ASMap.from_binary(enc) + assert asmap3 is not None + self.assertTrue(asmap3.extends(asmap)) + + def test_patching(self) -> None: + """Test behavior of update, lookup, extends, and diff.""" + #pylint: disable=too-many-locals,too-many-nested-blocks + # Iterate over the number of leaves the random test ASMap objects have. + for leaves in range(1, 20): + # Iterate over the number of bits in the AS numbers used. + for asnbits in range(0, 10): + # Iterate over the probability that leaves are unassigned. + for pct in range(0, 101): + # Construct a random ASMap object according to the above parameters. + asmap = ASMap.from_random(num_leaves=leaves, max_asn=1 + (1 << asnbits), + unassigned_prob=0.01 * pct) + # Make a copy of that asmap object to which patches will be applied. + # It starts off being equal to asmap. + patched = copy.copy(asmap) + # Keep a list of patches performed. + patches: List[ASNEntry] = [] + # Initially there cannot be any difference. + self.assertEqual(asmap.diff(patched), []) + # Make 5 patches, each building on top of the previous ones. + for _ in range(0, 5): + # Construct a random path and new ASN to assign it to, apply it to patched, + # and remember it in patches. + pathlen = random.randrange(5) + path = [random.getrandbits(1) != 0 for _ in range(pathlen)] + newasn = random.randrange(1 + (1 << asnbits)) + patched.update(path, newasn) + patches = [(path, newasn)] + patches + + # Compute the diff, and whether asmap extends patched, and the other way + # around. + diff = asmap.diff(patched) + self.assertEqual(asmap == patched, len(diff) == 0) + extends = asmap.extends(patched) + back_extends = patched.extends(asmap) + # Determine whether those extends results are consistent with the diff + # result. + self.assertEqual(extends, all(d[2] == 0 for d in diff)) + self.assertEqual(back_extends, all(d[1] == 0 for d in diff)) + # For every diff found: + for path, old_asn, new_asn in diff: + # Verify asmap and patched actually differ there. + self.assertTrue(old_asn != new_asn) + self.assertEqual(asmap.lookup(path), old_asn) + self.assertEqual(patched.lookup(path), new_asn) + for _ in range(2): + # Extend the path far enough that it's smaller than any mapped + # range, and check the lookup holds there too. + spec_path = list(path) + while len(spec_path) < 32: + spec_path.append(random.getrandbits(1) != 0) + self.assertEqual(asmap.lookup(spec_path), old_asn) + self.assertEqual(patched.lookup(spec_path), new_asn) + # Search through the list of performed patches to find the last one + # applying to the extended path (note that patches is in reverse + # order, so the first match should work). + found = False + for patch_path, patch_asn in patches: + if spec_path[:len(patch_path)] == patch_path: + # When found, it must match whatever the result was patched + # to. + self.assertEqual(new_asn, patch_asn) + found = True + break + # And such a patch must exist. + self.assertTrue(found) + +if __name__ == '__main__': + unittest.main() diff --git a/contrib/seeds/generate-seeds.py b/contrib/seeds/generate-seeds.py index 151cafb287..e3647e443f 100755 --- a/contrib/seeds/generate-seeds.py +++ b/contrib/seeds/generate-seeds.py @@ -4,29 +4,22 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. ''' Script to generate list of seed nodes for chainparams.cpp. - This script expects two text files in the directory that is passed as an argument: - nodes_main.txt nodes_test.txt - -These files must consist of lines in the format - +These files must consist of lines in the format : []: .onion: .b32.i2p: - The output will be two data structures with the peers in binary format: - static const uint8_t chainparams_seed_{main,test}[]={ ... } - These should be pasted into `src/chainparamsseeds.h`. ''' -from __future__ import print_function, division + from base64 import b32decode from enum import Enum import struct @@ -58,10 +51,10 @@ def name_to_bip155(addr): if len(vchAddr) == 32: return (BIP155Network.I2P, vchAddr) else: - raise ValueError(f'Invalid I2P {vchAddr}') + raise ValueError(f"Invalid I2P {vchAddr}") elif '.' in addr: # IPv4 return (BIP155Network.IPV4, bytes((int(x) for x in addr.split('.')))) - elif ':' in addr: # IPv6 + elif ':' in addr: # IPv6 or CJDNS sub = [[], []] # prefix, suffix x = 0 addr = addr.split(':') @@ -77,7 +70,14 @@ def name_to_bip155(addr): sub[x].append(val & 0xff) nullbytes = 16 - len(sub[0]) - len(sub[1]) assert((x == 0 and nullbytes == 0) or (x == 1 and nullbytes > 0)) - return (BIP155Network.IPV6, bytes(sub[0] + ([0] * nullbytes) + sub[1])) + addr_bytes = bytes(sub[0] + ([0] * nullbytes) + sub[1]) + if addr_bytes[0] == 0xfc: + # Assume that seeds with fc00::/8 addresses belong to CJDNS, + # not to the publicly unroutable "Unique Local Unicast" network, see + # RFC4193: https://datatracker.ietf.org/doc/html/rfc4193#section-8 + return (BIP155Network.CJDNS, addr_bytes) + else: + return (BIP155Network.IPV6, addr_bytes) else: raise ValueError('Could not parse address %s' % addr) @@ -149,13 +149,13 @@ def process_nodes(g, f, structname): def main(): if len(sys.argv)<2: print(('Usage: %s ' % sys.argv[0]), file=sys.stderr) - exit(1) + sys.exit(1) g = sys.stdout indir = sys.argv[1] g.write('#ifndef BGL_CHAINPARAMSSEEDS_H\n') g.write('#define BGL_CHAINPARAMSSEEDS_H\n') g.write('/**\n') - g.write(' * List of fixed seed nodes for the falco network\n') + g.write(' * List of fixed seed nodes for the bitgesell network\n') g.write(' * AUTOGENERATED by contrib/seeds/generate-seeds.py\n') g.write(' *\n') g.write(' * Each line contains a BIP155 serialized (networkID, addr, port) tuple.\n') @@ -169,4 +169,3 @@ def main(): if __name__ == '__main__': main() - diff --git a/contrib/seeds/makeseeds.py b/contrib/seeds/makeseeds.py index d61ace777b..89652948e8 100755 --- a/contrib/seeds/makeseeds.py +++ b/contrib/seeds/makeseeds.py @@ -6,21 +6,27 @@ # Generate seeds.txt from Pieter's DNS seeder # -NSEEDS=512 +import argparse +import ipaddress +import re +import sys +import collections +from typing import List, Dict, Union -MAX_SEEDS_PER_ASN=2 +from asmap import ASMap, net_to_prefix -MIN_BLOCKS = 400000 +NSEEDS=512 -# These are hosts that have been observed to be behaving strangely (e.g. -# aggressively connecting to every node). -with open("suspicious_hosts.txt", mode="r", encoding="utf-8") as f: - SUSPICIOUS_HOSTS = {s.strip() for s in f if s.strip()} +MAX_SEEDS_PER_ASN = { + 'ipv4': 2, + 'ipv6': 10, +} +MIN_BLOCKS = 730000 PATTERN_IPV4 = re.compile(r"^((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})):(\d+)$") PATTERN_IPV6 = re.compile(r"^\[([0-9a-z:]+)\]:(\d+)$") -PATTERN_ONION = re.compile(r"^([abcdefghijklmnopqrstuvwxyz234567]{16}\.onion):(\d+)$") +PATTERN_ONION = re.compile(r"^([a-z2-7]{56}\.onion):(\d+)$") PATTERN_AGENT = re.compile( r"^/Satoshi:(" r"0.14.(0|1|2|3|99)|" @@ -32,10 +38,14 @@ r"0.20.99" r")") -def parseline(line): +def parseline(line: str) -> Union[dict, None]: + """ Parses a line from `seeds_main.txt` into a dictionary of details for that line. + or `None`, if the line could not be parsed. + """ sline = line.split() if len(sline) < 11: - return None + # line too short to be valid, skip it. + return None m = PATTERN_IPV4.match(sline[0]) sortkey = None ip = None @@ -99,99 +109,124 @@ def parseline(line): 'sortkey': sortkey, } -def filtermultiport(ips): - '''Filter out hosts with more nodes per IP''' +def dedup(ips: List[Dict]) -> List[Dict]: + """ Remove duplicates from `ips` where multiple ips share address and port. """ + d = {} + for ip in ips: + d[ip['ip'],ip['port']] = ip + return list(d.values()) + +def filtermultiport(ips: List[Dict]) -> List[Dict]: + """ Filter out hosts with more nodes per IP""" hist = collections.defaultdict(list) for ip in ips: hist[ip['sortkey']].append(ip) return [value[0] for (key,value) in list(hist.items()) if len(value)==1] -def lookup_asn(net, ip): - ''' - Look up the asn for an IP (4 or 6) address by querying cymru.com, or None - if it could not be found. - ''' - try: - if net == 'ipv4': - ipaddr = ip - prefix = '.origin' - else: # http://www.team-cymru.com/IP-ASN-mapping.html - res = str() # 2001:4860:b002:23::68 - for nb in ip.split(':')[:4]: # pick the first 4 nibbles - for c in nb.zfill(4): # right padded with '0' - res += c + '.' # 2001 4860 b002 0023 - ipaddr = res.rstrip('.') # 2.0.0.1.4.8.6.0.b.0.0.2.0.0.2.3 - prefix = '.origin6' - - asn = int([x.to_text() for x in dns.resolver.resolve('.'.join( - reversed(ipaddr.split('.'))) + prefix + '.asn.cymru.com', - 'TXT').response.answer][0].split('\"')[1].split(' ')[0]) - return asn - except Exception: - sys.stderr.write('ERR: Could not resolve ASN for "' + ip + '"\n') - return None - # Based on Greg Maxwell's seed_filter.py -def filterbyasn(ips, max_per_asn, max_total): +def filterbyasn(asmap: ASMap, ips: List[Dict], max_per_asn: Dict, max_per_net: int) -> List[Dict]: + """ Prunes `ips` by + (a) trimming ips to have at most `max_per_net` ips from each net (e.g. ipv4, ipv6); and + (b) trimming ips to have at most `max_per_asn` ips from each asn in each net. + """ # Sift out ips by type - ips_ipv4 = [ip for ip in ips if ip['net'] == 'ipv4'] - ips_ipv6 = [ip for ip in ips if ip['net'] == 'ipv6'] + ips_ipv46 = [ip for ip in ips if ip['net'] in ['ipv4', 'ipv6']] ips_onion = [ip for ip in ips if ip['net'] == 'onion'] - # Filter IPv4 by ASN + # Filter IPv46 by ASN, and limit to max_per_net per network result = [] - asn_count = {} - for ip in ips_ipv4: - if len(result) == max_total: - break - try: - asn = int([x.to_text() for x in dns.resolver.query('.'.join(reversed(ip['ip'].split('.'))) + '.origin.asn.cymru.com', 'TXT').response.answer][0].split('\"')[1].split(' ')[0]) - if asn not in asn_count: - asn_count[asn] = 0 - if asn_count[asn] == max_per_asn: - continue - asn_count[asn] += 1 - result.append(ip) - except: - sys.stderr.write('ERR: Could not resolve ASN for "' + ip['ip'] + '"\n') - - # TODO: filter IPv6 by ASN - - # Add back non-IPv4 - result.extend(ips_ipv6) - result.extend(ips_onion) + net_count: Dict[str, int] = collections.defaultdict(int) + asn_count: Dict[int, int] = collections.defaultdict(int) + + for i, ip in enumerate(ips_ipv46): + if net_count[ip['net']] == max_per_net: + # do not add this ip as we already too many + # ips from this network + continue + asn = asmap.lookup(net_to_prefix(ipaddress.ip_network(ip['ip']))) + if not asn or asn_count[ip['net'], asn] == max_per_asn[ip['net']]: + # do not add this ip as we already have too many + # ips from this ASN on this network + continue + asn_count[ip['net'], asn] += 1 + net_count[ip['net']] += 1 + ip['asn'] = asn + result.append(ip) + + # Add back Onions (up to max_per_net) + result.extend(ips_onion[0:max_per_net]) return result +def ip_stats(ips: List[Dict]) -> str: + """ Format and return pretty string from `ips`. """ + hist: Dict[str, int] = collections.defaultdict(int) + for ip in ips: + if ip is not None: + hist[ip['net']] += 1 + + return f"{hist['ipv4']:6d} {hist['ipv6']:6d} {hist['onion']:6d}" + +def parse_args(): + argparser = argparse.ArgumentParser(description='Generate a list of bitcoin node seed ip addresses.') + argparser.add_argument("-a","--asmap", help='the location of the asmap asn database file (required)', required=True) + return argparser.parse_args() + def main(): + args = parse_args() + + print(f'Loading asmap database "{args.asmap}"…', end='', file=sys.stderr, flush=True) + with open(args.asmap, 'rb') as f: + asmap = ASMap.from_binary(f.read()) + print('Done.', file=sys.stderr) + + print('Loading and parsing DNS seeds…', end='', file=sys.stderr, flush=True) lines = sys.stdin.readlines() ips = [parseline(line) for line in lines] + print('Done.', file=sys.stderr) - # Skip entries with valid address. + print('\x1b[7m IPv4 IPv6 Onion Pass \x1b[0m', file=sys.stderr) + print(f'{ip_stats(ips):s} Initial', file=sys.stderr) + # Skip entries with invalid address. ips = [ip for ip in ips if ip is not None] - # Skip entries from suspicious hosts. - ips = [ip for ip in ips if ip['ip'] not in SUSPICIOUS_HOSTS] + print(f'{ip_stats(ips):s} Skip entries with invalid address', file=sys.stderr) + # Skip duplicates (in case multiple seeds files were concatenated) + ips = dedup(ips) + print(f'{ip_stats(ips):s} After removing duplicates', file=sys.stderr) # Enforce minimal number of blocks. ips = [ip for ip in ips if ip['blocks'] >= MIN_BLOCKS] + print(f'{ip_stats(ips):s} Enforce minimal number of blocks', file=sys.stderr) # Require service bit 1. ips = [ip for ip in ips if (ip['service'] & 1) == 1] - # Require at least 50% 30-day uptime. - ips = [ip for ip in ips if ip['uptime'] > 50] + print(f'{ip_stats(ips):s} Require service bit 1', file=sys.stderr) + # Require at least 50% 30-day uptime for clearnet, 10% for onion. + req_uptime = { + 'ipv4': 50, + 'ipv6': 50, + 'onion': 10, + } + ips = [ip for ip in ips if ip['uptime'] > req_uptime[ip['net']]] + print(f'{ip_stats(ips):s} Require minimum uptime', file=sys.stderr) # Require a known and recent user agent. ips = [ip for ip in ips if PATTERN_AGENT.match(ip['agent'])] + print(f'{ip_stats(ips):s} Require a known and recent user agent', file=sys.stderr) # Sort by availability (and use last success as tie breaker) ips.sort(key=lambda x: (x['uptime'], x['lastsuccess'], x['ip']), reverse=True) - # Filter out hosts with multiple ports, these are likely abusive + # Filter out hosts with multiple bitcoin ports, these are likely abusive ips = filtermultiport(ips) + print(f'{ip_stats(ips):s} Filter out hosts with multiple bitcoin ports', file=sys.stderr) # Look up ASNs and limit results, both per ASN and globally. - ips = filterbyasn(ips, MAX_SEEDS_PER_ASN, NSEEDS) + ips = filterbyasn(asmap, ips, MAX_SEEDS_PER_ASN, NSEEDS) + print(f'{ip_stats(ips):s} Look up ASNs and limit results per ASN and per net', file=sys.stderr) # Sort the results by IP address (for deterministic output). ips.sort(key=lambda x: (x['net'], x['sortkey'])) - for ip in ips: if ip['net'] == 'ipv6': - print '[%s]:%i' % (ip['ip'], ip['port']) + print(f"[{ip['ip']}]:{ip['port']}", end="") else: - print '%s:%i' % (ip['ip'], ip['port']) + print(f"{ip['ip']}:{ip['port']}", end="") + if 'asn' in ip: + print(f" # AS{ip['asn']}", end="") + print() if __name__ == '__main__': main() From 418082a8a313b16784b3b1af28fc85b63fe06b5e Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Thu, 17 Feb 2022 22:15:40 +0100 Subject: [PATCH 023/144] contrib: refactor: simplify block header string routine in linearize-data.py The string representation of a block header hash is simply the hexlified byte-reversed double SHA256 hash of its serialization. --- contrib/linearize/linearize-data.py | 39 ++--------------------------- 1 file changed, 2 insertions(+), 37 deletions(-) diff --git a/contrib/linearize/linearize-data.py b/contrib/linearize/linearize-data.py index f70cf12ae0..c8e4cfb971 100755 --- a/contrib/linearize/linearize-data.py +++ b/contrib/linearize/linearize-data.py @@ -24,44 +24,9 @@ def hex_switchEndian(s): pairList = [s[i:i+2].encode() for i in range(0, len(s), 2)] return b''.join(pairList[::-1]).decode() -def uint32(x): - return x & 0xffffffff - -def bytereverse(x): - return uint32(( ((x) << 24) | (((x) << 8) & 0x00ff0000) | - (((x) >> 8) & 0x0000ff00) | ((x) >> 24) )) - -def bufreverse(in_buf): - out_words = [] - for i in range(0, len(in_buf), 4): - word = struct.unpack('@I', in_buf[i:i+4])[0] - out_words.append(struct.pack('@I', bytereverse(word))) - return b''.join(out_words) - -def wordreverse(in_buf): - out_words = [] - for i in range(0, len(in_buf), 4): - out_words.append(in_buf[i:i+4]) - out_words.reverse() - return b''.join(out_words) - -def calc_hdr_hash(blk_hdr): - hash1 = hashlib.sha256() - hash1.update(blk_hdr) - hash1_o = hash1.digest() - - hash2 = hashlib.sha256() - hash2.update(hash1_o) - hash2_o = hash2.digest() - - return hash2_o - def calc_hash_str(blk_hdr): - hash = calc_hdr_hash(blk_hdr) - hash = bufreverse(hash) - hash = wordreverse(hash) - hash_str = hash.hex() - return hash_str + blk_hdr_hash = hashlib.sha256(hashlib.sha256(blk_hdr).digest()).digest() + return blk_hdr_hash[::-1].hex() def get_blk_dt(blk_hdr): members = struct.unpack(" Date: Thu, 17 Feb 2022 22:38:10 +0100 Subject: [PATCH 024/144] contrib: refactor: replace `hex_switchEndian` in linearize scripts Switching the endianness of a hex string `str` can simply be achieved by `bytes.fromhex(str)[::-1].hex()`, i.e. we can use that and remove those helper methods. --- contrib/linearize/linearize-data.py | 7 +------ contrib/linearize/linearize-hashes.py | 7 +------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/contrib/linearize/linearize-data.py b/contrib/linearize/linearize-data.py index c8e4cfb971..6183ee69f8 100755 --- a/contrib/linearize/linearize-data.py +++ b/contrib/linearize/linearize-data.py @@ -19,11 +19,6 @@ settings = {} -def hex_switchEndian(s): - """ Switches the endianness of a hex string (in pairs of hex chars) """ - pairList = [s[i:i+2].encode() for i in range(0, len(s), 2)] - return b''.join(pairList[::-1]).decode() - def calc_hash_str(blk_hdr): blk_hdr_hash = hashlib.sha256(hashlib.sha256(blk_hdr).digest()).digest() return blk_hdr_hash[::-1].hex() @@ -42,7 +37,7 @@ def get_block_hashes(settings): for line in f: line = line.rstrip() if settings['rev_hash_bytes'] == 'true': - line = hex_switchEndian(line) + line = bytes.fromhex(line)[::-1].hex() blkindex.append(line) print("Read " + str(len(blkindex)) + " hashes") diff --git a/contrib/linearize/linearize-hashes.py b/contrib/linearize/linearize-hashes.py index 23a18dc3ce..7b8f246fdf 100755 --- a/contrib/linearize/linearize-hashes.py +++ b/contrib/linearize/linearize-hashes.py @@ -17,11 +17,6 @@ settings = {} -def hex_switchEndian(s): - """ Switches the endianness of a hex string (in pairs of hex chars) """ - pairList = [s[i:i+2].encode() for i in range(0, len(s), 2)] - return b''.join(pairList[::-1]).decode() - class BGLRPC: def __init__(self, host, port, username, password): authpair = "%s:%s" % (username, password) @@ -85,7 +80,7 @@ def get_block_hashes(settings, max_blocks_per_call=10000): sys.exit(1) assert(resp_obj['id'] == x) # assume replies are in-sequence if settings['rev_hash_bytes'] == 'true': - resp_obj['result'] = hex_switchEndian(resp_obj['result']) + resp_obj['result'] = bytes.fromhex(resp_obj['result'])[::-1].hex() print(resp_obj['result']) height += num_blocks From a9b6f0d269570446b3c0266fac4682bd296ab0ff Mon Sep 17 00:00:00 2001 From: brunoerg Date: Tue, 26 Apr 2022 14:39:07 -0300 Subject: [PATCH 025/144] test, contrib, refactor: use `with` when opening a file --- contrib/devtools/copyright_header.py | 10 ++--- contrib/linearize/linearize-data.py | 37 +++++++++---------- contrib/linearize/linearize-hashes.py | 25 ++++++------- contrib/verify-commits/verify-commits.py | 15 +++++--- test/functional/feature_config_args.py | 3 +- .../functional/feature_versionbits_warning.py | 3 +- test/util/test_runner.py | 12 ++++-- 7 files changed, 56 insertions(+), 49 deletions(-) diff --git a/contrib/devtools/copyright_header.py b/contrib/devtools/copyright_header.py index c8d66849e0..bd3c3df9f9 100755 --- a/contrib/devtools/copyright_header.py +++ b/contrib/devtools/copyright_header.py @@ -319,15 +319,13 @@ def get_most_recent_git_change_year(filename): ################################################################################ def read_file_lines(filename): - f = open(filename, 'r', encoding="utf8") - file_lines = f.readlines() - f.close() + with open(filename, 'r', encoding="utf8") as f: + file_lines = f.readlines() return file_lines def write_file_lines(filename, file_lines): - f = open(filename, 'w', encoding="utf8") - f.write(''.join(file_lines)) - f.close() + with open(filename, 'w', encoding="utf8") as f: + f.write(''.join(file_lines)) ################################################################################ # update header years execution diff --git a/contrib/linearize/linearize-data.py b/contrib/linearize/linearize-data.py index 6183ee69f8..ed1ee1750e 100755 --- a/contrib/linearize/linearize-data.py +++ b/contrib/linearize/linearize-data.py @@ -33,12 +33,12 @@ def get_blk_dt(blk_hdr): # When getting the list of block hashes, undo any byte reversals. def get_block_hashes(settings): blkindex = [] - f = open(settings['hashlist'], "r", encoding="utf8") - for line in f: - line = line.rstrip() - if settings['rev_hash_bytes'] == 'true': - line = bytes.fromhex(line)[::-1].hex() - blkindex.append(line) + with open(settings['hashlist'], "r", encoding="utf8") as f: + for line in f: + line = line.rstrip() + if settings['rev_hash_bytes'] == 'true': + line = bytes.fromhex(line)[::-1].hex() + blkindex.append(line) print("Read " + str(len(blkindex)) + " hashes") @@ -222,19 +222,18 @@ def run(self): print("Usage: linearize-data.py CONFIG-FILE") sys.exit(1) - f = open(sys.argv[1], encoding="utf8") - for line in f: - # skip comment lines - m = re.search(r'^\s*#', line) - if m: - continue - - # parse key=value lines - m = re.search(r'^(\w+)\s*=\s*(\S.*)$', line) - if m is None: - continue - settings[m.group(1)] = m.group(2) - f.close() + with open(sys.argv[1], encoding="utf8") as f: + for line in f: + # skip comment lines + m = re.search(r'^\s*#', line) + if m: + continue + + # parse key=value lines + m = re.search(r'^(\w+)\s*=\s*(\S.*)$', line) + if m is None: + continue + settings[m.group(1)] = m.group(2) # Force hash byte format setting to be lowercase to make comparisons easier. # Also place upfront in case any settings need to know about it. diff --git a/contrib/linearize/linearize-hashes.py b/contrib/linearize/linearize-hashes.py index 7b8f246fdf..d82849e9df 100755 --- a/contrib/linearize/linearize-hashes.py +++ b/contrib/linearize/linearize-hashes.py @@ -98,19 +98,18 @@ def get_rpc_cookie(): print("Usage: linearize-hashes.py CONFIG-FILE") sys.exit(1) - f = open(sys.argv[1], encoding="utf8") - for line in f: - # skip comment lines - m = re.search(r'^\s*#', line) - if m: - continue - - # parse key=value lines - m = re.search(r'^(\w+)\s*=\s*(\S.*)$', line) - if m is None: - continue - settings[m.group(1)] = m.group(2) - f.close() + with open(sys.argv[1], encoding="utf8") as f: + for line in f: + # skip comment lines + m = re.search(r'^\s*#', line) + if m: + continue + + # parse key=value lines + m = re.search(r'^(\w+)\s*=\s*(\S.*)$', line) + if m is None: + continue + settings[m.group(1)] = m.group(2) if 'host' not in settings: settings['host'] = '127.0.0.1' diff --git a/contrib/verify-commits/verify-commits.py b/contrib/verify-commits/verify-commits.py index 0cab101495..10e80393a3 100755 --- a/contrib/verify-commits/verify-commits.py +++ b/contrib/verify-commits/verify-commits.py @@ -82,11 +82,16 @@ def main(): # get directory of this program and read data files dirname = os.path.dirname(os.path.abspath(__file__)) print("Using verify-commits data from " + dirname) - verified_root = open(dirname + "/trusted-git-root", "r", encoding="utf8").read().splitlines()[0] - verified_sha512_root = open(dirname + "/trusted-sha512-root-commit", "r", encoding="utf8").read().splitlines()[0] - revsig_allowed = open(dirname + "/allow-revsig-commits", "r", encoding="utf-8").read().splitlines() - unclean_merge_allowed = open(dirname + "/allow-unclean-merge-commits", "r", encoding="utf-8").read().splitlines() - incorrect_sha512_allowed = open(dirname + "/allow-incorrect-sha512-commits", "r", encoding="utf-8").read().splitlines() + with open(dirname + "/trusted-git-root", "r", encoding="utf8") as f: + verified_root = f.read().splitlines()[0] + with open(dirname + "/trusted-sha512-root-commit", "r", encoding="utf8") as f: + verified_sha512_root = f.read().splitlines()[0] + with open(dirname + "/allow-revsig-commits", "r", encoding="utf8") as f: + revsig_allowed = f.read().splitlines() + with open(dirname + "/allow-unclean-merge-commit", "r", encoding="utf8") as f: + unclean_merge_allowed = f.read().splitlines() + with open(dirname + "/allow-incorrect-sha512-commits", "r", encoding="utf8") as f: + incorrect_sha512_allowed = f.read().splitlines() # Set commit and branch and set variables current_commit = args.commit diff --git a/test/functional/feature_config_args.py b/test/functional/feature_config_args.py index 8f5241f7cc..c537782af5 100755 --- a/test/functional/feature_config_args.py +++ b/test/functional/feature_config_args.py @@ -248,7 +248,8 @@ def run_test(self): conf_file = os.path.join(default_data_dir, "BGL.conf") # datadir needs to be set before [regtest] section - conf_file_contents = open(conf_file, encoding='utf8').read() + with open(conf_file, encoding='utf8') as f: + conf_file_contents = f.read() with open(conf_file, 'w', encoding='utf8') as f: f.write(f"datadir={new_data_dir}\n") f.write(conf_file_contents) diff --git a/test/functional/feature_versionbits_warning.py b/test/functional/feature_versionbits_warning.py index 5cc18c4b9a..edd4f3db90 100755 --- a/test/functional/feature_versionbits_warning.py +++ b/test/functional/feature_versionbits_warning.py @@ -59,7 +59,8 @@ def send_blocks_with_version(self, peer, numblocks, version): def versionbits_in_alert_file(self): """Test that the versionbits warning has been written to the alert file.""" - alert_text = open(self.alert_filename, 'r', encoding='utf8').read() + with open(self.alert_filename, 'r', encoding='utf8') as f: + alert_text = f.read() return VB_PATTERN.search(alert_text) is not None def run_test(self): diff --git a/test/util/test_runner.py b/test/util/test_runner.py index 7679851d7d..1c1813b6af 100755 --- a/test/util/test_runner.py +++ b/test/util/test_runner.py @@ -22,7 +22,8 @@ def main(): config = configparser.ConfigParser() config.optionxform = str - config.read_file(open(os.path.join(os.path.dirname(__file__), "../config.ini"), encoding="utf8")) + with open(os.path.join(os.path.dirname(__file__), "../config.ini"), encoding="utf8") as f: + config.read_file(f) env_conf = dict(config.items('environment')) parser = argparse.ArgumentParser(description=__doc__) @@ -43,7 +44,8 @@ def main(): def bctester(testDir, input_basename, buildenv): """ Loads and parses the input file, runs all tests and reports results""" input_filename = os.path.join(testDir, input_basename) - raw_data = open(input_filename, encoding="utf8").read() + with open(input_filename, encoding="utf8") as f: + raw_data = f.read() input_data = json.loads(raw_data) failed_testcases = [] @@ -80,7 +82,8 @@ def bctest(testDir, testObj, buildenv): inputData = None if "input" in testObj: filename = os.path.join(testDir, testObj["input"]) - inputData = open(filename, encoding="utf8").read() + with open(filename, encoding="utf8") as f: + inputData = f.read() stdinCfg = subprocess.PIPE # Read the expected output data (if there is any) @@ -91,7 +94,8 @@ def bctest(testDir, testObj, buildenv): outputFn = testObj['output_cmp'] outputType = os.path.splitext(outputFn)[1][1:] # output type from file extension (determines how to compare) try: - outputData = open(os.path.join(testDir, outputFn), encoding="utf8").read() + with open(os.path.join(testDir, outputFn), encoding="utf8") as f: + outputData = f.read() except: logging.error("Output file " + outputFn + " can not be opened") raise From 8149eb34d32ebf463da66460015afa590743c625 Mon Sep 17 00:00:00 2001 From: Rjected Date: Sun, 27 Oct 2019 23:01:22 -0400 Subject: [PATCH 026/144] Add search for first blk file with pruned node --- contrib/linearize/linearize-data.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/contrib/linearize/linearize-data.py b/contrib/linearize/linearize-data.py index ed1ee1750e..fb7efe8947 100755 --- a/contrib/linearize/linearize-data.py +++ b/contrib/linearize/linearize-data.py @@ -15,6 +15,7 @@ import hashlib import datetime import time +import glob from collections import namedtuple settings = {} @@ -51,6 +52,30 @@ def mkblockmap(blkindex): blkmap[hash] = height return blkmap +# This gets the first block file ID that exists from the input block +# file directory. +def getFirstBlockFileId(block_dir_path): + # First, this sets up a pattern to search for block files, for + # example 'blkNNNNN.dat'. + blkFilePattern = os.path.join(block_dir_path, "blk[0-9][0-9][0-9][0-9][0-9].dat") + + # This search is done with glob + blkFnList = glob.glob(blkFilePattern) + + if len(blkFnList) == 0: + print("blocks not pruned - starting at 0") + return 0 + # We then get the lexicographic minimum, which should be the first + # block file name. + firstBlkFilePath = min(blkFnList) + firstBlkFn = os.path.basename(firstBlkFilePath) + + # now, the string should be ['b','l','k','N','N','N','N','N','.','d','a','t'] + # So get the ID by choosing: 3 4 5 6 7 + # The ID is not necessarily 0 if this is a pruned node. + blkId = int(firstBlkFn[3:8]) + return blkId + # Block header and extent on disk BlockExtent = namedtuple('BlockExtent', ['fn', 'offset', 'inhdr', 'blkhdr', 'size']) @@ -60,7 +85,9 @@ def __init__(self, settings, blkindex, blkmap): self.blkindex = blkindex self.blkmap = blkmap - self.inFn = 0 + # Get first occurring block file id - for pruned nodes this + # will not necessarily be 0 + self.inFn = getFirstBlockFileId(self.settings['input']) self.inF = None self.outFn = 0 self.outsz = 0 From 1c70d01d7099313b53efe3a1014f504460c3c84f Mon Sep 17 00:00:00 2001 From: Korrrba Date: Mon, 24 Oct 2022 11:53:52 +0200 Subject: [PATCH 027/144] test/functional/feature_loadblock: Fix BGL Regtest network magic value. Set the correct magic value for BGL Regtest network. --- test/functional/feature_loadblock.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/feature_loadblock.py b/test/functional/feature_loadblock.py index 908fb50033..983050244a 100755 --- a/test/functional/feature_loadblock.py +++ b/test/functional/feature_loadblock.py @@ -52,7 +52,7 @@ def run_test(self): cfg.write(f"host={node_url.hostname}\n") cfg.write(f"output_file={bootstrap_file}\n") cfg.write(f"max_height=100\n") - cfg.write(f"netmagic=fabfb5da\n") + cfg.write(f"netmagic=d98cbfba\n") cfg.write(f"input={blocks_dir}\n") cfg.write(f"genesis={genesis_block}\n") cfg.write(f"hashlist={hash_list.name}\n") From 81b96627a830dea69f17b32e54ceaa2829152c99 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Mon, 24 Oct 2022 11:56:53 +0200 Subject: [PATCH 028/144] contrib/linearize/linearize-data: Update linearize data to match BGL hashing algorithm. Update the script to use hashing algorithm for BGL blocks: Keccak (sha-3). --- contrib/linearize/linearize-data.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/contrib/linearize/linearize-data.py b/contrib/linearize/linearize-data.py index fb7efe8947..44eb079851 100755 --- a/contrib/linearize/linearize-data.py +++ b/contrib/linearize/linearize-data.py @@ -11,6 +11,7 @@ import re import os import os.path +import sha3 import sys import hashlib import datetime @@ -18,11 +19,14 @@ import glob from collections import namedtuple + + settings = {} def calc_hash_str(blk_hdr): - blk_hdr_hash = hashlib.sha256(hashlib.sha256(blk_hdr).digest()).digest() - return blk_hdr_hash[::-1].hex() + blk_hdr_hash = sha3.keccak_256() + blk_hdr_hash.update(blk_hdr) + return blk_hdr_hash.digest()[::-1].hex() def get_blk_dt(blk_hdr): members = struct.unpack(" Date: Wed, 26 Oct 2022 09:05:19 +0200 Subject: [PATCH 029/144] test/functional/wallet_taproot: Encode correct segwit address for BGL network. Fixes wallet_taproot functional test. --- test/functional/wallet_taproot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/wallet_taproot.py b/test/functional/wallet_taproot.py index 1c05c26412..1603f70c9a 100755 --- a/test/functional/wallet_taproot.py +++ b/test/functional/wallet_taproot.py @@ -167,7 +167,7 @@ def compute_taproot_address(pubkey, scripts): tap = taproot_construct(pubkey, scripts) assert tap.scriptPubKey[0] == 0x51 assert tap.scriptPubKey[1] == 0x20 - return encode_segwit_address("bcrt", 1, tap.scriptPubKey[2:]) + return encode_segwit_address("rbgl", 1, tap.scriptPubKey[2:]) class WalletTaprootTest(BGLTestFramework): """Test generation and spending of P2TR address outputs.""" From de81f960fc08704a8d7e5f5cbb965923df657a76 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Wed, 26 Oct 2022 08:58:33 +0200 Subject: [PATCH 030/144] wallet/sqlite: Update error message to BGLd. Fixes tool_wallet.py functional test. --- src/wallet/sqlite.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/sqlite.cpp b/src/wallet/sqlite.cpp index 650e083e8e..3e33f8ee89 100644 --- a/src/wallet/sqlite.cpp +++ b/src/wallet/sqlite.cpp @@ -228,7 +228,7 @@ void SQLiteDatabase::Open() // Now begin a transaction to acquire the exclusive lock. This lock won't be released until we close because of the exclusive locking mode. int ret = sqlite3_exec(m_db, "BEGIN EXCLUSIVE TRANSACTION", nullptr, nullptr, nullptr); if (ret != SQLITE_OK) { - throw std::runtime_error("SQLiteDatabase: Unable to obtain an exclusive lock on the database, is it being used by another bitcoind?\n"); + throw std::runtime_error("SQLiteDatabase: Unable to obtain an exclusive lock on the database, is it being used by another BGLd?\n"); } ret = sqlite3_exec(m_db, "COMMIT", nullptr, nullptr, nullptr); if (ret != SQLITE_OK) { From 93d84b8273c96c0b4a8fb03e10e838b6f633ee69 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Wed, 26 Oct 2022 09:21:01 +0200 Subject: [PATCH 031/144] test/functional/feature_addrman: Use keccak for BGL network. Fixes feature_addrman functional test. --- test/functional/feature_addrman.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/functional/feature_addrman.py b/test/functional/feature_addrman.py index ec1b307d5c..d462413644 100755 --- a/test/functional/feature_addrman.py +++ b/test/functional/feature_addrman.py @@ -6,6 +6,7 @@ import os import re +import sha3 import struct from test_framework.messages import ser_uint256, hash256 @@ -38,7 +39,9 @@ def serialize_addrman( r += struct.pack("i", ADDRMAN_NEW_BUCKET_COUNT ^ (1 << 30)) for _ in range(ADDRMAN_NEW_BUCKET_COUNT): r += struct.pack("i", 0) - checksum = hash256(r) + checksum = sha3.keccak_256() + checksum.update(r) + checksum = checksum.digest() r += mock_checksum or checksum return r From 804b17f1ee05cd70135d70271f1c23c49eddfdfd Mon Sep 17 00:00:00 2001 From: Korrrba Date: Wed, 26 Oct 2022 11:35:40 +0200 Subject: [PATCH 032/144] test/functional/data: Generate proper rpc_getblockstats for BGL network. Fixes rpc_getblockstats functional test case. --- test/functional/data/rpc_getblockstats.json | 308 ++++++++++---------- 1 file changed, 154 insertions(+), 154 deletions(-) diff --git a/test/functional/data/rpc_getblockstats.json b/test/functional/data/rpc_getblockstats.json index 16dbc5fe60..79f13e4a17 100644 --- a/test/functional/data/rpc_getblockstats.json +++ b/test/functional/data/rpc_getblockstats.json @@ -1,117 +1,117 @@ { "blocks": [ - "0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4adae5494dffff7f20020000000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000", - "0000002006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f28394022bf44bff30d7399cb5a16e3b94fed67dc174c2e1d77df91bad5a51cb3194ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020e959d05cac787d7f82d1348326a4ca25ead09589befcd4b4513163e5acb5af6612d2f07672102dc6f099c4be308f598e4c4da1a7e0cb462ae14f0444525a13321a4ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03520101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204401ebd07d42f8f18e80ede81795f728a9eb2a63073274ad92ccb9eda593ff3c5f17ca91704a014c6f68ca623ace6c542950f2e1d2d02ece08fbd440e33af53a1a4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03530101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020eab1809c3e750647f588c027df5c9d5735bb8cb2a1a5f182d7b35524b0b8595f9d59f165de689fd9a4b6954b4394d40d7899eef078e6ddb9f7eb036b7b15af2b1b4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03540101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020bbe445e86bf69865a0c816690c0e470338bf9d692d388f8186613830afe2f54c07ae38ccc6fd49e7098d6e3149e459a234f30970c6c9a9894df992e3caf97ce31b4ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03550101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020f5b84b4e3b7e84720a83dae76aad6657c06ec6bbf85d9158c575de09c34631035b263b763b955c4c6d1a97b23e6b4bc5e6ee96d75910845557aaca233fe777fe1b4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03560101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002028d52759ccb342b81f2e8d574d8cf116178949f8a595d577098bae70e6969326119c83444b75d63bbe98d8b3a937f0de3a459bda5fdc0fd66c7acd752d19496d1b4ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03570101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020f461e9c8981911f5180e9a8e28be1d34146460ae4e7583935949f43f6252bb3cb287270caf2d4e735caf0d9888f998b8d7c79443e97933976930919e6dbc0b471c4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03580101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020d3328d99edb99583b478969aea57e378c2840bfc1df0341963fde16f75636e34a6c85df88c2800c54565eb2e6579b729def99fa9b8ca347ec649b8d4f8db78de1c4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03590101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000206b88980f5b713605233c1c8806639717f753c4aad93617d5e37872a43188af6c8dabd724a42288139a21186c855f23c4fe1d12337ec7b97f87c48389983239651c4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035a0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002030fd29b0e0e54a5eec463f93dac2fd9d73f383b7467d146a882bee4700f79832a343b1b1867b07ba30134ae555db5816ccd971232b78a9d596e2711d02251c521c4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035b0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000201845eacaca9b23798f32c22414015655035d4918be70e26f56b56e730e195e220bf32e9a8af59ce9264884b0690bb26709616ccf4bfb85812faf87144b2fb8131c4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035c0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020353ff17bd0d66a6ee1e784bfbb2497691f49e27c3822aced5125fda6ff09892fe72239d73e75b82916e8eef04a4963e6b500de80a7fdcd89952e23c6d249c5931c4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035d0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020c6c359d1b891b0a6afa7e0fb685b9c21afe41c8dddd80cd6331ecd856650af3803953a9bf6fc675eb2856718bac5362a12168e7b1baa7dc6b46a4eacd2e8baf61d4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035e0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020291a8a183e7ebb538030bc791b0f995a2ac0a766add84d83d3fa9f6fad50075a0857e76b64648e82fd4341931116efccaf147f0bc6e8c107cee68f400530c17d1d4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035f0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002081f804c3afb976efbaf9f62d50ca43402fd5a09571cfd93ddaf77d78952ebb3e3db790f598f68da5e0514b03902de787ff0d2457c05a59bfb22547d8ee6f7ed91d4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03600101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204d559298cc1db4c70f422519822a850603ec250f4ab705f51423d67bb2d4a03abfdfd932c91a77b0065183cf1a575e73b9d1322804f869cc640747e7fa36c0531d4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401110101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020b49a26625c5d5210a3dbd1aeba62718b828a29dab035b6e028073c3679053c02ee7b702c74ece9d04af3aca5f745aad5d4142d6a15ae12d16157c1449b62b1b31d4ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401120101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020655a431b076a153aa7d9d3731b42b4213995f92299a56e6270860be4005d584d33b5d4b94367acd8ef20e10678a75de3c02e143a3f9bb0b0f0c31ed0396454c31d4ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401130101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020a96f9ad3e058c097d63488627158e074f759a73ae3292b8d8e3e979edcb4e33f0ccd7e3208e9cf08375f36a34f3d71da039e6a33cb8621a67bb484cedc5fb4f31e4ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401140101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000202ec3fddee36cdcfa564d29eafe073ba79120ecdf8740f62600293b0aad6039419047bdc522883061665549cacc029b05713ad4ae24281eeaf0a041cec3c7d0d31e4ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401150101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020d2985cee6e78b525c61ad111b0e9a6ad8c222ca793eff2121c23cf06462fd930bfe97d3f071f45d95467db4f5d31d8b7966c26789be3d5c1a5d53c903230abe61e4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401160101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020e799bf0166a1e3e7b94d6709fa0edd5feeadac19ddb271ce8e8a6144fd52c23b1699dad3820cb2ba528c13e37550cd32a900ca14f307db9b735daddb523b1d511e4ae75affff7f200a00000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401170101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020a6e38cccd5f39851e6f1aaab690b3591ce59ed225bc4815b66ed59f9e604da4beadf823c049567a4628d7b06090ac7f51f1a854c46817a8b6fb8f069a098f8941e4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401180101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002067dc38dccecab584fccbd21e1fdcaa8ce69155053eaffe082d51fedff22c26299e57f12478cab2077ac63eecad4a342082c9976addd08ea58896ab334ddf5e6d1e4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401190101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000200b71cba7f1d43034d1584c309e04bff61a7814896b3fd170f69d8757a81b114b4769be83a7993e5214c7cbb5053a142840cc180e23366cc1d52cd2ace2347a1b1f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011a0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002044d38910c5362c279ee6e183c56bb2379f0d053bceea9f2c00f99adaf1a70067de8615ddd58387b2847d215fde3633242c278ef9b18ab9c70963c9060b4a3f101f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011b0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020b063fc1b09b6f9cd8207b0f9ca9f1549ce2b1de07b7f937275d96461ecacb26a3abf0a5d24c68c0b3df1a58b6128039eca6452810a374a306ac0cb96bd462df61f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011c0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002023334826cbee5a6679259a50f8e112332db9663c97a1d08d54e64319dabac73331dbae7789d23e1da14d1ee39a9dea43581ddd9c09a199253ec0bd6c819514911f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011d0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020911e28670d744a0cb23495711db6ac20576273eec7ee442b0377ea2d7564402fcc7db46bd4aa8fdf1209e649b3866f5cb79fe3f2cfaf8aadd39a3d43eb084ce21f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011e0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002038d6d41fddd3c9278884c9141096360c538d2491ffb078be006222a88a10c854366b75e0a133e1d3f4db26e1b0e9b9820db50dbfb11988e8bb8739420ce1799c1f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011f0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204e501ddc49c462c4ca52283614e99e6379b9c6570c947a822b832804e39aee00b037b85318c2f997bd9edda927e85dc2c83f8aa1952dc67556565d141a246186204ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401200101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002040cb0b50f15716374c2dc627d1fa6e3eaae67b1b4f1c90a30914e3c89a74de794a98fd86cc22c32f447477016e297c61a4e48135e658e5b5be84638f3a836ee3204ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401210101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020f51dd27d82fbb9296330e7f105a69ea307303799ca986abe900f00836f181e59a34210d60eb84f3fe493845aadfe404fb4096e599a26f63453c8120257cfc8c2204ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401220101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020b696bc517ca5d36092ca1106fd8d31047552e9453a9de51d92cf9226259a491618e806cd5aa13974beb89d41c5040a48242c24bffa8e65e9fdf3bc35e2a7c1b4204ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401230101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020358daeb9eef51c07f280abf17c5321023d8cf8bae26254abf25b9268d89a424fb67a604005cd713a7df2c45fbf5f761da51b9c6f21e86a3d8eb40827bbe2764b204ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401240101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000200170975c14ec6544367490c04b06294aa57fe978a1da6e5939ee6051d7602928e3676a94ad350f04f371edfe21281df51430055242082d9704030cf5317d0b81204ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401250101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002008d02d23a387a7263f5f3475bcd56b380fde9b742bbe83790dd9751701a7923038bfe35d91a9e4e5f8cc714713acfe2d1e96646e61b29b3dc072e5b182fdb45e214ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401260101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000206bd75eab3dabdee5a35c0a64de2aa90fb54f2d12b4f37ee60aa28541b51b493f0e5915bc2be5d87850016a330fc36b62f6e40ad7a6d38e0ed6a4f62056ba22a9214ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401270101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020a42645a785e5dd28047022b724c1af64d507d372b83f3f23899c82b317168262371693330fe6d94f33a962de50891b2f5811a066830c331a240996310b5c6280214ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401280101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020a6626233cfb7d9dd7c97f6db305ca20b6a7fc32d5e8ce9b07e35aeaaa7c0af3975cbe08a458c6fc4cd748a39427e29c2b29180293359623e30e2b5639d2d0417214ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401290101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000203a5a408e1a076fdc7bfa08460932fa40aedb0471fe808e268ee5768ce173520af5dc75a6bde31efc2ba81a4ea94fe91d3b1ab1ed99975fc5b1cc725f7f20817b214ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012a0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204cc70837ef7c3804c04419260a2d65ce21515317991751117fb81596ef32c3161154931edf6dd92bb8a13231190f7c0b21bc527e188384770faa53b54aba04f8214ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012b0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002070b6275e92ff0b54df08933d70b7d933c3b534b779026630dfb2f96efb860436581cf56e07b7d7e2a377ba0e698f592e464d1ed84bf464b0dd67cb85cbf69f7a224ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012c0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020a330af8e1dc93fd74b7479c626b1a77c21dec2d240fe7b7d90249da127aaea50773fe8f12bdce2a65c375082dc3db0414e68aacea57f41504cf901a7858b8cf3224ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012d0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002052841b806090d1d40d221788025ba6ae3a9bb32f352cb12ce4b165be58846a12ee2ad08be6b3e693e3d53a90abe88a8426b342f19f3b271818e66eed4ed1892f224ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012e0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002095b86217b1ebf86fa345f2c605f4251b24d5a647710758cbe08340448250ef015f65e5752628c0a0131fc31fac03ed3a2ab0d2c1407414d4dfdc1680037a3b38224ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012f0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020757dfdbb6f52e389a0ed997dff15de8682d55f9e241d3b53b254f19fd96b926860d0c537aaa527616248c9e50fd776e801eb5dc5d9ef034251b846359da84bc1224ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401300101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204c5ff56d6188016b722ba01c7d3b74bc530820b7dff447efbb8c5e756def2d25bdb8e2a27ead1a99e184a87195f06f858b810add552f6bf0127c0a36ec101a60224ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401310101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002064c6f9651c489cb014e8d5271e1f711b71d20d865ab7561b26bea5c85fe6957b6326b1ba78a33db0f148a07e1d49437ca70ae9d73544c183d2cfdf814fd7ff37234ae75affff7f200700000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401320101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020bc955dccd950bcd6051723e18c87ba5114103eb66c136d4bde1070b99678c12f6192856637c104e86194dc91e1550447d83b7124a230871020c37454f2ec82bf234ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401330101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000200f4e7a95470e9056dda68e82b62a61cae778e88b6e35a4714bdfa3bff8b6e846c45be9fa19a24d90a3180a562bdd8b8a5b71d4c2e0a9f84b6c55c439ebf2f22a234ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401340101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002044388dd29a4f16901222a7beeb49315884c0583a2c31a2f8865536931ff8ec4442553d33ba0273b54c52e589523cde509eb117046f5e63bd5e8a5a96f467c5f1234ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401350101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020438366e968619730e26031d71e8208d31ab6cb7c242acb65f3d1769157cb971210b6afd88e0ce95bb14554c6dad04012fa8ce0c88a5932ad71da4d04a15d44c3234ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401360101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020c38296d021842f437d04f8515079f943f0a1c8437d8f2c329499c32c0448ae1d961fb68ada366165b25199757ce8a527f11d0744bbcbaad402815e09623dae04234ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401370101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020101cd76ca645831e3a55898707454b2405151a06f8c8cee7822d148ca1251d12fd945975eb3855e5f0cd2afafd20b169a7763bdc73b64d1c2f096425d9c902eb244ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401380101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020f7735468f9b54bae6399754a1ba4b5ee620af1dc6a46261f4d8ab4d872818f35507916cc69e748edc3a9feadf7b79d1d19f16140e8f3260d7fbe9d1620e55f26244ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401390101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000200bc5d881eeab42717526d45d8475fefb1940bbf03c5726174e64379e5a23bf5cbc75b97dfb5771d55e7bd108bb109705ba34952511ab96646cd2db4539fc3b2b244ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013a0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002094a466199740a3c77035005e1fe5ae603df04ab18c429abfcc385b93681b75390e0d6b356161c1ccbe486a26b777ff01b1247cd6b4b9d4d5b0f958d2e887caab244ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013b0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020b5e8aad67d17f4f047da10404862703a89feab21624801f785cfe77af4a71d6b87994452ce4bfdc92a07f49ed16903e68d8d48191e31d9558dad4805718311d5244ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013c0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020b0ed4309ee1541c2dc5480b14092940b88870b9d4ca32ca448e7eaffc1d74978b9c5b6e8c1739811c932cdbecd192ae0bead4068782ca2e98805b8174d40f213244ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013d0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000205caa7f7a1817fcf6b454b156301f44edbb71cd19de098d9261305aa5731cf073faa4b4bcef4b3ed44ddf9b2b708397114484aa262a538c81b04103a02d8c033a254ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013e0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020c7ec1d68a2b4309b255ebc418cc4c8c1a57892bb3c6360a07d22b526ffba6a38436088fcdbf94cabbacefee23bb69b5ac30e3627f94500746630163249cc5029254ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013f0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002014c877261aa37fc58f703b64278f1d611b6faddd582e33cc7f1e7e63ad75df6cbd9d279982bfe391b013160a66675ed11debd83c32a9efa02351eee65ac96d09254ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401400101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000202b5cbee48cac714ff220fafa0cd4304f452e5c5b63dc5cd4f27072cc4ba7e9376f1f5aac2480c10e93e13f3be00b38523dc036eb6ae49b93f815140ee2b08a27254ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401410101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020aebd16a2c6cf18789e213338ee08bcca42d89e7c9f9220cf80e803cf9b67205eb58e2687eae141c7bc9656b434bc95900a6935f00db43dc23ac155e380af8e9e254ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401420101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020984d2d236668762da13fcb8f811401c1928a1df9a9896a4cc382912669b0b13642ad8e61dd8e6c702869587acb0d09b3355a1be27cb20ea909f51287f9e1b010254ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401430101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020d8ca9b5782f98937be5967d0c34aabdcdddc0201e17b70e4071e320bbb2c06418d020f678641ba278d49d70430385ede2f830c46aa49ff7a3febe99d2a9896a9264ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401440101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002017dad2d355421342e973abef035c18398d83dceccd6372269f6bbe6e844fcd52d9c4bce498d350184aae9af97f0aef0f366356d50b926c59bc1605ff6f41f144264ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401450101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020ab1775daac96add2d038b5046be91c90b597b8ed11038b2b9da32f47537d106556d820e14b52e6f4fd113554754f3a8d65b80e7dfab2c84c5e7bb41a30c39977264ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401460101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204dd398d0716e12f3397c9de79cc644ae3d63c6b90c579f5872d76820dd79260fc5808f07c0d1a3e6a23c9e8dc84d58c12758cd61a2f0e8ec3694a1ac08a89bda264ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401470101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020ed9c915c725956194c078ed08ad2508ec34a6b868c21226d14213904bb3c4c50f385dbbdfd18fa6f8355a89c58370c50a71f59f44e2d2e505fb861960d155705264ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401480101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020b2f8525fa7a276f4a078bdad600074c49df4c237aae27cadb60ecf91eb7b8d42c21e035455f17270ff5e2a53c57c8c663f31cdb7a3a929de1499e3117358108f264ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401490101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020897b6cc09bd1b7cb5d42c648498199aba4008875614e021898b121e8e751f34cf0b8a1a4c993ffd133335d84b9aba6159bb8129384a253131d1998f28c3d371b274ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014a0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000206a9836bb25994ab592060389b119cb8f7a19a64acd27f9665eab93b235803170ec6385bd31ab432ed3a13f7a6cdf0a6c87fe50c614372a58a5a3716c34456e83274ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014b0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000208202cd4938b8eef65707e3b6cbd025780f7220fdfea8bc897e802da008026d29043cd5b1662309701440c7941d61cfb95d0c98e22ff8ff8b5994149e988ab179274ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014c0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002074eed60562b3fabf1cfbd4efd86acd62a470dc264b81b98c784dce4a57f56614d713809d3b1678f325563577d3b6dd9ae4f1e5b05b70c3b16abd67d7161d9002274ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014d0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002072677aab7f4bb3af82841c6a7100df3ac5e8b643d9e88bb271b2da39c575222aadfd5417618dde8d0ee9191c4b110d0c76dcb65eb8adfd3f8a32a35ccceee445274ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014e0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020508ed0a8978dd8a6a4e55bb5bc27dd8edae3838d4ddba461332da10f0fb901080c5a78ea3fb056e326e873cea75009c29c401fb77a415ee64ae4eca44bd617dd274ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014f0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000202004607f94d91d8eca99a860ed208c53a4fd53f38889c77dc35b31a676eef1625ee8e5c95cb2105d0b8268ed13eaac6236eb3405df3099fc52d62169d218fcdf284ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401500101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204374d19a51a307de1344af36d893991965f58779adbc4b1c1045d5d8e14d6d0b034e10cf7e5158f62fe2674c89e8fc4ee94d2da62d81c0ffc8a237e8dfcb3e21284ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401510101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002037320af6c9cc617be33ba517458ae4607b1c0e3e007268669cf5c799e93ebe67f182660cef31f84c0c6b384f084b243a77e2c271be610ac958124076306d9170284ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401520101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000201ea13062078bd8f70060208d6973bd55789cbf2f221e8690f1a78254a597a1434a16aa13a90a872e0dd3046458114dc745e37d2928bd9ff306ce7adb2567efb3284ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401530101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002052fe4aa74774077ea9a1c27fea59dfa12b75f7ad46746f8458eb67acaeb9803921a47de6874e6c2359af86d72abdee12b27bcebe0f1ce48751055005813d3f42284ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401540101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000208ee41caa2f3076233035157fde7c5c2795a81b85d5e27ce7898e301679e91c4d2d38f595981a444c7d868166ae50e371d83b5f59802bebfed056b93aad1b971e284ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401550101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000201a0eea032f4abd74aa1bf1151e2966433175ecdf2d68b750b509305bc5663e3641f55e2175bc1d50b4d8a83f167091059a2a6e7d1a24d8223f50ca41313eef1b294ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401560101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000207403c2bca2c06351f16746d3360a1a7dceb5194d57879caee03a8316ec774a608a5d44cb75516291cdf62cd51a1a9c71fd3d4879737d88216c6c4c6bffb0784a294ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401570101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020f2be7a9ba2c914d5ee97c819cb096aa9d2c715d2f74e9dcf8a12cc83ac48475e4e332a45285f3fff16e8c5cf79107ee110dc2a2f84456205f43d8f4e237a10da294ae75affff7f200400000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401580101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000205fc71ff65dd07485e26129b765937f514315487b27f0e431c5da7de97b397a4f1d984f86e81bd2c9db53c3515b6e3d6a28187b50adffb87df25608b738190bcf294ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401590101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020d7befb40f244eb69f02a3253bcc9b14f5c2697261e158288e7d0b48eab34f12eeac43d0751178d2574aa20506d1b91af13af688a8dfcdf1a48806f63e53b3245294ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015a0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204a0082f8508319d99c86cc074cfedcf26fb98f2e6d0c27d602a9d6ed6d04db042163e10278a5cc75003c52739df112f1ea4fe0ed250ace8e544ecde713f47bfe294ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015b0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000203de23751fef24f5d30565808862dd364e209fc0f7bf83874ebcc8f155e65574acda81243c6a438daeb547e1b36c9a5441e6556bf16bb9bfb839628c39a3785162a4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015c0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002045addce76c20d564ac3ff6b955e8ecf2185a5aa355a0d3ac7fd29448dcfb9c1ed184bdf283ba671c76c99173e4ec87e45dd97331c9000070edc81093bc4c7c872a4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015d0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020a7e8079eccbca3b4a4a0136ef27478b45352270f2f8947ab83eea09b06cc826ab29d7b37989b6570510e368a20f4fee2ca0142044f96a027830abdf438ddf7592a4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015e0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000201f28203982fc7c2fc155361d00ef7e69ac9fa9c35ff3d10e8fd1a0004e9b10528488982a149b5ac96bef6be131e0b2f0ad9269ba66c9b4216901c0b81523123e2a4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015f0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020435d68020c01c6088e4013cb4f349009e65c28ffa0630baf5dde1676df55481513a48742e06190847a40cabbda6d48f715802bdb3cbab7ad7a2e5c345d557b082a4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401600101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020e525dd596c4b9ca78d964ef7997063d35af98665f62e9da62ed9c7fb38c9f57f5abfb8140edec21a383e1e3e31288ee0130a86564e5c3da9764594d8365134652a4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401610101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000203d4144c4bd71aa7f71af930a98087d3786e697335fc1eb11177bedcdae72a61549aa4519391183deb58058f99a6abb7638fe81f079b31c4e090d486c49e047ac2b4ae75affff7f200500000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401620101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020f44e7a48b9f221af95f3295c8dcefc5358934a68dc79e2933dc0794b350cad0a90fad2cd50b41d4ef45e76c2a456b98c180632bb4b44e0cd18ce90679fe54e552b4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401630101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002087454276cce83f4d19e0120f6e9728ac5905f7adaf6b27e3f5bbe43ab823f85db7d1f44666531483df3d67c15f2c231718ad93b63b851dce5ff4c4a67f524ffa2b4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401640101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000202cdc3e99f07a80252dd6097faa0eddf3f2dde5ae390610e0bca94ecc25931551d31fceb8fe0a682f6017ca3dbb582f3a2f06e5d99ec99c42c8a744dd4c9216b82b4ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401650101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000209b3ace9bd510918d20e87518c0cf5976cab3e28cc7af41259a89c6dd7668a32922808b8a082be71bcd6152cb8fd223650b5579a41344ba749e4d17b9bf211a9e2b4ae75affff7f200000000002020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401660101ffffffff026c03062a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9edb85d8f3c122c43a72f1e0dd122c8f7af040aa0b0a46001621110fb37818021510120000000000000000000000000000000000000000000000000000000000000000000000000020000000128394022bf44bff30d7399cb5a16e3b94fed67dc174c2e1d77df91bad5a51cb3000000006a47304402201c16d06a5c4353168b3881071aea7d1eb4d88eedfea53a9d6af9abb56da9060002205abf3ae535f1f1b5cfe8ba955535c2b20ac003e7d7720c5b7d2640ac2a04d19001210227d85ba011276cf25b51df6a188b75e604b38770a462b2d0e9fb2fc839ef5d3ffeffffff0294b89a3b000000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac00286bee0000000017a91452bab4f229415d0dc5c6d30b162f93a1a0cac5958765000000", - "000000200fa168b50a79ad24378a6b0f96e4c9f4ccb657a2663320d5fc1efd8ee7caa10ab42a31c444f2153387530a0979d4dc3dcc134b394c821227b8abff930c03c8412b4ae75affff7f200200000004020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401670101ffffffff02e015072a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ed20376d4bc90f9c689850eec3603cda658ba6295241730473ceb0e970b8d594150120000000000000000000000000000000000000000000000000000000000000000000000000020000000191e549a6cc852bbf1d3f11144b1a34079f64305e6971d2e685d2b40cd386e8a6000000006a47304402200bf62021c0a9a47ced8eba1e0998f5c71b2950763198d83ad284bd791241dbb00220446a05b7c35e7458924de88a8dcccab1ec6a106aa005345e55b482d8eb66337301210227d85ba011276cf25b51df6a188b75e604b38770a462b2d0e9fb2fc839ef5d3ffeffffff02acdbf405000000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac94d7a4350000000017a914dfa6f0b17d2c64962c94203e744a9d4179ed22c18766000000020000000112d2f07672102dc6f099c4be308f598e4c4da1a7e0cb462ae14f0444525a1332000000006a47304402200a6a2f544f3f9d299608a7c745e2326de176fb1cac03ae3e74943f4250b8896e02205023a5b4faff99865bf91f1263605a502c723628be9240c0b7bec81d2ed106f101210227d85ba011276cf25b51df6a188b75e604b38770a462b2d0e9fb2fc839ef5d3ffeffffff0200ca9a3b000000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac94166bee0000000017a914152cc82f7944f5c416de7dbffb052f7081765d7987660000000200000000010191e549a6cc852bbf1d3f11144b1a34079f64305e6971d2e685d2b40cd386e8a601000000171600147cc872ad7350c37fecab9c4c6d9f08aceb53bdb8feffffff02005ed0b20000000017a914aab1c8c53fe62e283a53efa28097709f4f2ed37b87e0bc9a3b000000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0247304402201b4476f238ed5d515bfcd6927d0d008a4993770763eca73e3ee66f69971831d902200f5215a6dfd90391dd63462cfdf69804fe31224c309ec9c38d33a04dce71c0ee0121028c9d2955a95301b699db62e97d54bf0a91feb44e5cd94bbf5b62f1df57fb643966000000" + "0100000000000000000000000000000000000000000000000000000000000000000000006206d75085e384a6d29423c59668439da5df1066c54395874658f9375a1b3bd400ce875effff7f20050000000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff5f04ffff7f2001044c56596f757220737570706f72742068656c70732065636f73797374656d206b6565702067726f77696e672e2062676c31716b656378786738656b797275776b6b68656137796535633067616e6d68646c3764356e6e6133ffffffff0100c817a804000000434104489d8efd89b673459f3ebbe435956c90255d31408dec347e01649c067267a16347c653e7b721d2aacd8290d3c29665280b52605aab9ee7fecd9db31237467411ac00000000", + "00000020426c3ad5f10ea9f63c45e83a2ad336e4b60e65dfed2f609096ec4597ecea142ed02cdad55a71d19eae9dcb4cd2d08dd5b0688e7d57ea3cfa7ea5ca3be01feaaaaafb5863ffdf00210000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020567b4d09bdd37086a0cab38df6c3525fd7f66ce521c5e36890e2502b606e73a3dce1cdf5360dc62ea06f3926de88b95bb71f5d02da7901b59f125662a654303aabfb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03520101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002097b406c1c9384d590bae7bad1dadc58849579f8943d5c73a875976dc13f99b07712ce4947e6c7c77eab39082c0aa342c7712c63265405e954835da546a627a76abfb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03530101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002079f0f37fdeee0d74ad571ac815e4ef952c1b435e289e64f6f5e08b2eec1153649861ac4a47c21006ece59975e6584eb4adbec6862f884998787fc9ab065de5ceacfb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03540101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000202bade3d5d4d95e52ac607133358e842ccf26422b0db47089662d4f180ca7b06d61a556eff79369e3cc6dd1bc2d77ed27bb851da29aadad888c605cffd9486bd5acfb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03550101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002068799da0f6f344f20db908685db4296b0e61a9569823aded1d1fc076f1379b6e532b59cdfcb1f1ea68cbb75d6e042e4a5804e39c6d5d726b4841f4ad1c3bba12acfb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03560101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020740099d4498b320999fa00e0b98c48005c7181530fb5fd3edb21a797c486aa0f42ee5114785d2a58e64cb051db8b240cad8ad00d4434ff4bd11e6fe04089f9fcacfb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03570101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020f3233217848197c3184085879a42483d724c11a3659fb08fb3a49bdfc7506e5ff8282b00416ee83574cdaae8dd123d88a88894846d1c529e349c134fe3acdeefadfb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03580101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020ef298bc4c71d199aae663d3fb1b08b3d18556f85adc1211c77afb35c0bb22d57f6f3290ea71231e60f776353fc49a974936f823a0dc067cc0b9a477439439a0fadfb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03590101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020923ba2cfa16915e63c03a9aa10e9f123894b10a78d53d21afc1e48df5c19dc45c2c18457d3a036acb82bc0d8976bc76807cf02e13e504ff0b0548ede87624d4dadfb5863ffff7f200400000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035a0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020f28d90f8c2ef7455c4aa5c26a6b2eb62dcd8e5cb556c238ea7aef004f55ae6414ac4cf6e0db880d04c6a4b618d7389d6ac0713bd715016907d1c79936d8a7f59adfb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035b0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000205136579a1f406e73de9141269a3565546145b438ba22ca7ae0750d36b6435b3f7f643ae826430c54bc0ae76fbb50844d9719d01a7a3dd5a39567a1a22f9adb94adfb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035c0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000205102baa6df35e2032a4afe7ad7e1b64f1a5bd7b9fd2c329fd2ce6511c581e75dd0e33febfa0443e3fe67d8826d8d5d56ee100248d1055bc4b70bc627b3b38a9eadfb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035d0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020ca6de909847bfafe6f77938063238e38c1063859ee75ab55a69109356f74557918257148ffc34aaa6f981f75197d2abffe1ab623c12f1783ec7f3fbb2f03d8d1aefb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035e0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020f7fa0ce261d46fbbdd99e1d80b7105eec4966348ce2e61e90b234734dca08f20c38a628171e90563f49bee7c3dced120509af392af46f7a2ebca77201af96610aefb5863ffff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035f0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020a71995b628fbd8441ee13fad651cd1fb2a5142b986a30df2d8cd8f270a00467e3a6410c4e7667f4436f034769e6065c69941ebe0aa1d086202a9a538cfe15148aefb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03600101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000207c0f054ef1cd84ccd4693daeae67b8e3f294a56a8e172305d35d3ea27774c366fb9f0e13d91f2652f586723604ad53464f3d415bde09cf4b04527a51519a6e49aefb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401110101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002084fa9914325cb6e0480e42c7103bac60a3d82f0afe9e8a382deaf8af559ac04bf16356082c5de9c8f3b2ec3ae05463700f175291e45fa0ffa839f44932cbdfd9aefb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401120101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000207ff46da508eb62ce501672927cab18ac7b5100ca6878378a168da64394d4de1e93197a58694ddc0c4392679c42f84f73cec1315dde798c6b3572d10b0640d086aefb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401130101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000206408950c9926736fd43b6f14c5fdcfdaab23361c487a3c43b6bfc2901a33ba373c5d5ddf9adf652374626a54cacb6c518f00b6676d40df675cece86c37b37b79affb5863ffff7f200500000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401140101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000209936cfe443585270d40155c8d59f3281786737c93fa03644ba02a3ddf5a6e6239a66d0740209c5cae91ea24238af466b0a63f108aebb7913891670d130fbe702affb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401150101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002000072db0c05e153d1c7c072a974084ae20bd293de5c056f664214d5914251c4adba35d302ad5aa7e08030511aeed2c1a20ddf3fcb0c4425cad4ba39eee404db5affb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401160101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000203f029ac2cf29f967a3c4220e44928cd042314a20f3bd5f86eb980bd0a1a156537711e5c110c92cee558a3e4ae9edd15889776e742f9c5a48e04850e1e6c64865affb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401170101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020f02e24eeb1578a2a776f91240d49de3703c7244074369e7d5e81e8a21d277f74398c0ebe844ebc53964ae9d1c0bc6468d644f887910982d3883080c9ed94755daffb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401180101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020ab96a0568d56544dba27305519c90c4e85effd30c1652ce346afa0753833c259224bf5c8144a6b7221f40e3c425c9697c3660e5124d2b0bdb2143f2dfd19f6b9affb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401190101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020e672030ef633ae86532c3ff8e731bd785c59ac8d05f4b2de0b5e511cd91bdd1d12ea7b5096ab44a1a4289c8452810feba15fe94adc57e62b546b24036086601db0fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011a0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020acb661334475eaa6b83e91ef47e2a8d84ccd215699e1f77770f9086fa402d20571c18acb6e2d2e7be2d017db7a02066b9fe188cc119439a26f51775f6d1079cdb0fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011b0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020fbe0ee7faf521a793a7ed6d61bff55a007569f1ead39110b83c82e8294d4382ae1a8784e0e07918fb1df081b05341ff9b2dd07c3b36bdd8e15cd2305c9891f85b0fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011c0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000202007ccc0d43f5282dcbb7c28ccba651f419e8093a52120ad8adc0513c6807520fe9d7163e3637acf180ccf69cae8f5e17e8c097ffbb39ec84eb338ec380f8f80b0fb5863ffff7f200500000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011d0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020dc9fd9137d7a0f91429c251e79081ff2d763d4d3f820ab72d9c2e157468b6e77e078c23c6388225445df4c5a8e62f3e7e9a6c8352381e646ca6c648ac9759e17b0fb5863ffff7f200600000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011e0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020a7b970608fc6aa8e00930131dcbf42ed7c05c3a2d163ccce90a41ca76c9c745fd2122099ecb96fda85113de22809a8e80dceec399927d51429c88851012823f5b0fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011f0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000206897d106466bb296e3c2156914d085b448df614a93c50b82c63c1f5ff288e74acb1b6e7da59240fb247e46e740ed5fd9dc205f577687fe2a723737fadb63ad60b1fb5863ffff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401200101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020661cb6b9a5613a77d93727bb16bf9f3daf635cbc93a189ba99f46afc3f41652f323e0fd5430e39f9aef11ef3f8338908b6fea494ab85222414c62363874ececbb1fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401210101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000206a67ef053f979cef3316246f6de8c103d7bc80f2634461335e98989352719914f3f33c895fcaf18b78e689c215581dc0706a6beed52736d306cd2710f6068a76b1fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401220101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020da9aa7777b6957456f5b53b383bfca41c36df7eb65a056d1fe39d556270aed550abb3c6ed53fc3df8a4dcae072c7ad20c6450f2357021b61886a2d849729388ab1fb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401230101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020c39e6d6d6d2fd8e8056873a311f25e585bfcd0a6e56fe53bceece9b58f4aef28d13f6c5675a86bbdddea8a724d656f5e6535920e1d81fa56ea29692a19fce91db1fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401240101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020220c1f6f59c166bc83a84294f5778ec8d0e30f5b97e8a96ca293dc240308507853acd337f55a51bdfb957700a57b147f9fb37fc74d010e8b5c9c3222fed07709b1fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401250101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000207d36b6ecc4a0fcb5ec9a1f5c3ce6496179ac032dcd2402acfd5bf68bc0e4601d6cf66a6590952ec417ae8715864643d6cbfcf938a5937387fdc853ee1f8330f8b2fb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401260101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002032e26cdf4e3295408d33705cb332dce947bccca3c48d91beebe98305d6352f56d990b22d3ba21ccbf910c82e9bde7b585b620da938f971aa92a29c088414f1ddb2fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401270101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000205884f607e28655520cd355c94ef29b510ec6d892765867d95ead181ee02f9867f728d48cc6e4ec2f836afa74034d1d88f7fda5cdc08a59334acfc79eca80584fb2fb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401280101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000203875fe41cf0908489e570b1261af9612ee5698cada2006cf06db08376e0909314d31e04773fc710845b7bbcff8c8944629657ec9323f5a66c6100e4c533379b9b2fb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401290101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020c250857dfa253c5b6fc9553b833e163d14eead6a0f1869571315e3fcbe2614285a3d4b5ab27c676191df76d9f957eb64dd86eea0e864870ab47b6ad211aaa6c4b2fb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012a0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000200dfe71cf945cc3d8d5030ebc11f5e336ecf028ba955db7685d003d0eb8e570345a2fa15e45306dc11679b538c14e8c5b835f100b0b9f048ab3f2c6dd7434f0e1b2fb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012b0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020b14d26a609e19c1caf9d4b2cc69d820beddf53f896439f8780ba2f90d781ff7748d11d98e3307855c6311fab707d65f4dc849d789683600ddaa1f312f15bbd9ab3fb5863ffff7f200400000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012c0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020321f5366a4f61b383c57ff23c467c756b32755b810db8ca7a20bf14c310723157b53da8879c5ffbdeb948b17ec5ec809f9c1645537548231654acea1a6a5805cb3fb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012d0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020fb23891bbe42501be70b762453051fafbb2fa4fccd4f170df45e000a8eb65448a3755e60cd42039bb5caa432f24acca224da264203766399d2ac41f34263aae3b3fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012e0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000206d0f2306a97a23aad789336219bcc0ef8ab60f461bb3d530a4b90e468b21a7178535aa38f12ba97c414baba591d0c97af642f6f385ae174502c634b25f0efaedb3fb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012f0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000203fb279f25be524a730f46727d4acb8822361c54c750790498a6bcd1c9a394337a8e6e132aa4dd3db96c77583c1fc84594657f8332c72a5d36304dde0ea55db83b3fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401300101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020ea8438781c31595b309bb0b78d27b23bb28823a19741571c85cacf26c00eb64dbf0435b90472b6cc1bc2e90e602ee109bfd9d30d23e727ac4b9eecabe610db99b3fb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401310101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000209ec8962e80b3105864f36a14d967dbfc671abaf81d63c8ee53894990f893d979d5e68e0e25c564a72a2c9280347d021acc8a30123230083348dcc66f70b9b6eeb4fb5863ffff7f200400000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401320101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020b2003a1cd7f6cea769afcbbae67b118c11047ba10315151b436d30ee351acf2eafa9dc2b3b30080a944662ef3f81937f6f352d07d65eacdb5d2cf012047ecd20b4fb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401330101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020a0c83db8fd4dda3fde410a16e47676a1c3c0391e84381e8b101534ad5e863012c1649e6707efd9caea1bae36193e2ec8221568705922896f17fe0ccef2fbbce5b4fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401340101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020d067e748abbacedf36cd4ae6e9a7ab84cb20fee8b7d30185c4ece182373b752baf14d176c9870ccf01a655a82091c046c4a66cdb337ed65ee0314a12642db304b4fb5863ffff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401350101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000207299762314ec3a68768810434d96a6da7ea9eeef1eba233f8795e35cb3ac1c143b65432ce1bd3b15db3821d436a1cf8a5feb7896de895d9d604bbac4d2ed4880b4fb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401360101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020cb87d453a8078f1f2d5d4ca1a722d7408f6fc08c421c226d85461cf7087c5360b164c437153ffb9bbf394bb7f7f6afedf3032fa4720391fdc6e54b1e8f2fa04db4fb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401370101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020b5c0df64aa100c15eed264e8769658fd1fe8ac878abe13205af9fd269d779073995b813b22a9340e12cc2ce363d670535a1fc2a3332c50784acbe8f3f8033435b5fb5863ffff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401380101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000202163de700788aa62aea281fe0ab3d3494ffa3b1139fb736c145d80d0f09dd8672b1f9f993d0d4f5b914f2cc81ef81334a5f81b9383f4a3f873f23c740d1fee43b5fb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401390101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002028a2d47500aa78fc987c4d2bb855c7803d6f0c681f88e782001c14890ea2d54a88960561ec6d62250aba39ba083bff0d516fcb88f4fa1261ef66d0c93ecdccbeb5fb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013a0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020fcf716d8b7f7c167e7aaa72b6133e46703f7082b77a29ac96394e976af165368efca1e0dcf15a3dafb62ee0d33d5418bc8fa4a8116d347cf93d28aafc082c86bb5fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013b0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000201cb9c0fcb8075b51bddab0884384fa15d46654f05465b5172f3653219865674cbfe39ec55918d5fdaefdb1870bc41cef2a7748292658a9d093513b1f116a8564b5fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013c0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000202dc24eb4968827618930b64331efe511455f85e1e1c9cdf9f820372263fec221dda59312d603442762b732dde1f842c12d6fe2f24ac471756d4441afdda38e3eb5fb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013d0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000207c8bde8a31132449f27be84c436a4e5eb650f62110b2122fa9f172cec338704370b54f25dedf687fcee98010083794c22203245668ff9065201971f9c1e358fbb6fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013e0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020072b7b7c76c91fe8b82911148adbf09038ef6528834f01f1ee2c9d1718800c53cca0d1a0fcb2f38838942d54eff30c3cbdde08fceb91cb3cffbca6aed92e9364b6fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013f0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020828fafa7d3fca39b7f03b1087a5920279adcbe108c12e835799cc4c3581d844b2d245b16aaa7bc4dbc04cf4a6ce60b1a533c7aa19ce0832ac4c88460c6705162b6fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401400101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020310ccc881047dda4b64ceb3873a5e709f705d712418ddbe1bcf634677134002090aaa763fa2696e7b62ef1f444f324f4a640b795f33b3d93418879d0bdd6bb8fb6fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401410101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020be44d666545e705cc2847c74ff70a9c282ca697d964730a8906044022d66d814460509ce8fb4f6bebf17bce6b861adf0a10eefbb84701770ddc72db80c5e4768b6fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401420101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020a597eef5155c9d2315b69786a00dac783d16f33dadd2478b39a5f49e437cd4189b40ee4900f53340b0b5a4e06e7c52afef8f528fcaa19cd0e8cb255846b93bd8b6fb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401430101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020327abdd07fbadc240327eff9f13c776352398c5bb652ee92884551df5e1d7e3bf0908ef819388ec6116d697e8ea25fb14a09c20aa6d83c2f869f87db4ec1faafb7fb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401440101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000207fedda5fadf8683f1d5f9774c66e1198d769857e0116be64e6e5d2f6b6a6483de573e7f06caf4986ac27735bf225ea9b112b16f2368d2c743e11a0a9748bacb4b7fb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401450101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000208755717ba9e0483048749f4b70c58ef187c1164368cb0321933e269d47be0666ba3c939fa26ea98a08a5516b9a20c3e6c3e156495b2e3e485cc062dae194abd3b7fb5863ffff7f200500000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401460101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000201364577bf1a852591dddeacee0892b177e6f2d0554ea85ba00b0b2d2cb310437cbbfdd65b9a1dba9ed5d07cbf95dc38ef3afd1f0c3f2e8ee28bd5e1a9b5a3971b7fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401470101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020978519cee8d62b0158f89fcc7093cec80bd6e2517a602895d4f9863366072f5d1c8a4dbf44260f2de171b53326db1f43ec5e22fa830c6ad021e05b2ff71df415b7fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401480101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020df2a85e37e69ecf76c0c125124803dd17b413c63add40f76043e8cb1ddfd32325f26b6be547d1e97d84f0c5bf53f464132864a7f86189f25ac840d5dba8b6a2eb7fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401490101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002021d6cec0783aae11fc4f9adc5c4d33044da36139ab798078a11ef4d642122e227277838e3635d31513e8b9be5a17c262d5e324f4ec0a8ae0468b80c3fc25035ab8fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014a0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000202668b0a2b2e6a89b25f2a673fd9be3fb7660b98fbae44c217ee43c5e6c0242492cf116ccb4fc0f160eb3d13e2597f9507e9fdaed71efb43306f196a55496027fb8fb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014b0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000202c7a2e65568d3a980c69a3784c1ea095d6d42c297db24884f781805ed9266644a18ce6af1199cd730e7470a108090b8538296029a31059d48f39db83c4859c4bb8fb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014c0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000200c553aeb2949a930fd5a6359eb9909d2b422e84ccde7375d43a29ca9d492846f2ab1246f3500b5f7d9a620ee83973f965e46e0f455b82135efd83c97476f02dab8fb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014d0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020f8f21b2e4d8225133dfeb5d916799c809959a7586bea0b0a1321f6a68f90c66563a4435aca5f5330584a001870b13c2943c1dbfd2441d7889702b0e1ee11abd3b8fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014e0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000209eea9738de5bcbc0980b47edee317745194d78b5fdac9486055ff613820e6a220107a0ac9594181dbb50aacbf6a140c22a77423dcbac281cf209c645b836148ab8fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014f0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000208afc147655eab045705419e9dfe08911cac40bebf94eb3bf7aab5395127e3355b318c159a952213133323540770683835aef7228b3c631eea2e664f84050937fb9fb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401500101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000203ba24dc14ca0aad867c7da6d331f4c548922e918396945e396b386ad35841b63f2c49808eb1655e2cfb512f5b3a6a236b5a9eb16f1d0afb159d431e9ef216d5ab9fb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401510101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020104ddc13fb8d176e82239492c7b215135c5eda47531b34e2332ffcf522016c72078c3860da768a07a1adfab43e31d990ef135100a36c50f1facf939ed433542cb9fb5863ffff7f200400000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401520101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020a05f41d1429fdf1ed958788e3f76fd9135366daad16bca6302b124199704ec3f2cb130ffed56fcab82b9a0ba992b63a180b6a5e8f0689f339eabd33939f44b10b9fb5863ffff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401530101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020d34e7804345ecbdb33d7a483ab3ebb0017fcee43335a0b1f80dd5898d153651da9fa33ee2e70d7115caa0b4e8bb4a7904df8cb58c543b9d5f0f5ba1c7ef496f7b9fb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401540101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000203a31a5823321afb883c8ad7fd018f740f4ab682332741beafb3c3627f408cf1be24a818df14f8b652dd8fd22fb962843693ceaa3e3748188199f011a9fcee8a0b9fb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401550101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002086a15399b90428a5015b8b376efb7f153274092978cd33af4b9a24a9eeeca546443cc324d6117d3986a1ac2438c13396e60e78de54247a93dfea8097b680ef3ebafb5863ffff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401560101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020af0c3e9be70f56709696f4666a20fc86891c16ac5a00b37619a2d726484d175edf756fe8293aca0c24261debffce67cdb7d7f193a80f610f49b0bcb365a684ecbafb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401570101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000204551badbe44e08d7b278410f0b2940c2d6b33fc8f364580cebbc2e090308bc1a36f1a55170b9673fe46df68fcbf1d392361f5a56ac94f2e7da6dc24aaf63a313bafb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401580101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020787f6fe9b4588f6fca60815de7856a4e31bb2d62d7511d9c7bc65cb2ff520e3e9de9b44eb7af8972217cf360ccd0950e218d56f35f91ff5f7da21c9dc39dc2f8bafb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401590101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020fc4b2a01e77204f4d243388746abe69c350d7f66384ae133ea68ebc5f67d3e222b263a902be0e4162672947a15a7ca01fb6d2a5a2a350fa5a3a67847029ba91cbafb5863ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015a0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002065cfd20a6e74334e1a0e575b092d3abd3c7c25931e73377927e0a9f05db0573252ba6eca5f0c4230c7b486239b6bc8356d8fd0179e445eaa9b965ea88cd12a2ebafb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015b0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020f0f2d89e637921359c4019d25716ff45a1687dd7240350c20b91ad8b178ecc7767e553f0da3cc001ab95027a7c16b706fea8655e188427ae6267fd7965148d2ebbfb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015c0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020934350143533d53120a015df0773c75f763da0aad76bd1a58f12c98eaa0c675b98d29d24cd8f4bce9ed1583bb6a3c54294e38097dd84f10fcd3a776ce491a408bbfb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015d0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000206d7aed4937ff3300c057decef36e512ec7bc834937a5cf7b1c59a61a44ecc64cdf4ad8cf4e375df8fe0a5d892389dbce33332409717bf094f8f0bbf1861c89a3bbfb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015e0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020522b025025c13aa27c6de4a71b2a2ca6c2f5a7c9cc02aa2f513b4b64782a324cfbb18f709baaf571cbcb72ebcdf6ef492e5426dfeeaaf9d2cb3af93b2979053dbbfb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015f0101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002030c91a30179363185468bd9dd662ca148977122cab4472e104c22c7f0761c977e029034394e6b1651fd4ae9a9c5f450f23ba857cb58cc962f5d4533320f3f121bbfb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401600101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020c68d89591f0f4fd063c662774d217eeca6a605738a30c237d1154c293584794a503ce9bde379b8b96cf295494afb9f4f6be082049921a185c866163fc61fabaebbfb5863ffff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401610101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002074f1f6f1096e398ac4cc54361062fc277f3959c484bacbb2402761caaaf31952e30d102585d9826b73213650810583457c79b639723f17501cd8408bbddd261ebcfb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401620101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020fd722fe2dcdccb9b30ba4ea8ba05562cc97211f59d86243b119d873e94c24b4e06cef1631112bc36effd466f2c6396a3b2dac16acf74dcc5512e5945bc04d873bcfb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401630101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020bb778811115f51fe7b6262717e60dfced2cdcd3a2a870fc52c31aa23b446bb32805c6b1d39516e7b8837edd756118ee90db73d5176f2036e985f980856788f43bcfb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401640101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020408e30f5b4127bac87d9b7c1b85c3af13aa162feecb6da343fd351377c8ad56f5ae3f450025fea523580f6c803c314ad9ad04ab6e524213bebe42c8c649e735abcfb5863ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401650101ffffffff0200c817a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020a0af232570a23ce8a448e57a7ef440aed91098fb345eb981393f6cb41d28fe51bd779a25be033651460f10154045990273abb24783da22c34dd7ff611f5b2d2cbcfb5863ffff7f200200000002020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401660101ffffffff021ac917a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ed9c3eb1fa18e5bd51691eb1891c44131b7d2ea0aad982143e16e606f28adda7aa012000000000000000000000000000000000000000000000000000000000000000000000000002000000000101d02cdad55a71d19eae9dcb4cd2d08dd5b0688e7d57ea3cfa7ea5ca3be01feaaa0000000000feffffff0200fe7c6c04000000160014c2a37861a534b72fc2853298c795a37dcd3ef183fcbe9a3b000000001600140076b1e496ec9520df644c6343c271771bbd2ee90247304402205a9f8977cce859e975a26348852a57cb702926bf4e53232f10a78a60fd132cd602204a8e3b8e577008475675261e0b91ebbb7e7964d29b43e71c98b8ddc466e5a5920121022a8ed5358832ab1218113501d19ee1cb02dc42f5713506fbd320c075fc866b8865000000", + "0000002015e2f49c13b416ac008d0274b57f93e4f5f1c5950b711938257c8efb82bfb33bd1c2bb4bab3aa0b60e59168013e47300d5adac4f45f94a2ba1d7b7927775c6d5bcfb5863ffff7f200000000004020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401670101ffffffff02bada17a8040000001600140076b1e496ec9520df644c6343c271771bbd2ee90000000000000000266a24aa21a9ed5b95e5b7a7b059082bc6fa7775f56c57eefaf79b122348337f255c56a15930c1012000000000000000000000000000000000000000000000000000000000000000000000000002000000000101a939d9f07ad7ef9781e37bd194605ee84d428059aee93125c5badce08ea47ebb0000000000feffffff02fcbe9a3b000000001600140076b1e496ec9520df644c6343c271771bbd2ee90034e23004000000160014916e1e79e8a50aab2efd61d291cc35ad659462a40247304402206ea6fc8fe923ebe79d31090a1f32dfc7534ccb077c1affe92eb2f26617817d5002202cfb26f4ac2650f737dafdfd26f60223b78e53c843ac27225ef1f3dee66536f90121021fb59383fea283c4c84c8dc7dfea87acdf8ccc2803fe96d8c0e067760435e8996600000002000000000101b47a587de90e631218735b1f0795b41ec0efd3dd136663b61a71dcc58d50f2ad0100000000feffffff02fc5e47f503000000160014986109cba20299315102fa85ddbbfdb1699b7b6300ca9a3b000000001600140076b1e496ec9520df644c6343c271771bbd2ee902473044022072a5a1752aa72777bdfffac25672d0b1311c8052e5e9b1f7e6938b29d46cf4b502206d48befba1c768db417f1de0252263d9d2222a7d8d20fc1d9fe05c2a237771e3012103e9e0fcceefafdfdc46ef8715c23f70eb8db7806ee8e091582c0aff70c1e979e06600000002000000000101870812a90c7b5d6adf8d5b5e2c8e97306deec3d6cbf65305d6ae3964f0886dd80000000000feffffff02c43bf505000000001600140076b1e496ec9520df644c6343c271771bbd2ee9fc7d51ef030000001600144e60642f586cc815caf725c0bd6bd1957bbfba6c02473044022019ccd8ae302abf6290334ae619781ff8c6d7c13c1e2c4e946b50b876eb7caca802201199af48f8cd6b9e8c9dc8818a3280979db07023bd969236214f10c71e3e8dbf012103ec4ae9ac681e8bad3138225b7b7cb3dad36a294173ea91eeba056279d27f8b6a4a000000" ], - "mocktime": 1525107225, + "mocktime": 1666775978, "stats": [ { "avgfee": 0, "avgfeerate": 0, "avgtxsize": 0, - "blockhash": "29a36876ddc6899a2541afc78ce2b3ca7659cfc01875e8208d9110d59bce3a9b", + "blockhash": "51fe281db46c3f3981b95e34fb9810d9ae40f47e7ae548a4e83ca2702523afa0", "feerate_percentiles": [ 0, 0, @@ -125,30 +125,30 @@ "maxfeerate": 0, "maxtxsize": 0, "medianfee": 0, - "mediantime": 1525107242, + "mediantime": 1666775995, "mediantxsize": 0, "minfee": 0, "minfeerate": 0, "mintxsize": 0, "outs": 2, - "subsidy": 5000000000, + "subsidy": 20000000000, "swtotal_size": 0, "swtotal_weight": 0, "swtxs": 0, - "time": 1525107243, + "time": 1666775996, "total_out": 0, "total_size": 0, "total_weight": 0, "totalfee": 0, "txs": 1, "utxo_increase": 2, - "utxo_size_inc": 163 + "utxo_size_inc": 160 }, { - "avgfee": 4460, + "avgfee": 2820, "avgfeerate": 20, - "avgtxsize": 223, - "blockhash": "0aa1cae78efd1efcd5203366a257b6ccf4c9e4960f6b8a3724ad790ab568a10f", + "avgtxsize": 222, + "blockhash": "3bb3bf82fb8e7c253819710b95c5f1f5e4937fb574028d00ac16b4139cf4e215", "feerate_percentiles": [ 20, 20, @@ -158,65 +158,65 @@ ], "height": 102, "ins": 1, - "maxfee": 4460, + "maxfee": 2820, "maxfeerate": 20, - "maxtxsize": 223, - "medianfee": 4460, - "mediantime": 1525107242, - "mediantxsize": 223, - "minfee": 4460, + "maxtxsize": 222, + "medianfee": 2820, + "mediantime": 1666775995, + "mediantxsize": 222, + "minfee": 2820, "minfeerate": 20, - "mintxsize": 223, + "mintxsize": 222, "outs": 4, - "subsidy": 5000000000, - "swtotal_size": 0, - "swtotal_weight": 0, - "swtxs": 0, - "time": 1525107243, - "total_out": 4999995540, - "total_size": 223, - "total_weight": 892, - "totalfee": 4460, + "subsidy": 20000000000, + "swtotal_size": 222, + "swtotal_weight": 561, + "swtxs": 1, + "time": 1666775996, + "total_out": 19999997180, + "total_size": 222, + "total_weight": 561, + "totalfee": 2820, "txs": 2, "utxo_increase": 3, - "utxo_size_inc": 236 + "utxo_size_inc": 232 }, { - "avgfee": 24906, - "avgfeerate": 121, - "avgtxsize": 231, - "blockhash": "53e416e2538bc783c42a7aea566e884321afed893e9e58cf356d6429759dfa46", + "avgfee": 15980, + "avgfeerate": 113, + "avgtxsize": 222, + "blockhash": "6f9bee954889c17fd46378998717acaa2d2fb2663eddda506655fefe6d8470e5", "feerate_percentiles": [ 20, 20, 20, - 300, - 300 + 301, + 301 ], "height": 103, "ins": 3, - "maxfee": 66900, - "maxfeerate": 300, - "maxtxsize": 249, - "medianfee": 4460, - "mediantime": 1525107243, - "mediantxsize": 223, - "minfee": 3360, + "maxfee": 42300, + "maxfeerate": 301, + "maxtxsize": 222, + "medianfee": 2820, + "mediantime": 1666775996, + "mediantxsize": 222, + "minfee": 2820, "minfeerate": 20, - "mintxsize": 223, + "mintxsize": 222, "outs": 8, - "subsidy": 5000000000, - "swtotal_size": 249, - "swtotal_weight": 669, - "swtxs": 1, - "time": 1525107243, - "total_out": 9999920820, - "total_size": 695, - "total_weight": 2453, - "totalfee": 74720, + "subsidy": 20000000000, + "swtotal_size": 666, + "swtotal_weight": 1683, + "swtxs": 3, + "time": 1666775996, + "total_out": 53999949240, + "total_size": 666, + "total_weight": 1683, + "totalfee": 47940, "txs": 4, "utxo_increase": 5, - "utxo_size_inc": 384 + "utxo_size_inc": 376 } ] } \ No newline at end of file From 88396d532b733fce4d2bbc3f77cae660c99f093d Mon Sep 17 00:00:00 2001 From: nadyka Date: Sat, 29 Oct 2022 19:39:01 +0400 Subject: [PATCH 033/144] Update error message to BGLd. --- test/functional/wallet_multiwallet.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/functional/wallet_multiwallet.py b/test/functional/wallet_multiwallet.py index 3a449f35d5..960e142e9e 100755 --- a/test/functional/wallet_multiwallet.py +++ b/test/functional/wallet_multiwallet.py @@ -201,7 +201,7 @@ def wallet_file(name): self.restart_node(0, ['-nowallet', '-walletdir=' + competing_wallet_dir]) self.nodes[0].createwallet(self.default_wallet_name) if self.options.descriptors: - exp_stderr = r"Error: SQLiteDatabase: Unable to obtain an exclusive lock on the database, is it being used by another bitcoind?" + exp_stderr = r"Error: SQLiteDatabase: Unable to obtain an exclusive lock on the database, is it being used by another BGLd?" else: exp_stderr = r"Error: Error initializing wallet database environment \"\S+competing_walletdir\S*\"!" self.nodes[1].assert_start_raises_init_error(['-walletdir=' + competing_wallet_dir], exp_stderr, match=ErrorMatch.PARTIAL_REGEX) @@ -302,7 +302,7 @@ def wallet_file(name): # Fail to load duplicate wallets path = os.path.join(self.options.tmpdir, "node0", "regtest", "wallets", "w1", "wallet.dat") if self.options.descriptors: - assert_raises_rpc_error(-4, "Wallet file verification failed. SQLiteDatabase: Unable to obtain an exclusive lock on the database, is it being used by another bitcoind?", self.nodes[0].loadwallet, wallet_names[0]) + assert_raises_rpc_error(-4, "Wallet file verification failed. SQLiteDatabase: Unable to obtain an exclusive lock on the database, is it being used by another BGLd?", self.nodes[0].loadwallet, wallet_names[0]) else: assert_raises_rpc_error(-35, "Wallet file verification failed. Refusing to load database. Data file '{}' is already loaded.".format(path), self.nodes[0].loadwallet, wallet_names[0]) From df648148c7495e8c86f3081800301dc31fa41439 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Wed, 26 Oct 2022 10:22:18 +0200 Subject: [PATCH 034/144] test/functional/p2p_segwit: Fix the test case by adjusting to BGL network. Fix the test case by setting the correct MAX_BLOCK_WEIGHT in test framework for BGL which is 10x less than Bitcoin and setting correct prefix for BGL regtest network. --- test/functional/p2p_segwit.py | 10 ++++++---- test/functional/test_framework/messages.py | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/test/functional/p2p_segwit.py b/test/functional/p2p_segwit.py index fc0cc28e18..6fa915f9f1 100755 --- a/test/functional/p2p_segwit.py +++ b/test/functional/p2p_segwit.py @@ -881,7 +881,7 @@ def test_witness_block_size(self): # This should give us plenty of room to tweak the spending tx's # virtual size. NUM_DROPS = 200 # 201 max ops per script! - NUM_OUTPUTS = 50 + NUM_OUTPUTS = 5 witness_script = CScript([OP_2DROP] * NUM_DROPS + [OP_TRUE]) script_pubkey = script_to_p2wsh_script(witness_script) @@ -922,8 +922,10 @@ def test_witness_block_size(self): block.solve() assert_equal(block.get_weight(), MAX_BLOCK_WEIGHT + 1) # Make sure that our test case would exceed the old max-network-message - # limit - assert len(block.serialize()) > 2 * 1024 * 1024 + # limit. For BGL this value is adjusted to MAX_BLOCK_WEIGHT / 2 since the + # Segwit is enabled by default and the serialized block size is less than + # len(block.get_weight()) + assert len(block.serialize()) > MAX_BLOCK_WEIGHT / 2 test_witness_block(self.nodes[0], self.test_node, block, accepted=False) @@ -1999,7 +2001,7 @@ def serialize(self): self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(address_type='bech32'), 5) self.generate(self.nodes[0], 1) - unspent = next(u for u in self.nodes[0].listunspent() if u['spendable'] and u['address'].startswith('bcrt')) + unspent = next(u for u in self.nodes[0].listunspent() if u['spendable'] and u['address'].startswith('rbgl')) raw = self.nodes[0].createrawtransaction([{"txid": unspent['txid'], "vout": unspent['vout']}], {self.nodes[0].getnewaddress(): 1}) tx = tx_from_hex(raw) diff --git a/test/functional/test_framework/messages.py b/test/functional/test_framework/messages.py index 327e2ef19b..a3b027b785 100755 --- a/test/functional/test_framework/messages.py +++ b/test/functional/test_framework/messages.py @@ -35,7 +35,7 @@ from test_framework.util import assert_equal MAX_LOCATOR_SZ = 101 -MAX_BLOCK_WEIGHT = 4000000 +MAX_BLOCK_WEIGHT = 400000 MAX_BLOOM_FILTER_SIZE = 36000 MAX_BLOOM_HASH_FUNCS = 50 From 0b04397b820856d891c9c892ddbe4347725146c2 Mon Sep 17 00:00:00 2001 From: Fotis Koutoupas Date: Thu, 4 Feb 2021 00:19:11 +0200 Subject: [PATCH 035/144] wallet: Fix already-loading error message grammar --- test/functional/wallet_multiwallet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/wallet_multiwallet.py b/test/functional/wallet_multiwallet.py index 960e142e9e..378df0618c 100755 --- a/test/functional/wallet_multiwallet.py +++ b/test/functional/wallet_multiwallet.py @@ -34,7 +34,7 @@ def test_load_unload(node, name): node.loadwallet(name) node.unloadwallet(name) except JSONRPCException as e: - if e.error['code'] == -4 and 'Wallet already being loading' in e.error['message']: + if e.error['code'] == -4 and 'Wallet already loading' in e.error['message']: got_loading_error = True return From 299955284eaed9d30a23b7ad34b0ae4e7ab9c89a Mon Sep 17 00:00:00 2001 From: Korrrba Date: Mon, 7 Nov 2022 17:02:17 +0100 Subject: [PATCH 036/144] test/functional/wallet_listdescriptors: Set correct descriptor for BGL regtest network. The BGL regtest functional tests network is initialized with deterministic private keys defined in PRIV_KEYS mapping in the test framework. The test case failed on descriptor and descriptor checksum calculated for Bitcoin network. Fix the test case by adjusting the correct value for BGL network. --- test/functional/wallet_listdescriptors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/wallet_listdescriptors.py b/test/functional/wallet_listdescriptors.py index f719d694bf..fd1ba51734 100755 --- a/test/functional/wallet_listdescriptors.py +++ b/test/functional/wallet_listdescriptors.py @@ -116,7 +116,7 @@ def run_test(self): 'wallet_name': 'w4', 'descriptors': [ {'active': False, - 'desc': 'combo(0227d85ba011276cf25b51df6a188b75e604b38770a462b2d0e9fb2fc839ef5d3f)#np574htj', + 'desc': 'combo(022a8ed5358832ab1218113501d19ee1cb02dc42f5713506fbd320c075fc866b88)#55wlgpc0', 'timestamp': 1296688602}, ] } From ae96576cb3b3e7c6a1d6692947a18253e95d4d01 Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Mon, 28 Jun 2021 15:53:41 -0400 Subject: [PATCH 037/144] Store pubkeys in TRDescriptor::MakeScripts When expanding the scripts for a TRDescriptor, also store the pubkeys in the FlatSigningProvider. --- src/script/descriptor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/script/descriptor.cpp b/src/script/descriptor.cpp index 78847839b4..abe45dcd93 100644 --- a/src/script/descriptor.cpp +++ b/src/script/descriptor.cpp @@ -851,6 +851,7 @@ class TRDescriptor final : public DescriptorImpl builder.Finalize(xpk); WitnessV1Taproot output = builder.GetOutput(); out.tr_spenddata[output].Merge(builder.GetSpendData()); + out.pubkeys.emplace(keys[0].GetID(), keys[0]); return Vector(GetScriptForDestination(output)); } bool ToStringSubScriptHelper(const SigningProvider* arg, std::string& ret, const StringType type, const DescriptorCache* cache = nullptr) const override From 97be6e05e4f8744ce4724fd356b4288e31aeefef Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Wed, 23 Jun 2021 16:11:51 -0400 Subject: [PATCH 038/144] Create a tr() descriptor bech32m DescriptorScriptPubKeyMan by default --- src/wallet/scriptpubkeyman.cpp | 11 +++--- src/wallet/wallet.cpp | 5 --- test/functional/rpc_fundrawtransaction.py | 23 ++++++++----- test/functional/rpc_psbt.py | 2 +- test/functional/tool_wallet.py | 13 ++++--- test/functional/wallet_address_types.py | 41 ++++++++++++++++------- test/functional/wallet_createwallet.py | 2 +- test/functional/wallet_descriptor.py | 6 ++-- test/functional/wallet_groups.py | 21 ++++++++---- test/functional/wallet_hd.py | 2 +- test/functional/wallet_keypool.py | 8 ++--- test/functional/wallet_listdescriptors.py | 6 ++-- 12 files changed, 85 insertions(+), 55 deletions(-) diff --git a/src/wallet/scriptpubkeyman.cpp b/src/wallet/scriptpubkeyman.cpp index 619ebc8b4f..b976475d39 100644 --- a/src/wallet/scriptpubkeyman.cpp +++ b/src/wallet/scriptpubkeyman.cpp @@ -1876,12 +1876,6 @@ bool DescriptorScriptPubKeyMan::AddDescriptorKeyWithDB(WalletBatch& batch, const bool DescriptorScriptPubKeyMan::SetupDescriptorGeneration(const CExtKey& master_key, OutputType addr_type, bool internal) { - if (addr_type == OutputType::BECH32M) { - // Don't allow setting up taproot descriptors yet - // TODO: Allow setting up taproot descriptors - return false; - } - LOCK(cs_desc_man); assert(m_storage.IsWalletFlagSet(WALLET_FLAG_DESCRIPTORS)); @@ -1911,7 +1905,10 @@ bool DescriptorScriptPubKeyMan::SetupDescriptorGeneration(const CExtKey& master_ desc_prefix = "wpkh(" + xpub + "/84'"; break; } - case OutputType::BECH32M: assert(false); // TODO: Setup taproot descriptor + case OutputType::BECH32M: { + desc_prefix = "tr(" + xpub + "/86'"; + break; + } } // no default case, so the compiler can warn about missing cases assert(!desc_prefix.empty()); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 4eb9d5560d..05e5b6f6a3 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -3164,11 +3164,6 @@ void CWallet::SetupDescriptorScriptPubKeyMans() for (bool internal : {false, true}) { for (OutputType t : OUTPUT_TYPES) { - if (t == OutputType::BECH32M) { - // Skip taproot (bech32m) for now - // TODO: Setup taproot (bech32m) descriptors by default - continue; - } auto spk_manager = std::unique_ptr(new DescriptorScriptPubKeyMan(*this)); if (IsCrypted()) { if (IsLocked()) { diff --git a/test/functional/rpc_fundrawtransaction.py b/test/functional/rpc_fundrawtransaction.py index 7f71ff383e..32327f4d75 100755 --- a/test/functional/rpc_fundrawtransaction.py +++ b/test/functional/rpc_fundrawtransaction.py @@ -575,12 +575,12 @@ def test_locked_wallet(self): if self.options.descriptors: self.nodes[1].walletpassphrase('test', 10) self.nodes[1].importdescriptors([{ - 'desc': descsum_create('wpkh(tprv8ZgxMBicQKsPdYeeZbPSKd2KYLmeVKtcFA7kqCxDvDR13MQ6us8HopUR2wLcS2ZKPhLyKsqpDL2FtL73LMHcgoCL7DXsciA8eX8nbjCR2eG/0h/*h)'), + 'desc': descsum_create('tr(tprv8ZgxMBicQKsPdYeeZbPSKd2KYLmeVKtcFA7kqCxDvDR13MQ6us8HopUR2wLcS2ZKPhLyKsqpDL2FtL73LMHcgoCL7DXsciA8eX8nbjCR2eG/0h/*h)'), 'timestamp': 'now', 'active': True }, { - 'desc': descsum_create('wpkh(tprv8ZgxMBicQKsPdYeeZbPSKd2KYLmeVKtcFA7kqCxDvDR13MQ6us8HopUR2wLcS2ZKPhLyKsqpDL2FtL73LMHcgoCL7DXsciA8eX8nbjCR2eG/1h/*h)'), + 'desc': descsum_create('tr(tprv8ZgxMBicQKsPdYeeZbPSKd2KYLmeVKtcFA7kqCxDvDR13MQ6us8HopUR2wLcS2ZKPhLyKsqpDL2FtL73LMHcgoCL7DXsciA8eX8nbjCR2eG/1h/*h)'), 'timestamp': 'now', 'active': True, 'internal': True @@ -789,11 +789,18 @@ def test_option_feerate(self): for param, zero_value in product(["fee_rate", "feeRate"], [0, 0.000, 0.00000000, "0", "0.000", "0.00000000"]): assert_equal(self.nodes[3].fundrawtransaction(rawtx, {param: zero_value})["fee"], 0) - # With no arguments passed, expect fee of 141 satoshis. - assert_approx(node.fundrawtransaction(rawtx)["fee"], vexp=0.00000141, vspan=0.00000001) - # Expect fee to be 10,000x higher when an explicit fee rate 10,000x greater is specified. - result = node.fundrawtransaction(rawtx, {"fee_rate": 10000}) - assert_approx(result["fee"], vexp=0.0141, vspan=0.0001) + if self.options.descriptors: + # With no arguments passed, expect fee of 153 satoshis as descriptor wallets now have a taproot output. + assert_approx(node.fundrawtransaction(rawtx)["fee"], vexp=0.00000153, vspan=0.00000001) + # Expect fee to be 10,000x higher when an explicit fee rate 10,000x greater is specified. + result = node.fundrawtransaction(rawtx, {"fee_rate": 10000}) + assert_approx(result["fee"], vexp=0.0153, vspan=0.0001) + else: + # With no arguments passed, expect fee of 141 satoshis as legacy wallets only support up to segwit v0. + assert_approx(node.fundrawtransaction(rawtx)["fee"], vexp=0.00000141, vspan=0.00000001) + # Expect fee to be 10,000x higher when an explicit fee rate 10,000x greater is specified. + result = node.fundrawtransaction(rawtx, {"fee_rate": 10000}) + assert_approx(result["fee"], vexp=0.0141, vspan=0.0001) self.log.info("Test fundrawtxn with invalid estimate_mode settings") for k, v in {"number": 42, "object": {"foo": "bar"}}.items(): @@ -1079,7 +1086,7 @@ def test_22670(self): # Make sure the default wallet will not be loaded when restarted with a high minrelaytxfee self.nodes[0].unloadwallet(self.default_wallet_name, False) feerate = Decimal("0.1") - self.restart_node(0, [f"-minrelaytxfee={feerate}", "-discardfee=0"]) # Set high minrelayfee, set discardfee to 0 for easier calculation + self.restart_node(0, [f"-minrelaytxfee={feerate}", "-discardfee=0", "-changetype=bech32", "-addresstype=bech32"]) # Set high minrelayfee, set discardfee to 0 for easier calculation self.nodes[0].loadwallet(self.default_wallet_name, True) funds = self.nodes[0].get_wallet_rpc(self.default_wallet_name) diff --git a/test/functional/rpc_psbt.py b/test/functional/rpc_psbt.py index 5d067b7d32..6d490d5d73 100755 --- a/test/functional/rpc_psbt.py +++ b/test/functional/rpc_psbt.py @@ -31,7 +31,7 @@ class PSBTTest(BGLTestFramework): def set_test_params(self): self.num_nodes = 3 self.extra_args = [ - ["-walletrbf=1"], + ["-walletrbf=1", "-addresstype=bech32", "-changetype=bech32"], #TODO: Remove address type restrictions once taproot has psbt extensions ["-walletrbf=0", "-changetype=legacy"], [] ] diff --git a/test/functional/tool_wallet.py b/test/functional/tool_wallet.py index 2417965078..e7a2c1ca33 100755 --- a/test/functional/tool_wallet.py +++ b/test/functional/tool_wallet.py @@ -69,8 +69,8 @@ def log_wallet_timestamp_comparison(self, old, new): def get_expected_info_output(self, name="", transactions=0, keypool=2, address=0): wallet_name = self.default_wallet_name if name == "" else name - output_types = 3 # p2pkh, p2sh, segwit if self.options.descriptors: + output_types = 4 # p2pkh, p2sh, segwit, bech32m return textwrap.dedent('''\ Wallet info =========== @@ -84,6 +84,7 @@ def get_expected_info_output(self, name="", transactions=0, keypool=2, address=0 Address Book: %d ''' % (wallet_name, keypool * output_types, transactions, address)) else: + output_types = 3 # p2pkh, p2sh, segwit. Legacy wallets do not support bech32m. return textwrap.dedent('''\ Wallet info =========== @@ -356,9 +357,13 @@ def test_getwalletinfo_on_different_wallet(self): self.log.debug('Wallet file timestamp after calling getwalletinfo: {}'.format(timestamp_after)) assert_equal(0, out['txcount']) - assert_equal(1000, out['keypoolsize']) - assert_equal(1000, out['keypoolsize_hd_internal']) - assert_equal(True, 'hdseedid' in out) + if not self.options.descriptors: + assert_equal(1000, out['keypoolsize']) + assert_equal(1000, out['keypoolsize_hd_internal']) + assert_equal(True, 'hdseedid' in out) + else: + assert_equal(4000, out['keypoolsize']) + assert_equal(4000, out['keypoolsize_hd_internal']) self.log_wallet_timestamp_comparison(timestamp_before, timestamp_after) assert_equal(timestamp_before, timestamp_after) diff --git a/test/functional/wallet_address_types.py b/test/functional/wallet_address_types.py index 2188d43e2a..e8ec9a09a9 100755 --- a/test/functional/wallet_address_types.py +++ b/test/functional/wallet_address_types.py @@ -121,6 +121,12 @@ def test_address(self, node, address, multisig, typ): assert_equal(info['witness_version'], 0) assert_equal(len(info['witness_program']), 40) assert 'pubkey' in info + elif not multisig and typ == "bech32m": + # P2TR single sig + assert info["isscript"] + assert info["iswitness"] + assert_equal(info["witness_version"], 1) + assert_equal(len(info["witness_program"]), 64) elif typ == 'legacy': # P2SH-multisig assert info['isscript'] @@ -342,19 +348,31 @@ def run_test(self): self.log.info("Nodes with addresstype=legacy never use a P2WPKH change output (unless changetype is set otherwise):") self.test_change_output_type(0, [to_address_bech32_1], 'legacy') - self.log.info("Nodes with addresstype=p2sh-segwit only use a P2WPKH change output if any destination address is bech32:") - self.test_change_output_type(1, [to_address_p2sh], 'p2sh-segwit') - self.test_change_output_type(1, [to_address_bech32_1], 'bech32') - self.test_change_output_type(1, [to_address_p2sh, to_address_bech32_1], 'bech32') - self.test_change_output_type(1, [to_address_bech32_1, to_address_bech32_2], 'bech32') + if self.options.descriptors: + self.log.info("Nodes with addresstype=p2sh-segwit only use a bech32m change output if any destination address is bech32:") + self.test_change_output_type(1, [to_address_p2sh], 'p2sh-segwit') + self.test_change_output_type(1, [to_address_bech32_1], 'bech32m') + self.test_change_output_type(1, [to_address_p2sh, to_address_bech32_1], 'bech32m') + self.test_change_output_type(1, [to_address_bech32_1, to_address_bech32_2], 'bech32m') + else: + self.log.info("Nodes with addresstype=p2sh-segwit only use a P2WPKH change output if any destination address is bech32:") + self.test_change_output_type(1, [to_address_p2sh], 'p2sh-segwit') + self.test_change_output_type(1, [to_address_bech32_1], 'bech32') + self.test_change_output_type(1, [to_address_p2sh, to_address_bech32_1], 'bech32') + self.test_change_output_type(1, [to_address_bech32_1, to_address_bech32_2], 'bech32') self.log.info("Nodes with change_type=bech32 always use a P2WPKH change output:") self.test_change_output_type(2, [to_address_bech32_1], 'bech32') self.test_change_output_type(2, [to_address_p2sh], 'bech32') - self.log.info("Nodes with addresstype=bech32 always use a P2WPKH change output (unless changetype is set otherwise):") - self.test_change_output_type(3, [to_address_bech32_1], 'bech32') - self.test_change_output_type(3, [to_address_p2sh], 'bech32') + if self.options.descriptors: + self.log.info("Nodes with addresstype=bech32 always use either a bech32 or bech32m change output (unless changetype is set otherwise):") + self.test_change_output_type(3, [to_address_bech32_1], 'bech32m') + self.test_change_output_type(3, [to_address_p2sh], 'bech32') + else: + self.log.info("Nodes with addresstype=bech32 always use a P2WPKH change output (unless changetype is set otherwise):") + self.test_change_output_type(3, [to_address_bech32_1], 'bech32') + self.test_change_output_type(3, [to_address_p2sh], 'bech32') self.log.info('getrawchangeaddress defaults to addresstype if -changetype is not set and argument is absent') self.test_address(3, self.nodes[3].getrawchangeaddress(), multisig=False, typ='bech32') @@ -373,10 +391,9 @@ def run_test(self): self.test_address(4, self.nodes[4].getrawchangeaddress('bech32'), multisig=False, typ='bech32') if self.options.descriptors: - self.log.info("Descriptor wallets do not have bech32m addreses by default yet") - # TODO: Remove this when they do - assert_raises_rpc_error(-12, "Error: No bech32m addresses available", self.nodes[0].getnewaddress, "", "bech32m") - assert_raises_rpc_error(-12, "Error: Keypool ran out, please call keypoolrefill first", self.nodes[0].getrawchangeaddress, "bech32m") + self.log.info("Descriptor wallets have bech32m addresses") + self.test_address(4, self.nodes[4].getnewaddress("", "bech32m"), multisig=False, typ="bech32m") + self.test_address(4, self.nodes[4].getrawchangeaddress("bech32m"), multisig=False, typ="bech32m") else: self.log.info("Legacy wallets cannot make bech32m addresses") assert_raises_rpc_error(-8, "Legacy wallets cannot provide bech32m addresses", self.nodes[0].getnewaddress, "", "bech32m") diff --git a/test/functional/wallet_createwallet.py b/test/functional/wallet_createwallet.py index d95e3abb1c..8142ecf554 100755 --- a/test/functional/wallet_createwallet.py +++ b/test/functional/wallet_createwallet.py @@ -146,7 +146,7 @@ def run_test(self): w6.keypoolrefill(1) # There should only be 1 key for legacy, 3 for descriptors walletinfo = w6.getwalletinfo() - keys = 3 if self.options.descriptors else 1 + keys = 4 if self.options.descriptors else 1 assert_equal(walletinfo['keypoolsize'], keys) assert_equal(walletinfo['keypoolsize_hd_internal'], keys) # Allow empty passphrase, but there should be a warning diff --git a/test/functional/wallet_descriptor.py b/test/functional/wallet_descriptor.py index 70dee2f341..d52cafec43 100755 --- a/test/functional/wallet_descriptor.py +++ b/test/functional/wallet_descriptor.py @@ -37,12 +37,12 @@ def run_test(self): self.log.info("Making a descriptor wallet") self.nodes[0].createwallet(wallet_name="desc1", descriptors=True) - # A descriptor wallet should have 100 addresses * 3 types = 300 keys + # A descriptor wallet should have 100 addresses * 4 types = 400 keys self.log.info("Checking wallet info") wallet_info = self.nodes[0].getwalletinfo() assert_equal(wallet_info['format'], 'sqlite') - assert_equal(wallet_info['keypoolsize'], 300) - assert_equal(wallet_info['keypoolsize_hd_internal'], 300) + assert_equal(wallet_info['keypoolsize'], 400) + assert_equal(wallet_info['keypoolsize_hd_internal'], 400) assert 'keypoololdest' not in wallet_info # Check that getnewaddress works diff --git a/test/functional/wallet_groups.py b/test/functional/wallet_groups.py index 4ad864de31..d2a76e937e 100755 --- a/test/functional/wallet_groups.py +++ b/test/functional/wallet_groups.py @@ -109,13 +109,24 @@ def run_test(self): assert_equal(input_addrs[0], input_addrs[1]) # Node 2 enforces avoidpartialspends so needs no checking here + if self.options.descriptors: + # Descriptor wallets will use Taproot change by default which has different fees + tx4_ungrouped_fee = 3060 + tx4_grouped_fee = 4400 + tx5_6_ungrouped_fee = 5760 + tx5_6_grouped_fee = 8480 + else: + tx4_ungrouped_fee = 2820 + tx4_grouped_fee = 4160 + tx5_6_ungrouped_fee = 5520 + tx5_6_grouped_fee = 8240 + self.log.info("Test wallet option maxapsfee") addr_aps = self.nodes[3].getnewaddress() self.nodes[0].sendtoaddress(addr_aps, 1.0) self.nodes[0].sendtoaddress(addr_aps, 1.0) self.generate(self.nodes[0], 1) - self.sync_all() - with self.nodes[3].assert_debug_log(['Fee non-grouped = 2820, grouped = 4160, using grouped']): + with self.nodes[3].assert_debug_log([f'Fee non-grouped = {tx4_ungrouped_fee}, grouped = {tx4_grouped_fee}, using grouped']): txid4 = self.nodes[3].sendtoaddress(self.nodes[0].getnewaddress(), 0.1) tx4 = self.nodes[3].getrawtransaction(txid4, True) # tx4 should have 2 inputs and 2 outputs although one output would @@ -126,8 +137,7 @@ def run_test(self): addr_aps2 = self.nodes[3].getnewaddress() [self.nodes[0].sendtoaddress(addr_aps2, 1.0) for _ in range(5)] self.generate(self.nodes[0], 1) - self.sync_all() - with self.nodes[3].assert_debug_log(['Fee non-grouped = 5520, grouped = 8240, using non-grouped']): + with self.nodes[3].assert_debug_log([f'Fee non-grouped = {tx5_6_ungrouped_fee}, grouped = {tx5_6_grouped_fee}, using non-grouped']): txid5 = self.nodes[3].sendtoaddress(self.nodes[0].getnewaddress(), 2.95) tx5 = self.nodes[3].getrawtransaction(txid5, True) # tx5 should have 3 inputs (1.0, 1.0, 1.0) and 2 outputs @@ -140,8 +150,7 @@ def run_test(self): addr_aps3 = self.nodes[4].getnewaddress() [self.nodes[0].sendtoaddress(addr_aps3, 1.0) for _ in range(5)] self.generate(self.nodes[0], 1) - self.sync_all() - with self.nodes[4].assert_debug_log(['Fee non-grouped = 5520, grouped = 8240, using grouped']): + with self.nodes[4].assert_debug_log([f'Fee non-grouped = {tx5_6_ungrouped_fee}, grouped = {tx5_6_grouped_fee}, using grouped']): txid6 = self.nodes[4].sendtoaddress(self.nodes[0].getnewaddress(), 2.95) tx6 = self.nodes[4].getrawtransaction(txid6, True) # tx6 should have 5 inputs and 2 outputs diff --git a/test/functional/wallet_hd.py b/test/functional/wallet_hd.py index 4147a0db69..3aafd03741 100755 --- a/test/functional/wallet_hd.py +++ b/test/functional/wallet_hd.py @@ -136,7 +136,7 @@ def run_test(self): keypath = self.nodes[1].getaddressinfo(out['scriptPubKey']['address'])['hdkeypath'] if self.options.descriptors: - assert_equal(keypath[0:14], "m/84'/1'/0'/1/") + assert_equal(keypath[0:14], "m/86'/1'/0'/1/") else: assert_equal(keypath[0:7], "m/0'/1'") diff --git a/test/functional/wallet_keypool.py b/test/functional/wallet_keypool.py index 4db1d60e90..811a2a7475 100755 --- a/test/functional/wallet_keypool.py +++ b/test/functional/wallet_keypool.py @@ -87,8 +87,8 @@ def run_test(self): nodes[0].walletlock() wi = nodes[0].getwalletinfo() if self.options.descriptors: - assert_equal(wi['keypoolsize_hd_internal'], 18) - assert_equal(wi['keypoolsize'], 18) + assert_equal(wi['keypoolsize_hd_internal'], 24) + assert_equal(wi['keypoolsize'], 24) else: assert_equal(wi['keypoolsize_hd_internal'], 6) assert_equal(wi['keypoolsize'], 6) @@ -132,8 +132,8 @@ def run_test(self): nodes[0].keypoolrefill(100) wi = nodes[0].getwalletinfo() if self.options.descriptors: - assert_equal(wi['keypoolsize_hd_internal'], 300) - assert_equal(wi['keypoolsize'], 300) + assert_equal(wi['keypoolsize_hd_internal'], 400) + assert_equal(wi['keypoolsize'], 400) else: assert_equal(wi['keypoolsize_hd_internal'], 100) assert_equal(wi['keypoolsize'], 100) diff --git a/test/functional/wallet_listdescriptors.py b/test/functional/wallet_listdescriptors.py index f719d694bf..3df29dacaf 100755 --- a/test/functional/wallet_listdescriptors.py +++ b/test/functional/wallet_listdescriptors.py @@ -43,9 +43,9 @@ def run_test(self): node.createwallet(wallet_name='w3', descriptors=True) result = node.get_wallet_rpc('w3').listdescriptors() assert_equal("w3", result['wallet_name']) - assert_equal(6, len(result['descriptors'])) - assert_equal(6, len([d for d in result['descriptors'] if d['active']])) - assert_equal(3, len([d for d in result['descriptors'] if d['internal']])) + assert_equal(8, len(result['descriptors'])) + assert_equal(8, len([d for d in result['descriptors'] if d['active']])) + assert_equal(4, len([d for d in result['descriptors'] if d['internal']])) for item in result['descriptors']: assert item['desc'] != '' assert item['next'] == 0 From a41fac2bb0af7d9b55a292efe4fee1acb79ac0aa Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Wed, 23 Jun 2021 19:03:10 -0400 Subject: [PATCH 039/144] Mention bech32m in -addresstype and -changetype help --- src/wallet/init.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wallet/init.cpp b/src/wallet/init.cpp index 7a5526a4cb..4ff049170e 100644 --- a/src/wallet/init.cpp +++ b/src/wallet/init.cpp @@ -43,9 +43,9 @@ const WalletInitInterface& g_wallet_init_interface = WalletInit(); void WalletInit::AddWalletOptions(ArgsManager& argsman) const { - argsman.AddArg("-addresstype", strprintf("What type of addresses to use (\"legacy\", \"p2sh-segwit\", or \"bech32\", default: \"%s\")", FormatOutputType(DEFAULT_ADDRESS_TYPE)), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); + argsman.AddArg("-addresstype", strprintf("What type of addresses to use (\"legacy\", \"p2sh-segwit\", \"bech32\", or \"bech32m\", default: \"%s\")", FormatOutputType(DEFAULT_ADDRESS_TYPE)), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); argsman.AddArg("-avoidpartialspends", strprintf("Group outputs by address, selecting many (possibly all) or none, instead of selecting on a per-output basis. Privacy is improved as addresses are mostly swept with fewer transactions and outputs are aggregated in clean change addresses. It may result in higher fees due to less optimal coin selection caused by this added limitation and possibly a larger-than-necessary number of inputs being used. Always enabled for wallets with \"avoid_reuse\" enabled, otherwise default: %u.", DEFAULT_AVOIDPARTIALSPENDS), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); - argsman.AddArg("-changetype", "What type of change to use (\"legacy\", \"p2sh-segwit\", or \"bech32\"). Default is same as -addresstype, except when -addresstype=p2sh-segwit a native segwit output is used when sending to a native segwit address)", ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); + argsman.AddArg("-changetype", "What type of change to use (\"legacy\", \"p2sh-segwit\", \"bech32\", or \"bech32m\"). Default is same as -addresstype, except when -addresstype=p2sh-segwit a native segwit output is used when sending to a native segwit address)", ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); argsman.AddArg("-consolidatefeerate=", strprintf("The maximum feerate (in %s/kvB) at which transaction building may use more inputs than strictly necessary so that the wallet's UTXO pool can be reduced (default: %s).", CURRENCY_UNIT, FormatMoney(DEFAULT_CONSOLIDATE_FEERATE)), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); argsman.AddArg("-disablewallet", "Do not load the wallet and disable wallet RPC calls", ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); argsman.AddArg("-discardfee=", strprintf("The fee rate (in %s/kvB) that indicates your tolerance for discarding change by adding it to the fee (default: %s). " From fca7f71519295187c34d9eff30c4c49cfc8eba34 Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Wed, 23 Jun 2021 21:17:48 -0400 Subject: [PATCH 040/144] Extract Taproot internal keyid with GetKeyFromDestination --- src/script/signingprovider.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/script/signingprovider.cpp b/src/script/signingprovider.cpp index b80fbe22ce..17f97fa30c 100644 --- a/src/script/signingprovider.cpp +++ b/src/script/signingprovider.cpp @@ -190,8 +190,8 @@ bool FillableSigningProvider::GetCScript(const CScriptID &hash, CScript& redeemS CKeyID GetKeyForDestination(const SigningProvider& store, const CTxDestination& dest) { - // Only supports destinations which map to single public keys, i.e. P2PKH, - // P2WPKH, and P2SH-P2WPKH. + // Only supports destinations which map to single public keys: + // P2PKH, P2WPKH, P2SH-P2WPKH, P2TR if (auto id = std::get_if(&dest)) { return ToKeyID(*id); } @@ -208,5 +208,15 @@ CKeyID GetKeyForDestination(const SigningProvider& store, const CTxDestination& } } } + if (auto output_key = std::get_if(&dest)) { + TaprootSpendData spenddata; + CPubKey pub; + if (store.GetTaprootSpendData(*output_key, spenddata) + && !spenddata.internal_key.IsNull() + && spenddata.merkle_root.IsNull() + && store.GetPubKeyByXOnly(spenddata.internal_key, pub)) { + return pub.GetID(); + } + } return CKeyID(); } From 9d736030998159ce67f8e6c91934d37e7778c47d Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Thu, 25 Nov 2021 17:11:32 +0100 Subject: [PATCH 041/144] test: refactor: use `set_node_times` helper in wallet_transactiontime_rescan.py --- .../wallet_transactiontime_rescan.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/test/functional/wallet_transactiontime_rescan.py b/test/functional/wallet_transactiontime_rescan.py index cb4e974295..a921e656d5 100755 --- a/test/functional/wallet_transactiontime_rescan.py +++ b/test/functional/wallet_transactiontime_rescan.py @@ -10,7 +10,8 @@ from test_framework.blocktools import COINBASE_MATURITY from test_framework.test_framework import BGLTestFramework from test_framework.util import ( - assert_equal + assert_equal, + set_node_times, ) @@ -35,9 +36,7 @@ def run_test(self): # synchronize nodes and time self.sync_all() - minernode.setmocktime(cur_time) - usernode.setmocktime(cur_time) - restorenode.setmocktime(cur_time) + set_node_times(self.nodes, cur_time) # prepare miner wallet minernode.createwallet(wallet_name='default') @@ -68,9 +67,7 @@ def run_test(self): # synchronize nodes and time self.sync_all() - minernode.setmocktime(cur_time + ten_days) - usernode.setmocktime(cur_time + ten_days) - restorenode.setmocktime(cur_time + ten_days) + set_node_times(self.nodes, cur_time + ten_days) # send 10 btc to user's first watch-only address self.log.info('Send 10 btc to user') miner_wallet.sendtoaddress(wo1, 10) @@ -81,9 +78,7 @@ def run_test(self): # synchronize nodes and time self.sync_all() - minernode.setmocktime(cur_time + ten_days + ten_days) - usernode.setmocktime(cur_time + ten_days + ten_days) - restorenode.setmocktime(cur_time + ten_days + ten_days) + set_node_times(self.nodes, cur_time + ten_days + ten_days) # send 5 btc to our second watch-only address self.log.info('Send 5 btc to user') miner_wallet.sendtoaddress(wo2, 5) @@ -94,9 +89,7 @@ def run_test(self): # synchronize nodes and time self.sync_all() - minernode.setmocktime(cur_time + ten_days + ten_days + ten_days) - usernode.setmocktime(cur_time + ten_days + ten_days + ten_days) - restorenode.setmocktime(cur_time + ten_days + ten_days + ten_days) + set_node_times(self.nodes, cur_time + ten_days + ten_days + ten_days) # send 1 btc to our third watch-only address self.log.info('Send 1 btc to user') miner_wallet.sendtoaddress(wo3, 1) From 892243a85cba4e773ba4560d9b76626abb6c401a Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Thu, 25 Nov 2021 17:30:55 +0100 Subject: [PATCH 042/144] test: fix test wallet_transactiontime_rescan.py for descriptor wallets --- test/functional/wallet_transactiontime_rescan.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/functional/wallet_transactiontime_rescan.py b/test/functional/wallet_transactiontime_rescan.py index a921e656d5..44aa192329 100755 --- a/test/functional/wallet_transactiontime_rescan.py +++ b/test/functional/wallet_transactiontime_rescan.py @@ -119,6 +119,14 @@ def run_test(self): restorenode.createwallet(wallet_name='wo', disable_private_keys=True) restorewo_wallet = restorenode.get_wallet_rpc('wo') + # for descriptor wallets, the test framework maps the importaddress RPC to the + # importdescriptors RPC (with argument 'timestamp'='now'), which always rescans + # blocks of the past 2 hours, based on the current MTP timestamp; in order to avoid + # importing the last address (wo3), we advance the time further and generate 10 blocks + if self.options.descriptors: + set_node_times(self.nodes, cur_time + ten_days + ten_days + ten_days + ten_days) + self.generatetoaddress(minernode, 10, m1) + restorewo_wallet.importaddress(wo1, rescan=False) restorewo_wallet.importaddress(wo2, rescan=False) restorewo_wallet.importaddress(wo3, rescan=False) From 21197ee1d21e95230b4e50752408762181cf2c4e Mon Sep 17 00:00:00 2001 From: brunoerg Date: Mon, 22 Aug 2022 16:27:03 -0300 Subject: [PATCH 043/144] test: add coverage for invalid parameters for `rescanblockchain` --- test/functional/wallet_transactiontime_rescan.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/functional/wallet_transactiontime_rescan.py b/test/functional/wallet_transactiontime_rescan.py index 44aa192329..50b0ae6b00 100755 --- a/test/functional/wallet_transactiontime_rescan.py +++ b/test/functional/wallet_transactiontime_rescan.py @@ -11,6 +11,7 @@ from test_framework.test_framework import BGLTestFramework from test_framework.util import ( assert_equal, + assert_raises_rpc_error, set_node_times, ) @@ -158,5 +159,11 @@ def run_test(self): assert_equal(tx['time'], cur_time + ten_days + ten_days + ten_days) + self.log.info('Test handling of invalid parameters for rescanblockchain') + assert_raises_rpc_error(-8, "Invalid start_height", restorewo_wallet.rescanblockchain, -1, 10) + assert_raises_rpc_error(-8, "Invalid stop_height", restorewo_wallet.rescanblockchain, 1, -1) + assert_raises_rpc_error(-8, "stop_height must be greater than start_height", restorewo_wallet.rescanblockchain, 20, 10) + + if __name__ == '__main__': TransactionTimeRescanTest().main() From 530b1c4ae3a017f8a9fcb0f0d3b6da66022e844f Mon Sep 17 00:00:00 2001 From: Korrrba Date: Tue, 8 Nov 2022 14:19:50 +0100 Subject: [PATCH 044/144] test/functional/wallet_txn_doublespend: Set correct expected coinbase transaction value for BGL network. The default coinbase transaction nValue for BGL regtest network is 200 BGL. Correct the value to make the test case pass when --mineblock argument is provided. --- test/functional/wallet_txn_doublespend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/wallet_txn_doublespend.py b/test/functional/wallet_txn_doublespend.py index b6bcc64a6f..4d44635197 100755 --- a/test/functional/wallet_txn_doublespend.py +++ b/test/functional/wallet_txn_doublespend.py @@ -99,7 +99,7 @@ def run_test(self): # matured block, minus 40, minus 20, and minus transaction fees: expected = starting_balance + fund_foo_tx["fee"] + fund_bar_tx["fee"] if self.options.mine_block: - expected += 50 + expected += 200 expected += tx1["amount"] + tx1["fee"] expected += tx2["amount"] + tx2["fee"] assert_equal(self.nodes[0].getbalance(), expected) From 91ed9cfb2ab9a4a14d1ea1631ad8bdbc22f46a1d Mon Sep 17 00:00:00 2001 From: Fabian Jahr Date: Sun, 26 Jun 2022 16:34:11 +0200 Subject: [PATCH 045/144] test: Remove unnecessary block mining from importdescriptors test --- test/functional/wallet_importdescriptors.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/functional/wallet_importdescriptors.py b/test/functional/wallet_importdescriptors.py index fe326a97d8..c558000c15 100755 --- a/test/functional/wallet_importdescriptors.py +++ b/test/functional/wallet_importdescriptors.py @@ -432,7 +432,6 @@ def run_test(self): send_txid = wmulti_priv.sendtoaddress(w0.getnewaddress(), 8) decoded = wmulti_priv.gettransaction(txid=send_txid, verbose=True)['decoded'] assert_equal(len(decoded['vin'][0]['txinwitness']), 4) - self.generate(self.nodes[0], 6) self.sync_all() self.nodes[1].createwallet(wallet_name="wmulti_pub", disable_private_keys=True, blank=True, descriptors=True) From d49ba1986546bab1b0d4408cd842689199af3370 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Mon, 7 Nov 2022 23:29:46 +0100 Subject: [PATCH 046/144] test/functional/wallet_importdescriptors: Update expected address values for BGL regtest network. --- test/functional/wallet_importdescriptors.py | 26 ++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/test/functional/wallet_importdescriptors.py b/test/functional/wallet_importdescriptors.py index c558000c15..c2837e2871 100755 --- a/test/functional/wallet_importdescriptors.py +++ b/test/functional/wallet_importdescriptors.py @@ -53,7 +53,7 @@ def test_importdesc(self, req, success, error_code=None, error_message=None, war result = wrpc.importdescriptors([req]) observed_warnings = [] if 'warnings' in result[0]: - observed_warnings = result[0]['warnings'] + observed_warnings = result[0]['warnings'] assert_equal("\n".join(sorted(warnings)), "\n".join(sorted(observed_warnings))) assert_equal(result[0]['success'], success) if error_code is not None: @@ -187,8 +187,8 @@ def run_test(self): # # Test ranged descriptors xpriv = "tprv8ZgxMBicQKsPeuVhWwi6wuMQGfPKi9Li5GtX35jVNknACgqe3CY4g5xgkfDDJcmtF7o1QnxWDRYw4H5P26PXq7sbcUkEqeR4fg3Kxp2tigg" xpub = "tpubD6NzVbkrYhZ4YNXVQbNhMK1WqguFsUXceaVJKbmno2aZ3B6QfbMeraaYvnBSGpV3vxLyTTK9DYT1yoEck4XUScMzXoQ2U2oSmE2JyMedq3H" - addresses = ["2N7yv4p8G8yEaPddJxY41kPihnWvs39qCMf", "2MsHxyb2JS3pAySeNUsJ7mNnurtpeenDzLA"] # hdkeypath=m/0'/0'/0' and 1' - addresses += ["bcrt1qrd3n235cj2czsfmsuvqqpr3lu6lg0ju7scl8gn", "bcrt1qfqeppuvj0ww98r6qghmdkj70tv8qpchehegrg8"] # wpkh subscripts corresponding to the above addresses + addresses = ["MNdrJxcCUdaezMGfPHRUx5yqtsK9FyJXV1", "M7wuDjWEmiAFaAHiucfay543yFCvpH2FCd"] # hdkeypath=m/0'/0'/0' and 1' + addresses = ["rbgl1qrd3n235cj2czsfmsuvqqpr3lu6lg0ju7f8j03e", "rbgl1qrd3n235cj2czsfmsuvqqpr3lu6lg0ju7f8j03e"] # wpkh subscripts corresponding to the above addresses desc = "sh(wpkh(" + xpub + "/0/0/*" + "))" self.log.info("Ranged descriptors cannot have labels") @@ -284,11 +284,11 @@ def run_test(self): self.log.info('Key ranges should be imported in order') xpub = "tpubDAXcJ7s7ZwicqjprRaEWdPoHKrCS215qxGYxpusRLLmJuT69ZSicuGdSfyvyKpvUNYBW1s2U3NSrT6vrCYB9e6nZUEvrqnwXPF8ArTCRXMY" addresses = [ - 'bcrt1qtmp74ayg7p24uslctssvjm06q5phz4yrxucgnv', # m/0'/0'/0 - 'bcrt1q8vprchan07gzagd5e6v9wd7azyucksq2xc76k8', # m/0'/0'/1 - 'bcrt1qtuqdtha7zmqgcrr26n2rqxztv5y8rafjp9lulu', # m/0'/0'/2 - 'bcrt1qau64272ymawq26t90md6an0ps99qkrse58m640', # m/0'/0'/3 - 'bcrt1qsg97266hrh6cpmutqen8s4s962aryy77jp0fg0', # m/0'/0'/4 + 'rbgl1qtmp74ayg7p24uslctssvjm06q5phz4yrlr4q2x', # m/0'/0'/0 + 'rbgl1q8vprchan07gzagd5e6v9wd7azyucksq2l8nj0d', # m/0'/0'/1 + 'rbgl1qtuqdtha7zmqgcrr26n2rqxztv5y8rafjc6j5xk', # m/0'/0'/2 + 'rbgl1qau64272ymawq26t90md6an0ps99qkrsedckjv9', # m/0'/0'/3 + 'rbgl1qsg97266hrh6cpmutqen8s4s962aryy77t7zp39', # m/0'/0'/4 ] self.test_importdesc({'desc': descsum_create('wpkh([80002067/0h/0h]' + xpub + '/*)'), @@ -361,7 +361,7 @@ def run_test(self): }, success=True) address = w1.getrawchangeaddress('legacy') - assert_equal(address, "mpA2Wh9dvZT7yfELq1UnrUmAoc5qCkMetg") + assert_equal(address, "Eq8ahLCTFfmf1HVfwhqFWpobLmFCWicd9M") # # Test importing a descriptor containing a WIF private key wif_priv = "cTe1f5rdT8A8DFgVWTjyPwACsDPJM9ff4QngFxUixCSvvbg1x6sh" @@ -422,9 +422,9 @@ def run_test(self): assert_equal(wmulti_priv.getwalletinfo()['keypoolsize'], 1001) # Range end (1000) is inclusive, so 1001 addresses generated addr = wmulti_priv.getnewaddress('', 'bech32') - assert_equal(addr, 'bcrt1qdt0qy5p7dzhxzmegnn4ulzhard33s2809arjqgjndx87rv5vd0fq2czhy8') # Derived at m/84'/0'/0'/0 + assert_equal(addr, 'rbgl1qdt0qy5p7dzhxzmegnn4ulzhard33s2809arjqgjndx87rv5vd0fqh3hrz7') # Derived at m/84'/0'/0'/0 change_addr = wmulti_priv.getrawchangeaddress('bech32') - assert_equal(change_addr, 'bcrt1qt9uhe3a9hnq7vajl7a094z4s3crm9ttf8zw3f5v9gr2nyd7e3lnsy44n8e') + assert_equal(change_addr, 'rbgl1qt9uhe3a9hnq7vajl7a094z4s3crm9ttf8zw3f5v9gr2nyd7e3lnseuq8pq') assert_equal(wmulti_priv.getwalletinfo()['keypoolsize'], 1000) txid = w0.sendtoaddress(addr, 10) self.generate(self.nodes[0], 6) @@ -456,9 +456,9 @@ def run_test(self): assert_equal(wmulti_pub.getwalletinfo()['keypoolsize'], 1000) # The first one was already consumed by previous import and is detected as used addr = wmulti_pub.getnewaddress('', 'bech32') - assert_equal(addr, 'bcrt1qp8s25ckjl7gr6x2q3dx3tn2pytwp05upkjztk6ey857tt50r5aeqn6mvr9') # Derived at m/84'/0'/0'/1 + assert_equal(addr, 'rbgl1qp8s25ckjl7gr6x2q3dx3tn2pytwp05upkjztk6ey857tt50r5aeqwnwc9u') # Derived at m/84'/0'/0'/1 change_addr = wmulti_pub.getrawchangeaddress('bech32') - assert_equal(change_addr, 'bcrt1qt9uhe3a9hnq7vajl7a094z4s3crm9ttf8zw3f5v9gr2nyd7e3lnsy44n8e') + assert_equal(change_addr, 'rbgl1qt9uhe3a9hnq7vajl7a094z4s3crm9ttf8zw3f5v9gr2nyd7e3lnseuq8pq') assert_equal(wmulti_pub.getwalletinfo()['keypoolsize'], 999) # generate some utxos for next tests From 5a53fdbf9b61fafb9fccb940d4a0c0ec236cf3b0 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Mon, 7 Nov 2022 16:54:35 +0100 Subject: [PATCH 047/144] test/functional/wallet_singer: Correct expected BGL network address values. --- test/functional/wallet_signer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/functional/wallet_signer.py b/test/functional/wallet_signer.py index bbbb131642..0cb4bec931 100755 --- a/test/functional/wallet_signer.py +++ b/test/functional/wallet_signer.py @@ -78,21 +78,21 @@ def run_test(self): assert_equal(hww.getwalletinfo()["keypoolsize"], 30) address1 = hww.getnewaddress(address_type="bech32") - assert_equal(address1, "bcrt1qm90ugl4d48jv8n6e5t9ln6t9zlpm5th68x4f8g") + assert_equal(address1, "rbgl1qm90ugl4d48jv8n6e5t9ln6t9zlpm5th67ecp7z") address_info = hww.getaddressinfo(address1) assert_equal(address_info['solvable'], True) assert_equal(address_info['ismine'], True) assert_equal(address_info['hdkeypath'], "m/84'/1'/0'/0/0") address2 = hww.getnewaddress(address_type="p2sh-segwit") - assert_equal(address2, "2N2gQKzjUe47gM8p1JZxaAkTcoHPXV6YyVp") + assert_equal(address2, "MHLLa9DQyiTkwrTMjKL3NSikudmoifhjQF") address_info = hww.getaddressinfo(address2) assert_equal(address_info['solvable'], True) assert_equal(address_info['ismine'], True) assert_equal(address_info['hdkeypath'], "m/49'/1'/0'/0/0") address3 = hww.getnewaddress(address_type="legacy") - assert_equal(address3, "n1LKejAadN6hg2FrBXoU1KrwX4uK16mco9") + assert_equal(address3, "F2JsqNDPxUREheXBJE9vffuN4E4gCH1yVC") address_info = hww.getaddressinfo(address3) assert_equal(address_info['solvable'], True) assert_equal(address_info['ismine'], True) From d0b681bea1123c1cd4617d137bbcedf07ef676d1 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Wed, 9 Nov 2022 21:27:28 +0100 Subject: [PATCH 048/144] test/functional/wallet_resendwallettransactions: Wait for BGL wallet broadcast with transaction wtxid. Bitgesell wallet broadcasts WTX transactions by default with the hash of serialized transaction, including witness data. msg_inv(inv=[CInv(type=WTX hash=xxx)]) where hash is wtx. Fixes failing wallet_resendwallettransactions test case. --- src/wallet/rpcwallet.cpp | 2 ++ src/wallet/transaction.h | 1 + test/functional/wallet_basic.py | 2 +- test/functional/wallet_resendwallettransactions.py | 3 +++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 1338fbc5f1..1d3f9f28be 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -170,6 +170,7 @@ static void WalletTxToJSON(const CWallet& wallet, const CWalletTx& wtx, UniValue } uint256 hash = wtx.GetHash(); entry.pushKV("txid", hash.GetHex()); + entry.pushKV("wtxid", wtx.GetWitnessHash().GetHex()); UniValue conflicts(UniValue::VARR); for (const uint256& conflict : wallet.GetTxConflicts(wtx)) conflicts.push_back(conflict.GetHex()); @@ -1397,6 +1398,7 @@ static const std::vector TransactionDescriptionString() {RPCResult::Type::NUM, "blockindex", /* optional */ true, "The index of the transaction in the block that includes it."}, {RPCResult::Type::NUM_TIME, "blocktime", /* optional */ true, "The block time expressed in " + UNIX_EPOCH_TIME + "."}, {RPCResult::Type::STR_HEX, "txid", "The transaction id."}, + {RPCResult::Type::STR_HEX, "wtxid", "The hash of serialized transaction, including witness data."}, {RPCResult::Type::ARR, "walletconflicts", "Conflicting transaction ids.", { {RPCResult::Type::STR_HEX, "txid", "The transaction id."}, diff --git a/src/wallet/transaction.h b/src/wallet/transaction.h index 4df61029e4..f8c64a3e9d 100644 --- a/src/wallet/transaction.h +++ b/src/wallet/transaction.h @@ -265,6 +265,7 @@ class CWalletTx bool isConfirmed() const { return m_confirm.status == CWalletTx::CONFIRMED; } void setConfirmed() { m_confirm.status = CWalletTx::CONFIRMED; } const uint256& GetHash() const { return tx->GetHash(); } + const uint256& GetWitnessHash() const { return tx->GetWitnessHash(); } bool IsCoinBase() const { return tx->IsCoinBase(); } // Disable copying of CWalletTx objects to prevent bugs where instances get diff --git a/test/functional/wallet_basic.py b/test/functional/wallet_basic.py index abd2b0c8e8..9d08e1a542 100755 --- a/test/functional/wallet_basic.py +++ b/test/functional/wallet_basic.py @@ -670,7 +670,7 @@ def run_test(self): "category": baz["category"], "vout": baz["vout"]} expected_fields = frozenset({'amount', 'bip125-replaceable', 'confirmations', 'details', 'fee', - 'hex', 'time', 'timereceived', 'trusted', 'txid', 'walletconflicts'}) + 'hex', 'time', 'timereceived', 'trusted', 'txid', 'wtxid', 'walletconflicts'}) verbose_field = "decoded" expected_verbose_fields = expected_fields | {verbose_field} diff --git a/test/functional/wallet_resendwallettransactions.py b/test/functional/wallet_resendwallettransactions.py index 50a8db4568..7828959642 100755 --- a/test/functional/wallet_resendwallettransactions.py +++ b/test/functional/wallet_resendwallettransactions.py @@ -29,6 +29,9 @@ def run_test(self): self.log.info("Create a new transaction and wait until it's broadcast") txid = node.sendtoaddress(node.getnewaddress(), 1) + # Bitgesell wallet broadcasts WTX transactions with the hash of serialized transaction, + # including witness data. msg_inv(inv=[CInv(type=WTX hash=xxx)]) where hash is wtx. + txid = node.gettransaction(txid)["wtxid"] # Wallet rebroadcast is first scheduled 1 sec after startup (see # nNextResend in ResendWalletTransactions()). Tell scheduler to call From 6077c33a218374f2f9bf1d106ac2a18a21beaea1 Mon Sep 17 00:00:00 2001 From: alekcangp <40195312+alekcangp@users.noreply.github.com> Date: Wed, 16 Nov 2022 17:26:59 +0600 Subject: [PATCH 049/144] Update chainparams.cpp --- src/chainparams.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index de280525d3..3b238afed8 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -221,7 +221,7 @@ class CTestNetParams : public CChainParams { consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = 1230767999; // December 31, 2008 - consensus.nMinimumChainWork = uint256S("0x0000000000000000000000000000000000000000000005180c3bd8290da33a1a"); + consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000000000005ede0aa26f0"); // block 103846 consensus.defaultAssumeValid = uint256S("0x0000000000004ae2f3896ca8ecd41c460a35bf6184e145d91558cece1c688a76"); // 2010000 pchMessageStart[0] = 0x0b; From 0f3ebcb32e7382c53471512f9c5b73c48e2d2b72 Mon Sep 17 00:00:00 2001 From: alekcangp <40195312+alekcangp@users.noreply.github.com> Date: Thu, 17 Nov 2022 14:43:13 +0600 Subject: [PATCH 050/144] Added checkpointData for testnet --- src/chainparams.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 3b238afed8..80bd61bfd3 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -263,7 +263,10 @@ class CTestNetParams : public CChainParams { m_is_mockable_chain = false; checkpointData = { - {}}; + { + {546, uint256S("000000033f0ecd6bc1c46eb98a2856cf2fe48bc3e90ef11ac24ea5272c1adbf8")}, + } + }; chainTxData = ChainTxData{ // Data from RPC: getchaintxstats 4096 0000000000004ae2f3896ca8ecd41c460a35bf6184e145d91558cece1c688a76 From 2f176ae70e0afdcfd5039b980443d9c260e17a58 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Tue, 22 Nov 2022 10:41:08 +0100 Subject: [PATCH 051/144] test/functional/tool_wallet: Increase pool size to 8. Increase the keypool size value from 6 to 8 to accomodate adding bech32m address support and pass the wallet_address_types test case. --- test/functional/tool_wallet.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/functional/tool_wallet.py b/test/functional/tool_wallet.py index e7a2c1ca33..f0eac64d28 100755 --- a/test/functional/tool_wallet.py +++ b/test/functional/tool_wallet.py @@ -227,7 +227,7 @@ def test_tool_wallet_info(self): Descriptors: yes Encrypted: no HD (hd seed available): yes - Keypool Size: 6 + Keypool Size: 8 Transactions: 0 Address Book: 1 ''') @@ -284,7 +284,7 @@ def test_tool_wallet_info_after_transaction(self): Descriptors: yes Encrypted: no HD (hd seed available): yes - Keypool Size: 6 + Keypool Size: 8 Transactions: 1 Address Book: 1 ''') From 45769e7280f6cbddad84d16f13dd354d6ea1d3e0 Mon Sep 17 00:00:00 2001 From: nadyka Date: Tue, 6 Dec 2022 00:43:31 +0400 Subject: [PATCH 052/144] sync/fix tests --- test/functional/feature_anchors.py | 8 +- test/functional/feature_cltv.py | 4 +- test/functional/feature_csv_activation.py | 10 +- test/functional/feature_dbcrash.py | 71 ++- test/functional/feature_dersig.py | 2 +- test/functional/feature_fee_estimation.py | 209 +++----- test/functional/feature_maxuploadtarget.py | 8 +- test/functional/feature_rbf.py | 501 ++++++++++-------- test/functional/mempool_accept.py | 77 ++- test/functional/mempool_limit.py | 42 +- test/functional/mempool_reorg.py | 16 +- test/functional/mempool_spend_coinbase.py | 17 +- test/functional/mempool_unbroadcast.py | 19 +- .../mining_prioritisetransaction.py | 47 +- test/functional/p2p_add_connections.py | 8 +- test/functional/p2p_blocksonly.py | 2 +- test/functional/p2p_segwit.py | 26 +- test/functional/rpc_createmultisig.py | 91 ++-- test/functional/rpc_generateblock.py | 21 +- test/functional/rpc_rawtransaction.py | 209 +++----- test/functional/rpc_txoutproof.py | 2 +- test/functional/test_framework/address.py | 4 + test/functional/test_framework/messages.py | 3 +- test/functional/test_framework/script.py | 17 +- .../test_framework/test_framework.py | 10 +- test/functional/test_framework/util.py | 63 +-- test/functional/test_framework/wallet.py | 200 +++++-- test/functional/test_runner.py | 4 +- 28 files changed, 864 insertions(+), 827 deletions(-) diff --git a/test/functional/feature_anchors.py b/test/functional/feature_anchors.py index ac25ddc2e9..bb470396ae 100755 --- a/test/functional/feature_anchors.py +++ b/test/functional/feature_anchors.py @@ -8,18 +8,12 @@ from test_framework.p2p import P2PInterface from test_framework.test_framework import BGLTestFramework -from test_framework.util import assert_equal +from test_framework.util import check_node_connections INBOUND_CONNECTIONS = 5 BLOCK_RELAY_CONNECTIONS = 2 -def check_node_connections(*, node, num_in, num_out): - info = node.getnetworkinfo() - assert_equal(info["connections_in"], num_in) - assert_equal(info["connections_out"], num_out) - - class AnchorsTest(BGLTestFramework): def set_test_params(self): self.num_nodes = 1 diff --git a/test/functional/feature_cltv.py b/test/functional/feature_cltv.py index a5b1b9fd0e..ed4c8a6345 100755 --- a/test/functional/feature_cltv.py +++ b/test/functional/feature_cltv.py @@ -113,7 +113,7 @@ def run_test(self): # create one invalid tx per CLTV failure reason (5 in total) and collect them invalid_cltv_txs = [] for i in range(5): - spendtx = wallet.create_self_transfer(from_node=self.nodes[0])['tx'] + spendtx = wallet.create_self_transfer()['tx'] cltv_invalidate(spendtx, i) invalid_cltv_txs.append(spendtx) @@ -144,7 +144,7 @@ def run_test(self): # create and test one invalid tx per CLTV failure reason (5 in total) for i in range(5): - spendtx = wallet.create_self_transfer(from_node=self.nodes[0])['tx'] + spendtx = wallet.create_self_transfer()['tx'] cltv_invalidate(spendtx, i) expected_cltv_reject_reason = [ diff --git a/test/functional/feature_csv_activation.py b/test/functional/feature_csv_activation.py index f6a077d641..165619a6c3 100755 --- a/test/functional/feature_csv_activation.py +++ b/test/functional/feature_csv_activation.py @@ -104,7 +104,7 @@ def set_test_params(self): def create_self_transfer_from_utxo(self, input_tx): utxo = self.miniwallet.get_utxo(txid=input_tx.rehash(), mark_as_spent=False) - tx = self.miniwallet.create_self_transfer(from_node=self.nodes[0], utxo_to_spend=utxo)['tx'] + tx = self.miniwallet.create_self_transfer(utxo_to_spend=utxo)['tx'] return tx def create_bip112special(self, input, txversion): @@ -112,6 +112,7 @@ def create_bip112special(self, input, txversion): tx.nVersion = txversion self.miniwallet.sign_tx(tx) tx.vin[0].scriptSig = CScript([-1, OP_CHECKSEQUENCEVERIFY, OP_DROP] + list(CScript(tx.vin[0].scriptSig))) + tx.rehash() return tx def create_bip112emptystack(self, input, txversion): @@ -119,6 +120,7 @@ def create_bip112emptystack(self, input, txversion): tx.nVersion = txversion self.miniwallet.sign_tx(tx) tx.vin[0].scriptSig = CScript([OP_CHECKSEQUENCEVERIFY] + list(CScript(tx.vin[0].scriptSig))) + tx.rehash() return tx def send_generic_input_tx(self, coinbases): @@ -136,7 +138,6 @@ def create_bip68txs(self, bip68inputs, txversion, locktime_delta=0): tx.nVersion = txversion tx.vin[0].nSequence = locktime + locktime_delta self.miniwallet.sign_tx(tx) - tx.rehash() txs.append({'tx': tx, 'sdf': sdf, 'stf': stf}) return txs @@ -343,20 +344,16 @@ def run_test(self): # BIP 113 tests should now fail regardless of version number if nLockTime isn't satisfied by new rules bip113tx_v1.nLockTime = self.last_block_time - 600 * 5 # = MTP of prior block (not <) but < time put on current block self.miniwallet.sign_tx(bip113tx_v1) - bip113tx_v1.rehash() bip113tx_v2.nLockTime = self.last_block_time - 600 * 5 # = MTP of prior block (not <) but < time put on current block self.miniwallet.sign_tx(bip113tx_v2) - bip113tx_v2.rehash() for bip113tx in [bip113tx_v1, bip113tx_v2]: self.send_blocks([self.create_test_block([bip113tx])], success=False, reject_reason='bad-txns-nonfinal') # BIP 113 tests should now pass if the locktime is < MTP bip113tx_v1.nLockTime = self.last_block_time - 600 * 5 - 1 # < MTP of prior block self.miniwallet.sign_tx(bip113tx_v1) - bip113tx_v1.rehash() bip113tx_v2.nLockTime = self.last_block_time - 600 * 5 - 1 # < MTP of prior block self.miniwallet.sign_tx(bip113tx_v2) - bip113tx_v2.rehash() for bip113tx in [bip113tx_v1, bip113tx_v2]: self.send_blocks([self.create_test_block([bip113tx])]) self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash()) @@ -481,7 +478,6 @@ def run_test(self): for tx in [tx['tx'] for tx in bip112txs_vary_OP_CSV_v2 if not tx['sdf'] and tx['stf']]: tx.vin[0].nSequence = BASE_RELATIVE_LOCKTIME | SEQ_TYPE_FLAG self.miniwallet.sign_tx(tx) - tx.rehash() time_txs.append(tx) self.send_blocks([self.create_test_block(time_txs)]) diff --git a/test/functional/feature_dbcrash.py b/test/functional/feature_dbcrash.py index cce56a02d4..286afddc0c 100755 --- a/test/functional/feature_dbcrash.py +++ b/test/functional/feature_dbcrash.py @@ -30,17 +30,17 @@ import random import time +from test_framework.blocktools import COINBASE_MATURITY from test_framework.messages import ( COIN, - COutPoint, - CTransaction, - CTxIn, - CTxOut, ) from test_framework.test_framework import BGLTestFramework from test_framework.util import ( assert_equal, - create_confirmed_utxos, +) +from test_framework.wallet import ( + MiniWallet, + getnewdestination, ) @@ -53,26 +53,22 @@ def set_test_params(self): # Set -maxmempool=0 to turn off mempool memory sharing with dbcache # Set -rpcservertimeout=900 to reduce socket disconnects in this # long-running test - self.base_args = ["-limitdescendantsize=0", "-maxmempool=0", "-rpcservertimeout=900", "-dbbatchsize=200000"] + self.base_args = ["-limitdescendantsize=0", "-maxmempool=0", "-rpcservertimeout=900", "-dbbatchsize=20000"] # Set different crash ratios and cache sizes. Note that not all of # -dbcache goes to the in-memory coins cache. - self.node0_args = ["-dbcrashratio=8", "-dbcache=4"] + self.base_args - self.node1_args = ["-dbcrashratio=16", "-dbcache=8"] + self.base_args - self.node2_args = ["-dbcrashratio=24", "-dbcache=16"] + self.base_args + self.node0_args = ["-dbcrashratio=8", "-dbcache=0.4"] + self.base_args + self.node1_args = ["-dbcrashratio=16", "-dbcache=0.8"] + self.base_args + self.node2_args = ["-dbcrashratio=24", "-dbcache=1.6"] + self.base_args # Node3 is a normal node with default args, except will mine full blocks # and non-standard txs (e.g. txs with "dust" outputs) - self.node3_args = ["-blockmaxweight=4000000", "-acceptnonstdtxn"] + self.node3_args = ["-blockmaxweight=400000", "-dustrelayfee=0"] self.extra_args = [self.node0_args, self.node1_args, self.node2_args, self.node3_args] - def skip_test_if_missing_module(self): - self.skip_if_no_wallet() - def setup_network(self): self.add_nodes(self.num_nodes, extra_args=self.extra_args) self.start_nodes() - self.import_deterministic_coinbase_privkeys() # Leave them unconnected, we'll use submitblock directly in this test def restart_node(self, node_index, expected_tip): @@ -190,34 +186,36 @@ def generate_small_transactions(self, node, count, utxo_list): num_transactions = 0 random.shuffle(utxo_list) while len(utxo_list) >= 2 and num_transactions < count: - tx = CTransaction() - input_amount = 0 - for _ in range(2): - utxo = utxo_list.pop() - tx.vin.append(CTxIn(COutPoint(int(utxo['txid'], 16), utxo['vout']))) - input_amount += int(utxo['amount'] * COIN) - output_amount = (input_amount - FEE) // 3 - - if output_amount <= 0: + utxos_to_spend = [utxo_list.pop() for _ in range(2)] + input_amount = int(sum([utxo['value'] for utxo in utxos_to_spend]) * COIN) + if input_amount < FEE: # Sanity check -- if we chose inputs that are too small, skip continue - for _ in range(3): - tx.vout.append(CTxOut(output_amount, bytes.fromhex(utxo['scriptPubKey']))) - - # Sign and send the transaction to get into the mempool - tx_signed_hex = node.signrawtransactionwithwallet(tx.serialize().hex())['hex'] - node.sendrawtransaction(tx_signed_hex) + self.wallet.send_self_transfer_multi( + from_node=node, + utxos_to_spend=utxos_to_spend, + num_outputs=3, + fee_per_output=FEE // 3, + ) num_transactions += 1 def run_test(self): + self.wallet = MiniWallet(self.nodes[3]) + self.wallet.rescan_utxos() + initial_height = self.nodes[3].getblockcount() + self.generate(self.nodes[3], COINBASE_MATURITY, sync_fun=self.no_op) + # Track test coverage statistics self.restart_counts = [0, 0, 0] # Track the restarts for nodes 0-2 self.crashed_on_restart = 0 # Track count of crashes during recovery # Start by creating a lot of utxos on node3 - initial_height = self.nodes[3].getblockcount() - utxo_list = create_confirmed_utxos(self, self.nodes[3].getnetworkinfo()['relayfee'], self.nodes[3], 5000, sync_fun=self.no_op) + utxo_list = [] + for _ in range(5): + utxo_list.extend(self.wallet.send_self_transfer_multi(from_node=self.nodes[3], num_outputs=100)['new_utxos']) + self.generate(self.nodes[3], 1, sync_fun=self.no_op) + assert_equal(len(self.nodes[3].getrawmempool()), 0) self.log.info(f"Prepped {len(utxo_list)} utxo entries") # Sync these blocks with the other nodes @@ -235,9 +233,9 @@ def run_test(self): # each time through the loop, generate a bunch of transactions, # and then either mine a single new block on the tip, or some-sized reorg. for i in range(40): - self.log.info(f"Iteration {i}, generating 2500 transactions {self.restart_counts}") + self.log.info(f"Iteration {i}, generating 250 transactions {self.restart_counts}") # Generate a bunch of small-ish transactions - self.generate_small_transactions(self.nodes[3], 2500, utxo_list) + self.generate_small_transactions(self.nodes[3], 250, utxo_list) # Pick a random block between current tip, and starting tip current_height = self.nodes[3].getblockcount() random_height = random.randint(starting_tip_height, current_height) @@ -257,13 +255,14 @@ def run_test(self): self.nodes[3], nblocks=min(10, current_height + 1 - self.nodes[3].getblockcount()), # new address to avoid mining a block that has just been invalidated - address=self.nodes[3].getnewaddress(), + address=getnewdestination()[2], sync_fun=self.no_op, )) self.log.debug(f"Syncing {len(block_hashes)} new blocks...") self.sync_node3blocks(block_hashes) - utxo_list = self.nodes[3].listunspent() - self.log.debug(f"Node3 utxo count: {len(utxo_list)}") + self.wallet.rescan_utxos() + utxo_list = self.wallet.get_utxos() + self.log.debug(f"MiniWallet utxo count: {len(utxo_list)}") # Check that the utxo hashes agree with node3 # Useful side effect: each utxo cache gets flushed here, so that we diff --git a/test/functional/feature_dersig.py b/test/functional/feature_dersig.py index d0071358f7..991470800b 100755 --- a/test/functional/feature_dersig.py +++ b/test/functional/feature_dersig.py @@ -57,7 +57,7 @@ def set_test_params(self): def create_tx(self, input_txid): utxo_to_spend = self.miniwallet.get_utxo(txid=input_txid, mark_as_spent=False) - return self.miniwallet.create_self_transfer(from_node=self.nodes[0], utxo_to_spend=utxo_to_spend)['tx'] + return self.miniwallet.create_self_transfer(utxo_to_spend=utxo_to_spend)['tx'] def test_dersig_info(self, *, is_active): assert_equal(self.nodes[0].getblockchaininfo()['softforks']['bip66'], diff --git a/test/functional/feature_fee_estimation.py b/test/functional/feature_fee_estimation.py index 270241d0e8..6bb021f45f 100755 --- a/test/functional/feature_fee_estimation.py +++ b/test/functional/feature_fee_estimation.py @@ -3,26 +3,13 @@ # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test fee estimation code.""" +from copy import deepcopy from decimal import Decimal import os import random from test_framework.messages import ( COIN, - COutPoint, - CTransaction, - CTxIn, - CTxOut, -) -from test_framework.script import ( - CScript, - OP_1, - OP_2, - OP_DROP, - OP_TRUE, -) -from test_framework.script_util import ( - script_to_p2sh_script, ) from test_framework.test_framework import BGLTestFramework from test_framework.util import ( @@ -32,24 +19,13 @@ assert_raises_rpc_error, satoshi_round, ) +from test_framework.wallet import MiniWallet -# Construct 2 trivial P2SH's and the ScriptSigs that spend them -# So we can create many transactions without needing to spend -# time signing. -REDEEM_SCRIPT_1 = CScript([OP_1, OP_DROP]) -REDEEM_SCRIPT_2 = CScript([OP_2, OP_DROP]) -P2SH_1 = script_to_p2sh_script(REDEEM_SCRIPT_1) -P2SH_2 = script_to_p2sh_script(REDEEM_SCRIPT_2) - -# Associated ScriptSig's to spend satisfy P2SH_1 and P2SH_2 -SCRIPT_SIG = [CScript([OP_TRUE, REDEEM_SCRIPT_1]), CScript([OP_TRUE, REDEEM_SCRIPT_2])] - - -def small_txpuzzle_randfee(from_node, conflist, unconflist, amount, min_fee, fee_increment): - """Create and send a transaction with a random fee. - The transaction pays to a trivial P2SH script, and assumes that its inputs - are of the same form. +def small_txpuzzle_randfee( + wallet, from_node, conflist, unconflist, amount, min_fee, fee_increment +): + """Create and send a transaction with a random fee using MiniWallet. The function takes a list of confirmed outputs and unconfirmed outputs and attempts to use the confirmed list first for its inputs. It adds the newly created outputs to the unconfirmed list. @@ -61,61 +37,33 @@ def small_txpuzzle_randfee(from_node, conflist, unconflist, amount, min_fee, fee rand_fee = float(fee_increment) * (1.1892 ** random.randint(0, 28)) # Total fee ranges from min_fee to min_fee + 127*fee_increment fee = min_fee - fee_increment + satoshi_round(rand_fee) - tx = CTransaction() + utxos_to_spend = [] total_in = Decimal("0.00000000") while total_in <= (amount + fee) and len(conflist) > 0: t = conflist.pop(0) - total_in += t["amount"] - tx.vin.append(CTxIn(COutPoint(int(t["txid"], 16), t["vout"]), b"")) + total_in += t["value"] + utxos_to_spend.append(t) + while total_in <= (amount + fee) and len(unconflist) > 0: + t = unconflist.pop(0) + total_in += t["value"] + utxos_to_spend.append(t) if total_in <= amount + fee: - while total_in <= (amount + fee) and len(unconflist) > 0: - t = unconflist.pop(0) - total_in += t["amount"] - tx.vin.append(CTxIn(COutPoint(int(t["txid"], 16), t["vout"]), b"")) - if total_in <= amount + fee: - raise RuntimeError(f"Insufficient funds: need {amount + fee}, have {total_in}") - tx.vout.append(CTxOut(int((total_in - amount - fee) * COIN), P2SH_1)) - tx.vout.append(CTxOut(int(amount * COIN), P2SH_2)) - # These transactions don't need to be signed, but we still have to insert - # the ScriptSig that will satisfy the ScriptPubKey. - for inp in tx.vin: - inp.scriptSig = SCRIPT_SIG[inp.prevout.n] + raise RuntimeError(f"Insufficient funds: need {amount + fee}, have {total_in}") + tx = wallet.create_self_transfer_multi( + utxos_to_spend=utxos_to_spend, + fee_per_output=0, + )["tx"] + tx.vout[0].nValue = int((total_in - amount - fee) * COIN) + tx.vout.append(deepcopy(tx.vout[0])) + tx.vout[1].nValue = int(amount * COIN) + txid = from_node.sendrawtransaction(hexstring=tx.serialize().hex(), maxfeerate=0) - unconflist.append({"txid": txid, "vout": 0, "amount": total_in - amount - fee}) - unconflist.append({"txid": txid, "vout": 1, "amount": amount}) + unconflist.append({"txid": txid, "vout": 0, "value": total_in - amount - fee}) + unconflist.append({"txid": txid, "vout": 1, "value": amount}) return (tx.serialize().hex(), fee) -def split_inputs(from_node, txins, txouts, initial_split=False): - """Generate a lot of inputs so we can generate a ton of transactions. - - This function takes an input from txins, and creates and sends a transaction - which splits the value into 2 outputs which are appended to txouts. - Previously this was designed to be small inputs so they wouldn't have - a high coin age when the notion of priority still existed.""" - - prevtxout = txins.pop() - tx = CTransaction() - tx.vin.append(CTxIn(COutPoint(int(prevtxout["txid"], 16), prevtxout["vout"]), b"")) - - half_change = satoshi_round(prevtxout["amount"] / 2) - rem_change = prevtxout["amount"] - half_change - Decimal("0.00001000") - tx.vout.append(CTxOut(int(half_change * COIN), P2SH_1)) - tx.vout.append(CTxOut(int(rem_change * COIN), P2SH_2)) - - # If this is the initial split we actually need to sign the transaction - # Otherwise we just need to insert the proper ScriptSig - if (initial_split): - completetx = from_node.signrawtransactionwithwallet(tx.serialize().hex())["hex"] - else: - tx.vin[0].scriptSig = SCRIPT_SIG[prevtxout["vout"]] - completetx = tx.serialize().hex() - txid = from_node.sendrawtransaction(hexstring=completetx, maxfeerate=0) - txouts.append({"txid": txid, "vout": 0, "amount": half_change}) - txouts.append({"txid": txid, "vout": 1, "amount": rem_change}) - - def check_raw_estimates(node, fees_seen): """Call estimaterawfee and verify that the estimates meet certain invariants.""" @@ -134,8 +82,8 @@ def check_smart_estimates(node, fees_seen): delta = 1.0e-6 # account for rounding error last_feerate = float(max(fees_seen)) all_smart_estimates = [node.estimatesmartfee(i) for i in range(1, 26)] - mempoolMinFee = node.getmempoolinfo()['mempoolminfee'] - minRelaytxFee = node.getmempoolinfo()['minrelaytxfee'] + mempoolMinFee = node.getmempoolinfo()["mempoolminfee"] + minRelaytxFee = node.getmempoolinfo()["minrelaytxfee"] for i, e in enumerate(all_smart_estimates): # estimate is for i+1 feerate = float(e["feerate"]) assert_greater_than(feerate, 0) @@ -158,34 +106,27 @@ def check_estimates(node, fees_seen): check_raw_estimates(node, fees_seen) check_smart_estimates(node, fees_seen) -def send_tx(node, utxo, feerate): - """Broadcast a 1in-1out transaction with a specific input and feerate (sat/vb).""" - overhead, op, scriptsig, nseq, value, spk = 10, 36, 5, 4, 8, 24 - tx_size = overhead + op + scriptsig + nseq + value + spk - fee = tx_size * feerate - tx = CTransaction() - tx.vin = [CTxIn(COutPoint(int(utxo["txid"], 16), utxo["vout"]), SCRIPT_SIG[utxo["vout"]])] - tx.vout = [CTxOut(int(utxo["amount"] * COIN) - fee, P2SH_1)] - txid = node.sendrawtransaction(tx.serialize().hex()) +def send_tx(wallet, node, utxo, feerate): + """Broadcast a 1in-1out transaction with a specific input and feerate (sat/vb).""" + return wallet.send_self_transfer( + from_node=node, + utxo_to_spend=utxo, + fee_rate=Decimal(feerate * 1000) / COIN, + )['txid'] - return txid class EstimateFeeTest(BGLTestFramework): def set_test_params(self): self.num_nodes = 3 - # mine non-standard txs (e.g. txs with "dust" outputs) # Force fSendTrickle to true (via whitelist.noban) self.extra_args = [ - ["-acceptnonstdtxn", "-whitelist=noban@127.0.0.1"], - ["-acceptnonstdtxn", "-whitelist=noban@127.0.0.1", "-blockmaxweight=68000"], - ["-acceptnonstdtxn", "-whitelist=noban@127.0.0.1", "-blockmaxweight=32000"], + ["-whitelist=noban@127.0.0.1"], + ["-whitelist=noban@127.0.0.1", "-blockmaxweight=68000"], + ["-whitelist=noban@127.0.0.1", "-blockmaxweight=32000"], ] - def skip_test_if_missing_module(self): - self.skip_if_no_wallet() - def setup_network(self): """ We'll setup the network to have 3 nodes that all mine with different parameters. @@ -199,9 +140,6 @@ def setup_network(self): # (68k weight is room enough for 120 or so transactions) # Node2 is a stingy miner, that # produces too small blocks (room for only 55 or so transactions) - self.start_nodes() - self.import_deterministic_coinbase_privkeys() - self.stop_nodes() def transact_and_mine(self, numblocks, mining_node): min_fee = Decimal("0.00001") @@ -213,13 +151,19 @@ def transact_and_mine(self, numblocks, mining_node): random.shuffle(self.confutxo) for _ in range(random.randrange(100 - 50, 100 + 50)): from_index = random.randint(1, 2) - (txhex, fee) = small_txpuzzle_randfee(self.nodes[from_index], self.confutxo, - self.memutxo, Decimal("0.005"), min_fee, min_fee) + (txhex, fee) = small_txpuzzle_randfee( + self.wallet, + self.nodes[from_index], + self.confutxo, + self.memutxo, + Decimal("0.005"), + min_fee, + min_fee, + ) tx_kbytes = (len(txhex) // 2) / 1000.0 self.fees_per_kb.append(float(fee) / tx_kbytes) - self.sync_mempools(wait=.1) + self.sync_mempools(wait=0.1) mined = mining_node.getblock(self.generate(mining_node, 1)[0], True)["tx"] - self.sync_blocks(wait=.1) # update which txouts are confirmed newmem = [] for utx in self.memutxo: @@ -231,37 +175,18 @@ def transact_and_mine(self, numblocks, mining_node): def initial_split(self, node): """Split two coinbase UTxOs into many small coins""" - self.txouts = [] - self.txouts2 = [] - # Split a coinbase into two transaction puzzle outputs - split_inputs(node, node.listunspent(0), self.txouts, True) - - # Mine + self.confutxo = self.wallet.send_self_transfer_multi( + from_node=node, + utxos_to_spend=[self.wallet.get_utxo() for _ in range(2)], + num_outputs=2048)['new_utxos'] while len(node.getrawmempool()) > 0: self.generate(node, 1, sync_fun=self.no_op) - # Repeatedly split those 2 outputs, doubling twice for each rep - # Use txouts to monitor the available utxo, since these won't be tracked in wallet - reps = 0 - while reps < 5: - # Double txouts to txouts2 - while len(self.txouts) > 0: - split_inputs(node, self.txouts, self.txouts2) - while len(node.getrawmempool()) > 0: - self.generate(node, 1, sync_fun=self.no_op) - # Double txouts2 to txouts - while len(self.txouts2) > 0: - split_inputs(node, self.txouts2, self.txouts) - while len(node.getrawmempool()) > 0: - self.generate(node, 1, sync_fun=self.no_op) - reps += 1 - def sanity_check_estimates_range(self): """Populate estimation buckets, assert estimates are in a sane range and are strictly increasing as the target decreases.""" self.fees_per_kb = [] self.memutxo = [] - self.confutxo = self.txouts # Start with the set of confirmed txouts after splitting self.log.info("Will output estimates for 1/2/3/6/15/25 blocks") for _ in range(2): @@ -280,13 +205,12 @@ def sanity_check_estimates_range(self): while len(self.nodes[1].getrawmempool()) > 0: self.generate(self.nodes[1], 1) - self.sync_blocks(self.nodes[0:3], wait=.1) self.log.info("Final estimates after emptying mempools") check_estimates(self.nodes[1], self.fees_per_kb) def test_feerate_mempoolminfee(self): - high_val = 3*self.nodes[1].estimatesmartfee(1)['feerate'] - self.restart_node(1, extra_args=[f'-minrelaytxfee={high_val}']) + high_val = 3 * self.nodes[1].estimatesmartfee(1)["feerate"] + self.restart_node(1, extra_args=[f"-minrelaytxfee={high_val}"]) check_estimates(self.nodes[1], self.fees_per_kb) self.restart_node(1) @@ -307,41 +231,36 @@ def sanity_check_rbf_estimates(self, utxos): utxos_to_respend = [] txids_to_replace = [] - assert len(utxos) >= 250 + assert_greater_than_or_equal(len(utxos), 250) for _ in range(5): # Broadcast 45 low fee transactions that will need to be RBF'd for _ in range(45): u = utxos.pop(0) - txid = send_tx(node, u, low_feerate) + txid = send_tx(self.wallet, node, u, low_feerate) utxos_to_respend.append(u) txids_to_replace.append(txid) # Broadcast 5 low fee transaction which don't need to for _ in range(5): - send_tx(node, utxos.pop(0), low_feerate) + send_tx(self.wallet, node, utxos.pop(0), low_feerate) # Mine the transactions on another node - self.sync_mempools(wait=.1, nodes=[node, miner]) + self.sync_mempools(wait=0.1, nodes=[node, miner]) for txid in txids_to_replace: miner.prioritisetransaction(txid=txid, fee_delta=-COIN) self.generate(miner, 1) - self.sync_blocks(wait=.1, nodes=[node, miner]) # RBF the low-fee transactions - while True: - try: - u = utxos_to_respend.pop(0) - send_tx(node, u, high_feerate) - except IndexError: - break + while len(utxos_to_respend) > 0: + u = utxos_to_respend.pop(0) + send_tx(self.wallet, node, u, high_feerate) # Mine the last replacement txs - self.sync_mempools(wait=.1, nodes=[node, miner]) + self.sync_mempools(wait=0.1, nodes=[node, miner]) self.generate(miner, 1) - self.sync_blocks(wait=.1, nodes=[node, miner]) # Only 10% of the transactions were really confirmed with a low feerate, # the rest needed to be RBF'd. We must return the 90% conf rate feerate. - high_feerate_kvb = Decimal(high_feerate) / COIN * 10**3 + high_feerate_kvb = Decimal(high_feerate) / COIN * 10 ** 3 est_feerate = node.estimatesmartfee(2)["feerate"] - assert est_feerate == high_feerate_kvb + assert_equal(est_feerate, high_feerate_kvb) def run_test(self): self.log.info("This test is time consuming, please be patient") @@ -349,6 +268,8 @@ def run_test(self): # Split two coinbases into many small utxos self.start_node(0) + self.wallet = MiniWallet(self.nodes[0]) + self.wallet.rescan_utxos() self.initial_split(self.nodes[0]) self.log.info("Finished splitting") @@ -385,5 +306,5 @@ def run_test(self): self.nodes[0].estimatesmartfee, 2) -if __name__ == '__main__': +if __name__ == "__main__": EstimateFeeTest().main() diff --git a/test/functional/feature_maxuploadtarget.py b/test/functional/feature_maxuploadtarget.py index f9d801eed7..8622d18c58 100755 --- a/test/functional/feature_maxuploadtarget.py +++ b/test/functional/feature_maxuploadtarget.py @@ -17,6 +17,7 @@ from test_framework.p2p import P2PInterface from test_framework.test_framework import BGLTestFramework from test_framework.util import assert_equal, mine_large_block +from test_framework.wallet import MiniWallet class TestP2PConn(P2PInterface): def __init__(self): @@ -55,7 +56,8 @@ def run_test(self): self.nodes[0].setmocktime(old_time) # Generate some old blocks - self.generate(self.nodes[0], 130) + self.wallet = MiniWallet(self.nodes[0]) + self.generate(self.wallet, 130) # p2p_conns[0] will only request old blocks # p2p_conns[1] will only request new blocks @@ -66,7 +68,7 @@ def run_test(self): p2p_conns.append(self.nodes[0].add_p2p_connection(TestP2PConn())) # Now mine a big block - mine_large_block(self, self.nodes[0], self.utxo_cache) + mine_large_block(self, self.wallet, self.nodes[0]) # Store the hash; we'll request this later big_old_block = self.nodes[0].getbestblockhash() @@ -77,7 +79,7 @@ def run_test(self): self.nodes[0].setmocktime(int(time.time()) - 2*60*60*24) # Mine one more block, so that the prior block looks old - mine_large_block(self, self.nodes[0], self.utxo_cache) + mine_large_block(self, self.wallet, self.nodes[0]) # We'll be requesting this new block too big_new_block = self.nodes[0].getbestblockhash() diff --git a/test/functional/feature_rbf.py b/test/functional/feature_rbf.py index 497a3075a2..391214bd69 100755 --- a/test/functional/feature_rbf.py +++ b/test/functional/feature_rbf.py @@ -1,54 +1,47 @@ #!/usr/bin/env python3 -# Copyright (c) 2014-2020 The Bitcoin Core developers +# Copyright (c) 2014-2021 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test the RBF code.""" -from copy import deepcopy from decimal import Decimal from test_framework.messages import ( BIP125_SEQUENCE_NUMBER, COIN, - COutPoint, - CTransaction, - CTxIn, - CTxOut, + SEQUENCE_FINAL, ) -from test_framework.script import CScript, OP_DROP from test_framework.test_framework import BGLTestFramework from test_framework.util import ( assert_equal, assert_raises_rpc_error, ) -from test_framework.script_util import ( - DUMMY_P2WPKH_SCRIPT, - DUMMY_2_P2WPKH_SCRIPT, -) from test_framework.wallet import MiniWallet from test_framework.address import ADDRESS_BCRT1_UNSPENDABLE MAX_REPLACEMENT_LIMIT = 100 class ReplaceByFeeTest(BGLTestFramework): def set_test_params(self): - self.num_nodes = 1 + self.num_nodes = 2 self.extra_args = [ [ - "-acceptnonstdtxn=1", "-maxorphantx=1000", "-limitancestorcount=50", "-limitancestorsize=101", "-limitdescendantcount=200", "-limitdescendantsize=101", ], + # second node has default mempool parameters + [ + ], ] self.supports_cli = False def run_test(self): self.wallet = MiniWallet(self.nodes[0]) # the pre-mined test framework chain contains coinbase outputs to the - # MiniWallet's default address ADDRESS_BCRT1_P2WSH_OP_TRUE in blocks - # 76-100 (see method BitcoinTestFramework._initialize_chain()) + # MiniWallet's default address in blocks 76-100 (see method + # BitcoinTestFramework._initialize_chain()) self.wallet.rescan_utxos() self.log.info("Running test simple doublespend...") @@ -72,6 +65,9 @@ def run_test(self): self.log.info("Running test too many replacements...") self.test_too_many_replacements() + self.log.info("Running test too many replacements using default mempool params...") + self.test_too_many_replacements_with_default_mempool_params() + self.log.info("Running test opt-in...") self.test_opt_in() @@ -89,15 +85,13 @@ def run_test(self): self.log.info("Passed") - def make_utxo(self, node, amount, confirmed=True, scriptPubKey=DUMMY_P2WPKH_SCRIPT): + def make_utxo(self, node, amount, *, confirmed=True, scriptPubKey=None): """Create a txout with a given amount and scriptPubKey - - confirmed - txouts created will be confirmed in the blockchain; + confirmed - txout created will be confirmed in the blockchain; unconfirmed otherwise. """ - txid, n = self.wallet.send_to(from_node=node, scriptPubKey=scriptPubKey, amount=amount) + txid, n = self.wallet.send_to(from_node=node, scriptPubKey=scriptPubKey or self.wallet.get_scriptPubKey(), amount=amount) - # If requested, ensure txouts are confirmed. if confirmed: mempool_size = len(node.getrawmempool()) while mempool_size > 0: @@ -108,30 +102,24 @@ def make_utxo(self, node, amount, confirmed=True, scriptPubKey=DUMMY_P2WPKH_SCRI assert new_size < mempool_size mempool_size = new_size - return COutPoint(int(txid, 16), n) + return self.wallet.get_utxo(txid=txid, vout=n) def test_simple_doublespend(self): """Simple doublespend""" # we use MiniWallet to create a transaction template with inputs correctly set, # and modify the output (amount, scriptPubKey) according to our needs - tx_template = self.wallet.create_self_transfer(from_node=self.nodes[0])['tx'] - - tx1a = deepcopy(tx_template) - tx1a.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)] - tx1a_hex = tx1a.serialize().hex() - tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, 0) + tx = self.wallet.create_self_transfer()["tx"] + tx1a_txid = self.nodes[0].sendrawtransaction(tx.serialize().hex()) # Should fail because we haven't changed the fee - tx1b = deepcopy(tx_template) - tx1b.vout = [CTxOut(1 * COIN, DUMMY_2_P2WPKH_SCRIPT)] - tx1b_hex = tx1b.serialize().hex() + tx.vout[0].scriptPubKey[-1] ^= 1 # This will raise an exception due to insufficient fee - assert_raises_rpc_error(-26, "insufficient fee", self.nodes[0].sendrawtransaction, tx1b_hex, 0) + assert_raises_rpc_error(-26, "insufficient fee", self.nodes[0].sendrawtransaction, tx.serialize().hex(), 0) # Extra 0.1 BTC fee - tx1b.vout[0].nValue -= int(0.1 * COIN) - tx1b_hex = tx1b.serialize().hex() + tx.vout[0].nValue -= int(0.1 * COIN) + tx1b_hex = tx.serialize().hex() # Works when enabled tx1b_txid = self.nodes[0].sendrawtransaction(tx1b_hex, 0) @@ -153,28 +141,28 @@ def test_doublespend_chain(self): chain_txids = [] while remaining_value > 1 * COIN: remaining_value -= int(0.1 * COIN) - tx = CTransaction() - tx.vin = [CTxIn(prevout, nSequence=0)] - tx.vout = [CTxOut(remaining_value, CScript([1, OP_DROP] * 15 + [1]))] - tx_hex = tx.serialize().hex() - txid = self.nodes[0].sendrawtransaction(tx_hex, 0) - chain_txids.append(txid) - prevout = COutPoint(int(txid, 16), 0) + prevout = self.wallet.send_self_transfer( + from_node=self.nodes[0], + utxo_to_spend=prevout, + sequence=0, + fee=Decimal("0.1"), + )["new_utxo"] + chain_txids.append(prevout["txid"]) # Whether the double-spend is allowed is evaluated by including all # child fees - 4 BTC - so this attempt is rejected. - dbl_tx = CTransaction() - dbl_tx.vin = [CTxIn(tx0_outpoint, nSequence=0)] - dbl_tx.vout = [CTxOut(initial_nValue - 3 * COIN, DUMMY_P2WPKH_SCRIPT)] + dbl_tx = self.wallet.create_self_transfer( + utxo_to_spend=tx0_outpoint, + sequence=0, + fee=Decimal("3"), + )["tx"] dbl_tx_hex = dbl_tx.serialize().hex() # This will raise an exception due to insufficient fee assert_raises_rpc_error(-26, "insufficient fee", self.nodes[0].sendrawtransaction, dbl_tx_hex, 0) # Accepted with sufficient fee - dbl_tx = CTransaction() - dbl_tx.vin = [CTxIn(tx0_outpoint, nSequence=0)] - dbl_tx.vout = [CTxOut(int(0.1 * COIN), DUMMY_P2WPKH_SCRIPT)] + dbl_tx.vout[0].nValue = int(0.1 * COIN) dbl_tx_hex = dbl_tx.serialize().hex() self.nodes[0].sendrawtransaction(dbl_tx_hex, 0) @@ -198,22 +186,19 @@ def branch(prevout, initial_value, max_txs, tree_width=5, fee=0.00001 * COIN, _t if txout_value < fee: return - vout = [CTxOut(txout_value, CScript([i+1])) - for i in range(tree_width)] - tx = CTransaction() - tx.vin = [CTxIn(prevout, nSequence=0)] - tx.vout = vout - tx_hex = tx.serialize().hex() + tx = self.wallet.send_self_transfer_multi( + utxos_to_spend=[prevout], + from_node=self.nodes[0], + sequence=0, + num_outputs=tree_width, + amount_per_output=txout_value, + ) - assert len(tx.serialize()) < 100000 - txid = self.nodes[0].sendrawtransaction(tx_hex, 0) - yield tx + yield tx["txid"] _total_txs[0] += 1 - txid = int(txid, 16) - - for i, txout in enumerate(tx.vout): - for x in branch(COutPoint(txid, i), txout_value, + for utxo in tx["new_utxos"]: + for x in branch(utxo, txout_value, max_txs, tree_width=tree_width, fee=fee, _total_txs=_total_txs): @@ -225,25 +210,26 @@ def branch(prevout, initial_value, max_txs, tree_width=5, fee=0.00001 * COIN, _t assert_equal(len(tree_txs), n) # Attempt double-spend, will fail because too little fee paid - dbl_tx = CTransaction() - dbl_tx.vin = [CTxIn(tx0_outpoint, nSequence=0)] - dbl_tx.vout = [CTxOut(initial_nValue - fee * n, DUMMY_P2WPKH_SCRIPT)] - dbl_tx_hex = dbl_tx.serialize().hex() + dbl_tx_hex = self.wallet.create_self_transfer( + utxo_to_spend=tx0_outpoint, + sequence=0, + fee=(Decimal(fee) / COIN) * n, + )["hex"] # This will raise an exception due to insufficient fee assert_raises_rpc_error(-26, "insufficient fee", self.nodes[0].sendrawtransaction, dbl_tx_hex, 0) # 0.1 BTC fee is enough - dbl_tx = CTransaction() - dbl_tx.vin = [CTxIn(tx0_outpoint, nSequence=0)] - dbl_tx.vout = [CTxOut(initial_nValue - fee * n - int(0.1 * COIN), DUMMY_P2WPKH_SCRIPT)] - dbl_tx_hex = dbl_tx.serialize().hex() + dbl_tx_hex = self.wallet.create_self_transfer( + utxo_to_spend=tx0_outpoint, + sequence=0, + fee=(Decimal(fee) / COIN) * n + Decimal("0.1"), + )["hex"] self.nodes[0].sendrawtransaction(dbl_tx_hex, 0) mempool = self.nodes[0].getrawmempool() - for tx in tree_txs: - tx.rehash() - assert tx.hash not in mempool + for txid in tree_txs: + assert txid not in mempool # Try again, but with more total transactions than the "max txs # double-spent at once" anti-DoS limit. @@ -253,33 +239,36 @@ def branch(prevout, initial_value, max_txs, tree_width=5, fee=0.00001 * COIN, _t tree_txs = list(branch(tx0_outpoint, initial_nValue, n, fee=fee)) assert_equal(len(tree_txs), n) - dbl_tx = CTransaction() - dbl_tx.vin = [CTxIn(tx0_outpoint, nSequence=0)] - dbl_tx.vout = [CTxOut(initial_nValue - 2 * fee * n, DUMMY_P2WPKH_SCRIPT)] - dbl_tx_hex = dbl_tx.serialize().hex() + dbl_tx_hex = self.wallet.create_self_transfer( + utxo_to_spend=tx0_outpoint, + sequence=0, + fee=2 * (Decimal(fee) / COIN) * n, + )["hex"] # This will raise an exception assert_raises_rpc_error(-26, "too many potential replacements", self.nodes[0].sendrawtransaction, dbl_tx_hex, 0) - for tx in tree_txs: - tx.rehash() - self.nodes[0].getrawtransaction(tx.hash) + for txid in tree_txs: + self.nodes[0].getrawtransaction(txid) def test_replacement_feeperkb(self): """Replacement requires fee-per-KB to be higher""" tx0_outpoint = self.make_utxo(self.nodes[0], int(1.1 * COIN)) - tx1a = CTransaction() - tx1a.vin = [CTxIn(tx0_outpoint, nSequence=0)] - tx1a.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)] - tx1a_hex = tx1a.serialize().hex() - self.nodes[0].sendrawtransaction(tx1a_hex, 0) + self.wallet.send_self_transfer( + from_node=self.nodes[0], + utxo_to_spend=tx0_outpoint, + sequence=0, + fee=Decimal("0.1"), + ) # Higher fee, but the fee per KB is much lower, so the replacement is # rejected. - tx1b = CTransaction() - tx1b.vin = [CTxIn(tx0_outpoint, nSequence=0)] - tx1b.vout = [CTxOut(int(0.001 * COIN), CScript([b'a' * 999000]))] - tx1b_hex = tx1b.serialize().hex() + tx1b_hex = self.wallet.create_self_transfer_multi( + utxos_to_spend=[tx0_outpoint], + sequence=0, + num_outputs=100, + amount_per_output=1000, + )["hex"] # This will raise an exception due to insufficient fee assert_raises_rpc_error(-26, "insufficient fee", self.nodes[0].sendrawtransaction, tx1b_hex, 0) @@ -289,37 +278,36 @@ def test_spends_of_conflicting_outputs(self): utxo1 = self.make_utxo(self.nodes[0], int(1.2 * COIN)) utxo2 = self.make_utxo(self.nodes[0], 3 * COIN) - tx1a = CTransaction() - tx1a.vin = [CTxIn(utxo1, nSequence=0)] - tx1a.vout = [CTxOut(int(1.1 * COIN), DUMMY_P2WPKH_SCRIPT)] - tx1a_hex = tx1a.serialize().hex() - tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, 0) - - tx1a_txid = int(tx1a_txid, 16) + tx1a_utxo = self.wallet.send_self_transfer( + from_node=self.nodes[0], + utxo_to_spend=utxo1, + sequence=0, + fee=Decimal("0.1"), + )["new_utxo"] # Direct spend an output of the transaction we're replacing. - tx2 = CTransaction() - tx2.vin = [CTxIn(utxo1, nSequence=0), CTxIn(utxo2, nSequence=0)] - tx2.vin.append(CTxIn(COutPoint(tx1a_txid, 0), nSequence=0)) - tx2.vout = tx1a.vout - tx2_hex = tx2.serialize().hex() + tx2_hex = self.wallet.create_self_transfer_multi( + utxos_to_spend=[utxo1, utxo2, tx1a_utxo], + sequence=0, + amount_per_output=int(COIN * tx1a_utxo["value"]), + )["hex"] # This will raise an exception assert_raises_rpc_error(-26, "bad-txns-spends-conflicting-tx", self.nodes[0].sendrawtransaction, tx2_hex, 0) # Spend tx1a's output to test the indirect case. - tx1b = CTransaction() - tx1b.vin = [CTxIn(COutPoint(tx1a_txid, 0), nSequence=0)] - tx1b.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)] - tx1b_hex = tx1b.serialize().hex() - tx1b_txid = self.nodes[0].sendrawtransaction(tx1b_hex, 0) - tx1b_txid = int(tx1b_txid, 16) + tx1b_utxo = self.wallet.send_self_transfer( + from_node=self.nodes[0], + utxo_to_spend=tx1a_utxo, + sequence=0, + fee=Decimal("0.1"), + )["new_utxo"] - tx2 = CTransaction() - tx2.vin = [CTxIn(utxo1, nSequence=0), CTxIn(utxo2, nSequence=0), - CTxIn(COutPoint(tx1b_txid, 0))] - tx2.vout = tx1a.vout - tx2_hex = tx2.serialize().hex() + tx2_hex = self.wallet.create_self_transfer_multi( + utxos_to_spend=[utxo1, utxo2, tx1b_utxo], + sequence=0, + amount_per_output=int(COIN * tx1a_utxo["value"]), + )["hex"] # This will raise an exception assert_raises_rpc_error(-26, "bad-txns-spends-conflicting-tx", self.nodes[0].sendrawtransaction, tx2_hex, 0) @@ -327,18 +315,20 @@ def test_spends_of_conflicting_outputs(self): def test_new_unconfirmed_inputs(self): """Replacements that add new unconfirmed inputs are rejected""" confirmed_utxo = self.make_utxo(self.nodes[0], int(1.1 * COIN)) - unconfirmed_utxo = self.make_utxo(self.nodes[0], int(0.1 * COIN), False) + unconfirmed_utxo = self.make_utxo(self.nodes[0], int(0.1 * COIN), confirmed=False) - tx1 = CTransaction() - tx1.vin = [CTxIn(confirmed_utxo)] - tx1.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)] - tx1_hex = tx1.serialize().hex() - self.nodes[0].sendrawtransaction(tx1_hex, 0) + self.wallet.send_self_transfer( + from_node=self.nodes[0], + utxo_to_spend=confirmed_utxo, + sequence=0, + fee=Decimal("0.1"), + ) - tx2 = CTransaction() - tx2.vin = [CTxIn(confirmed_utxo), CTxIn(unconfirmed_utxo)] - tx2.vout = tx1.vout - tx2_hex = tx2.serialize().hex() + tx2_hex = self.wallet.create_self_transfer_multi( + utxos_to_spend=[confirmed_utxo, unconfirmed_utxo], + sequence=0, + amount_per_output=1 * COIN, + )["hex"] # This will raise an exception assert_raises_rpc_error(-26, "replacement-adds-unconfirmed", self.nodes[0].sendrawtransaction, tx2_hex, 0) @@ -354,67 +344,148 @@ def test_too_many_replacements(self): fee = int(0.0001 * COIN) split_value = int((initial_nValue - fee) / (MAX_REPLACEMENT_LIMIT + 1)) - outputs = [] - for _ in range(MAX_REPLACEMENT_LIMIT + 1): - outputs.append(CTxOut(split_value, CScript([1]))) - - splitting_tx = CTransaction() - splitting_tx.vin = [CTxIn(utxo, nSequence=0)] - splitting_tx.vout = outputs - splitting_tx_hex = splitting_tx.serialize().hex() - - txid = self.nodes[0].sendrawtransaction(splitting_tx_hex, 0) - txid = int(txid, 16) + splitting_tx_utxos = self.wallet.send_self_transfer_multi( + from_node=self.nodes[0], + utxos_to_spend=[utxo], + sequence=0, + num_outputs=MAX_REPLACEMENT_LIMIT + 1, + amount_per_output=split_value, + )["new_utxos"] # Now spend each of those outputs individually - for i in range(MAX_REPLACEMENT_LIMIT + 1): - tx_i = CTransaction() - tx_i.vin = [CTxIn(COutPoint(txid, i), nSequence=0)] - tx_i.vout = [CTxOut(split_value - fee, DUMMY_P2WPKH_SCRIPT)] - tx_i_hex = tx_i.serialize().hex() - self.nodes[0].sendrawtransaction(tx_i_hex, 0) + for utxo in splitting_tx_utxos: + self.wallet.send_self_transfer( + from_node=self.nodes[0], + utxo_to_spend=utxo, + sequence=0, + fee=Decimal(fee) / COIN, + ) # Now create doublespend of the whole lot; should fail. # Need a big enough fee to cover all spending transactions and have # a higher fee rate double_spend_value = (split_value - 100 * fee) * (MAX_REPLACEMENT_LIMIT + 1) - inputs = [] - for i in range(MAX_REPLACEMENT_LIMIT + 1): - inputs.append(CTxIn(COutPoint(txid, i), nSequence=0)) - double_tx = CTransaction() - double_tx.vin = inputs - double_tx.vout = [CTxOut(double_spend_value, CScript([b'a']))] + double_tx = self.wallet.create_self_transfer_multi( + utxos_to_spend=splitting_tx_utxos, + sequence=0, + amount_per_output=double_spend_value, + )["tx"] double_tx_hex = double_tx.serialize().hex() # This will raise an exception assert_raises_rpc_error(-26, "too many potential replacements", self.nodes[0].sendrawtransaction, double_tx_hex, 0) # If we remove an input, it should pass - double_tx = CTransaction() - double_tx.vin = inputs[0:-1] - double_tx.vout = [CTxOut(double_spend_value, CScript([b'a']))] + double_tx.vin.pop() double_tx_hex = double_tx.serialize().hex() self.nodes[0].sendrawtransaction(double_tx_hex, 0) + def test_too_many_replacements_with_default_mempool_params(self): + """ + Test rule 5 (do not allow replacements that cause more than 100 + evictions) without having to rely on non-default mempool parameters. + In order to do this, create a number of "root" UTXOs, and then hang + enough transactions off of each root UTXO to exceed the MAX_REPLACEMENT_LIMIT. + Then create a conflicting RBF replacement transaction. + """ + normal_node = self.nodes[1] + wallet = MiniWallet(normal_node) + wallet.rescan_utxos() + # Clear mempools to avoid cross-node sync failure. + for node in self.nodes: + self.generate(node, 1) + + # This has to be chosen so that the total number of transactions can exceed + # MAX_REPLACEMENT_LIMIT without having any one tx graph run into the descendant + # limit; 10 works. + num_tx_graphs = 10 + + # (Number of transactions per graph, rule 5 failure expected) + cases = [ + # Test the base case of evicting fewer than MAX_REPLACEMENT_LIMIT + # transactions. + ((MAX_REPLACEMENT_LIMIT // num_tx_graphs) - 1, False), + + # Test hitting the rule 5 eviction limit. + (MAX_REPLACEMENT_LIMIT // num_tx_graphs, True), + ] + + for (txs_per_graph, failure_expected) in cases: + self.log.debug(f"txs_per_graph: {txs_per_graph}, failure: {failure_expected}") + # "Root" utxos of each txn graph that we will attempt to double-spend with + # an RBF replacement. + root_utxos = [] + + # For each root UTXO, create a package that contains the spend of that + # UTXO and `txs_per_graph` children tx. + for graph_num in range(num_tx_graphs): + root_utxos.append(wallet.get_utxo()) + + optin_parent_tx = wallet.send_self_transfer_multi( + from_node=normal_node, + sequence=BIP125_SEQUENCE_NUMBER, + utxos_to_spend=[root_utxos[graph_num]], + num_outputs=txs_per_graph, + ) + assert_equal(True, normal_node.getmempoolentry(optin_parent_tx['txid'])['bip125-replaceable']) + new_utxos = optin_parent_tx['new_utxos'] + + for utxo in new_utxos: + # Create spends for each output from the "root" of this graph. + child_tx = wallet.send_self_transfer( + from_node=normal_node, + utxo_to_spend=utxo, + ) + + assert normal_node.getmempoolentry(child_tx['txid']) + + num_txs_invalidated = len(root_utxos) + (num_tx_graphs * txs_per_graph) + + if failure_expected: + assert num_txs_invalidated > MAX_REPLACEMENT_LIMIT + else: + assert num_txs_invalidated <= MAX_REPLACEMENT_LIMIT + + # Now attempt to submit a tx that double-spends all the root tx inputs, which + # would invalidate `num_txs_invalidated` transactions. + tx_hex = wallet.create_self_transfer_multi( + utxos_to_spend=root_utxos, + fee_per_output=10_000_000, # absurdly high feerate + )["hex"] + + if failure_expected: + assert_raises_rpc_error( + -26, "too many potential replacements", normal_node.sendrawtransaction, tx_hex, 0) + else: + txid = normal_node.sendrawtransaction(tx_hex, 0) + assert normal_node.getmempoolentry(txid) + + # Clear the mempool once finished, and rescan the other nodes' wallet + # to account for the spends we've made on `normal_node`. + self.generate(normal_node, 1) + self.wallet.rescan_utxos() + def test_opt_in(self): """Replacing should only work if orig tx opted in""" tx0_outpoint = self.make_utxo(self.nodes[0], int(1.1 * COIN)) # Create a non-opting in transaction - tx1a = CTransaction() - tx1a.vin = [CTxIn(tx0_outpoint, nSequence=0xffffffff)] - tx1a.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)] - tx1a_hex = tx1a.serialize().hex() - tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, 0) + tx1a_utxo = self.wallet.send_self_transfer( + from_node=self.nodes[0], + utxo_to_spend=tx0_outpoint, + sequence=SEQUENCE_FINAL, + fee=Decimal("0.1"), + )["new_utxo"] # This transaction isn't shown as replaceable - assert_equal(self.nodes[0].getmempoolentry(tx1a_txid)['bip125-replaceable'], False) + assert_equal(self.nodes[0].getmempoolentry(tx1a_utxo["txid"])['bip125-replaceable'], False) # Shouldn't be able to double-spend - tx1b = CTransaction() - tx1b.vin = [CTxIn(tx0_outpoint, nSequence=0)] - tx1b.vout = [CTxOut(int(0.9 * COIN), DUMMY_P2WPKH_SCRIPT)] - tx1b_hex = tx1b.serialize().hex() + tx1b_hex = self.wallet.create_self_transfer( + utxo_to_spend=tx0_outpoint, + sequence=0, + fee=Decimal("0.2"), + )["hex"] # This will raise an exception assert_raises_rpc_error(-26, "txn-mempool-conflict", self.nodes[0].sendrawtransaction, tx1b_hex, 0) @@ -422,17 +493,19 @@ def test_opt_in(self): tx1_outpoint = self.make_utxo(self.nodes[0], int(1.1 * COIN)) # Create a different non-opting in transaction - tx2a = CTransaction() - tx2a.vin = [CTxIn(tx1_outpoint, nSequence=0xfffffffe)] - tx2a.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)] - tx2a_hex = tx2a.serialize().hex() - tx2a_txid = self.nodes[0].sendrawtransaction(tx2a_hex, 0) + tx2a_utxo = self.wallet.send_self_transfer( + from_node=self.nodes[0], + utxo_to_spend=tx1_outpoint, + sequence=0xfffffffe, + fee=Decimal("0.1"), + )["new_utxo"] # Still shouldn't be able to double-spend - tx2b = CTransaction() - tx2b.vin = [CTxIn(tx1_outpoint, nSequence=0)] - tx2b.vout = [CTxOut(int(0.9 * COIN), DUMMY_P2WPKH_SCRIPT)] - tx2b_hex = tx2b.serialize().hex() + tx2b_hex = self.wallet.create_self_transfer( + utxo_to_spend=tx1_outpoint, + sequence=0, + fee=Decimal("0.2"), + )["hex"] # This will raise an exception assert_raises_rpc_error(-26, "txn-mempool-conflict", self.nodes[0].sendrawtransaction, tx2b_hex, 0) @@ -441,34 +514,31 @@ def test_opt_in(self): # opt-in on one of the inputs # Transaction should be replaceable on either input - tx1a_txid = int(tx1a_txid, 16) - tx2a_txid = int(tx2a_txid, 16) - - tx3a = CTransaction() - tx3a.vin = [CTxIn(COutPoint(tx1a_txid, 0), nSequence=0xffffffff), - CTxIn(COutPoint(tx2a_txid, 0), nSequence=0xfffffffd)] - tx3a.vout = [CTxOut(int(0.9 * COIN), CScript([b'c'])), CTxOut(int(0.9 * COIN), CScript([b'd']))] - tx3a_hex = tx3a.serialize().hex() - - tx3a_txid = self.nodes[0].sendrawtransaction(tx3a_hex, 0) + tx3a_txid = self.wallet.send_self_transfer_multi( + from_node=self.nodes[0], + utxos_to_spend=[tx1a_utxo, tx2a_utxo], + sequence=[SEQUENCE_FINAL, 0xfffffffd], + fee_per_output=int(0.1 * COIN), + )["txid"] # This transaction is shown as replaceable assert_equal(self.nodes[0].getmempoolentry(tx3a_txid)['bip125-replaceable'], True) - tx3b = CTransaction() - tx3b.vin = [CTxIn(COutPoint(tx1a_txid, 0), nSequence=0)] - tx3b.vout = [CTxOut(int(0.5 * COIN), DUMMY_P2WPKH_SCRIPT)] - tx3b_hex = tx3b.serialize().hex() - - tx3c = CTransaction() - tx3c.vin = [CTxIn(COutPoint(tx2a_txid, 0), nSequence=0)] - tx3c.vout = [CTxOut(int(0.5 * COIN), DUMMY_P2WPKH_SCRIPT)] - tx3c_hex = tx3c.serialize().hex() + self.wallet.send_self_transfer( + from_node=self.nodes[0], + utxo_to_spend=tx1a_utxo, + sequence=0, + fee=Decimal("0.4"), + ) - self.nodes[0].sendrawtransaction(tx3b_hex, 0) # If tx3b was accepted, tx3c won't look like a replacement, # but make sure it is accepted anyway - self.nodes[0].sendrawtransaction(tx3c_hex, 0) + self.wallet.send_self_transfer( + from_node=self.nodes[0], + utxo_to_spend=tx2a_utxo, + sequence=0, + fee=Decimal("0.4"), + ) def test_prioritised_transactions(self): # Ensure that fee deltas used via prioritisetransaction are @@ -477,17 +547,20 @@ def test_prioritised_transactions(self): # 1. Check that feeperkb uses modified fees tx0_outpoint = self.make_utxo(self.nodes[0], int(1.1 * COIN)) - tx1a = CTransaction() - tx1a.vin = [CTxIn(tx0_outpoint, nSequence=0)] - tx1a.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)] - tx1a_hex = tx1a.serialize().hex() - tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, 0) + tx1a_txid = self.wallet.send_self_transfer( + from_node=self.nodes[0], + utxo_to_spend=tx0_outpoint, + sequence=0, + fee=Decimal("0.1"), + )["txid"] # Higher fee, but the actual fee per KB is much lower. - tx1b = CTransaction() - tx1b.vin = [CTxIn(tx0_outpoint, nSequence=0)] - tx1b.vout = [CTxOut(int(0.001 * COIN), CScript([b'a' * 740000]))] - tx1b_hex = tx1b.serialize().hex() + tx1b_hex = self.wallet.create_self_transfer_multi( + utxos_to_spend=[tx0_outpoint], + sequence=0, + num_outputs=100, + amount_per_output=int(0.00001 * COIN), + )["hex"] # Verify tx1b cannot replace tx1a. assert_raises_rpc_error(-26, "insufficient fee", self.nodes[0].sendrawtransaction, tx1b_hex, 0) @@ -503,27 +576,29 @@ def test_prioritised_transactions(self): # 2. Check that absolute fee checks use modified fee. tx1_outpoint = self.make_utxo(self.nodes[0], int(1.1 * COIN)) - tx2a = CTransaction() - tx2a.vin = [CTxIn(tx1_outpoint, nSequence=0)] - tx2a.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)] - tx2a_hex = tx2a.serialize().hex() - self.nodes[0].sendrawtransaction(tx2a_hex, 0) + # tx2a + self.wallet.send_self_transfer( + from_node=self.nodes[0], + utxo_to_spend=tx1_outpoint, + sequence=0, + fee=Decimal("0.1"), + ) # Lower fee, but we'll prioritise it - tx2b = CTransaction() - tx2b.vin = [CTxIn(tx1_outpoint, nSequence=0)] - tx2b.vout = [CTxOut(int(1.01 * COIN), DUMMY_P2WPKH_SCRIPT)] - tx2b.rehash() - tx2b_hex = tx2b.serialize().hex() + tx2b = self.wallet.create_self_transfer( + utxo_to_spend=tx1_outpoint, + sequence=0, + fee=Decimal("0.09"), + ) # Verify tx2b cannot replace tx2a. - assert_raises_rpc_error(-26, "insufficient fee", self.nodes[0].sendrawtransaction, tx2b_hex, 0) + assert_raises_rpc_error(-26, "insufficient fee", self.nodes[0].sendrawtransaction, tx2b["hex"], 0) # Now prioritise tx2b to have a higher modified fee - self.nodes[0].prioritisetransaction(txid=tx2b.hash, fee_delta=int(0.1 * COIN)) + self.nodes[0].prioritisetransaction(txid=tx2b["txid"], fee_delta=int(0.1 * COIN)) # tx2b should now be accepted - tx2b_txid = self.nodes[0].sendrawtransaction(tx2b_hex, 0) + tx2b_txid = self.nodes[0].sendrawtransaction(tx2b["hex"], 0) assert tx2b_txid in self.nodes[0].getrawmempool() @@ -538,7 +613,7 @@ def test_rpc(self): assert_equal(json0["vin"][0]["sequence"], 4294967293) assert_equal(json1["vin"][0]["sequence"], 4294967295) - if self.is_wallet_compiled(): + if self.is_specified_wallet_compiled(): self.init_wallet(node=0) rawtx2 = self.nodes[0].createrawtransaction([], outs) frawtx2a = self.nodes[0].fundrawtransaction(rawtx2, {"replaceable": True}) @@ -562,7 +637,6 @@ def test_no_inherited_signaling(self): assert_equal(True, self.nodes[0].getmempoolentry(optin_parent_tx['txid'])['bip125-replaceable']) replacement_parent_tx = self.wallet.create_self_transfer( - from_node=self.nodes[0], utxo_to_spend=confirmed_utxo, sequence=BIP125_SEQUENCE_NUMBER, fee_rate=Decimal('0.02'), @@ -579,7 +653,7 @@ def test_no_inherited_signaling(self): optout_child_tx = self.wallet.send_self_transfer( from_node=self.nodes[0], utxo_to_spend=parent_utxo, - sequence=0xffffffff, + sequence=SEQUENCE_FINAL, fee_rate=Decimal('0.01'), ) @@ -587,11 +661,9 @@ def test_no_inherited_signaling(self): assert_equal(True, self.nodes[0].getmempoolentry(optout_child_tx['txid'])['bip125-replaceable']) replacement_child_tx = self.wallet.create_self_transfer( - from_node=self.nodes[0], utxo_to_spend=parent_utxo, - sequence=0xffffffff, + sequence=SEQUENCE_FINAL, fee_rate=Decimal('0.02'), - mempool_valid=False, ) # Broadcast replacement child tx @@ -608,7 +680,7 @@ def test_no_inherited_signaling(self): replacement_parent_tx = self.wallet.send_self_transfer( from_node=self.nodes[0], utxo_to_spend=confirmed_utxo, - sequence=0xffffffff, + sequence=SEQUENCE_FINAL, fee_rate=Decimal('0.03'), ) # Check that child is removed and update wallet utxo state @@ -620,6 +692,7 @@ def test_replacement_relay_fee(self): # Higher fee, higher feerate, different txid, but the replacement does not provide a relay # fee conforming to node's `incrementalrelayfee` policy of 1000 sat per KB. + assert_equal(self.nodes[0].getmempoolinfo()["minrelaytxfee"], Decimal("0.00001")) tx.vout[0].nValue -= 1 assert_raises_rpc_error(-26, "insufficient fee", self.nodes[0].sendrawtransaction, tx.serialize().hex()) diff --git a/test/functional/mempool_accept.py b/test/functional/mempool_accept.py index cd3c1f78c2..2d6ba6cbad 100755 --- a/test/functional/mempool_accept.py +++ b/test/functional/mempool_accept.py @@ -4,6 +4,7 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test mempool acceptance of raw transactions.""" +from copy import deepcopy from decimal import Decimal import math from test_framework.key import ECKey @@ -16,6 +17,7 @@ CTxOut, MAX_BLOCK_WEIGHT, MAX_MONEY, + SEQUENCE_FINAL, tx_from_hex, ) from test_framework.script import ( @@ -32,6 +34,7 @@ assert_equal, assert_raises_rpc_error, ) +from test_framework.wallet import MiniWallet class MempoolAcceptanceTest(BGLTestFramework): @@ -55,12 +58,13 @@ def check_mempool_result(self, result_expected, *args, **kwargs): def run_test(self): node = self.nodes[0] + self.wallet = MiniWallet(node) + self.wallet.rescan_utxos() self.log.info('Start with empty mempool, and 200 blocks') self.mempool_size = 0 assert_equal(node.getblockcount(), 200) assert_equal(node.getmempoolinfo()['size'], self.mempool_size) - coins = node.listunspent() self.log.info('Should not accept garbage to testmempoolaccept') assert_raises_rpc_error(-3, 'Expected type array, got string', lambda: node.testmempoolaccept(rawtxs='ff00baar')) @@ -69,12 +73,12 @@ def run_test(self): assert_raises_rpc_error(-22, 'TX decode failed', lambda: node.testmempoolaccept(rawtxs=['ff00baar'])) self.log.info('A transaction already in the blockchain') - coin = coins.pop() # Pick a random coin(base) to spend - raw_tx_in_block = node.signrawtransactionwithwallet(node.createrawtransaction( - inputs=[{'txid': coin['txid'], 'vout': coin['vout']}], - outputs=[{node.getnewaddress(): 0.3}, {node.getnewaddress(): 49}], - ))['hex'] - txid_in_block = node.sendrawtransaction(hexstring=raw_tx_in_block, maxfeerate=0) + tx = self.wallet.create_self_transfer()['tx'] # Pick a random coin(base) to spend + tx.vout.append(deepcopy(tx.vout[0])) + tx.vout[0].nValue = int(0.3 * COIN) + tx.vout[1].nValue = int(49 * COIN) + raw_tx_in_block = tx.serialize().hex() + txid_in_block = self.wallet.sendrawtransaction(from_node=node, tx_hex=raw_tx_in_block) self.generate(node, 1) self.mempool_size = 0 self.check_mempool_result( @@ -84,11 +88,10 @@ def run_test(self): self.log.info('A transaction not in the mempool') fee = Decimal('0.000007') - raw_tx_0 = node.signrawtransactionwithwallet(node.createrawtransaction( - inputs=[{"txid": txid_in_block, "vout": 0, "sequence": BIP125_SEQUENCE_NUMBER}], # RBF is used later - outputs=[{node.getnewaddress(): Decimal('0.3') - fee}], - ))['hex'] - tx = tx_from_hex(raw_tx_0) + utxo_to_spend = self.wallet.get_utxo(txid=txid_in_block) # use 0.3 BGL UTXO + tx = self.wallet.create_self_transfer(utxo_to_spend=utxo_to_spend, sequence=BIP125_SEQUENCE_NUMBER)['tx'] + tx.vout[0].nValue = int((Decimal('0.3') - fee) * COIN) + raw_tx_0 = tx.serialize().hex() txid_0 = tx.rehash() self.check_mempool_result( result_expected=[{'txid': txid_0, 'allowed': True, 'vsize': tx.get_vsize(), 'fees': {'base': fee}}], @@ -96,15 +99,15 @@ def run_test(self): ) self.log.info('A final transaction not in the mempool') - coin = coins.pop() # Pick a random coin(base) to spend output_amount = Decimal('0.025') - raw_tx_final = node.signrawtransactionwithwallet(node.createrawtransaction( - inputs=[{'txid': coin['txid'], 'vout': coin['vout'], "sequence": 0xffffffff}], # SEQUENCE_FINAL - outputs=[{node.getnewaddress(): output_amount}], + tx = self.wallet.create_self_transfer( + sequence=SEQUENCE_FINAL, locktime=node.getblockcount() + 2000, # Can be anything - ))['hex'] + )['tx'] + tx.vout[0].nValue = int(output_amount * COIN) + raw_tx_final = tx.serialize().hex() tx = tx_from_hex(raw_tx_final) - fee_expected = coin['amount'] - output_amount + fee_expected = Decimal('200.0') - output_amount self.check_mempool_result( result_expected=[{'txid': tx.rehash(), 'allowed': True, 'vsize': tx.get_vsize(), 'fees': {'base': fee_expected}}], rawtxs=[tx.serialize().hex()], @@ -125,8 +128,7 @@ def run_test(self): tx = tx_from_hex(raw_tx_0) tx.vout[0].nValue -= int(fee * COIN) # Double the fee tx.vin[0].nSequence = BIP125_SEQUENCE_NUMBER + 1 # Now, opt out of RBF - raw_tx_0 = node.signrawtransactionwithwallet(tx.serialize().hex())['hex'] - tx = tx_from_hex(raw_tx_0) + raw_tx_0 = tx.serialize().hex() txid_0 = tx.rehash() self.check_mempool_result( result_expected=[{'txid': txid_0, 'allowed': True, 'vsize': tx.get_vsize(), 'fees': {'base': (2 * fee)}}], @@ -139,7 +141,6 @@ def run_test(self): # take original raw_tx_0 tx = tx_from_hex(raw_tx_0) tx.vout[0].nValue -= int(4 * fee * COIN) # Set more fee - # skip re-signing the tx self.check_mempool_result( result_expected=[{'txid': tx.rehash(), 'allowed': False, 'reject-reason': 'txn-mempool-conflict'}], rawtxs=[tx.serialize().hex()], @@ -149,7 +150,6 @@ def run_test(self): self.log.info('A transaction with missing inputs, that never existed') tx = tx_from_hex(raw_tx_0) tx.vin[0].prevout = COutPoint(hash=int('ff' * 32, 16), n=14) - # skip re-signing the tx self.check_mempool_result( result_expected=[{'txid': tx.rehash(), 'allowed': False, 'reject-reason': 'missing-inputs'}], rawtxs=[tx.serialize().hex()], @@ -158,17 +158,17 @@ def run_test(self): self.log.info('A transaction with missing inputs, that existed once in the past') tx = tx_from_hex(raw_tx_0) tx.vin[0].prevout.n = 1 # Set vout to 1, to spend the other outpoint (49 coins) of the in-chain-tx we want to double spend - raw_tx_1 = node.signrawtransactionwithwallet(tx.serialize().hex())['hex'] + raw_tx_1 = tx.serialize().hex() txid_1 = node.sendrawtransaction(hexstring=raw_tx_1, maxfeerate=0) # Now spend both to "clearly hide" the outputs, ie. remove the coins from the utxo set by spending them - raw_tx_spend_both = node.signrawtransactionwithwallet(node.createrawtransaction( - inputs=[ - {'txid': txid_0, 'vout': 0}, - {'txid': txid_1, 'vout': 0}, - ], - outputs=[{node.getnewaddress(): 0.1}] - ))['hex'] - txid_spend_both = node.sendrawtransaction(hexstring=raw_tx_spend_both, maxfeerate=0) + tx = self.wallet.create_self_transfer()['tx'] + tx.vin.append(deepcopy(tx.vin[0])) + tx.wit.vtxinwit.append(deepcopy(tx.wit.vtxinwit[0])) + tx.vin[0].prevout = COutPoint(hash=int(txid_0, 16), n=0) + tx.vin[1].prevout = COutPoint(hash=int(txid_1, 16), n=0) + tx.vout[0].nValue = int(0.1 * COIN) + raw_tx_spend_both = tx.serialize().hex() + txid_spend_both = self.wallet.sendrawtransaction(from_node=node, tx_hex=raw_tx_spend_both) self.generate(node, 1) self.mempool_size = 0 # Now see if we can add the coins back to the utxo set by sending the exact txs again @@ -181,12 +181,11 @@ def run_test(self): rawtxs=[raw_tx_1], ) - self.log.info('Create a signed "reference" tx for later use') - raw_tx_reference = node.signrawtransactionwithwallet(node.createrawtransaction( - inputs=[{'txid': txid_spend_both, 'vout': 0}], - outputs=[{node.getnewaddress(): 0.05}], - ))['hex'] - tx = tx_from_hex(raw_tx_reference) + self.log.info('Create a "reference" tx for later use') + utxo_to_spend = self.wallet.get_utxo(txid=txid_spend_both) + tx = self.wallet.create_self_transfer(utxo_to_spend=utxo_to_spend, sequence=SEQUENCE_FINAL)['tx'] + tx.vout[0].nValue = int(0.05 * COIN) + raw_tx_reference = tx.serialize().hex() # Reference tx should be valid on itself self.check_mempool_result( result_expected=[{'txid': tx.rehash(), 'allowed': True, 'vsize': tx.get_vsize(), 'fees': { 'base': Decimal('0.1') - Decimal('0.05')}}], @@ -197,8 +196,6 @@ def run_test(self): self.log.info('A transaction with no outputs') tx = tx_from_hex(raw_tx_reference) tx.vout = [] - # Skip re-signing the transaction for context independent checks from now on - # tx = tx_from_hex(node.signrawtransactionwithwallet(tx.serialize().hex())['hex']) self.check_mempool_result( result_expected=[{'txid': tx.rehash(), 'allowed': False, 'reject-reason': 'bad-txns-vout-empty'}], rawtxs=[tx.serialize().hex()], @@ -255,7 +252,7 @@ def run_test(self): ) self.log.info('A coinbase transaction') - # Pick the input of the first tx we signed, so it has to be a coinbase tx + # Pick the input of the first tx we created, so it has to be a coinbase tx raw_tx_coinbase_spent = node.getrawtransaction(txid=node.decoderawtransaction(hexstring=raw_tx_in_block)['vin'][0]['txid']) tx = tx_from_hex(raw_tx_coinbase_spent) self.check_mempool_result( diff --git a/test/functional/mempool_limit.py b/test/functional/mempool_limit.py index 5eb0e16967..95b59a5534 100755 --- a/test/functional/mempool_limit.py +++ b/test/functional/mempool_limit.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# Copyright (c) 2014-2019 The Bitcoin Core developers +# Copyright (c) 2014-2021 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test mempool limiting together/eviction with the wallet.""" @@ -8,7 +8,13 @@ from test_framework.blocktools import COINBASE_MATURITY from test_framework.test_framework import BGLTestFramework -from test_framework.util import assert_equal, assert_greater_than, assert_raises_rpc_error, gen_return_txouts +from test_framework.util import ( + assert_equal, + assert_greater_than, + assert_raises_rpc_error, + create_lots_of_big_transactions, + gen_return_txouts, +) from test_framework.wallet import MiniWallet @@ -17,22 +23,15 @@ def set_test_params(self): self.setup_clean_chain = True self.num_nodes = 1 self.extra_args = [[ - "-acceptnonstdtxn=1", + "-datacarriersize=100000", "-maxmempool=5", "-spendzeroconfchange=0", ]] self.supports_cli = False - def send_large_txs(self, node, miniwallet, txouts, fee_rate, tx_batch_size): - for _ in range(tx_batch_size): - tx = miniwallet.create_self_transfer(from_node=node, fee_rate=fee_rate)['tx'] - for txout in txouts: - tx.vout.append(txout) - miniwallet.sendrawtransaction(from_node=node, tx_hex=tx.serialize().hex()) - def run_test(self): txouts = gen_return_txouts() - node=self.nodes[0] + node = self.nodes[0] miniwallet = MiniWallet(node) relayfee = node.getnetworkinfo()['relayfee'] @@ -40,7 +39,7 @@ def run_test(self): assert_equal(node.getmempoolinfo()['minrelaytxfee'], Decimal('0.00001000')) assert_equal(node.getmempoolinfo()['mempoolminfee'], Decimal('0.00001000')) - tx_batch_size = 25 + tx_batch_size = 250 num_of_batches = 3 # Generate UTXOs to flood the mempool # 1 to create a tx initially that will be evicted from the mempool later @@ -52,15 +51,16 @@ def run_test(self): self.generate(node, COINBASE_MATURITY - 1) self.log.info('Create a mempool tx that will be evicted') - tx_to_be_evicted_id = miniwallet.send_self_transfer(from_node=node, fee_rate=relayfee)["txid"] - - # Increase the tx fee rate massively to give the subsequent transactions a higher priority in the mempool - base_fee = relayfee * 1000 + tx_to_be_evicted_id =miniwallet.send_self_transfer(from_node=node, fee_rate=relayfee)["txid"] + # Increase the tx fee rate to give the subsequent transactions a higher priority in the mempool + # The tx has an approx. vsize of 65k, i.e. multiplying the previous fee rate (in sats/kvB) + # by 130 should result in a fee that corresponds to 2x of that fee rate + base_fee = relayfee * 130 self.log.info("Fill up the mempool with txs with higher fee rate") for batch_of_txid in range(num_of_batches): - fee_rate=(batch_of_txid + 1) * base_fee - self.send_large_txs(node, miniwallet, txouts, fee_rate, tx_batch_size) + fee = (batch_of_txid + 1) * base_fee + create_lots_of_big_transactions(miniwallet, node, fee, tx_batch_size, txouts) self.log.info('The tx should be evicted by now') # The number of transactions created should be greater than the ones present in the mempool @@ -74,7 +74,11 @@ def run_test(self): # Deliberately try to create a tx with a fee less than the minimum mempool fee to assert that it does not get added to the mempool self.log.info('Create a mempool tx that will not pass mempoolminfee') - assert_raises_rpc_error(-26, "mempool min fee not met", miniwallet.send_self_transfer, from_node=node, fee_rate=relayfee, mempool_valid=False) + assert_raises_rpc_error(-26, "mempool min fee not met", miniwallet.send_self_transfer, from_node=node, fee_rate=relayfee) + + self.log.info('Test passing a value below the minimum (5 MB) to -maxmempool throws an error') + self.stop_node(0) + self.nodes[0].assert_start_raises_init_error(["-maxmempool=4"], "Error: -maxmempool must be at least 5 MB") if __name__ == '__main__': diff --git a/test/functional/mempool_reorg.py b/test/functional/mempool_reorg.py index 88437b041c..1965d4a1a2 100755 --- a/test/functional/mempool_reorg.py +++ b/test/functional/mempool_reorg.py @@ -45,17 +45,15 @@ def run_test(self): utxo_2 = wallet.get_utxo(txid=coinbase_txids[2]) utxo_3 = wallet.get_utxo(txid=coinbase_txids[3]) self.log.info("Create three transactions spending from coinbase utxos: spend_1, spend_2, spend_3") - spend_1 = wallet.create_self_transfer(from_node=self.nodes[0], utxo_to_spend=utxo_1) - spend_2 = wallet.create_self_transfer(from_node=self.nodes[0], utxo_to_spend=utxo_2) - spend_3 = wallet.create_self_transfer(from_node=self.nodes[0], utxo_to_spend=utxo_3) + spend_1 = wallet.create_self_transfer(utxo_to_spend=utxo_1) + spend_2 = wallet.create_self_transfer(utxo_to_spend=utxo_2) + spend_3 = wallet.create_self_transfer(utxo_to_spend=utxo_3) self.log.info("Create another transaction which is time-locked to two blocks in the future") utxo = wallet.get_utxo(txid=coinbase_txids[0]) timelock_tx = wallet.create_self_transfer( - from_node=self.nodes[0], utxo_to_spend=utxo, - mempool_valid=False, - locktime=self.nodes[0].getblockcount() + 2 + locktime=self.nodes[0].getblockcount() + 2, )['hex'] self.log.info("Check that the time-locked transaction is too immature to spend") @@ -70,10 +68,8 @@ def run_test(self): assert_raises_rpc_error(-26, 'non-final', self.nodes[0].sendrawtransaction, timelock_tx) self.log.info("Create spend_2_1 and spend_3_1") - spend_2_utxo = wallet.get_utxo(txid=spend_2['txid']) - spend_2_1 = wallet.create_self_transfer(from_node=self.nodes[0], utxo_to_spend=spend_2_utxo) - spend_3_utxo = wallet.get_utxo(txid=spend_3['txid']) - spend_3_1 = wallet.create_self_transfer(from_node=self.nodes[0], utxo_to_spend=spend_3_utxo) + spend_2_1 = wallet.create_self_transfer(utxo_to_spend=spend_2["new_utxo"]) + spend_3_1 = wallet.create_self_transfer(utxo_to_spend=spend_3["new_utxo"]) self.log.info("Broadcast and mine spend_3_1") spend_3_1_id = self.nodes[0].sendrawtransaction(spend_3_1['hex']) diff --git a/test/functional/mempool_spend_coinbase.py b/test/functional/mempool_spend_coinbase.py index f79afc6387..0a1cd25a78 100755 --- a/test/functional/mempool_spend_coinbase.py +++ b/test/functional/mempool_spend_coinbase.py @@ -37,23 +37,24 @@ def run_test(self): utxo_mature = wallet.get_utxo(txid=coinbase_txid(chain_height - 100 + 1)) utxo_immature = wallet.get_utxo(txid=coinbase_txid(chain_height - 100 + 2)) - spend_101_id = wallet.send_self_transfer(from_node=self.nodes[0], utxo_to_spend=utxo_101)["txid"] + spend_mature_id = wallet.send_self_transfer(from_node=self.nodes[0], utxo_to_spend=utxo_mature)["txid"] - # coinbase at height 102 should be too immature to spend + # other coinbase should be too immature to spend + immature_tx = wallet.create_self_transfer(utxo_to_spend=utxo_immature) assert_raises_rpc_error(-26, "bad-txns-premature-spend-of-coinbase", - lambda: wallet.send_self_transfer(from_node=self.nodes[0], utxo_to_spend=utxo_102)) + lambda: self.nodes[0].sendrawtransaction(immature_tx['hex'])) - # mempool should have just spend_101: - assert_equal(self.nodes[0].getrawmempool(), [spend_101_id]) + # mempool should have just the mature one + assert_equal(self.nodes[0].getrawmempool(), [spend_mature_id]) # mine a block, mature one should get confirmed self.generate(self.nodes[0], 1) assert_equal(set(self.nodes[0].getrawmempool()), set()) - # ... and now height 102 can be spent: - spend_102_id = wallet.send_self_transfer(from_node=self.nodes[0], utxo_to_spend=utxo_102)["txid"] - assert_equal(self.nodes[0].getrawmempool(), [spend_102_id]) + # ... and now previously immature can be spent: + spend_new_id = self.nodes[0].sendrawtransaction(immature_tx['hex']) + assert_equal(self.nodes[0].getrawmempool(), [spend_new_id]) if __name__ == '__main__': diff --git a/test/functional/mempool_unbroadcast.py b/test/functional/mempool_unbroadcast.py index b8200dfa24..d789b15259 100755 --- a/test/functional/mempool_unbroadcast.py +++ b/test/functional/mempool_unbroadcast.py @@ -9,10 +9,8 @@ from test_framework.p2p import P2PTxInvStore from test_framework.test_framework import BGLTestFramework -from test_framework.util import ( - assert_equal, - create_confirmed_utxos, -) +from test_framework.util import assert_equal +from test_framework.wallet import MiniWallet MAX_INITIAL_BROADCAST_DELAY = 15 * 60 # 15 minutes in seconds @@ -24,6 +22,8 @@ def skip_test_if_missing_module(self): self.skip_if_no_wallet() def run_test(self): + self.wallet = MiniWallet(self.nodes[0]) + self.wallet.rescan_utxos() self.test_broadcast() self.test_txn_removal() @@ -31,9 +31,6 @@ def test_broadcast(self): self.log.info("Test that mempool reattempts delivery of locally submitted transaction") node = self.nodes[0] - min_relay_fee = node.getnetworkinfo()["relayfee"] - utxos = create_confirmed_utxos(self, min_relay_fee, node, 10) - self.disconnect_nodes(0, 1) self.log.info("Generate transactions that only node 0 knows about") @@ -43,13 +40,7 @@ def test_broadcast(self): wallet_tx_hsh = node.sendtoaddress(addr, 0.0001) # generate a txn using sendrawtransaction - us0 = utxos.pop() - inputs = [{"txid": us0["txid"], "vout": us0["vout"]}] - outputs = {addr: 0.0001} - tx = node.createrawtransaction(inputs, outputs) - node.settxfee(min_relay_fee) - txF = node.fundrawtransaction(tx) - txFS = node.signrawtransactionwithwallet(txF["hex"]) + txFS = self.wallet.create_self_transfer() rpc_tx_hsh = node.sendrawtransaction(txFS["hex"]) # check transactions are in unbroadcast using rpc diff --git a/test/functional/mining_prioritisetransaction.py b/test/functional/mining_prioritisetransaction.py index 3280ef2a17..97ec8303ee 100755 --- a/test/functional/mining_prioritisetransaction.py +++ b/test/functional/mining_prioritisetransaction.py @@ -1,22 +1,30 @@ #!/usr/bin/env python3 -# Copyright (c) 2015-2019 The Bitcoin Core developers +# Copyright (c) 2015-2021 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test the prioritisetransaction mining RPC.""" import time -from test_framework.messages import COIN, MAX_BLOCK_WEIGHT +from test_framework.messages import ( + COIN, + MAX_BLOCK_WEIGHT, +) from test_framework.test_framework import BGLTestFramework -from test_framework.util import assert_equal, assert_raises_rpc_error, create_confirmed_utxos, create_lots_of_big_transactions, gen_return_txouts +from test_framework.util import ( + assert_equal, + assert_raises_rpc_error, + create_lots_of_big_transactions, + gen_return_txouts, +) +from test_framework.wallet import MiniWallet class PrioritiseTransactionTest(BGLTestFramework): def set_test_params(self): - self.setup_clean_chain = True self.num_nodes = 1 self.extra_args = [[ "-printpriority=1", - "-acceptnonstdtxn=1", + "-datacarriersize=100000", ]] * self.num_nodes self.supports_cli = False @@ -24,6 +32,8 @@ def skip_test_if_missing_module(self): self.skip_if_no_wallet() def run_test(self): + self.wallet = MiniWallet(self.nodes[0]) + self.wallet.rescan_utxos() # Test `prioritisetransaction` required parameters assert_raises_rpc_error(-1, "prioritisetransaction", self.nodes[0].prioritisetransaction) assert_raises_rpc_error(-1, "prioritisetransaction", self.nodes[0].prioritisetransaction, '') @@ -48,7 +58,10 @@ def run_test(self): self.relayfee = self.nodes[0].getnetworkinfo()['relayfee'] utxo_count = 90 - utxos = create_confirmed_utxos(self, self.relayfee, self.nodes[0], utxo_count) + utxos = self.wallet.send_self_transfer_multi(from_node=self.nodes[0], num_outputs=utxo_count)['new_utxos'] + self.generate(self.wallet, 1) + assert_equal(len(self.nodes[0].getrawmempool()), 0) + base_fee = self.relayfee*100 # our transactions are smaller than 100kb txids = [] @@ -58,7 +71,13 @@ def run_test(self): txids.append([]) start_range = i * range_size end_range = start_range + range_size - txids[i] = create_lots_of_big_transactions(self.nodes[0], self.txouts, utxos[start_range:end_range], end_range - start_range, (i+1)*base_fee) + txids[i] = create_lots_of_big_transactions( + self.wallet, + self.nodes[0], + (i+1) * base_fee, + end_range - start_range, + self.txouts, + utxos[start_range:end_range]) # Make sure that the size of each group of transactions exceeds # MAX_BLOCK_WEIGHT // 4 -- otherwise the test needs to be revised to @@ -117,17 +136,9 @@ def run_test(self): assert x not in mempool # Create a free transaction. Should be rejected. - utxo_list = self.nodes[0].listunspent() - assert len(utxo_list) > 0 - utxo = utxo_list[0] - - inputs = [] - outputs = {} - inputs.append({"txid" : utxo["txid"], "vout" : utxo["vout"]}) - outputs[self.nodes[0].getnewaddress()] = utxo["amount"] - raw_tx = self.nodes[0].createrawtransaction(inputs, outputs) - tx_hex = self.nodes[0].signrawtransactionwithwallet(raw_tx)["hex"] - tx_id = self.nodes[0].decoderawtransaction(tx_hex)["txid"] + tx_res = self.wallet.create_self_transfer(fee_rate=0) + tx_hex = tx_res['hex'] + tx_id = tx_res['txid'] # This will raise an exception due to min relay fee not being met assert_raises_rpc_error(-26, "min relay fee not met", self.nodes[0].sendrawtransaction, tx_hex) diff --git a/test/functional/p2p_add_connections.py b/test/functional/p2p_add_connections.py index a212e620c1..2c3b12dfba 100755 --- a/test/functional/p2p_add_connections.py +++ b/test/functional/p2p_add_connections.py @@ -6,13 +6,7 @@ from test_framework.p2p import P2PInterface from test_framework.test_framework import BGLTestFramework -from test_framework.util import assert_equal - - -def check_node_connections(*, node, num_in, num_out): - info = node.getnetworkinfo() - assert_equal(info["connections_in"], num_in) - assert_equal(info["connections_out"], num_out) +from test_framework.util import check_node_connections class P2PAddConnections(BGLTestFramework): diff --git a/test/functional/p2p_blocksonly.py b/test/functional/p2p_blocksonly.py index 2a84ff403a..6369cdaba8 100755 --- a/test/functional/p2p_blocksonly.py +++ b/test/functional/p2p_blocksonly.py @@ -102,7 +102,7 @@ def blocks_relay_conn_tests(self): def check_p2p_tx_violation(self): self.log.info('Check that txs from P2P are rejected and result in disconnect') - spendtx = self.miniwallet.create_self_transfer(from_node=self.nodes[0]) + spendtx = self.miniwallet.create_self_transfer() with self.nodes[0].assert_debug_log(['transaction sent in violation of protocol peer=0']): self.nodes[0].p2ps[0].send_message(msg_tx(spendtx['tx'])) diff --git a/test/functional/p2p_segwit.py b/test/functional/p2p_segwit.py index 6fa915f9f1..a0369f388c 100755 --- a/test/functional/p2p_segwit.py +++ b/test/functional/p2p_segwit.py @@ -85,6 +85,7 @@ softfork_active, assert_raises_rpc_error, ) +from test_framework.wallet import MiniWallet MAX_SIGOP_COST = 80000 @@ -246,6 +247,7 @@ def run_test(self): self.log.info("Starting tests before segwit activation") self.segwit_active = False + self.wallet = MiniWallet(self.nodes[0]) self.test_non_witness_transaction() self.test_v0_outputs_arent_spendable() @@ -309,7 +311,7 @@ def test_non_witness_transaction(self): self.test_node.send_and_ping(msg_no_witness_block(block)) # make sure the block was processed txid = block.vtx[0].sha256 - self.generate(self.nodes[0], 99) # let the block mature + self.generate(self.wallet, 99) # let the block mature # Create a transaction that spends the coinbase tx = CTransaction() @@ -1999,22 +2001,16 @@ class msg_bogus_tx(msg_tx): def serialize(self): return serialize_with_bogus_witness(self.tx) - self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(address_type='bech32'), 5) - self.generate(self.nodes[0], 1) - unspent = next(u for u in self.nodes[0].listunspent() if u['spendable'] and u['address'].startswith('rbgl')) - - raw = self.nodes[0].createrawtransaction([{"txid": unspent['txid'], "vout": unspent['vout']}], {self.nodes[0].getnewaddress(): 1}) - tx = tx_from_hex(raw) - assert_raises_rpc_error(-22, "TX decode failed", self.nodes[0].decoderawtransaction, hexstring=serialize_with_bogus_witness(tx).hex(), iswitness=True) - with self.nodes[0].assert_debug_log(['Superfluous witness record']): - self.test_node.send_and_ping(msg_bogus_tx(tx)) - raw = self.nodes[0].signrawtransactionwithwallet(raw) - assert raw['complete'] - raw = raw['hex'] - tx = tx_from_hex(raw) - assert_raises_rpc_error(-22, "TX decode failed", self.nodes[0].decoderawtransaction, hexstring=serialize_with_bogus_witness(tx).hex(), iswitness=True) + tx = self.wallet.create_self_transfer()['tx'] + assert_raises_rpc_error(-22, "TX decode failed", self.nodes[0].decoderawtransaction, + hexstring=serialize_with_bogus_witness(tx).hex(), iswitness=True) with self.nodes[0].assert_debug_log(['Unknown transaction optional data']): self.test_node.send_and_ping(msg_bogus_tx(tx)) + tx.wit.vtxinwit = [] # drop witness + assert_raises_rpc_error(-22, "TX decode failed", self.nodes[0].decoderawtransaction, + hexstring=serialize_with_bogus_witness(tx).hex(), iswitness=True) + with self.nodes[0].assert_debug_log(['Superfluous witness record']): + self.test_node.send_and_ping(msg_bogus_tx(tx)) @subtest # type: ignore def test_wtxid_relay(self): diff --git a/test/functional/rpc_createmultisig.py b/test/functional/rpc_createmultisig.py index a31279bda0..c60830b69b 100755 --- a/test/functional/rpc_createmultisig.py +++ b/test/functional/rpc_createmultisig.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# Copyright (c) 2015-2020 The Bitcoin Core developers +# Copyright (c) 2015-2021 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test multisig RPCs""" @@ -18,15 +18,18 @@ assert_equal, ) from test_framework.wallet_util import bytes_to_wif +from test_framework.wallet import ( + MiniWallet, + getnewdestination, +) class RpcCreateMultiSigTest(BGLTestFramework): def set_test_params(self): self.setup_clean_chain = True self.num_nodes = 3 self.supports_cli = False - - def skip_test_if_missing_module(self): - self.skip_if_no_wallet() + if self.is_bdb_compiled(): + self.requires_wallet = True def get_keys(self): self.pub = [] @@ -37,16 +40,20 @@ def get_keys(self): k.generate() self.pub.append(k.get_pubkey().get_bytes().hex()) self.priv.append(bytes_to_wif(k.get_bytes(), k.is_compressed)) - self.final = node2.getnewaddress() + if self.is_bdb_compiled(): + self.final = node2.getnewaddress() + else: + self.final = getnewdestination('bech32')[2] def run_test(self): node0, node1, node2 = self.nodes + self.wallet = MiniWallet(test_node=node0) - self.check_addmultisigaddress_errors() + if self.is_bdb_compiled(): + self.check_addmultisigaddress_errors() self.log.info('Generating blocks ...') - self.generate(node0, 149) - self.sync_all() + self.generate(self.wallet, 149) self.moved = 0 for self.nkeys in [3, 5]: @@ -54,14 +61,12 @@ def run_test(self): for self.output_type in ["bech32", "p2sh-segwit", "legacy"]: self.get_keys() self.do_multisig() - - self.checkbalances() + if self.is_bdb_compiled(): + self.checkbalances() # Test mixed compressed and uncompressed pubkeys self.log.info('Mixed compressed and uncompressed multisigs are not allowed') - pk0 = node0.getaddressinfo(node0.getnewaddress())['pubkey'] - pk1 = node1.getaddressinfo(node1.getnewaddress())['pubkey'] - pk2 = node2.getaddressinfo(node2.getnewaddress())['pubkey'] + pk0, pk1, pk2 = [getnewdestination('bech32')[0].hex() for _ in range(3)] # decompress pk2 pk_obj = ECPubKey() @@ -69,8 +74,9 @@ def run_test(self): pk_obj.compressed = False pk2 = pk_obj.get_bytes().hex() - node0.createwallet(wallet_name='wmulti0', disable_private_keys=True) - wmulti0 = node0.get_wallet_rpc('wmulti0') + if self.is_bdb_compiled(): + node0.createwallet(wallet_name='wmulti0', disable_private_keys=True) + wmulti0 = node0.get_wallet_rpc('wmulti0') # Check all permutations of keys because order matters apparently for keys in itertools.permutations([pk0, pk1, pk2]): @@ -117,31 +123,33 @@ def check_addmultisigaddress_errors(self): def checkbalances(self): node0, node1, node2 = self.nodes self.generate(node0, COINBASE_MATURITY) - self.sync_all() bal0 = node0.getbalance() bal1 = node1.getbalance() bal2 = node2.getbalance() + balw = self.wallet.get_balance() height = node0.getblockchaininfo()["blocks"] assert 150 < height < 350 - total = 149 * 200 + (height - 149 - 100) * 100 - decimal.Decimal("0.00037504") + total = 149 * 200 + (height - 149 - 100) * 100 - decimal.Decimal("0.000216") assert bal1 == 0 assert bal2 == self.moved - assert bal0 + bal1 + bal2 == total + assert_equal(bal0 + bal1 + bal2 + balw, total) def do_multisig(self): node0, node1, node2 = self.nodes - if 'wmulti' not in node1.listwallets(): - try: - node1.loadwallet('wmulti') - except JSONRPCException as e: - path = os.path.join(self.options.tmpdir, "node1", "regtest", "wallets", "wmulti") - if e.error['code'] == -18 and "Wallet file verification failed. Failed to load database path '{}'. Path does not exist.".format(path) in e.error['message']: - node1.createwallet(wallet_name='wmulti', disable_private_keys=True) - else: - raise - wmulti = node1.get_wallet_rpc('wmulti') + + if self.is_bdb_compiled(): + if 'wmulti' not in node1.listwallets(): + try: + node1.loadwallet('wmulti') + except JSONRPCException as e: + path = os.path.join(self.options.tmpdir, "node1", "regtest", "wallets", "wmulti") + if e.error['code'] == -18 and "Wallet file verification failed. Failed to load database path '{}'. Path does not exist.".format(path) in e.error['message']: + node1.createwallet(wallet_name='wmulti', disable_private_keys=True) + else: + raise + wmulti = node1.get_wallet_rpc('wmulti') # Construct the expected descriptor desc = 'multi({},{})'.format(self.nsigs, ','.join(self.pub)) @@ -154,23 +162,26 @@ def do_multisig(self): desc = descsum_create(desc) msig = node2.createmultisig(self.nsigs, self.pub, self.output_type) + assert 'warnings' not in msig madd = msig["address"] mredeem = msig["redeemScript"] assert_equal(desc, msig['descriptor']) if self.output_type == 'bech32': assert madd[0:4] == "rbgl" # actually a bech32 address - # compare against addmultisigaddress - msigw = wmulti.addmultisigaddress(self.nsigs, self.pub, None, self.output_type) - maddw = msigw["address"] - mredeemw = msigw["redeemScript"] - assert_equal(desc, drop_origins(msigw['descriptor'])) - # addmultisigiaddress and createmultisig work the same - assert maddw == madd - assert mredeemw == mredeem - - txid = node0.sendtoaddress(madd, 40) - + if self.is_bdb_compiled(): + # compare against addmultisigaddress + msigw = wmulti.addmultisigaddress(self.nsigs, self.pub, None, self.output_type) + maddw = msigw["address"] + mredeemw = msigw["redeemScript"] + assert_equal(desc, drop_origins(msigw['descriptor'])) + # addmultisigiaddress and createmultisig work the same + assert maddw == madd + assert mredeemw == mredeem + wmulti.unloadwallet() + + spk = bytes.fromhex(node0.validateaddress(madd)["scriptPubKey"]) + txid, _ = self.wallet.send_to(from_node=self.nodes[0], scriptPubKey=spk, amount=1300) tx = node0.getrawtransaction(txid, True) vout = [v["n"] for v in tx["vout"] if madd == v["scriptPubKey"]["address"]] assert len(vout) == 1 @@ -221,8 +232,6 @@ def do_multisig(self): txinfo = node0.getrawtransaction(tx, True, blk) self.log.info("n/m=%d/%d %s size=%d vsize=%d weight=%d" % (self.nsigs, self.nkeys, self.output_type, txinfo["size"], txinfo["vsize"], txinfo["weight"])) - wmulti.unloadwallet() - if __name__ == '__main__': RpcCreateMultiSigTest().main() diff --git a/test/functional/rpc_generateblock.py b/test/functional/rpc_generateblock.py index 7f26384a79..2d0d5ebbf7 100755 --- a/test/functional/rpc_generateblock.py +++ b/test/functional/rpc_generateblock.py @@ -6,6 +6,7 @@ ''' from test_framework.test_framework import BGLTestFramework +from test_framework.wallet import MiniWallet from test_framework.util import ( assert_equal, assert_raises_rpc_error, @@ -21,6 +22,8 @@ def skip_test_if_missing_module(self): def run_test(self): node = self.nodes[0] + miniwallet = MiniWallet(node) + miniwallet.rescan_utxos() self.log.info('Generate an empty block to address') address = node.getnewaddress() @@ -66,22 +69,18 @@ def run_test(self): assert_equal(block['tx'][1], txid) self.log.info('Generate block with raw tx') - utxos = node.listunspent(addresses=[address]) - raw = node.createrawtransaction([{'txid':utxos[0]['txid'], 'vout':utxos[0]['vout']}],[{address:1}]) - signed_raw = node.signrawtransactionwithwallet(raw)['hex'] - hash = self.generateblock(node, address, [signed_raw])['hash'] + rawtx = miniwallet.create_self_transfer() + hash = self.generateblock(node, address, [rawtx['hex']])['hash'] block = node.getblock(hash, 1) assert_equal(len(block['tx']), 2) txid = block['tx'][1] - assert_equal(node.gettransaction(txid)['hex'], signed_raw) + assert_equal(txid, rawtx["txid"]) self.log.info('Fail to generate block with out of order txs') - raw1 = node.createrawtransaction([{'txid':txid, 'vout':0}],[{address:0.9999}]) - signed_raw1 = node.signrawtransactionwithwallet(raw1)['hex'] - txid1 = node.sendrawtransaction(signed_raw1) - raw2 = node.createrawtransaction([{'txid':txid1, 'vout':0}],[{address:0.999}]) - signed_raw2 = node.signrawtransactionwithwallet(raw2)['hex'] - assert_raises_rpc_error(-25, 'TestBlockValidity failed: bad-txns-inputs-missingorspent', self.generateblock, node, address, [signed_raw2, txid1]) + txid1 = miniwallet.send_self_transfer(from_node=node)['txid'] + utxo1 = miniwallet.get_utxo(txid=txid1) + rawtx2 = miniwallet.create_self_transfer(utxo_to_spend=utxo1)['hex'] + assert_raises_rpc_error(-25, 'TestBlockValidity failed: bad-txns-inputs-missingorspent', self.generateblock, node, address, [rawtx2, txid1]) self.log.info('Fail to generate block with txid not in mempool') missing_txid = '0000000000000000000000000000000000000000000000000000000000000000' diff --git a/test/functional/rpc_rawtransaction.py b/test/functional/rpc_rawtransaction.py index 3f0d4cb5dd..feb6515936 100755 --- a/test/functional/rpc_rawtransaction.py +++ b/test/functional/rpc_rawtransaction.py @@ -1,9 +1,8 @@ #!/usr/bin/env python3 -# Copyright (c) 2014-2020 The Bitcoin Core developers +# Copyright (c) 2014-2021 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test the rawtransaction RPCs. - Test the following RPCs: - getrawtransaction - createrawtransaction @@ -17,6 +16,7 @@ from test_framework.blocktools import COINBASE_MATURITY from test_framework.messages import ( + BIP125_SEQUENCE_NUMBER, CTransaction, tx_from_hex, ) @@ -24,7 +24,10 @@ from test_framework.util import ( assert_equal, assert_raises_rpc_error, - find_vout_for_address, +) +from test_framework.wallet import ( + getnewdestination, + MiniWallet, ) @@ -33,12 +36,10 @@ class multidict(dict): """Dictionary that allows duplicate keys. - Constructed with a list of (key, value) tuples. When dumped by the json module, will output invalid json with repeated keys, eg: >>> json.dumps(multidict([(1,2),(1,2)]) '{"1": 2, "1": 2}' - Used to test calls to rpc methods with repeated keys in the json object.""" def __init__(self, x): @@ -52,9 +53,8 @@ def items(self): class RawTransactionsTest(BGLTestFramework): def set_test_params(self): self.setup_clean_chain = True - self.num_nodes = 4 + self.num_nodes = 3 self.extra_args = [ - ["-txindex"], ["-txindex"], ["-txindex"], [], @@ -62,67 +62,62 @@ def set_test_params(self): # whitelist all peers to speed up tx relay / mempool sync for args in self.extra_args: args.append("-whitelist=noban@127.0.0.1") + self.requires_wallet = self.is_specified_wallet_compiled() self.supports_cli = False - def skip_test_if_missing_module(self): - self.skip_if_no_wallet() - def setup_network(self): super().setup_network() self.connect_nodes(0, 2) def run_test(self): + self.wallet = MiniWallet(self.nodes[0]) self.log.info("Prepare some coins for multiple *rawtransaction commands") - self.generate(self.nodes[2], 1) - self.sync_all() + self.generate(self.wallet, 10) self.generate(self.nodes[0], COINBASE_MATURITY + 1) - self.sync_all() - for amount in [1.5, 1.0, 5.0]: - self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), amount) - self.sync_all() - self.generate(self.nodes[0], 5) - self.sync_all() self.getrawtransaction_tests() self.createrawtransaction_tests() - self.signrawtransactionwithwallet_tests() self.sendrawtransaction_tests() self.sendrawtransaction_testmempoolaccept_tests() self.decoderawtransaction_tests() self.transaction_version_number_tests() - if not self.options.descriptors: + if self.requires_wallet and not self.options.descriptors: self.raw_multisig_transaction_legacy_tests() def getrawtransaction_tests(self): - addr = self.nodes[1].getnewaddress() - txid = self.nodes[0].sendtoaddress(addr, 10) - self.generate(self.nodes[0], 1) - self.sync_all() - vout = find_vout_for_address(self.nodes[1], txid, addr) - rawTx = self.nodes[1].createrawtransaction([{'txid': txid, 'vout': vout}], {self.nodes[1].getnewaddress(): 9.999}) - rawTxSigned = self.nodes[1].signrawtransactionwithwallet(rawTx) - txId = self.nodes[1].sendrawtransaction(rawTxSigned['hex']) + tx = self.wallet.send_self_transfer(from_node=self.nodes[0]) self.generate(self.nodes[0], 1) - self.sync_all() + txId = tx['txid'] + err_msg = ( + "No such mempool transaction. Use -txindex or provide a block hash to enable" + " blockchain transaction queries. Use gettransaction for wallet transactions." + ) - for n in [0, 3]: + for n in [0, 2]: self.log.info(f"Test getrawtransaction {'with' if n == 0 else 'without'} -txindex") - # 1. valid parameters - only supply txid - assert_equal(self.nodes[n].getrawtransaction(txId), rawTxSigned['hex']) - # 2. valid parameters - supply txid and 0 for non-verbose - assert_equal(self.nodes[n].getrawtransaction(txId, 0), rawTxSigned['hex']) + if n == 0: + # With -txindex. + # 1. valid parameters - only supply txid + assert_equal(self.nodes[n].getrawtransaction(txId), tx['hex']) + + # 2. valid parameters - supply txid and 0 for non-verbose + assert_equal(self.nodes[n].getrawtransaction(txId, 0), tx['hex']) - # 3. valid parameters - supply txid and False for non-verbose - assert_equal(self.nodes[n].getrawtransaction(txId, False), rawTxSigned['hex']) + # 3. valid parameters - supply txid and False for non-verbose + assert_equal(self.nodes[n].getrawtransaction(txId, False), tx['hex']) - # 4. valid parameters - supply txid and 1 for verbose. - # We only check the "hex" field of the output so we don't need to update this test every time the output format changes. - assert_equal(self.nodes[n].getrawtransaction(txId, 1)["hex"], rawTxSigned['hex']) + # 4. valid parameters - supply txid and 1 for verbose. + # We only check the "hex" field of the output so we don't need to update this test every time the output format changes. + assert_equal(self.nodes[n].getrawtransaction(txId, 1)["hex"], tx['hex']) - # 5. valid parameters - supply txid and True for non-verbose - assert_equal(self.nodes[n].getrawtransaction(txId, True)["hex"], rawTxSigned['hex']) + # 5. valid parameters - supply txid and True for non-verbose + assert_equal(self.nodes[n].getrawtransaction(txId, True)["hex"], tx['hex']) + else: + # Without -txindex, expect to raise. + for verbose in [None, 0, False, 1, True]: + assert_raises_rpc_error(-5, err_msg, self.nodes[n].getrawtransaction, txId, verbose) # 6. invalid parameters - supply txid and invalid boolean values (strings) for verbose for value in ["True", "False"]: @@ -135,10 +130,9 @@ def getrawtransaction_tests(self): assert_raises_rpc_error(-1, "not a boolean", self.nodes[n].getrawtransaction, txId, {}) # Make a tx by sending, then generate 2 blocks; block1 has the tx in it - tx = self.nodes[2].sendtoaddress(self.nodes[1].getnewaddress(), 1) + tx = self.wallet.send_self_transfer(from_node=self.nodes[2])['txid'] block1, block2 = self.generate(self.nodes[2], 2) - self.sync_all() - for n in [0, 3]: + for n in [0, 2]: self.log.info(f"Test getrawtransaction {'with' if n == 0 else 'without'} -txindex, with blockhash") # We should be able to get the raw transaction by providing the correct block gottx = self.nodes[n].getrawtransaction(txid=tx, verbose=True, blockhash=block1) @@ -151,10 +145,6 @@ def getrawtransaction_tests(self): assert 'in_active_chain' not in gottx else: self.log.info("Test getrawtransaction without -txindex, without blockhash: expect the call to raise") - err_msg = ( - "No such mempool transaction. Use -txindex or provide a block hash to enable" - " blockchain transaction queries. Use gettransaction for wallet transactions." - ) assert_raises_rpc_error(-5, err_msg, self.nodes[n].getrawtransaction, txid=tx, verbose=True) # We should not get the tx if we provide an unrelated block assert_raises_rpc_error(-5, "No such transaction found", self.nodes[n].getrawtransaction, txid=tx, blockhash=block2) @@ -199,21 +189,22 @@ def createrawtransaction_tests(self): # sequence number out of range for invalid_seq in [-1, 4294967296]: inputs = [{'txid': TXID, 'vout': 1, 'sequence': invalid_seq}] - outputs = {self.nodes[0].getnewaddress(): 1} + address = getnewdestination()[2] + outputs = {address: 1} assert_raises_rpc_error(-8, 'Invalid parameter, sequence number is out of range', self.nodes[0].createrawtransaction, inputs, outputs) # with valid sequence number for valid_seq in [1000, 4294967294]: inputs = [{'txid': TXID, 'vout': 1, 'sequence': valid_seq}] - outputs = {self.nodes[0].getnewaddress(): 1} + address = getnewdestination()[2] + outputs = {address: 1} rawtx = self.nodes[0].createrawtransaction(inputs, outputs) decrawtx = self.nodes[0].decoderawtransaction(rawtx) assert_equal(decrawtx['vin'][0]['sequence'], valid_seq) # Test `createrawtransaction` invalid `outputs` - address = self.nodes[0].getnewaddress() - address2 = self.nodes[0].getnewaddress() - assert_raises_rpc_error(-1, "JSON value is not an array as expected", self.nodes[0].createrawtransaction, [], 'foo') + address = getnewdestination()[2] + assert_raises_rpc_error(-1, "JSON value is not an array as expected", self.nodes[0].createrawtransaction, [],'foo') self.nodes[0].createrawtransaction(inputs=[], outputs={}) # Should not throw for backwards compatibility self.nodes[0].createrawtransaction(inputs=[], outputs=[]) assert_raises_rpc_error(-8, "Data must be hexadecimal string", self.nodes[0].createrawtransaction, [], {'data': 'foo'}) @@ -227,6 +218,10 @@ def createrawtransaction_tests(self): assert_raises_rpc_error(-8, "Invalid parameter, key-value pair must contain exactly one key", self.nodes[0].createrawtransaction, [], [{'a': 1, 'b': 2}]) assert_raises_rpc_error(-8, "Invalid parameter, key-value pair not an object as expected", self.nodes[0].createrawtransaction, [], [['key-value pair1'], ['2']]) + # Test `createrawtransaction` mismatch between sequence number(s) and `replaceable` option + assert_raises_rpc_error(-8, "Invalid parameter combination: Sequence number(s) contradict replaceable option", + self.nodes[0].createrawtransaction, [{'txid': TXID, 'vout': 0, 'sequence': BIP125_SEQUENCE_NUMBER+1}], {}, 0, True) + # Test `createrawtransaction` invalid `locktime` assert_raises_rpc_error(-3, "Expected type number", self.nodes[0].createrawtransaction, [], {}, 'foo') assert_raises_rpc_error(-8, "Invalid parameter, locktime out of range", self.nodes[0].createrawtransaction, [], {}, -1) @@ -244,6 +239,7 @@ def createrawtransaction_tests(self): self.nodes[2].createrawtransaction(inputs=[{'txid': TXID, 'vout': 9}], outputs=[{address: 99}]), ) # Two outputs + address2 = getnewdestination()[2] tx = tx_from_hex(self.nodes[2].createrawtransaction(inputs=[{'txid': TXID, 'vout': 9}], outputs=OrderedDict([(address, 99), (address2, 99)]))) assert_equal(len(tx.vout), 2) assert_equal( @@ -258,123 +254,53 @@ def createrawtransaction_tests(self): self.nodes[2].createrawtransaction(inputs=[{'txid': TXID, 'vout': 9}], outputs=[{address: 99}, {address2: 99}, {'data': '99'}]), ) - def signrawtransactionwithwallet_tests(self): - for type in ["bech32", "p2sh-segwit", "legacy"]: - self.log.info(f"Test signrawtransactionwithwallet with missing prevtx info ({type})") - addr = self.nodes[0].getnewaddress("", type) - addrinfo = self.nodes[0].getaddressinfo(addr) - pubkey = addrinfo["scriptPubKey"] - inputs = [{'txid': TXID, 'vout': 3, 'sequence': 1000}] - outputs = {self.nodes[0].getnewaddress(): 1} - rawtx = self.nodes[0].createrawtransaction(inputs, outputs) - - prevtx = dict(txid=TXID, scriptPubKey=pubkey, vout=3, amount=1) - succ = self.nodes[0].signrawtransactionwithwallet(rawtx, [prevtx]) - assert succ["complete"] - - if type == "legacy": - del prevtx["amount"] - succ = self.nodes[0].signrawtransactionwithwallet(rawtx, [prevtx]) - assert succ["complete"] - else: - assert_raises_rpc_error(-3, "Missing amount", self.nodes[0].signrawtransactionwithwallet, rawtx, [ - { - "txid": TXID, - "scriptPubKey": pubkey, - "vout": 3, - } - ]) - - assert_raises_rpc_error(-3, "Missing vout", self.nodes[0].signrawtransactionwithwallet, rawtx, [ - { - "txid": TXID, - "scriptPubKey": pubkey, - "amount": 1, - } - ]) - assert_raises_rpc_error(-3, "Missing txid", self.nodes[0].signrawtransactionwithwallet, rawtx, [ - { - "scriptPubKey": pubkey, - "vout": 3, - "amount": 1, - } - ]) - assert_raises_rpc_error(-3, "Missing scriptPubKey", self.nodes[0].signrawtransactionwithwallet, rawtx, [ - { - "txid": TXID, - "vout": 3, - "amount": 1 - } - ]) - def sendrawtransaction_tests(self): self.log.info("Test sendrawtransaction with missing input") inputs = [{'txid': TXID, 'vout': 1}] # won't exist - outputs = {self.nodes[0].getnewaddress(): 4.998} + address = getnewdestination()[2] + outputs = {address: 4.998} rawtx = self.nodes[2].createrawtransaction(inputs, outputs) - rawtx = self.nodes[2].signrawtransactionwithwallet(rawtx) - assert_raises_rpc_error(-25, "bad-txns-inputs-missingorspent", self.nodes[2].sendrawtransaction, rawtx['hex']) + assert_raises_rpc_error(-25, "bad-txns-inputs-missingorspent", self.nodes[2].sendrawtransaction, rawtx) def sendrawtransaction_testmempoolaccept_tests(self): self.log.info("Test sendrawtransaction/testmempoolaccept with maxfeerate") fee_exceeds_max = "Fee exceeds maximum configured by user (e.g. -maxtxfee, maxfeerate)" # Test a transaction with a small fee. - txId = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 1.0) - rawTx = self.nodes[0].getrawtransaction(txId, True) - vout = next(o for o in rawTx['vout'] if o['value'] == Decimal('1.00000000')) - - self.sync_all() - inputs = [{"txid": txId, "vout": vout['n']}] - # Fee 10,000 satoshis, (1 - (10000 sat * 0.00000001 BTC/sat)) = 0.9999 - outputs = {self.nodes[0].getnewaddress(): Decimal("0.99990000")} - rawTx = self.nodes[2].createrawtransaction(inputs, outputs) - rawTxSigned = self.nodes[2].signrawtransactionwithwallet(rawTx) - assert_equal(rawTxSigned['complete'], True) - # Fee 10,000 satoshis, ~100 b transaction, fee rate should land around 100 sat/byte = 0.00100000 BTC/kB + # Fee rate is 0.00100000 BTC/kvB + tx = self.wallet.create_self_transfer(fee_rate=Decimal('0.00100000')) # Thus, testmempoolaccept should reject - testres = self.nodes[2].testmempoolaccept([rawTxSigned['hex']], 0.00001000)[0] + testres = self.nodes[2].testmempoolaccept([tx['hex']], 0.00001000)[0] assert_equal(testres['allowed'], False) assert_equal(testres['reject-reason'], 'max-fee-exceeded') # and sendrawtransaction should throw - assert_raises_rpc_error(-25, fee_exceeds_max, self.nodes[2].sendrawtransaction, rawTxSigned['hex'], 0.00001000) + assert_raises_rpc_error(-25, fee_exceeds_max, self.nodes[2].sendrawtransaction, tx['hex'], 0.00001000) # and the following calls should both succeed - testres = self.nodes[2].testmempoolaccept(rawtxs=[rawTxSigned['hex']])[0] + testres = self.nodes[2].testmempoolaccept(rawtxs=[tx['hex']])[0] assert_equal(testres['allowed'], True) - self.nodes[2].sendrawtransaction(hexstring=rawTxSigned['hex']) + self.nodes[2].sendrawtransaction(hexstring=tx['hex']) # Test a transaction with a large fee. - txId = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 1.0) - rawTx = self.nodes[0].getrawtransaction(txId, True) - vout = next(o for o in rawTx['vout'] if o['value'] == Decimal('1.00000000')) - - self.sync_all() - inputs = [{"txid": txId, "vout": vout['n']}] - # Fee 2,000,000 satoshis, (1 - (2000000 sat * 0.00000001 BTC/sat)) = 0.98 - outputs = {self.nodes[0].getnewaddress() : Decimal("0.98000000")} - rawTx = self.nodes[2].createrawtransaction(inputs, outputs) - rawTxSigned = self.nodes[2].signrawtransactionwithwallet(rawTx) - assert_equal(rawTxSigned['complete'], True) - # Fee 2,000,000 satoshis, ~100 b transaction, fee rate should land around 20,000 sat/byte = 0.20000000 BTC/kB + # Fee rate is 0.20000000 BTC/kvB + tx = self.wallet.create_self_transfer(fee_rate=Decimal("0.20000000")) # Thus, testmempoolaccept should reject - testres = self.nodes[2].testmempoolaccept([rawTxSigned['hex']])[0] + testres = self.nodes[2].testmempoolaccept([tx['hex']])[0] assert_equal(testres['allowed'], False) assert_equal(testres['reject-reason'], 'max-fee-exceeded') # and sendrawtransaction should throw - assert_raises_rpc_error(-25, fee_exceeds_max, self.nodes[2].sendrawtransaction, rawTxSigned['hex']) + assert_raises_rpc_error(-25, fee_exceeds_max, self.nodes[2].sendrawtransaction, tx['hex']) # and the following calls should both succeed - testres = self.nodes[2].testmempoolaccept(rawtxs=[rawTxSigned['hex']], maxfeerate='0.20000000')[0] + testres = self.nodes[2].testmempoolaccept(rawtxs=[tx['hex']], maxfeerate='0.20000000')[0] assert_equal(testres['allowed'], True) - self.nodes[2].sendrawtransaction(hexstring=rawTxSigned['hex'], maxfeerate='0.20000000') + self.nodes[2].sendrawtransaction(hexstring=tx['hex'], maxfeerate='0.20000000') self.log.info("Test sendrawtransaction/testmempoolaccept with tx already in the chain") self.generate(self.nodes[2], 1) - self.sync_blocks() for node in self.nodes: - testres = node.testmempoolaccept([rawTxSigned['hex']])[0] + testres = node.testmempoolaccept([tx['hex']])[0] assert_equal(testres['allowed'], False) assert_equal(testres['reject-reason'], 'txn-already-known') - assert_raises_rpc_error(-27, 'Transaction already in block chain', node.sendrawtransaction, rawTxSigned['hex']) + assert_raises_rpc_error(-27, 'Transaction already in block chain', node.sendrawtransaction, tx['hex']) def decoderawtransaction_tests(self): self.log.info("Test decoderawtransaction") @@ -443,7 +369,6 @@ def raw_multisig_transaction_legacy_tests(self): txId = self.nodes[0].sendtoaddress(mSigObj, 1.2) self.sync_all() self.generate(self.nodes[0], 1) - self.sync_all() # node2 has both keys of the 2of2 ms addr, tx should affect the balance assert_equal(self.nodes[2].getbalance(), bal + Decimal('1.20000000')) @@ -465,7 +390,6 @@ def raw_multisig_transaction_legacy_tests(self): rawTx = self.nodes[0].decoderawtransaction(decTx['hex']) self.sync_all() self.generate(self.nodes[0], 1) - self.sync_all() # THIS IS AN INCOMPLETE FEATURE # NODE2 HAS TWO OF THREE KEYS AND THE FUNDS SHOULD BE SPENDABLE AND COUNT AT BALANCE CALCULATION @@ -508,7 +432,6 @@ def raw_multisig_transaction_legacy_tests(self): rawTx2 = self.nodes[0].decoderawtransaction(decTx['hex']) self.sync_all() self.generate(self.nodes[0], 1) - self.sync_all() assert_equal(self.nodes[2].getbalance(), bal) # the funds of a 2of2 multisig tx should not be marked as spendable diff --git a/test/functional/rpc_txoutproof.py b/test/functional/rpc_txoutproof.py index c0285481e5..08cdf3e1b1 100755 --- a/test/functional/rpc_txoutproof.py +++ b/test/functional/rpc_txoutproof.py @@ -53,7 +53,7 @@ def run_test(self): assert_equal(self.nodes[0].verifytxoutproof(self.nodes[0].gettxoutproof([txid1, txid2])), txlist) assert_equal(self.nodes[0].verifytxoutproof(self.nodes[0].gettxoutproof([txid1, txid2], blockhash)), txlist) - txin_spent = miniwallet.get_utxo() # Get the change from txid2 + txin_spent = miniwallet.get_utxo(txid=txid2) # Get the change from txid2 tx3 = miniwallet.send_self_transfer(from_node=self.nodes[0], utxo_to_spend=txin_spent) txid3 = tx3['txid'] self.generate(self.nodes[0], 1) diff --git a/test/functional/test_framework/address.py b/test/functional/test_framework/address.py index 1927637126..98a96cf8d6 100644 --- a/test/functional/test_framework/address.py +++ b/test/functional/test_framework/address.py @@ -119,6 +119,10 @@ def script_to_p2sh_p2wsh(script, main=False): p2shscript = CScript([OP_0, sha256(script)]) return script_to_p2sh(p2shscript, main) +def output_key_to_p2tr(key, main=False): + assert len(key) == 32 + return program_to_witness(1, key, main) + def check_key(key): if (type(key) is str): key = bytes.fromhex(key) # Assuming this is hex string diff --git a/test/functional/test_framework/messages.py b/test/functional/test_framework/messages.py index a3b027b785..ab3fcfdcdd 100755 --- a/test/functional/test_framework/messages.py +++ b/test/functional/test_framework/messages.py @@ -43,6 +43,7 @@ MAX_MONEY = 21000000 * COIN BIP125_SEQUENCE_NUMBER = 0xfffffffd # Sequence number that is rbf-opt-in (BIP 125) and csv-opt-out (BIP 68) +SEQUENCE_FINAL = 0xffffffff # Sequence number that disables nLockTime if set for every input of a tx MAX_PROTOCOL_MESSAGE_LENGTH = 4000000 # Maximum length of incoming protocol messages MAX_HEADERS_RESULTS = 2000 # Number of headers sent in one getheaders result @@ -514,7 +515,7 @@ class CTransaction: def __init__(self, tx=None): if tx is None: - self.nVersion = 1 + self.nVersion = 2 self.vin = [] self.vout = [] self.wit = CTxWitness() diff --git a/test/functional/test_framework/script.py b/test/functional/test_framework/script.py index 0ef0ffcb5a..d1991644dc 100644 --- a/test/functional/test_framework/script.py +++ b/test/functional/test_framework/script.py @@ -807,20 +807,20 @@ def taproot_tree_helper(scripts): h = TaggedHash("TapLeaf", bytes([version]) + ser_string(code)) if name is None: return ([], h) - return ([(name, version, code, bytes())], h) + return ([(name, version, code, bytes(), h)], h) elif len(scripts) == 2 and callable(scripts[1]): # Two entries, and the right one is a function left, left_h = taproot_tree_helper(scripts[0:1]) right_h = scripts[1](left_h) - left = [(name, version, script, control + right_h) for name, version, script, control in left] + left = [(name, version, script, control + right_h, leaf) for name, version, script, control, leaf in left] right = [] else: # Two or more entries: descend into each side split_pos = len(scripts) // 2 left, left_h = taproot_tree_helper(scripts[0:split_pos]) right, right_h = taproot_tree_helper(scripts[split_pos:]) - left = [(name, version, script, control + right_h) for name, version, script, control in left] - right = [(name, version, script, control + left_h) for name, version, script, control in right] + left = [(name, version, script, control + right_h, leaf) for name, version, script, control, leaf in left] + right = [(name, version, script, control + left_h, leaf) for name, version, script, control, leaf in right] if right_h < left_h: right_h, left_h = left_h, right_h h = TaggedHash("TapBranch", left_h + right_h) @@ -832,13 +832,13 @@ def taproot_tree_helper(scripts): # - negflag: whether the pubkey in the scriptPubKey was negated from internal_pubkey+tweak*G (bool). # - tweak: the tweak (32 bytes) # - leaves: a dict of name -> TaprootLeafInfo objects for all known leaves -TaprootInfo = namedtuple("TaprootInfo", "scriptPubKey,internal_pubkey,negflag,tweak,leaves") +TaprootInfo = namedtuple("TaprootInfo", "scriptPubKey,internal_pubkey,negflag,tweak,leaves,merkle_root,output_pubkey") # A TaprootLeafInfo object has the following fields: # - script: the leaf script (CScript or bytes) # - version: the leaf version (0xc0 for BIP342 tapscript) # - merklebranch: the merkle branch to use for this leaf (32*N bytes) -TaprootLeafInfo = namedtuple("TaprootLeafInfo", "script,version,merklebranch") +TaprootLeafInfo = namedtuple("TaprootLeafInfo", "script,version,merklebranch,leaf_hash") def taproot_construct(pubkey, scripts=None): """Construct a tree of Taproot spending conditions @@ -860,8 +860,9 @@ def taproot_construct(pubkey, scripts=None): ret, h = taproot_tree_helper(scripts) tweak = TaggedHash("TapTweak", pubkey + h) tweaked, negated = tweak_add_pubkey(pubkey, tweak) - leaves = dict((name, TaprootLeafInfo(script, version, merklebranch)) for name, version, script, merklebranch in ret) - return TaprootInfo(CScript([OP_1, tweaked]), pubkey, negated + 0, tweak, leaves) + print("ret",ret) + leaves = dict((name, TaprootLeafInfo(script, version, merklebranch, leaf)) for name, version, script, merklebranch, leaf in ret) + return TaprootInfo(CScript([OP_1, tweaked]), pubkey, negated + 0, tweak, leaves, h, tweaked) def is_op_success(o): return o == 0x50 or o == 0x62 or o == 0x89 or o == 0x8a or o == 0x8d or o == 0x8e or (o >= 0x7e and o <= 0x81) or (o >= 0x83 and o <= 0x86) or (o >= 0x95 and o <= 0x99) or (o >= 0xbb and o <= 0xfe) diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py index b37f515b2f..1ad75314b3 100755 --- a/test/functional/test_framework/test_framework.py +++ b/test/functional/test_framework/test_framework.py @@ -777,7 +777,7 @@ def _initialize_chain(self): # block in the cache does not age too much (have an old tip age). # This is needed so that we are out of IBD when the test starts, # see the tip age check in IsInitialBlockDownload(). - gen_addresses = [k.address for k in TestNode.PRIV_KEYS] + [ADDRESS_BCRT1_P2WSH_OP_TRUE] + gen_addresses = [k.address for k in TestNode.PRIV_KEYS][:3] + [ADDRESS_BCRT1_P2WSH_OP_TRUE] for i in range(8): self.generatetoaddress( cache_node, @@ -885,6 +885,14 @@ def is_wallet_compiled(self): """Checks whether the wallet module was compiled.""" return self.config["components"].getboolean("ENABLE_WALLET") + def is_specified_wallet_compiled(self): + """Checks whether wallet support for the specified type + (legacy or descriptor wallet) was compiled.""" + if self.options.descriptors: + return self.is_sqlite_compiled() + else: + return self.is_bdb_compiled() + def is_wallet_tool_compiled(self): """Checks whether BGL-wallet was compiled.""" return self.config["components"].getboolean("ENABLE_WALLET_TOOL") diff --git a/test/functional/test_framework/util.py b/test/functional/test_framework/util.py index ef8bc986bd..bcd2109f09 100644 --- a/test/functional/test_framework/util.py +++ b/test/functional/test_framework/util.py @@ -257,6 +257,7 @@ def wait_until_helper(predicate, *, attempts=float('inf'), timeout=float('inf'), raise AssertionError("Predicate {} not true after {} seconds".format(predicate_source, timeout)) raise RuntimeError('Unreachable') + def sha256sum_file(filename): h = hashlib.sha256() with open(filename, 'rb') as f: @@ -433,6 +434,12 @@ def set_node_times(nodes, t): node.setmocktime(t) +def check_node_connections(*, node, num_in, num_out): + info = node.getnetworkinfo() + assert_equal(info["connections_in"], num_in) + assert_equal(info["connections_out"], num_out) + + # Transaction/Block functions ############################# @@ -501,59 +508,39 @@ def chain_transaction(node, parent_txids, vouts, value, fee, num_outputs): # Create large OP_RETURN txouts that can be appended to a transaction -# to make it large (helper for constructing large transactions). +# to make it large (helper for constructing large transactions). The +# total serialized size of the txouts is about 6k vbytes. def gen_return_txouts(): - # Some pre-processing to create a bunch of OP_RETURN txouts to insert into transactions we create - # So we have big transactions (and therefore can't fit very many into each block) - # create one script_pubkey - script_pubkey = "6a4d0200" # OP_RETURN OP_PUSH2 512 bytes - for _ in range(512): - script_pubkey = script_pubkey + "01" - # concatenate 128 txouts of above script_pubkey which we'll insert before the txout for change - txouts = [] from .messages import CTxOut - txout = CTxOut() - txout.nValue = 0 - txout.scriptPubKey = bytes.fromhex(script_pubkey) - for _ in range(128): - txouts.append(txout) + from .script import CScript, OP_RETURN + txouts = [CTxOut(nValue=0, scriptPubKey=CScript([OP_RETURN, b'\x01'*6743]))] + assert_equal(sum([len(txout.serialize()) for txout in txouts]), 6758) return txouts # Create a spend of each passed-in utxo, splicing in "txouts" to each raw # transaction to make it large. See gen_return_txouts() above. -def create_lots_of_big_transactions(node, txouts, utxos, num, fee): - addr = node.getnewaddress() +def create_lots_of_big_transactions(mini_wallet, node, fee, tx_batch_size, txouts, utxos=None): txids = [] - from .messages import tx_from_hex - for _ in range(num): - t = utxos.pop() - inputs = [{"txid": t["txid"], "vout": t["vout"]}] - outputs = {} - change = t['amount'] - fee - outputs[addr] = satoshi_round(change) - rawtx = node.createrawtransaction(inputs, outputs) - tx = tx_from_hex(rawtx) - for txout in txouts: - tx.vout.append(txout) - newtx = tx.serialize().hex() - signresult = node.signrawtransactionwithwallet(newtx, None, "NONE") - txid = node.sendrawtransaction(signresult["hex"], 0) - txids.append(txid) + use_internal_utxos = utxos is None + for _ in range(tx_batch_size): + tx = mini_wallet.create_self_transfer( + utxo_to_spend=None if use_internal_utxos else utxos.pop(), + fee=fee, + )["tx"] + tx.vout.extend(txouts) + res = node.testmempoolaccept([tx.serialize().hex()])[0] + assert_equal(res['fees']['base'], fee) + txids.append(node.sendrawtransaction(tx.serialize().hex())) return txids -def mine_large_block(test_framework, node, utxos=None): +def mine_large_block(test_framework, mini_wallet, node): # generate a 66k transaction, # and 14 of them is close to the 1MB block limit - num = 14 txouts = gen_return_txouts() - utxos = utxos if utxos is not None else [] - if len(utxos) < num: - utxos.clear() - utxos.extend(node.listunspent()) fee = 100 * node.getnetworkinfo()["relayfee"] - create_lots_of_big_transactions(node, txouts, utxos, num, fee=fee) + create_lots_of_big_transactions(mini_wallet, node, fee, 14, txouts) test_framework.generate(node, 1) diff --git a/test/functional/test_framework/wallet.py b/test/functional/test_framework/wallet.py index 2ac766eb71..c87fd98584 100644 --- a/test/functional/test_framework/wallet.py +++ b/test/functional/test_framework/wallet.py @@ -8,10 +8,25 @@ from decimal import Decimal from enum import Enum from random import choice -from typing import Optional -from test_framework.address import ADDRESS_BCRT1_P2WSH_OP_TRUE +from typing import ( + Any, + List, + Optional, +) +from test_framework.address import ( + base58_to_byte, + ADDRESS_BCRT1_P2WSH_OP_TRUE, + key_to_p2pkh, + key_to_p2sh_p2wpkh, + key_to_p2wpkh, + output_key_to_p2tr, +) + from test_framework.descriptors import descsum_create -from test_framework.key import ECKey +from test_framework.key import ( + ECKey, + compute_xonly_pubkey, +) from test_framework.messages import ( COIN, COutPoint, @@ -27,10 +42,15 @@ OP_TRUE, OP_NOP, SIGHASH_ALL, + taproot_construct, ) from test_framework.script_util import ( key_to_p2pk_script, + key_to_p2pkh_script, + key_to_p2sh_p2wpkh_script, key_to_p2wpkh_script, + keyhash_to_p2pkh_script, + scripthash_to_p2sh_script, ) from test_framework.util import ( assert_equal, @@ -83,19 +103,34 @@ def __init__(self, test_node, *, mode=MiniWalletMode.ADDRESS_OP_TRUE): self._address = ADDRESS_BCRT1_P2WSH_OP_TRUE self._scriptPubKey = bytes.fromhex(self._test_node.validateaddress(self._address)['scriptPubKey']) + def _create_utxo(self, *, txid, vout, value, height): + return {"txid": txid, "vout": vout, "value": value, "height": height} + + def get_balance(self): + return sum(u['value'] for u in self._utxos) + def rescan_utxos(self): """Drop all utxos and rescan the utxo set""" self._utxos = [] res = self._test_node.scantxoutset(action="start", scanobjects=[self.get_descriptor()]) assert_equal(True, res['success']) for utxo in res['unspents']: - self._utxos.append({'txid': utxo['txid'], 'vout': utxo['vout'], 'value': utxo['amount'], 'height': utxo['height']}) + self._utxos.append(self._create_utxo(txid=utxo["txid"], vout=utxo["vout"], value=utxo["amount"], height=utxo["height"])) def scan_tx(self, tx): - """Scan the tx for self._scriptPubKey outputs and add them to self._utxos""" + """Scan the tx and adjust the internal list of owned utxos""" + for spent in tx["vin"]: + # Mark spent. This may happen when the caller has ownership of a + # utxo that remained in this wallet. For example, by passing + # mark_as_spent=False to get_utxo or by using an utxo returned by a + # create_self_transfer* call. + try: + self.get_utxo(txid=spent["txid"], vout=spent["vout"]) + except StopIteration: + pass for out in tx['vout']: if out['scriptPubKey']['hex'] == self._scriptPubKey.hex(): - self._utxos.append({'txid': tx['txid'], 'vout': out['n'], 'value': out['value'], 'height': 0}) + self._utxos.append(self._create_utxo(txid=tx["txid"], vout=out["n"], value=out["value"], height=0)) def sign_tx(self, tx, fixed_length=True): """Sign tx that has been created by MiniWallet in P2PK mode""" @@ -111,44 +146,61 @@ def sign_tx(self, tx, fixed_length=True): if not fixed_length: break tx.vin[0].scriptSig = CScript([der_sig + bytes(bytearray([SIGHASH_ALL]))]) + tx.rehash() def generate(self, num_blocks, **kwargs): - """Generate blocks with coinbase outputs to the internal address, and append the outputs to the internal list""" + """Generate blocks with coinbase outputs to the internal address, and call rescan_utxos""" blocks = self._test_node.generatetodescriptor(num_blocks, self.get_descriptor(), **kwargs) - for b in blocks: - block_info = self._test_node.getblock(blockhash=b, verbosity=2) - cb_tx = block_info['tx'][0] - self._utxos.append({'txid': cb_tx['txid'], 'vout': 0, 'value': cb_tx['vout'][0]['value'], 'height': block_info['height']}) + # Calling rescan_utxos here makes sure that after a generate the utxo + # set is in a clean state. For example, the wallet will update + # - if the caller consumed utxos, but never used them + # - if the caller sent a transaction that is not mined or got rbf'd + # - after block re-orgs + # - the utxo height for mined mempool txs + # - However, the wallet will not consider remaining mempool txs + self.rescan_utxos() return blocks + def get_scriptPubKey(self): + return self._scriptPubKey + def get_descriptor(self): return descsum_create(f'raw({self._scriptPubKey.hex()})') def get_address(self): return self._address - def get_utxo(self, *, txid: Optional[str]='', mark_as_spent=True): + def get_utxo(self, *, txid: str = '', vout: Optional[int] = None, mark_as_spent=True) -> dict: """ Returns a utxo and marks it as spent (pops it from the internal list) Args: txid: get the first utxo we find from a specific transaction - - Note: Can be used to get the change output immediately after a send_self_transfer """ - index = -1 # by default the last utxo + self._utxos = sorted(self._utxos, key=lambda k: (k['value'], -k['height'])) # Put the largest utxo last if txid: - utxo = next(filter(lambda utxo: txid == utxo['txid'], self._utxos)) - index = self._utxos.index(utxo) + utxo_filter: Any = filter(lambda utxo: txid == utxo['txid'], self._utxos) + else: + utxo_filter = reversed(self._utxos) # By default the largest utxo + if vout is not None: + utxo_filter = filter(lambda utxo: vout == utxo['vout'], utxo_filter) + index = self._utxos.index(next(utxo_filter)) if mark_as_spent: return self._utxos.pop(index) else: return self._utxos[index] - def send_self_transfer(self, **kwargs): + def get_utxos(self, *, mark_as_spent=True): + """Returns the list of all utxos and optionally mark them as spent""" + utxos = deepcopy(self._utxos) + if mark_as_spent: + self._utxos = [] + return utxos + + def send_self_transfer(self, *, from_node, **kwargs): """Create and send a tx with the specified fee_rate. Fee may be exact or at most one satoshi higher than needed.""" tx = self.create_self_transfer(**kwargs) - self.sendrawtransaction(from_node=kwargs['from_node'], tx_hex=tx['hex']) + self.sendrawtransaction(from_node=from_node, tx_hex=tx['hex']) return tx def send_to(self, *, from_node, scriptPubKey, amount, fee=1000): @@ -163,27 +215,83 @@ def send_to(self, *, from_node, scriptPubKey, amount, fee=1000): Returns a tuple (txid, n) referring to the created external utxo outpoint. """ - tx = self.create_self_transfer(from_node=from_node, fee_rate=0, mempool_valid=False)['tx'] + tx = self.create_self_transfer(fee_rate=0)["tx"] assert_greater_than_or_equal(tx.vout[0].nValue, amount + fee) tx.vout[0].nValue -= (amount + fee) # change output -> MiniWallet tx.vout.append(CTxOut(amount, scriptPubKey)) # arbitrary output -> to be returned txid = self.sendrawtransaction(from_node=from_node, tx_hex=tx.serialize().hex()) return txid, 1 - def create_self_transfer(self, *, fee_rate=Decimal("0.003"), from_node, utxo_to_spend=None, mempool_valid=True, locktime=0, sequence=0): - """Create and return a tx with the specified fee_rate. Fee may be exact or at most one satoshi higher than needed.""" - self._utxos = sorted(self._utxos, key=lambda k: (k['value'], -k['height'])) - utxo_to_spend = utxo_to_spend or self._utxos.pop() # Pick the largest utxo (if none provided) and hope it covers the fee + def send_self_transfer_multi(self, *, from_node, **kwargs): + """Call create_self_transfer_multi and send the transaction.""" + tx = self.create_self_transfer_multi(**kwargs) + self.sendrawtransaction(from_node=from_node, tx_hex=tx["hex"]) + return tx + + def create_self_transfer_multi( + self, + *, + utxos_to_spend: Optional[List[dict]] = None, + num_outputs=1, + amount_per_output=0, + sequence=0, + fee_per_output=1000, + ): + """ + Create and return a transaction that spends the given UTXOs and creates a + certain number of outputs with equal amounts. The output amounts can be + set by amount_per_output or automatically calculated with a fee_per_output. + """ + utxos_to_spend = utxos_to_spend or [self.get_utxo()] + sequence = [sequence] * len(utxos_to_spend) if type(sequence) is int else sequence + assert_equal(len(utxos_to_spend), len(sequence)) + # create simple tx template (1 input, 1 output) + tx = self.create_self_transfer( + fee_rate=0, + utxo_to_spend=utxos_to_spend[0])["tx"] + + # duplicate inputs, witnesses and outputs + tx.vin = [deepcopy(tx.vin[0]) for _ in range(len(utxos_to_spend))] + for txin, seq in zip(tx.vin, sequence): + txin.nSequence = seq + tx.wit.vtxinwit = [deepcopy(tx.wit.vtxinwit[0]) for _ in range(len(utxos_to_spend))] + tx.vout = [deepcopy(tx.vout[0]) for _ in range(num_outputs)] + + # adapt input prevouts + for i, utxo in enumerate(utxos_to_spend): + tx.vin[i] = CTxIn(COutPoint(int(utxo['txid'], 16), utxo['vout'])) + + # adapt output amounts (use fixed fee per output) + inputs_value_total = sum([int(COIN * utxo['value']) for utxo in utxos_to_spend]) + outputs_value_total = inputs_value_total - fee_per_output * num_outputs + for o in tx.vout: + o.nValue = amount_per_output or (outputs_value_total // num_outputs) + txid = tx.rehash() + return { + "new_utxos": [self._create_utxo( + txid=txid, + vout=i, + value=Decimal(tx.vout[i].nValue) / COIN, + height=0, + ) for i in range(len(tx.vout))], + "txid": txid, + "hex": tx.serialize().hex(), + "tx": tx, + } + + def create_self_transfer(self, *, fee_rate=Decimal("0.003"), fee=Decimal("0"), utxo_to_spend=None, locktime=0, sequence=0): + """Create and return a tx with the specified fee. If fee is 0, use fee_rate, where the resulting fee may be exact or at most one satoshi higher than needed.""" + utxo_to_spend = utxo_to_spend or self.get_utxo() if self._priv_key is None: vsize = Decimal(96) # anyone-can-spend else: vsize = Decimal(168) # P2PK (73 bytes scriptSig + 35 bytes scriptPubKey + 60 bytes other) - send_value = int(COIN * (utxo_to_spend['value'] - fee_rate * (vsize / 1000))) + send_value = utxo_to_spend["value"] - (fee or (fee_rate * vsize / 1000)) assert send_value > 0 tx = CTransaction() tx.vin = [CTxIn(COutPoint(int(utxo_to_spend['txid'], 16), utxo_to_spend['vout']), nSequence=sequence)] - tx.vout = [CTxOut(send_value, self._scriptPubKey)] + tx.vout = [CTxOut(int(COIN * send_value), bytearray(self._scriptPubKey))] tx.nLockTime = locktime if not self._address: # raw script @@ -198,18 +306,42 @@ def create_self_transfer(self, *, fee_rate=Decimal("0.003"), from_node, utxo_to_ tx.wit.vtxinwit[0].scriptWitness.stack = [CScript([OP_TRUE])] tx_hex = tx.serialize().hex() - tx_info = from_node.testmempoolaccept([tx_hex])[0] - assert_equal(mempool_valid, tx_info['allowed']) - if mempool_valid: - assert_equal(tx_info['vsize'], vsize) - assert_equal(tx_info['fees']['base'], utxo_to_spend['value'] - Decimal(send_value) / COIN) - return {'txid': tx_info['txid'], 'wtxid': tx_info['wtxid'], 'hex': tx_hex, 'tx': tx} + assert_equal(tx.get_vsize(), vsize) + new_utxo = self._create_utxo(txid=tx.rehash(), vout=0, value=send_value, height=0) + + return {"txid": new_utxo["txid"], "wtxid": tx.getwtxid(), "hex": tx_hex, "tx": tx, "new_utxo": new_utxo} - def sendrawtransaction(self, *, from_node, tx_hex): - txid = from_node.sendrawtransaction(tx_hex) + def sendrawtransaction(self, *, from_node, tx_hex, maxfeerate=0, **kwargs): + txid = from_node.sendrawtransaction(hexstring=tx_hex, maxfeerate=maxfeerate, **kwargs) self.scan_tx(from_node.decoderawtransaction(tx_hex)) return txid +def getnewdestination(address_type='bech32m'): + """Generate a random destination of the specified type and return the + corresponding public key, scriptPubKey and address. Supported types are + 'legacy', 'p2sh-segwit', 'bech32' and 'bech32m'. Can be used when a random + destination is needed, but no compiled wallet is available (e.g. as + replacement to the getnewaddress/getaddressinfo RPCs).""" + key = ECKey() + key.generate() + pubkey = key.get_pubkey().get_bytes() + if address_type == 'legacy': + scriptpubkey = key_to_p2pkh_script(pubkey) + address = key_to_p2pkh(pubkey) + elif address_type == 'p2sh-segwit': + scriptpubkey = key_to_p2sh_p2wpkh_script(pubkey) + address = key_to_p2sh_p2wpkh(pubkey) + elif address_type == 'bech32': + scriptpubkey = key_to_p2wpkh_script(pubkey) + address = key_to_p2wpkh(pubkey) + elif address_type == 'bech32m': + tap = taproot_construct(compute_xonly_pubkey(key.get_bytes())[0]) + pubkey = tap.output_pubkey + scriptpubkey = tap.scriptPubKey + address = output_key_to_p2tr(pubkey) + else: + assert False + return pubkey, scriptpubkey, address def random_p2wpkh(): """Generate a random P2WPKH scriptPubKey. Can be used when a random destination is needed, diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py index 4fa21955f7..c30028dded 100755 --- a/test/functional/test_runner.py +++ b/test/functional/test_runner.py @@ -110,7 +110,6 @@ 'p2p_tx_download.py', 'mempool_updatefromblock.py', 'wallet_dump.py --legacy-wallet', - 'feature_taproot.py --previous_release', 'feature_taproot.py', 'rpc_signer.py', 'wallet_signer.py --descriptors', @@ -219,8 +218,7 @@ 'feature_rbf.py', 'mempool_packages.py', 'mempool_package_onemore.py', - 'rpc_createmultisig.py --legacy-wallet', - 'rpc_createmultisig.py --descriptors', + 'rpc_createmultisig.py', 'rpc_packages.py', 'mempool_package_limits.py', 'feature_versionbits_warning.py', From 02ddb3f86c6bd059da1f9a14e2293fda0bccae83 Mon Sep 17 00:00:00 2001 From: nadyka Date: Tue, 6 Dec 2022 15:54:19 +0400 Subject: [PATCH 053/144] sync/fix tests --- test/functional/test_framework/script.py | 1 - test/functional/test_runner.py | 18 +++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/test/functional/test_framework/script.py b/test/functional/test_framework/script.py index d1991644dc..e1e799d9bf 100644 --- a/test/functional/test_framework/script.py +++ b/test/functional/test_framework/script.py @@ -860,7 +860,6 @@ def taproot_construct(pubkey, scripts=None): ret, h = taproot_tree_helper(scripts) tweak = TaggedHash("TapTweak", pubkey + h) tweaked, negated = tweak_add_pubkey(pubkey, tweak) - print("ret",ret) leaves = dict((name, TaprootLeafInfo(script, version, merklebranch, leaf)) for name, version, script, merklebranch, leaf in ret) return TaprootInfo(CScript([OP_1, tweaked]), pubkey, negated + 0, tweak, leaves, h, tweaked) diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py index c30028dded..30fa532c9e 100755 --- a/test/functional/test_runner.py +++ b/test/functional/test_runner.py @@ -151,7 +151,7 @@ 'wallet_avoidreuse.py --legacy-wallet', 'wallet_avoidreuse.py --descriptors', 'mempool_reorg.py', - 'mempool_persist.py', + 'mempool_persist.py --descriptors', 'wallet_multiwallet.py --legacy-wallet', 'wallet_multiwallet.py --descriptors', 'wallet_multiwallet.py --usecli', @@ -176,7 +176,8 @@ 'rpc_rawtransaction.py --legacy-wallet', 'rpc_rawtransaction.py --descriptors', 'wallet_groups.py --legacy-wallet', - 'wallet_transactiontime_rescan.py', + 'wallet_transactiontime_rescan.py --descriptors', + 'wallet_transactiontime_rescan.py --legacy-wallet', 'p2p_addrv2_relay.py', 'wallet_groups.py --descriptors', 'p2p_compactblocks_hb.py', @@ -184,8 +185,7 @@ 'rpc_decodescript.py', 'rpc_blockchain.py', 'rpc_deprecated.py', - 'wallet_disable.py --legacy-wallet', - 'wallet_disable.py --descriptors', + 'wallet_disable.py', 'p2p_addr_relay.py', 'p2p_getaddr_caching.py', 'p2p_getdata.py', @@ -206,7 +206,7 @@ 'feature_assumevalid.py', 'example_test.py', 'wallet_txn_doublespend.py --legacy-wallet', - 'wallet_multisig_descriptor_psbt.py', + 'wallet_multisig_descriptor_psbt.py --descriptors', 'wallet_txn_doublespend.py --descriptors', 'feature_backwards_compatibility.py --legacy-wallet', 'feature_backwards_compatibility.py --descriptors', @@ -267,9 +267,10 @@ 'feature_minchainwork.py', 'rpc_getblockstats.py', 'wallet_create_tx.py --legacy-wallet', - 'wallet_send.py', + 'wallet_send.py --legacy-wallet', + 'wallet_send.py --descriptors', 'wallet_create_tx.py --descriptors', - 'wallet_taproot.py', + 'wallet_taproot.py --descriptors', 'p2p_fingerprint.py', 'feature_uacomment.py', 'wallet_coinbase_category.py --legacy-wallet', @@ -307,8 +308,7 @@ 'rpc_help.py', 'feature_help.py', 'feature_shutdown.py', - 'p2p_ibd_txrelay.py', - 'feature_blockfilterindex_prune.py' + 'p2p_ibd_txrelay.py' # Don't append tests at the end to avoid merge conflicts # Put them in a random line within the section that fits their approximate run-time ] From a231ba2449c125d0e8b8a8b4d94e7d2b61bb4f8a Mon Sep 17 00:00:00 2001 From: nadyka Date: Tue, 6 Dec 2022 16:22:07 +0400 Subject: [PATCH 054/144] sync/fix tests --- test/functional/feature_utxo_set_hash.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/functional/feature_utxo_set_hash.py b/test/functional/feature_utxo_set_hash.py index d2bedd4c7c..4a97dbbe5a 100755 --- a/test/functional/feature_utxo_set_hash.py +++ b/test/functional/feature_utxo_set_hash.py @@ -69,8 +69,8 @@ def test_muhash_implementation(self): assert_equal(finalized[::-1].hex(), node_muhash) self.log.info("Test deterministic UTXO set hash results") - assert_equal(node.gettxoutsetinfo()['hash_serialized_2'], "1ec3e58b0be79fca5917c7c30b9761f12adb609d0233cf2b42fa17ec419f0056") - assert_equal(node.gettxoutsetinfo("muhash")['muhash'], "faee25ca4765facb643b7a2d96531c568cb52ad84de5ae3d420a92967621ec17") + assert_equal(node.gettxoutsetinfo()['hash_serialized_2'], "f4edcc42a569bfef13f56306cf32821774ce36b0868cabbf698859d453b3ee0a") + assert_equal(node.gettxoutsetinfo("muhash")['muhash'], "6aebab920c5c6102e2ae8fe94122c0cf6546e48eb167a9278693c00f7b348436") def run_test(self): self.test_muhash_implementation() From 9253a62eb748beef2ebe74be05579c499c3966f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Barbosa?= Date: Mon, 23 Nov 2020 12:00:50 +0000 Subject: [PATCH 055/144] rpc: Validate -rpcauth arguments --- src/httprpc.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/httprpc.cpp b/src/httprpc.cpp index 1efcb26efc..9ae592be79 100644 --- a/src/httprpc.cpp +++ b/src/httprpc.cpp @@ -254,11 +254,14 @@ static bool InitRPCAuthentication() if (gArgs.GetArg("-rpcauth","") != "") { LogPrintf("Using rpcauth authentication.\n"); - for (std::string rpcauth : gArgs.GetArgs("-rpcauth")) { + for (const std::string& rpcauth : gArgs.GetArgs("-rpcauth")) { std::vector fields; boost::split(fields, rpcauth, boost::is_any_of(":$")); if (fields.size() == 3) { g_rpcauth.push_back(fields); + } else { + LogPrintf("Invalid -rpcauth argument.\n"); + return false; } } } From 68d735dff74f59f9bde91eed41e2a53c89b6e5ef Mon Sep 17 00:00:00 2001 From: Douglas Chimento Date: Thu, 2 Dec 2021 13:17:36 +0200 Subject: [PATCH 056/144] test: Use byte unit 'M' for -maxuploadtarget functional test --- test/functional/feature_maxuploadtarget.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/feature_maxuploadtarget.py b/test/functional/feature_maxuploadtarget.py index 8622d18c58..f2ca895d3d 100755 --- a/test/functional/feature_maxuploadtarget.py +++ b/test/functional/feature_maxuploadtarget.py @@ -37,7 +37,7 @@ def set_test_params(self): self.setup_clean_chain = True self.num_nodes = 1 self.extra_args = [[ - "-maxuploadtarget=800", + "-maxuploadtarget=800M", "-acceptnonstdtxn=1", ]] self.supports_cli = False From 0f14f5c65f1be595ddaa0b3ce26a5571457d258d Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Fri, 11 Mar 2022 16:09:54 +0100 Subject: [PATCH 057/144] test: use MiniWallet for feature_maxuploadtarget.py This test can now be run even with the Bitcoin Core wallet disabled. --- test/functional/feature_maxuploadtarget.py | 18 ++++++++++-------- test/functional/test_framework/util.py | 9 +++++++-- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/test/functional/feature_maxuploadtarget.py b/test/functional/feature_maxuploadtarget.py index f2ca895d3d..beca9efe57 100755 --- a/test/functional/feature_maxuploadtarget.py +++ b/test/functional/feature_maxuploadtarget.py @@ -13,12 +13,20 @@ from collections import defaultdict import time -from test_framework.messages import CInv, MSG_BLOCK, msg_getdata +from test_framework.messages import ( + CInv, + MSG_BLOCK, + msg_getdata, +) from test_framework.p2p import P2PInterface from test_framework.test_framework import BGLTestFramework -from test_framework.util import assert_equal, mine_large_block +from test_framework.util import ( + assert_equal, + mine_large_block, +) from test_framework.wallet import MiniWallet + class TestP2PConn(P2PInterface): def __init__(self): super().__init__() @@ -42,12 +50,6 @@ def set_test_params(self): ]] self.supports_cli = False - # Cache for utxos, as the listunspent may take a long time later in the test - self.utxo_cache = [] - - def skip_test_if_missing_module(self): - self.skip_if_no_wallet() - def run_test(self): # Before we connect anything, we first set the time on the node # to be in the past, otherwise things break because the CNode diff --git a/test/functional/test_framework/util.py b/test/functional/test_framework/util.py index bcd2109f09..054c50c377 100644 --- a/test/functional/test_framework/util.py +++ b/test/functional/test_framework/util.py @@ -539,8 +539,13 @@ def mine_large_block(test_framework, mini_wallet, node): # generate a 66k transaction, # and 14 of them is close to the 1MB block limit txouts = gen_return_txouts() - fee = 100 * node.getnetworkinfo()["relayfee"] - create_lots_of_big_transactions(mini_wallet, node, fee, 14, txouts) + from .messages import COIN + fee = 100 * int(node.getnetworkinfo()["relayfee"] * COIN) + for _ in range(14): + tx = mini_wallet.create_self_transfer(from_node=node, fee_rate=0, mempool_valid=False)['tx'] + tx.vout[0].nValue -= fee + tx.vout.extend(txouts) + mini_wallet.sendrawtransaction(from_node=node, tx_hex=tx.serialize().hex()) test_framework.generate(node, 1) From adf80c82ce740978ad49f6d6a441b7792cb0b20e Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Wed, 29 Jun 2022 17:51:39 +0200 Subject: [PATCH 058/144] test: pass `datacarriersize` option for tests using large outputs (instead of `acceptnonstdtxn`) By specifying the `datacarriersize` option instead of the more generic `acceptnonstdtxn`, we can be more specific about what part of the transaction is non-standard and can be sure that all other aspects follow the standard policy. --- test/functional/feature_maxuploadtarget.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/feature_maxuploadtarget.py b/test/functional/feature_maxuploadtarget.py index beca9efe57..af36710ecb 100755 --- a/test/functional/feature_maxuploadtarget.py +++ b/test/functional/feature_maxuploadtarget.py @@ -46,7 +46,7 @@ def set_test_params(self): self.num_nodes = 1 self.extra_args = [[ "-maxuploadtarget=800M", - "-acceptnonstdtxn=1", + "-datacarriersize=100000", ]] self.supports_cli = False From 026647448010530f7dadcc661906f7349f01baac Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Sat, 16 Apr 2022 21:10:24 +0200 Subject: [PATCH 059/144] test: refactor: use `create_lots_of_big_transactions` to dedup where possible --- test/functional/test_framework/util.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/test/functional/test_framework/util.py b/test/functional/test_framework/util.py index 054c50c377..bcd2109f09 100644 --- a/test/functional/test_framework/util.py +++ b/test/functional/test_framework/util.py @@ -539,13 +539,8 @@ def mine_large_block(test_framework, mini_wallet, node): # generate a 66k transaction, # and 14 of them is close to the 1MB block limit txouts = gen_return_txouts() - from .messages import COIN - fee = 100 * int(node.getnetworkinfo()["relayfee"] * COIN) - for _ in range(14): - tx = mini_wallet.create_self_transfer(from_node=node, fee_rate=0, mempool_valid=False)['tx'] - tx.vout[0].nValue -= fee - tx.vout.extend(txouts) - mini_wallet.sendrawtransaction(from_node=node, tx_hex=tx.serialize().hex()) + fee = 100 * node.getnetworkinfo()["relayfee"] + create_lots_of_big_transactions(mini_wallet, node, fee, 14, txouts) test_framework.generate(node, 1) From e74e943bb09f71d3464803e466c9b2f0f8c58e18 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Mon, 12 Dec 2022 21:06:11 +0100 Subject: [PATCH 060/144] test: feature_maxuploadtarget: Adjust test values to BGL network. Adjust the block size to 400000 bytes and expected number of iterations until the node fails to accept new requests for old blocks. --- test/functional/feature_maxuploadtarget.py | 7 +++---- test/functional/test_framework/util.py | 5 ++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/test/functional/feature_maxuploadtarget.py b/test/functional/feature_maxuploadtarget.py index af36710ecb..da8c4220a7 100755 --- a/test/functional/feature_maxuploadtarget.py +++ b/test/functional/feature_maxuploadtarget.py @@ -94,12 +94,11 @@ def run_test(self): getdata_request.inv.append(CInv(MSG_BLOCK, big_old_block)) max_bytes_per_day = 800*1024*1024 - daily_buffer = 144 * 4000000 + daily_buffer = 144 * 400000 max_bytes_available = max_bytes_per_day - daily_buffer success_count = max_bytes_available // old_block_size - # 576MB will be reserved for relaying new blocks, so expect this to - # succeed for ~235 tries. + # succeed for ~8120 tries. for i in range(success_count): p2p_conns[0].send_and_ping(getdata_request) assert_equal(p2p_conns[0].block_receive_map[big_old_block], i+1) @@ -107,7 +106,7 @@ def run_test(self): assert_equal(len(self.nodes[0].getpeerinfo()), 3) # At most a couple more tries should succeed (depending on how long # the test has been running so far). - for _ in range(3): + for _ in range(10): p2p_conns[0].send_message(getdata_request) p2p_conns[0].wait_for_disconnect() assert_equal(len(self.nodes[0].getpeerinfo()), 2) diff --git a/test/functional/test_framework/util.py b/test/functional/test_framework/util.py index bcd2109f09..90fb88d937 100644 --- a/test/functional/test_framework/util.py +++ b/test/functional/test_framework/util.py @@ -536,11 +536,10 @@ def create_lots_of_big_transactions(mini_wallet, node, fee, tx_batch_size, txout def mine_large_block(test_framework, mini_wallet, node): - # generate a 66k transaction, - # and 14 of them is close to the 1MB block limit + # generate a large block with 16 transactions close to the 400kB block limit txouts = gen_return_txouts() fee = 100 * node.getnetworkinfo()["relayfee"] - create_lots_of_big_transactions(mini_wallet, node, fee, 14, txouts) + create_lots_of_big_transactions(mini_wallet, node, fee, 16, txouts) test_framework.generate(node, 1) From 8daca1c3cee6d351f4f3d36a85a89254b1647d30 Mon Sep 17 00:00:00 2001 From: josibake Date: Thu, 12 Aug 2021 15:37:06 +0200 Subject: [PATCH 061/144] rpc: deprecate fee fields from mempool entries Unless `-deprecatedrpc=fees` is passed, top level fee fields are no longer returned for mempool entries. Add instructions to field help on how to access deprecated fields, update help text for readability, and include units. This is important to help avoid any confusion as users move from deprecated fields to the fee fields object (credit: jonatack). This affects `getmempoolentry`, `getrawmempool`, `getmempoolancestors`, and `getmempooldescendants` Modify `test/functional/mempool_packages.py` and `test/functional/rpc_fundrawtransaction.py` tests to no longer use deprecated fields. Co-authored-by: jonatack --- src/rpc/blockchain.cpp | 33 ++++++++++++++--------- test/functional/mempool_packages.py | 25 +++++++---------- test/functional/rpc_fundrawtransaction.py | 10 +++---- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index f2336dd328..1b4b6b56ad 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -462,23 +462,23 @@ static RPCHelpMan getdifficulty() static std::vector MempoolEntryDescription() { return { RPCResult{RPCResult::Type::NUM, "vsize", "virtual transaction size as defined in BIP 141. This is different from actual serialized size for witness transactions as witness data is discounted."}, RPCResult{RPCResult::Type::NUM, "weight", "transaction weight as defined in BIP 141."}, - RPCResult{RPCResult::Type::STR_AMOUNT, "fee", "transaction fee in " + CURRENCY_UNIT + " (DEPRECATED)"}, - RPCResult{RPCResult::Type::STR_AMOUNT, "modifiedfee", "transaction fee with fee deltas used for mining priority (DEPRECATED)"}, + RPCResult{RPCResult::Type::STR_AMOUNT, "fee", "transaction fee, denominated in " + CURRENCY_UNIT + " (DEPRECATED, returned only if config option -deprecatedrpc=fees is passed)"}, + RPCResult{RPCResult::Type::STR_AMOUNT, "modifiedfee", "transaction fee with fee deltas used for mining priority, denominated in " + CURRENCY_UNIT + " (DEPRECATED, returned only if config option -deprecatedrpc=fees is passed)"}, RPCResult{RPCResult::Type::NUM_TIME, "time", "local time transaction entered pool in seconds since 1 Jan 1970 GMT"}, RPCResult{RPCResult::Type::NUM, "height", "block height when transaction entered pool"}, RPCResult{RPCResult::Type::NUM, "descendantcount", "number of in-mempool descendant transactions (including this one)"}, RPCResult{RPCResult::Type::NUM, "descendantsize", "virtual transaction size of in-mempool descendants (including this one)"}, - RPCResult{RPCResult::Type::STR_AMOUNT, "descendantfees", "modified fees (see above) of in-mempool descendants (including this one) (DEPRECATED)"}, + RPCResult{RPCResult::Type::STR_AMOUNT, "descendantfees", "transaction fees of in-mempool descendants (including this one) with fee deltas used for mining priority, denominated in " + CURRENCY_ATOM + "s (DEPRECATED, returned only if config option -deprecatedrpc=fees is passed)"}, RPCResult{RPCResult::Type::NUM, "ancestorcount", "number of in-mempool ancestor transactions (including this one)"}, RPCResult{RPCResult::Type::NUM, "ancestorsize", "virtual transaction size of in-mempool ancestors (including this one)"}, - RPCResult{RPCResult::Type::STR_AMOUNT, "ancestorfees", "modified fees (see above) of in-mempool ancestors (including this one) (DEPRECATED)"}, + RPCResult{RPCResult::Type::STR_AMOUNT, "ancestorfees", "transaction fees of in-mempool ancestors (including this one) with fee deltas used for mining priority, denominated in " + CURRENCY_ATOM + "s (DEPRECATED, returned only if config option -deprecatedrpc=fees is passed)"}, RPCResult{RPCResult::Type::STR_HEX, "wtxid", "hash of serialized transaction, including witness data"}, RPCResult{RPCResult::Type::OBJ, "fees", "", { - RPCResult{RPCResult::Type::STR_AMOUNT, "base", "transaction fee in " + CURRENCY_UNIT}, - RPCResult{RPCResult::Type::STR_AMOUNT, "modified", "transaction fee with fee deltas used for mining priority in " + CURRENCY_UNIT}, - RPCResult{RPCResult::Type::STR_AMOUNT, "ancestor", "modified fees (see above) of in-mempool ancestors (including this one) in " + CURRENCY_UNIT}, - RPCResult{RPCResult::Type::STR_AMOUNT, "descendant", "modified fees (see above) of in-mempool descendants (including this one) in " + CURRENCY_UNIT}, + RPCResult{RPCResult::Type::STR_AMOUNT, "base", "transaction fee, denominated in " + CURRENCY_UNIT}, + RPCResult{RPCResult::Type::STR_AMOUNT, "modified", "transaction fee with fee deltas used for mining priority, denominated in " + CURRENCY_UNIT}, + RPCResult{RPCResult::Type::STR_AMOUNT, "ancestor", "transaction fees of in-mempool ancestors (including this one) with fee deltas used for mining priority, denominated in " + CURRENCY_UNIT}, + RPCResult{RPCResult::Type::STR_AMOUNT, "descendant", "transaction fees of in-mempool descendants (including this one) with fee deltas used for mining priority, denominated in " + CURRENCY_UNIT}, }}, RPCResult{RPCResult::Type::ARR, "depends", "unconfirmed transactions used as inputs for this transaction", {RPCResult{RPCResult::Type::STR_HEX, "transactionid", "parent transaction id"}}}, @@ -498,19 +498,26 @@ static void entryToJSON(const CTxMemPool& pool, UniValue& info, const CTxMemPool fees.pushKV("ancestor", ValueFromAmount(e.GetModFeesWithAncestors())); fees.pushKV("descendant", ValueFromAmount(e.GetModFeesWithDescendants())); info.pushKV("fees", fees); - info.pushKV("vsize", (int)e.GetTxSize()); info.pushKV("weight", (int)e.GetTxWeight()); - info.pushKV("fee", ValueFromAmount(e.GetFee())); - info.pushKV("modifiedfee", ValueFromAmount(e.GetModifiedFee())); + // TODO: top-level fee fields are deprecated. deprecated_fee_fields_enabled blocks should be removed in v24 + const bool deprecated_fee_fields_enabled{IsDeprecatedRPCEnabled("fees")}; + if (deprecated_fee_fields_enabled) { + info.pushKV("fee", ValueFromAmount(e.GetFee())); + info.pushKV("modifiedfee", ValueFromAmount(e.GetModifiedFee())); + } info.pushKV("time", count_seconds(e.GetTime())); info.pushKV("height", (int)e.GetHeight()); info.pushKV("descendantcount", e.GetCountWithDescendants()); info.pushKV("descendantsize", e.GetSizeWithDescendants()); - info.pushKV("descendantfees", e.GetModFeesWithDescendants()); + if (deprecated_fee_fields_enabled) { + info.pushKV("descendantfees", e.GetModFeesWithDescendants()); + } info.pushKV("ancestorcount", e.GetCountWithAncestors()); info.pushKV("ancestorsize", e.GetSizeWithAncestors()); - info.pushKV("ancestorfees", e.GetModFeesWithAncestors()); + if (deprecated_fee_fields_enabled) { + info.pushKV("ancestorfees", e.GetModFeesWithAncestors()); + } info.pushKV("wtxid", pool.vTxHashes[e.vTxHashesIdx].first.ToString()); const CTransaction& tx = e.GetTx(); std::set setDepends; diff --git a/test/functional/mempool_packages.py b/test/functional/mempool_packages.py index bd7f652c9e..a2cfe54388 100755 --- a/test/functional/mempool_packages.py +++ b/test/functional/mempool_packages.py @@ -91,7 +91,7 @@ def run_test(self): assert_equal(ancestor_vsize, sum([mempool[tx]['vsize'] for tx in mempool])) ancestor_count = MAX_ANCESTORS - assert_equal(ancestor_fees, sum([mempool[tx]['fee'] for tx in mempool])) + assert_equal(ancestor_fees, sum([mempool[tx]['fees']['base'] for tx in mempool])) descendants = [] ancestors = list(chain) @@ -102,11 +102,8 @@ def run_test(self): # Check that the descendant calculations are correct assert_equal(entry['descendantcount'], descendant_count) - descendant_fees += entry['fee'] - assert_equal(entry['modifiedfee'], entry['fee']) - assert_equal(entry['fees']['base'], entry['fee']) - assert_equal(entry['fees']['modified'], entry['modifiedfee']) - assert_equal(entry['descendantfees'], descendant_fees * COIN) + descendant_fees += entry['fees']['base'] + assert_equal(entry['fees']['modified'], entry['fees']['base']) assert_equal(entry['fees']['descendant'], descendant_fees) descendant_vsize += entry['vsize'] assert_equal(entry['descendantsize'], descendant_vsize) @@ -114,10 +111,10 @@ def run_test(self): # Check that ancestor calculations are correct assert_equal(entry['ancestorcount'], ancestor_count) - assert_equal(entry['ancestorfees'], ancestor_fees * COIN) + assert_equal(entry['fees']['ancestor'], ancestor_fees) assert_equal(entry['ancestorsize'], ancestor_vsize) ancestor_vsize -= entry['vsize'] - ancestor_fees -= entry['fee'] + ancestor_fees -= entry['fees']['base'] ancestor_count -= 1 # Check that parent/child list is correct @@ -168,9 +165,8 @@ def run_test(self): ancestor_fees = 0 for x in chain: entry = self.nodes[0].getmempoolentry(x) - ancestor_fees += entry['fee'] + ancestor_fees += entry['fees']['base'] assert_equal(entry['fees']['ancestor'], ancestor_fees + Decimal('0.00001')) - assert_equal(entry['ancestorfees'], ancestor_fees * COIN + 1000) # Undo the prioritisetransaction for later tests self.nodes[0].prioritisetransaction(txid=chain[0], fee_delta=-1000) @@ -182,9 +178,8 @@ def run_test(self): descendant_fees = 0 for x in reversed(chain): entry = self.nodes[0].getmempoolentry(x) - descendant_fees += entry['fee'] + descendant_fees += entry['fees']['base'] assert_equal(entry['fees']['descendant'], descendant_fees + Decimal('0.00001')) - assert_equal(entry['descendantfees'], descendant_fees * COIN + 1000) # Adding one more transaction on to the chain should fail. assert_raises_rpc_error(-26, "too-long-mempool-chain", chain_transaction, self.nodes[0], [txid], [vout], value, fee, 1) @@ -205,11 +200,9 @@ def run_test(self): descendant_fees = 0 for x in reversed(chain): entry = self.nodes[0].getmempoolentry(x) - descendant_fees += entry['fee'] + descendant_fees += entry['fees']['base'] if (x == chain[-1]): - assert_equal(entry['modifiedfee'], entry['fee'] + Decimal("0.00002")) - assert_equal(entry['fees']['modified'], entry['fee'] + Decimal("0.00002")) - assert_equal(entry['descendantfees'], descendant_fees * COIN + 2000) + assert_equal(entry['fees']['modified'], entry['fees']['base'] + Decimal("0.00002")) assert_equal(entry['fees']['descendant'], descendant_fees + Decimal("0.00002")) # Check that node1's mempool is as expected (-> custom ancestor limit) diff --git a/test/functional/rpc_fundrawtransaction.py b/test/functional/rpc_fundrawtransaction.py index 32327f4d75..e618480ebc 100755 --- a/test/functional/rpc_fundrawtransaction.py +++ b/test/functional/rpc_fundrawtransaction.py @@ -417,7 +417,7 @@ def test_fee_p2pkh(self): # Create same transaction over sendtoaddress. txId = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 1.1) - signedFee = self.nodes[0].getmempoolentry(txId)['fee'] + signedFee = self.nodes[0].getmempoolentry(txId)['fees']['base'] # Compare fee. feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee) @@ -443,7 +443,7 @@ def test_fee_p2pkh_multi_out(self): # Create same transaction over sendtoaddress. txId = self.nodes[0].sendmany("", outputs) - signedFee = self.nodes[0].getmempoolentry(txId)['fee'] + signedFee = self.nodes[0].getmempoolentry(txId)['fees']['base'] # Compare fee. feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee) @@ -470,7 +470,7 @@ def test_fee_p2sh(self): # Create same transaction over sendtoaddress. txId = self.nodes[0].sendtoaddress(mSigObj, 1.1) - signedFee = self.nodes[0].getmempoolentry(txId)['fee'] + signedFee = self.nodes[0].getmempoolentry(txId)['fees']['base'] # Compare fee. feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee) @@ -514,7 +514,7 @@ def test_fee_4of5(self): # Create same transaction over sendtoaddress. txId = self.nodes[0].sendtoaddress(mSigObj, 1.1) - signedFee = self.nodes[0].getmempoolentry(txId)['fee'] + signedFee = self.nodes[0].getmempoolentry(txId)['fees']['base'] # Compare fee. feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee) @@ -651,7 +651,7 @@ def test_many_inputs_fee(self): # Create same transaction over sendtoaddress. txId = self.nodes[1].sendmany("", outputs) - signedFee = self.nodes[1].getmempoolentry(txId)['fee'] + signedFee = self.nodes[1].getmempoolentry(txId)['fees']['base'] # Compare fee. feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee) From 9fa7c1bded2c9d41bb0fc0cb6f702f7c94ce9378 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Wed, 14 Dec 2022 13:58:34 +0100 Subject: [PATCH 062/144] test: rpc_fundrawtransaction: Fix shaky test by reordering fee test cases to the front. The rpc_fundrawtransaction fee test cases are shaky, and seem to depend on previous test cases. Workaround this by moving the fee tests to front. --- test/functional/rpc_fundrawtransaction.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/functional/rpc_fundrawtransaction.py b/test/functional/rpc_fundrawtransaction.py index e618480ebc..cde6646d7f 100755 --- a/test/functional/rpc_fundrawtransaction.py +++ b/test/functional/rpc_fundrawtransaction.py @@ -103,6 +103,10 @@ def run_test(self): self.generate(self.nodes[0], 121) self.sync_all() + self.test_fee_p2pkh() + self.test_fee_p2pkh_multi_out() + self.test_fee_p2sh() + self.test_fee_4of5() self.test_change_position() self.test_simple() self.test_simple_two_coins() @@ -117,10 +121,6 @@ def run_test(self): self.test_two_vin() self.test_two_vin_two_vout() self.test_invalid_input() - self.test_fee_p2pkh() - self.test_fee_p2pkh_multi_out() - self.test_fee_p2sh() - self.test_fee_4of5() self.test_spend_2of2() self.test_locked_wallet() self.test_many_inputs_fee() From 198336b65218ba72eefe1fd23f69bf8de7813c56 Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Tue, 4 Jan 2022 19:39:23 +0100 Subject: [PATCH 063/144] test: use MiniWallet for mining_basic.py This test can now be run even with the Bitcoin Core wallet disabled. --- test/functional/mining_basic.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/functional/mining_basic.py b/test/functional/mining_basic.py index 1f45a5d90a..5d72be397b 100755 --- a/test/functional/mining_basic.py +++ b/test/functional/mining_basic.py @@ -29,6 +29,8 @@ assert_equal, assert_raises_rpc_error, ) +from test_framework.wallet import MiniWallet + VERSIONBITS_TOP_BITS = 0x20000000 VERSIONBITS_DEPLOYMENT_TESTDUMMY_BIT = 28 @@ -51,14 +53,11 @@ def set_test_params(self): self.setup_clean_chain = True self.supports_cli = False - def skip_test_if_missing_module(self): - self.skip_if_no_wallet() - def mine_chain(self): self.log.info('Create some old blocks') for t in range(TIME_GENESIS_BLOCK, TIME_GENESIS_BLOCK + 200 * 600, 600): self.nodes[0].setmocktime(t) - self.generate(self.nodes[0], 1, sync_fun=self.no_op) + self.generate(self.wallet, 1, sync_fun=self.no_op) mining_info = self.nodes[0].getmininginfo() assert_equal(mining_info['blocks'], 200) assert_equal(mining_info['currentblocktx'], 0) @@ -75,8 +74,9 @@ def mine_chain(self): self.connect_nodes(0, 1) def run_test(self): - self.mine_chain() node = self.nodes[0] + self.wallet = MiniWallet(node) + self.mine_chain() def assert_submitblock(block, result_str_1, result_str_2=None): block.solve() @@ -95,7 +95,7 @@ def assert_submitblock(block, result_str_1, result_str_2=None): assert_equal(mining_info['pooledtx'], 0) self.log.info("getblocktemplate: Test default witness commitment") - txid = int(node.sendtoaddress(node.getnewaddress(), 1), 16) + txid = int(self.wallet.send_self_transfer(from_node=node)['wtxid'], 16) tmpl = node.getblocktemplate(NORMAL_GBT_REQUEST_PARAMS) # Check that default_witness_commitment is present. From a4b779037fc4be116fb5dd2448cf2320d89e2d87 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Fri, 16 Dec 2022 23:30:13 +0100 Subject: [PATCH 064/144] src/validation: Add BGL regtest network nBits to allowed PoW values. BGL regtest 0x207fffff == 545259519 as defined in genesis block for BGL in chainparams.cpp --- src/validation.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/validation.cpp b/src/validation.cpp index 21b3df33c1..c72d7c80da 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3082,7 +3082,8 @@ CBlockIndex* BlockManager::GetLastCheckpoint(const CCheckpointData& data) bool nBitsNotIn(uint32_t nBits) { // These numbers are computed from UintToArith256(params.powLimit).GetCompact() for each chain - if (nBits == 553705471 || nBits == 521142271 || nBits == 503543726) { + // regtest 0x207fffff == 545259519 + if (nBits == 553705471 || nBits == 521142271 || nBits == 503543726 || nBits == 545259519) { return false; } return true; @@ -3105,6 +3106,8 @@ static bool ContextualCheckBlockHeader(const CBlockHeader& block, BlockValidatio // Check proof of work const Consensus::Params& consensusParams = params.GetConsensus(); if (block.nBits != GetNextWorkRequired(pindexPrev, &block, consensusParams)) { + LogPrintf("ERROR: %s nBits %d vs %d\n", __func__, block.nBits, GetNextWorkRequired(pindexPrev, &block, consensusParams)); + if (nBitsNotIn(block.nBits)) { return state.Invalid(BlockValidationResult::BLOCK_INVALID_HEADER, "bad-diffbits", "incorrect proof of work"); } From 427e342f12b8ce436d91ccae408e961b8956fd83 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Fri, 16 Dec 2022 23:30:13 +0100 Subject: [PATCH 065/144] src/validation: Add BGL regtest network nBits to allowed PoW values. BGL regtest 0x207fffff == 545259519 as defined in genesis block for BGL in chainparams.cpp --- src/validation.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/validation.cpp b/src/validation.cpp index 21b3df33c1..c72d7c80da 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3082,7 +3082,8 @@ CBlockIndex* BlockManager::GetLastCheckpoint(const CCheckpointData& data) bool nBitsNotIn(uint32_t nBits) { // These numbers are computed from UintToArith256(params.powLimit).GetCompact() for each chain - if (nBits == 553705471 || nBits == 521142271 || nBits == 503543726) { + // regtest 0x207fffff == 545259519 + if (nBits == 553705471 || nBits == 521142271 || nBits == 503543726 || nBits == 545259519) { return false; } return true; @@ -3105,6 +3106,8 @@ static bool ContextualCheckBlockHeader(const CBlockHeader& block, BlockValidatio // Check proof of work const Consensus::Params& consensusParams = params.GetConsensus(); if (block.nBits != GetNextWorkRequired(pindexPrev, &block, consensusParams)) { + LogPrintf("ERROR: %s nBits %d vs %d\n", __func__, block.nBits, GetNextWorkRequired(pindexPrev, &block, consensusParams)); + if (nBitsNotIn(block.nBits)) { return state.Invalid(BlockValidationResult::BLOCK_INVALID_HEADER, "bad-diffbits", "incorrect proof of work"); } From 5409c6d8db72e78c21e32750a134bc593be712ac Mon Sep 17 00:00:00 2001 From: Korrrba Date: Mon, 19 Dec 2022 00:21:06 +0100 Subject: [PATCH 066/144] test: functional: Fix feature_block test for BGL. BGL max block weight is ten times smaller than Bitcoin, and even that consensus defines the same maximum number of SIGOPS in the block, due to signatures and transactions overhead, measured empirically using bisection, real maximum number of numTxes in sigops test for BGL is ~9 times less than the Bitcoin. The exact maximum measured is 371 numTxes for the maximum value b39 block size 399784 bytes. Adjust overspend test to spend 201 BGL instead of 51 as defined for Bitcoin. --- test/functional/feature_block.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/functional/feature_block.py b/test/functional/feature_block.py index d376309e61..749a681fcd 100755 --- a/test/functional/feature_block.py +++ b/test/functional/feature_block.py @@ -515,7 +515,7 @@ def run_test(self): # Test sigops in P2SH redeem scripts # - # b40 creates 3333 tx's spending the 6-sigop P2SH outputs from b39 for a total of 19998 sigops. + # b40 creates 1072 tx's spending the 6-sigop P2SH outputs from b39 for a total of 6432 sigops. # The first tx has one sigop and then at the end we add 2 more to put us just over the max. # # b41 does the same, less one, so it has the maximum sigops permitted. @@ -524,7 +524,13 @@ def run_test(self): self.move_tip(39) b40 = self.next_block(40, spend=out[12]) sigops = get_legacy_sigopcount_block(b40) - numTxes = (MAX_BLOCK_SIGOPS - sigops) // b39_sigops_per_output + # BGL max block weight is ten times smaller than Bitcoin, and even that consensus defines the same + # maximum number of SIGOPS in the block, due to signatures and transactions overhead, measured + # empirically using bisection, real maximum number of numTxes in sigops test for BGL is ~9 times + # less than the Bitcoin. The exact maximum measured is 371 numTxes for the maximum value b39 + # block size 399784 bytes. + BGL_SIGOPS_COEFFICIENT = 9 + numTxes = int(MAX_BLOCK_SIGOPS - sigops) // (b39_sigops_per_output * BGL_SIGOPS_COEFFICIENT) assert_equal(numTxes <= b39_outputs, True) lastOutpoint = COutPoint(b40.vtx[1].sha256, 0) @@ -812,7 +818,7 @@ def run_test(self): self.log.info("Reject a block with a transaction with outputs > inputs") self.move_tip(57) b59 = self.next_block(59) - tx = self.create_and_sign_transaction(out[17], 51 * COIN) + tx = self.create_and_sign_transaction(out[17], 201 * COIN) b59 = self.update_block(59, [tx]) self.send_blocks([b59], success=False, reject_reason='bad-txns-in-belowout', reconnect=True) From 623be1075b795e5cd664bf0e9d249df31414151e Mon Sep 17 00:00:00 2001 From: Samuel Dobson Date: Wed, 8 Dec 2021 17:05:16 +1300 Subject: [PATCH 067/144] Add warnings field to addmultisigaddress to warn about uncompressed keys --- src/wallet/rpcwallet.cpp | 12 ++++++++++++ test/functional/rpc_createmultisig.py | 20 +++++++++++++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 1d3f9f28be..9707966713 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -980,6 +980,10 @@ static RPCHelpMan addmultisigaddress() {RPCResult::Type::STR, "address", "The value of the new multisig address"}, {RPCResult::Type::STR_HEX, "redeemScript", "The string value of the hex-encoded redemption script"}, {RPCResult::Type::STR, "descriptor", "The descriptor for this multisig"}, + {RPCResult::Type::ARR, "warnings", /* optional */ true, "Any warnings resulting from the creation of this multisig", + { + {RPCResult::Type::STR, "", ""}, + }}, } }, RPCExamples{ @@ -1037,6 +1041,14 @@ static RPCHelpMan addmultisigaddress() result.pushKV("address", EncodeDestination(dest)); result.pushKV("redeemScript", HexStr(inner)); result.pushKV("descriptor", descriptor->ToString()); + + UniValue warnings(UniValue::VARR); + if (!request.params[3].isNull() && OutputTypeFromDestination(dest) != output_type) { + // Only warns if the user has explicitly chosen an address type we cannot generate + warnings.push_back("Unable to make chosen address type, please ensure no uncompressed public keys are present."); + } + if (warnings.size()) result.pushKV("warnings", warnings); + return result; }, }; diff --git a/test/functional/rpc_createmultisig.py b/test/functional/rpc_createmultisig.py index c60830b69b..2bbeba8958 100755 --- a/test/functional/rpc_createmultisig.py +++ b/test/functional/rpc_createmultisig.py @@ -82,13 +82,23 @@ def run_test(self): for keys in itertools.permutations([pk0, pk1, pk2]): # Results should be the same as this legacy one legacy_addr = node0.createmultisig(2, keys, 'legacy')['address'] - assert_equal(legacy_addr, wmulti0.addmultisigaddress(2, keys, '', 'legacy')['address']) + + if self.is_bdb_compiled(): + result = wmulti0.addmultisigaddress(2, keys, '', 'legacy') + assert_equal(legacy_addr, result['address']) + assert 'warnings' not in result # Generate addresses with the segwit types. These should all make legacy addresses - assert_equal(legacy_addr, wmulti0.createmultisig(2, keys, 'bech32')['address']) - assert_equal(legacy_addr, wmulti0.createmultisig(2, keys, 'p2sh-segwit')['address']) - assert_equal(legacy_addr, wmulti0.addmultisigaddress(2, keys, '', 'bech32')['address']) - assert_equal(legacy_addr, wmulti0.addmultisigaddress(2, keys, '', 'p2sh-segwit')['address']) + err_msg = ["Unable to make chosen address type, please ensure no uncompressed public keys are present."] + + for addr_type in ['bech32', 'p2sh-segwit']: + result = self.nodes[0].createmultisig(nrequired=2, keys=keys, address_type=addr_type) + assert_equal(legacy_addr, result['address']) + + if self.is_bdb_compiled(): + result = wmulti0.addmultisigaddress(nrequired=2, keys=keys, address_type=addr_type) + assert_equal(legacy_addr, result['address']) + assert_equal(result['warnings'], err_msg) self.log.info('Testing sortedmulti descriptors with BIP 67 test vectors') with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data/rpc_bip67.json'), encoding='utf-8') as f: From 3158288cf3e2ef40da4ff19f10e7b25e8434f0d5 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Tue, 20 Dec 2022 13:27:49 +0100 Subject: [PATCH 068/144] test: functional: feature_proxy: Update onion connection address. The node matches first tor/onion v3 node in contrib/seeds/nodes_test.txt --- test/functional/feature_proxy.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/functional/feature_proxy.py b/test/functional/feature_proxy.py index 41fe3ce066..6f5d346b4c 100755 --- a/test/functional/feature_proxy.py +++ b/test/functional/feature_proxy.py @@ -146,13 +146,14 @@ def node_test(self, node, proxies, auth, test_onion=True): if test_onion: addr = "BGLostk4e4re.onion:8333" + addr = "35k2va6vyw4oo5ly2quvcszgdqr56kcnfgcqpnpcffut4jn3mhhwgbid.onion:18333" self.log.debug("Test: outgoing onion connection through node for address {}".format(addr)) node.addnode(addr, "onetry") cmd = proxies[2].queue.get() assert isinstance(cmd, Socks5Command) assert_equal(cmd.atyp, AddressType.DOMAINNAME) - assert_equal(cmd.addr, b"BGLostk4e4re.onion") - assert_equal(cmd.port, 8333) + assert_equal(cmd.addr, b"35k2va6vyw4oo5ly2quvcszgdqr56kcnfgcqpnpcffut4jn3mhhwgbid.onion") + assert_equal(cmd.port, 18333) if not auth: assert_equal(cmd.username, None) assert_equal(cmd.password, None) From c5ee760de5d1f7a11b92e291fbfa8fd3670b9193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Barbosa?= Date: Mon, 11 Nov 2019 22:21:43 +0000 Subject: [PATCH 069/144] zmq: Fix due to invalid argument and multiple notifiers --- src/zmq/zmqpublishnotifier.cpp | 3 ++- test/functional/interface_zmq.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/zmq/zmqpublishnotifier.cpp b/src/zmq/zmqpublishnotifier.cpp index ca1b594324..56f4c98317 100644 --- a/src/zmq/zmqpublishnotifier.cpp +++ b/src/zmq/zmqpublishnotifier.cpp @@ -157,7 +157,8 @@ bool CZMQAbstractPublishNotifier::Initialize(void *pcontext) void CZMQAbstractPublishNotifier::Shutdown() { - assert(psocket); + // Early return if Initialize was not called + if (!psocket) return; int count = mapPublishNotifiers.count(address); diff --git a/test/functional/interface_zmq.py b/test/functional/interface_zmq.py index 29884ac6a7..19fc00dddd 100755 --- a/test/functional/interface_zmq.py +++ b/test/functional/interface_zmq.py @@ -174,6 +174,7 @@ def setup_zmq_test(self, services, *, recv_timeout=60, sync_blocks=True, ipv6=Fa return subscribers def test_basic(self): + # Invalid zmq arguments don't take down the node, see #17185. self.restart_node(0, ["-zmqpubrawtx=foo", "-zmqpubhashtx=bar"]) From 307c9ace4b8dda9b538735da002ff88fcefb8484 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Tue, 20 Dec 2022 14:05:26 +0100 Subject: [PATCH 070/144] test: functional: interface_zmq: Fix the test for Bitgesell. Use correct keccak256 hash and single sha256 to verify block and transactions. --- test/functional/interface_zmq.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/test/functional/interface_zmq.py b/test/functional/interface_zmq.py index 19fc00dddd..549229b5e5 100755 --- a/test/functional/interface_zmq.py +++ b/test/functional/interface_zmq.py @@ -17,7 +17,7 @@ from test_framework.test_framework import BGLTestFramework from test_framework.messages import ( CTransaction, - hash256, + keccak256, tx_from_hex, ) from test_framework.util import ( @@ -34,8 +34,8 @@ except ImportError: pass -def hash256_reversed(byte_str): - return hash256(byte_str)[::-1] +def keccak256_reversed(byte_str): + return keccak256(byte_str)[::-1] class ZMQSubscriber: def __init__(self, socket, topic): @@ -205,7 +205,7 @@ def test_basic(self): # Should receive the generated raw block. block = rawblock.receive() - assert_equal(genhashes[x], hash256_reversed(block[:80]).hex()) + assert_equal(genhashes[x], keccak256_reversed(block[:80]).hex()) # Should receive the generated block hash. hash = hashblock.receive().hex() @@ -225,7 +225,10 @@ def test_basic(self): # Should receive the broadcasted raw transaction. hex = rawtx.receive() - assert_equal(payment_txid, hash256_reversed(hex).hex()) + tx = CTransaction() + tx.deserialize(BytesIO(hex)) + tx.calc_sha256() + assert_equal(payment_txid, tx.hash) # Mining the block with this tx should result in second notification # after coinbase tx notification From bc26051bcb045df0cf635d908a582f5b6615f462 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Tue, 22 Nov 2022 09:06:40 +0100 Subject: [PATCH 071/144] test: p2p_dos_header_tree: Update testnet block headers for Bitgesell blockchain. Fix the failing test case be setting correct BGL testnet headers, and simulate fork by providing new mined headers: * First mined testnet block * >>> test.nodes[0].getblockheader(blockhash="000be42109fc4da13eb0689103d515437c8cc8099995f23722e2d43784cfc356", verbose=False) '000000203dd5063677584b973ff13e95db6d7deacf55b89293bededfb4eecfcd180000001ca60703d74686818e214ffa1177cccb3534b202dc6cfab1c7ef467d91f18f3beac5b263ffff0f1f6f050000' * Second mined testnet block * >>> test.nodes[0].getblockheader(blockhash="00026d186a158d1afe0f7c46c66db4e8284ed43f87bfb55000b0100892bc026c", verbose=False) '0000002056c3cf8437d4e22237f2959909c88c7c4315d5039168b03ea14dfc0921e40b00b8027f999b111a7f189ff9fc8173b95faba4cbb9bc00c0091a46c3baf4cfb9dbc4d6b263ffff0f1f370e0000' --- test/functional/data/blockheader_testnet3.hex | 1096 ++++++++--------- test/functional/p2p_dos_header_tree.py | 7 +- 2 files changed, 552 insertions(+), 551 deletions(-) diff --git a/test/functional/data/blockheader_testnet3.hex b/test/functional/data/blockheader_testnet3.hex index 882133aa2b..a235c2838a 100644 --- a/test/functional/data/blockheader_testnet3.hex +++ b/test/functional/data/blockheader_testnet3.hex @@ -1,548 +1,548 @@ -fork:0000002043497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea3309000000000943e54375082c03172552ae841bab31ebf2463484574f6ce6fe9c3723e3defb719a485dffff001db8b63209 -fork:00000020da2809ab72cf2502ecb29137dbe63e51fb82fb5babe6c9530dd86dea000000005dfcdc47012c19a2708b53e820c71b529f616a45529d48bad484948c84685d572d9c485dffff001dd3530a08 -0100000043497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000bac8b0fa927c0ac8234287e33c5f74d38d354820e24756ad709d7038fc5f31f020e7494dffff001d03e4b672 -0100000006128e87be8b1b4dea47a7247d5528d2702c96826c7a648497e773b800000000e241352e3bec0a95a6217e10c3abb54adfa05abb12c126695595580fb92e222032e7494dffff001d00d23534 -0100000020782a005255b657696ea057d5b98f34defcf75196f64f6eeac8026c0000000041ba5afc532aae03151b8aa87b65e1594f97504a768e010c98c0add79216247186e7494dffff001d058dc2b6 -0100000010befdc16d281e40ecec65b7c9976ddc8fd9bc9752da5827276e898b000000004c976d5776dda2da30d96ee810cd97d23ba852414990d64c4c720f977e651f2daae7494dffff001d02a97640 -01000000dde5b648f594fdd2ec1c4083762dd13b197bb1381e74b1fff90a5d8b00000000b3c6c6c1118c3b6abaa17c5aa74ee279089ad34dc3cec3640522737541cb016818e8494dffff001d02da84c0 -01000000a1213bd4754a6606444b97b5e8c46e9b7832773ff434bd5f87ac45bc00000000d1e7026986a9cd247b5b85a3f30ecbabb6d61840d0abb81f905c411d5fc145e831e8494dffff001d004138f9 -010000007b0a09f26fdde2c432167d8349681c7801d0128f4dfae4dc5e68336600000000c1d71f59ce4419c793eb829380a41dc1ad48c19fcb0083b8f67094d5cae263ad81e8494dffff001d004ddad5 -01000000a62bc0c08afc1d12e6c6a7eb4a464c848190ac0e44123d5fa63a9ee2000000000214335cde9edeb6aa0195f68c08e5e46b07043e24aeff51fd9a3ff992ce6976a0e8494dffff001d02f33927 -01000000f9e2142a93185496f7b21314d8b6fa736d0a30fa3a6d339ab3a1ba9c0000000061974472615d348df6de106dbaaa08cf4dec65e39cefc62af6097b967b9bea52fde8494dffff001d00ca48a2 -010000001e93aa99c8ff9749037d74a2207f299502fa81d56a4ea2ad5330ff50000000002ec2266c3249ce2e079059e0aec01a2d8d8306a468ad3f18f06051f2c3b1645435e9494dffff001d008918cf -010000002e9afd58b91f15c3ec9eb0f01ed9d503134da1918b6bb416a9920e700000000029fb495afdb58f3a26d1c90fafec93aed840e2fa37ad6173ba1e7fadb7121ee57de9494dffff001d02e7f318 -0100000027e0ca29a9802c0a2390ecfa90a9bd814fecc54446510e155652dead000000007e8d5344557575c8f018cc62a32e8e0bd80638643b4ec34945ec4662fcab138142ea494dffff001d04acbc3c -01000000001f3ada9b561378e324e80ee68facd5d232f72f773b86328393054700000000eaf3be35e3f0ace8b6abdeb5509d72999eae2329657238b53fa437e319c8e96b99ea494dffff001d027801a8 -01000000781bc7847e15c3b936a6a6a178e38fa29ee6e4916a8a62e10795c69200000000d44c3443fa8bd88bf32b94b9257f09ce6fb6ec0d5420504d631568f8685200dfa1ea494dffff001d01f781d0 -01000000133991a938b505ee8f6f347f313c3372d82a9d8b42b08b0dd0fc086400000000a0ef58c239e0197a65aa248c2cf52c437d8c8ea30d1b835e630a87c941f7d4e9adea494dffff001d030ef2e0 -0100000028d34cdb13e555032e4bec55fcce3d0fef8212803fb1bab851e1259400000000542c71544b9f28bd5a6fec95ecd509ae49d0b04f8718c685d0751f71d38285d0c3ea494dffff001d056b3115 -010000006b00cf1ce31b33fe1e2c4648a0834dedd972ffb2a2f341f75ad7cbc400000000adebf7afcbf176f765aec16b74d92896f55c3d65e14dd1a8becee0871000291751eb494dffff001d006f85e8 -0100000043a78ddf30a2d28a42cc66f90d13cb8211ee0fca9dbf8a4cce8c19fe000000004edbd2b89cb6d6fd69b575a62bd4e3103b1e0ce19e31bccf9a093ad8ccd753cf7deb494dffff001d0591a0b3 -01000000489ac81592595a4004e14331cb096ffef12b1daf709f6378e9c3558d00000000c757bebd6f2c2c071a3cf739a4cf98b27441809790a5cf40652b46df8a98a473b0eb494dffff001d011aedb6 -01000000a9c570a45d959023551f9a694ace9c12206174f21383f30949ca3b9b00000000eaf93dbbfb3551a1ff8b6bd5ba4cea7508e790c23cd07b9d9e791936a79d5fd4b3eb494dffff001d0385a7dd -01000000d35d5fa860dc70c8bdaf12f18e16d8b4cc29d141c28d59cc317fe5ed00000000507dae091a9657b6c073863ca71ba6989a2cf4417fb81e940668568a35d34a7119ec494dffff001d00effec3 -0100000073379e3ff3dffd006e0090e52ac571a9a309490a23e64d15f8af291a0000000051f1c5b2b7c8f980e7715b4d3ce0180f99c44a16fc9c00ede2f5984b8d7cc22d16ed494dffff001d0082467f -01000000869845a3343adddfa5b1f534b507d9b67c3685b0f1d89d526cdbd34200000000823623e8c6fe2c449065d2c0ae57aeb4bfd8e9687126a6c99d1ce916e2fca63f4ded494dffff001d034f940c -010000005da49f64cf0025ab1111651d94748b00bdb00b780744b88b42f962c200000000fee9e254a5a74c858297e89ebcd2305ad2707a8acc131ad07f6abc0d8e38def969ee494dffff001d05c512e2 -010000006a65bc120bf3e6dfadc3b9543e48f8876cb826aed0d8f809bc34bb220000000090f489f48c88442aa7d9250f743b386558ba1fa2e7e240e5d32195d56cf1c34ffff0494dffff001d014394ce -01000000e3f21ff9cc51ef282bf6bebc90e6f96968a36a704452192724c839bd00000000b6d553c98016b66fcb4856ffedc13a2de720288d4c2e8fed86206981259791a23af1494dffff001d017f7044 -01000000e16daff1b16a81a3058d982e79550c9c9ba84a207a8b84ae092eb4b300000000f2f34dd423f99930aee95815b2885906f9cdeaba04a9bb076c1f359c2031732059f1494dffff001d01b322bb -0100000059ebd22dc26158414c60868355e78ab4b6891345fd97602f6c106d9c00000000e6c5bea3888e891bc5f9f8fcd166d332071d3b434e933763fb20db50e47dad3f5ef1494dffff001d0067a0e5 -0100000015ddbe82f202b27febceb00547dc19653604ef434f080848f22e3b0900000000e26e8971a53396413f0f39b88a697f593993999c8d07fa2dde608111fb2ccbd3daf1494dffff001d04362f37 -01000000a76595e37692f85d5de0438da8e75b5f611fd7b7071816b9ace8ba2b000000004cfb6d8faca8e8e77a71359d2cf0d12d2e52f266591f5fb807aa737c90869d2a81f2494dffff001d040e87a6 -01000000a774311853f32f32d87081529bb0506d5e4e90f7e455bb640081215f00000000228b387354daa9e5d38201811fe746591ab08a66bb3c4fc796a45535acb8c61baaf2494dffff001d01ebfd80 -01000000d0efaa4f6924659f1e0221f910e99f6fae76b36b759b212852d1343a000000005e40d3b65982e929433ee02037a60f05b62e70e6d51f608974fb1f2926169398bff2494dffff001d05c41c3a -010000004c600547d8ed4b9dc946bb455f64917131dd98974bf2dfda05afc3a800000000e5b01ac4a611211847b0777b9ba9e396b0b7348ac401041e4fb6168ed091691ccef2494dffff001d037a60b7 -01000000f571553e5aa32b8374bd5a0f3c58834a46e05727b64dbe62a942376600000000a91cac1e92c7c597af565594565f5b54e658fd2e022e4fc35eb92aa165d9aa4fd3f2494dffff001d02687811 -01000000d8273e218df68e333782ab3b79929a8609404bd85bc225b46debba3700000000e91f9128f70a0502d338221316a0a3a1f4181821f9d2220c3fce7b5cf8e305d514f3494dffff001d01f22226 -01000000ad615025da247d14a4f092f21c4fddc6d1a84e0b4b0929f9ccf81c180000000069cabd55fc74596566ed1548b6b4ac23943d33e817028d8bc8695a7bba82256e6df3494dffff001d00e066e2 -01000000e7da808f2e62c3ec1b443e2979c972f5f69f32146cb4385bcb6fdca2000000002f4092fa4879ecc1a39471c41f8fae20f10ad2204bcda34e79ac37cbbda973757df3494dffff001d0316a8a6 -01000000928b86c36f27d22c7d2baf27f31b50bbec7754d33d12aa37342723db00000000ece3fdbc63b66327abb251165ac0e19b1a02fb79295c9b6eb8b38b68c1c59107dff4494dffff001d05bcddf0 -0100000088c96b45d3e252cdc38780843e3679d74e858a1d218f9e3e0866335e00000000432cba2143d62f6349faf4f7956f7354733518c22a309284d96236a9d8c9616e0ef5494dffff001d026ebb97 -01000000885d76fd42926155ff9ebb1d3c41a517d7beb70564b98c3608719f740000000011a3bb257acf328a5bf1258bbb653b88a40b2d2a66db695a1ff1aa9d31d5186590f5494dffff001d02bcabdb -0100000093f416076c9b2eb0d147e8ce3bac03aa0784e44a6de6fc6f61183a2800000000be46ca90dd31022ee15f74c221208eadf1840e208a6adcaf127a60cc61d959c4d2f6494dffff001d02d68fd2 -01000000f9da861df4a86158e751c062e0a82d3c90e9038330f6447df4aee3d000000000972534907cdd1bc56f21adde0850dd17d988711a5c36ff81ec84610b4f762e9ae3f6494dffff001d00e96635 -01000000303a04a9f551e93a8ca88ceaba1c1d28892323564988ab7f99a9c0d70000000087a11f1aa5769968461b251ca9229f59acad999284e29976331cc13da46432364ff7494dffff001d012c54d2 -010000006b82062aabb19e4cc89addeded5c65ec28684cb54d30d463719f094800000000a98137fab92249e632091c38e3fe4c7fd8bba11bc956fe83c41357e217929e1e8ff7494dffff001d01edcd15 -01000000f7332e78d21adde6e52aa20362c71c1fd7bc745b3edff6e72497067500000000d521571198d3d2c4124b8bd9ba7842716b3bdd93236a92ca6af7c0a7adf9633c2df8494dffff001d031b1c13 -01000000c9ebcb8ea6f7e6a611117d0268639625cee28155c88708b4c09d4aea000000002d4c50f85979f0d2491d015206d867b273b353c253a173abf18dfbc5d96d088e50fa494dffff001d0397f4fc -01000000562c889f95c49db05f6a33277aae9bfe68e92f00a5d6f67ac8c366a100000000b7b0896c4a53b6aab15282cf53e1119676d89be0eda11064cadc40dc8ec194dc66fa494dffff001d01f0369e -01000000d41cef71d625aa5380f6cdc6452c67951e7e4f5b27b7904b4c2da413000000001c1e1096ab473aba614651fb98f47a375c03ec470daccff39a2d2d65bfd881b47bfa494dffff001d02454a15 -0100000095359a35957b89dd268576d562f49db7939baeda6de4855426ab5d9c000000006f68039da08fc314bcc71631be6f4b2ef5e0a2f9491fc078b11fad3dd49ac287a0fb494dffff001d02fbc213 -010000007d505f65addb5a3b50eb33cc5cd3bcafe03ee597c4027166aad2d2630000000090d221539ba3dabdcf0eacfa9d63f272c59dcc07e5e193271a24f4c11caf2c24d9fb494dffff001d05542cd6 -0100000013d5bb77b9235002acc75014e0c061c79de1752d3edc6859b4c0df7a000000000d17f332abe46c092877537ae764aa99e9b25d6bdd94f4007eac43f4861cf4675cfc494dffff001d02f62def -01000000612ec5ae40cb2a58e18d3124fd70664a4fcb9329f7d268d4bcaefacb00000000f7bc31a9984831440cfae529df94ba1680fa15b4490454454920ea8947af4a3765fc494dffff001d01c6c1af -01000000f13ce1836e92f0d12e4892eb229cbf6d50b9b2080af16b01f00b25de000000003f8f64092fddae84dad92736fb7d350e25bda6118bb1c660b06a4a5730fd352815fd494dffff001d055e65b0 -01000000ee24ae636bd70cadac603bf8cc631369bafbdfa8ac8effbc7dcb0fa5000000006faf8082545aef971aa4f92bd411947929c4949362300cd1302ec8bf74091fbe35fd494dffff001d0139a790 -010000006350a3cd2181f0eb75fa8c4022634ad85b6b9e1f9b7346a2eef5517900000000a09d738f407e2dcc888e8ecbde93458d8599720e0359a380d503ee56c688ef72f9fd494dffff001d02661caa -01000000a29d92b014057dbff2775280b8bae8b3877fa9a345f4972034c0711b00000000447bae5734b6c67dc36ae088869c18740a836d7a9feff0b349efdd7373a21358fdfd494dffff001d01b13c06 -01000000dcbf4a9455bf33482c2e17640cb89711468c0def1ba9f6e26e5a4aed00000000b555247649a364adb88b07afac3aa2f9ddf5c379154cb17d22f69fd74c84a2e24afe494dffff001d03144aac -010000000429b2aa02abcb8275705dc6482230dcb7c8678388fe7d75022c1ed800000000d5efd425dce6deb5750306ce8a0e5d045e0a607ee0b530866833e956dbeea0575ffe494dffff001d026ba2bb -01000000871d8a30b3b39373d71fb9c5c7d8d7a3c005ad688d9c8ca974cd330e000000005ec14d2b9adfccae05f78556b12fe2ca03cddd8bd67896fa5c6b6fb090e90177a3fe494dffff001d0147b26b -0100000019fd8a4e03a52e43322506693b696af00b828361e2a0968898708e43000000003853a270a7d9e6ad80fbf911146428c7ed63b2a1154df748f5a980fe20e9e8e2b3fe494dffff001d04538437 -01000000d250d67bd2679caba305e5e13698c7880098a1a4383c2f464fe9006d00000000d793e7c2c9416eae3d8d81046985db5f3d1df7922e869fda6ec5b22181ee46f725ff494dffff001d02391748 -010000009d83b8dbaae3dee980529b6dbd307df153a22b5b0fc35ea694a1faad000000003cfd458875824fadce673ca8c3125fd12c36b7230035b5f056a12d4e0d6b7e6b7eff494dffff001d0448653d -01000000a7d1ff0415c1d1be8a11c7dc20557e001d2fd96c0f396f52969e330d00000000ca20885f915b1d3c5e614cf76067fcf8d9894204db63664d512806ceab58ea27d2ff494dffff001d0327cc00 -01000000d98a10f08f4a7aa698ba8564a85bf821b747c7a44f656fb2e3b9335f00000000dad4bbd7663a69c07ff9579434972bb203d0d78d07858ddc7ca32513101c964e3d004a4dffff001d04df7568 -0100000031965a378dbb0d024df444b3ebf894f370d28df8abdd54565b598b9e000000007ad93f6eed4656fa7c0a606c08b067be35dfa5392eda5d77f133dabdfd08739794004a4dffff001d04facfab -0100000004cc9e4dad8b5d2166fb175e7bfe13ad56018dc81255d335336b8b38000000002d011ec2248c2899ca72a01673535807e2cd0fbcd4465ebafe2a002f3f6c9ec1a3004a4dffff001d04d4b0a1 -010000002093e7853950d588f1a36601643a97b7e187f6b7b274ae43d82410a6000000008ea10bf2d0d535c64d9db748aec8723566b270e0becacdb07438273654e59feea8004a4dffff001d04d4db49 -01000000eff17d4b5360e16151019597f732fc8f6e3b19ecf0c88e2ab1a2bd3a000000005d9b9c1d04856052c8f01497c9ce05d01c4c80c1c4296b15549ace3e04e2cc24e2004a4dffff001d02358897 -01000000bf5ea56c32a49508f0987cf0b18513d285edbe987b0dad25ceef3f1b00000000ba933ef648e2544227c7db41de45f0cf39aa612478c126e5ce5393668e230f1213014a4dffff001d044c6575 -0100000091ff63e6ab577bdc347fc87265fc316d53303bf28d0294a24791143300000000a97e4a6f79bb595fe0239f31549d5b06e13e7d5062e3707ebab0f38f0df5d1832e014a4dffff001d0083c449 -01000000bc749fb377c9a937702bd4ff35d376b43f5bc56726029a93a38e8232000000002bad8475b38ccd82eb98377132453c72706ae9626de3f913e8da2cca6795481166014a4dffff001d0594c61b -01000000a02349924ea393906e7fe3ffc2b9d152fdf55bcc1bace5251517168100000000448e52c8902abd28f82f3ff5eec8c97ab16b71b61674713cbc4f9a896f733b5ba5014a4dffff001d05c09af9 -0100000011f5cea7297afda99c9a141c4d438ff7708f451b571b4aa57b4b69f00000000087550789e53e3c66c4ce24d145f615c95f593d7557fa3ae2eee2a1f985549f9bfc014a4dffff001d00e035ee -010000004ba4c615f54d1557c5f691cb614cecb9edbad0011ebbd3b94fd458ee00000000c9782c5584bbe7c3a51f048dbf1e428e0b0e092607ea6514c401f13a45afd2b6cd024a4dffff001d049ecd2a -01000000718886f10113146ac974a449c8b5bb205e0307f42d1b81990cf1991e00000000b88f0b4d80b631a24a15d7c640ecc15ee82188bb16d692be42467e21b3971c1421044a4dffff001d03e07f40 -0100000081fbffbf5c27e4e908c14bc8f303a4d91bb71ae05445e839c531ec81000000002aefeed1a7378f70e1f434bde89af706e1777993d25d9a95f5b4f4a0d83bcda8d8044a4dffff001d02cda9e0 -010000006d7f371b437cc054548511f0f9ec50b6e04bb4f3a4915a099c3bad36000000005b72bacbca2f6bb848d4753733f6427849b1aa4805b244e2751c38ff8d3e339c41054a4dffff001d0018ffae -01000000b82c2d751368b79004a8e15e5b9f1bc7f620d5de2d6105d83d8ec2f6000000000cdfbd9bd57b78356abb0d07551b0c5c20d5258091604be05674d4d19455df2fb8054a4dffff001d003c4d86 -010000006efef1bc9d35256bbe500ee9c92230e0f987296e373e20ee7f3da4710000000030a2d3961a799e229a81337790254ebaefa055bb85ec7f03e5c8e9c3250eb35ad7054a4dffff001d0514a76d -01000000e789ed685960b594652b9b83a28ded0995725d6ad82b2f358058cbe80000000035b73fb2084e2e8faa28334b17c12668004b7cc8965831aaba65b38b7c54ba97ff064a4dffff001d055247e5 -010000000606ede205a1002e0995f8d009de821d488e22fb37167bcc9120afbe00000000f6f0d5c7f8204a7142f2e37a7cb406e0a57fd7c9784c12111c55a1cde5418ed11a074a4dffff001d01a5f8d1 -010000006da3e0f7fa132425557519508e4e97cbec301a33e25d4b65ac054a0d00000000d657340c13f9f8accfc3af62529a25d3d9e656caf2993fd3166f73850f397c228e074a4dffff001d0309686d -01000000cb9c32345bb264b3b2a6e96c8843f65c9598e4948737c569c0a00073000000000894a15ed694c745d87d2135f90eb9dcf8b454937b48c82132d52405e0d4c4689f074a4dffff001d02d5845a -0100000095349f59ed0c0ce5ab0de43b9d55fbc7b8afac7eb6dacebeaaf290f100000000df9bf22064b03cf08e658257b5d19662fdbe3d7acd27894cef0d3f9ff5a657bbbc074a4dffff001d00a13d79 -010000000be1a15c8ae486da44f0585514eea60780091e52e35f838cd1572bf50000000077333896bed3021acee751bf0c073d95bbdc99125f4298c052db8998bf7c3270f9084a4dffff001d008f86bf -01000000c0b7b630de7b1bd92c4be9d32e19faeadd68f60316ec97db96eaec0f000000005e3c98a964d941f4abd129531d0ee81cd5e7dc098179c3188ba36ccd1e5f9fff7e094a4dffff001d03d8a118 -01000000ae3c51439dc8f2bdd807e1d88c25a5a0b1a3005bcbb50bbb4e48493f00000000ac719d460d514cc4489597ac78e995276865ac07d7606a313c12b16e769b9294f50a4a4dffff001d04735f73 -01000000ce12350c698e84085e7b62c039249c63cb6a6cc9404776c9cc7fba8800000000ca128b2e74fafb345ad249d61c538f75a2a230bbf2266d470d47986555894deb370b4a4dffff001d001c0a17 -010000003dcca8252a636d4c0b8bc4ed9285b749434aaebc29965fc691a635ea00000000baebe5ae323c2bc5c316f6a8f1947b4666c7707c9ae127a03e6429fea7624ae53b0b4a4dffff001d00b4a44c -01000000f6cd7f4cec06d5c6aea54e64b45f049640680e4cb8249cf18587b314000000004a1b2b51da86ee82eadce5d3b852aa8f9b3e63106d877e129c5cf450b47f5c02480c4a4dffff001d02552721 -01000000c64e139bfae4adcd96860bbef3969b84851dc4d4fd8d06f16cd03698000000005e4b195fd24b314f69f7bb5b0139861b0f07a1286b8f6f42dbb6c82524bfdb93890c4a4dffff001d033b3297 -01000000a3e811a098612235feb5e1acb407cd98132a9d5f4dd99aa8d8b576ea0000000025a13ad0cce0eeae69ddb545bda3b490230e68dbf0687af3ddfa132caebadd7cb30c4a4dffff001d04a39aa9 -01000000ab5ab86fe14c9c765d8cdfd67f9bd5d41505f9f9f67e4da1851f099700000000beb6740250c060fa7b472f4daea18186d47e266dfafc88f088d7efe3ca5a2ac1060d4a4dffff001d0511eae4 -010000006ee9f67721369cabaf6e3e9045b2efb70bc1344256dda634a92eec5200000000d5b0833f82460e5ea635a31c60314eec20bb317f2cdaf354023ed4225e31f264380e4a4dffff001d03a74f10 -01000000b3ef61423747695daed4acef8980b5ef4c8feaaa908b3fdc6fbecdab000000004fd416b35e12b775e2899ba509a06822ed8b6627311364f5195d32ca6a314dbb3d0e4a4dffff001d0255ab96 -010000001c75c30c7bb6391ec7d94f6d52bd2aeb0b8f5224907b0106791ccdd70000000016f86bf97a3dda131f108ab4ab456d5ed3cc5e67eec631d8fa044b95c19f3449410e4a4dffff001d048e1c98 -01000000a8bb0604235d5310973b23a5c797442a1ae8c07b96d8cd33c191b45300000000322948a4806acfeca2b32248d0e183c8eb09d5e5ef48adf33777307635414cc05b0e4a4dffff001d00edcc80 -010000004d37f2af0c42371bb77b52cfe7f539e550e126631dbae6056e54dec80000000014238140ff083fe67f0d5c0627857c4330c4c96187964f42b680ec460ad0ccd6620e4a4dffff001d048185d3 -0100000087e774423a88647a4567d3a15e7099b7f271d8d846066af9776ef4ca000000000d90cd436a707875c28222178146cb93f6b048dc4e7555cf37b96757e3b90a5b740e4a4dffff001d030ccab4 -010000002f3be6a1d59b7786d8601330a47f030fcdf2354275fbafa8f4c129490000000098a23359c17ca2678e2039c8ff9081b18c4913749c9a081ac3f62958f09fa472e10e4a4dffff001d00c7fe6b -0100000050ac3cacdb94018a26258b82299da1307ccf3e2bf62a8f4acc19e02c00000000e09f513a024d3e13473d7a65f79073b36a90cc228613672d2a47812368ff42d1df0f4a4dffff001d007f726d -010000000e044393202d6b239c902d3f634e3dfdfa31ae439d339238ab1688e30000000055b5d3d496e196d624a471b818ba0b1778417ae335a544033536654fdda3eef6e80f4a4dffff001d03ed4240 -010000006396e6ba5ef4924d42f4f3114ec7507b81bce51e9e2eb51ca9c53c420000000049af9208af7b7a06d65ce1cfcab6ad9123a8dd7538fb0aca332c63429ff48d59ee0f4a4dffff001d056528d3 -01000000497b15826573b28c3e83a5d0c5ed30cf48b97dd6bd797849144ea2400000000018b50db063333a3261b9b41e887b4aa5b69becdc9967550507c120e22a76496710104a4dffff001d0408eda5 -01000000f5ddc74872eb899f5113e002f642e7b507f871d99a9900edba304aa0000000008f6546b850a14744afc3fe55f76f3959f40799bf4dcefe01ae4dba5903cf2fb553104a4dffff001d018f658e -01000000918a758ed54c9f495edb24ef3fe0f4432ede25853c324fc0f33a458f000000007a8e49b22114f17b5933fc7a8005421ff8370b8c48fa04c24323e91bd02d701492104a4dffff001d053e6e0f -0100000035893f7cdeb0e9af7d9fbda1584ef6d5219dfbb141b07b31257a1658000000008b9b3abfbe24d0e375deebb5f41e74949203c00772a678ba69c1126156c5489bfa104a4dffff001d012a69fb -01000000b6f8c48e94ca346b12373281acbaa08fa54d1cfdcd9c01e020cdda9f00000000be5b4753c6062e3eaed75f5412e43d6dce8d242c5816b436689f795f90536f28cf114a4dffff001d01b6887f -010000006006db00d70ce04a9940c203dc865b3c5d070f8c2d1295498ccd6c32000000008bc41e410a44b764dacb38c1138a3ff2c038a188a063509c6fed4aacaae72ee67b124a4dffff001d009531e5 -010000005e0dc170558d7b2872ddc85f481531dd823dffa66cc620c065adef7700000000e82e91ade6f25c8c6f4c053aa62d94926324ced07ba2f3aae072b13a2c5dc5f89e124a4dffff001d05ae2281 -0100000056320cab20bc1daf4fe3cf0115f2436523e44c40ebcf8c18e6b5822f00000000ce415eab9cba354ae042c22ac9f06c1a69d7a5dba67136fabef93d82f374dd3e01134a4dffff001d05a0d736 -01000000ccb063ab7d74a4030fd155615f046f95c8068078557568ce6b8092fc00000000ff33b27214141ef3d183b1d2499666c8635a57943ef5f515f4e60515f9ea0064c1134a4dffff001d021fa95a -010000007f6d7a61bd46dd27be404b8c883b812c2899095462591dcd75a96f1e0000000091777c00b7168a888d7a7db4b5f78758129e79ef909f92a84110b9f33f9c4c5505144a4dffff001d03526c4d -010000006be8cfe3e176d34d1a46f68b7d20a01ad3f9e2aa6f7540ef6a32573c00000000a870da2f87071c1366a22e77c829a6b85d745ab2279e0333872518d58b8dc0181a144a4dffff001d042c5db7 -010000009cb87223258aba43742de401d0157ee2b4057da95b23e1665880725700000000d54d368cd4243da3793fe3ba2af1570dd44a905d77ecd1a5cbd07cb8f72ad80f30144a4dffff001d048f280c -0100000052b771a3a85c26bc796ae0841ae894c6ad4527b062c94812d98b9c5800000000eeed0f4d975db8f66788f809ecf8c351d19ff5805276ef31983bc5682548342d52144a4dffff001d01aa3be1 -010000007ca07eb5637ef7696d7bf985b9114de19317a9abdfbe4ee79d8bcb1a00000000d7172956946d5547bd98c6a7040d353c3cb6285fbad096a1780f3b7503539adf3b154a4dffff001d0333fec4 -01000000326f947390bf03abdda16f673d26326d4b159e0b7f732a67286ba8e40000000085701296d47b03f388fd85431c2a9fc817afc9b24870a9a7da850d3a43a8154b71154a4dffff001d0164b7d2 -01000000a45af68df42f6f23ecc47e1cd0f41d47c1e5a26e8343951f9881e51400000000b7c1565d19d406d8c56448571d7e7da2ac559bf9b43887e16e4f416276ccb99b8e164a4dffff001d02ec606d -010000007eaec4cfdb152a8ecf8ec155b7343e2cc04750be00b96c61a477e57c00000000096a9263a5008a48e1c2b527b922a81cfc269fd401ce429976c587a951ff00798b174a4dffff001d015bd123 -01000000db36ec19328691975cb8c6666866be64b5be79ae42bee9fce3b5db5800000000b5e73d7d102476db3ca2379bdd891b311140b49626ef42937356ccdb8fed589103184a4dffff001d032d07eb -01000000d8f8a6686ecdeac529caa3ab9ecfa84a5fb62b06849ee09b8331d89e0000000038b408676c2a78fc63ddc1807804d17e8ad9433387cc3cc0edd68c07e4a714b610184a4dffff001d0437e51c -01000000c54675276e0401706aa93db6494dd7d1058b19424f23c8d7c01076da000000001c4375c8056b0ded0fa3d7fc1b5511eaf53216aed72ea95e1b5d19eccbe855f91a184a4dffff001d0336a226 -01000000bca72b7ccb44f1f0dd803f2c321143c9dda7f5a2a6ed87c76aac918a000000004266985f02f11bdffa559a233f5600c95c04bd70340e75673cadaf3ef6ac72b448194a4dffff001d035c84d8 -01000000769d6d6e4672a620669baa56dd39d066523e461762ad3610fb2055b400000000c50652340352ad79b799b870e3fa2c80804d0fc54063b413e0e2d6dc66ca3f9a55194a4dffff001d022510a4 -01000000e846583e9bd64108b3b89ad3883bec7731ddf1688a4cc8f79530fed800000000d2954cb816c87a9572bf822138dc84b5f6847fb502cce3d6073f9ffe40588571a1194a4dffff001d045d675b -010000001d72012c553d72f1f75863310ac0450e53a9e9026b9bf9556ca024ee000000001b7142acd57304290a2ade0e2c96d4fbd3ec924a02a5a0cd30c04f0e96265423ef194a4dffff001d041600b6 -01000000d2c5dfbfa04c7b67457c58f55a8d190dc5f8ec5ab94af969dfb748ba0000000069492041bb66f32c9bd69b74e7ba9bff6d4122e931eacf9c89b45eca2c35eb25211a4a4dffff001d03bca431 -01000000880be932720bbf22f1b14da0e6d16c2773f83699935d390e8621533f000000000f5d2500bce42137fe905225ed9a7380eceb7445c89011bfcc740cf2e9985a034e1a4a4dffff001d03d30924 -0100000000b0b174d61c08a92313345717ca7776a75cb67b77662c04ea7d3e2b00000000c8ac0a2fb1c01e0e0a5339d296eb072b2b9f9cb1d410a1fdd69a2c797094dda56c1a4a4dffff001d05225e37 -0100000089535760639df16a512f9caed73be0edf8c9b5466fcea14336f4a1bc000000001527b6224d45722c8ee351976c69c8fca59c11d3daef7abf1d189aab0e959f7ba71b4a4dffff001d0551b67c -01000000a61d5d887f8fd4c86f7111c2c5a4d0d593665b527cdf84dac7a0d57d0000000069b7df87a13603be78ccb048370aa1d2da0969f3b1822791d24aa921f8e268ffc51b4a4dffff001d055313f2 -010000007f678f2bbdae181d396123431faacd0b956633c30a55a9595ae6657f0000000085daad94e57797b9340c299e483531dfcd0f3c6996da98ffb2ab31bbe34e346a001c4a4dffff001d03ef37a0 -0100000054112b758ce49f1fd22d613250599ffe92c48202b6a477b9289f3d7900000000006302548e973a0d5764711fe84e1900dccedad0de9f054fbaaed3735b70ed62391c4a4dffff001d057c8c98 -01000000bb142886ff32916975d060c649c9119aca0b47e3f169acd3b7f1b9dd00000000ff166532d3f30299c5a82856e3411957dbe35fe7e17c4f58b92b2ef12c399dd7d41c4a4dffff001d04a2a121 -0100000029a936f51d08ad1f1353890300131fb7c04e20606eb48197dc863eb200000000c7bffe64778d6b4815226c6aab915985d8937fb0d3aaaa983bb513c69305caade61c4a4dffff001d0514cd03 -010000007d16758418920cd6d81283aa30108f20f37dc7114076e23025bb881800000000bda8c051f6e99590cbea0919b7a4189e4d3620ff3f46caa4b797fd52e204ff1fcc1d4a4dffff001d047ea807 -0100000087a6243ae1dc858cf91caf8a1f92dc473bdb14203c573b9d9bc134cb000000004caa084ebef276e6c454dff401271b39e55da21a8cd5a3afdf2d0e0f94b94a2dda1d4a4dffff001d039d9a6d -010000002d0a1a0b18f1f74ee797beef1bd4766a050a3480b5d7457303b5c54e00000000955ec547d5ff2bcbb3c9f108828e431a674576e1de0b8da794bfa3a70b794281ef1d4a4dffff001d0019c619 -0100000060500ea2003736b74596d4a507f5cf001daa55e7c93b53c77d32a32e00000000c545bbc6ae68433be1fbbf0ebf59f22751af853d0a6fd6c944458aa73ec7a014f71d4a4dffff001d03d8b5ea -01000000cc3d1b428029cae46634a9b96857475b2bc59619b8408e615f65b7b9000000003563548d04e24c89e7706a3f4ad681bebb3017133e87f7434d824db4e51f479b891e4a4dffff001d038a2031 -0100000073da9ccb3fdbdb4a9e3723a4bd5270c70ef3e78f448fad7e77a8eda0000000001f0a3749af61eeb59aff1499892c6641d1a464a26c156608d02cb74c264786ccfe1e4a4dffff001d0284512b -01000000ef5a98df2a193c1f8a5c271dc4d45de465b7122dfeefe96fedad105100000000cf330295467623ec1378dc6fa312103ad8a210b3e1351f2f4b6a57ac43fcd472071f4a4dffff001d050ac986 -0100000048256cc5b9ec6e7a12c378c93c1dd2ada859c9a9997adca75166c935000000008e3430573cfde2f3e1eece8aefe661dd841bcb665d35832415bab4f7526785229a1f4a4dffff001d02ae4b52 -01000000eb5d7c4b706d8891ddae3ba5bb57fcf509689fbc196f3ef73837f27b00000000226e90ccf96f41e04f011e69a86e18e96c09df6fbba19416132247f1d2a6e4073b204a4dffff001d0488c17c -01000000e5214de98aa5cdf1766c5129649895816f49ec82e93c4bbda787897f000000000abd68f73823585582e65529a8739e90bd943fc4e214ac00a20ca0369b70d45d7d204a4dffff001d041786ab -01000000fd4fc04cdc29aaa117b16b2420aadb9bb92fd19ef2a7aec3c40f71250000000078e5266df52051011f39eb29939c8782564563c20b3856f7aaafa6dc52921359e8204a4dffff001d0205fe6e -010000007252c67173d343874ecfab4d5f57ab5936f2d87f173047c99c20e73500000000d2b61f338da6ac531884c623db2804c0d7eeb84263b501524cbab6d5edfdf56f00214a4dffff001d0027a318 -010000005a7746eb6d1d19cdb24466e0a87a23b6ba8c2e461ba8928edb84253b00000000f1b03cf0680b9ef33fd311f6bbc6db3f1c164f9341f48a02df1905cec4ce241b2e214a4dffff001d03246ebd -01000000e93f1fd6ddca6d8fdc3ef50fe0f31769200f8fde592a0d5d6f8e1d290000000078966e9f0a2d4452ab2418249fa6fb1a325a04f039d015899141a82aa5a6c05c92224a4dffff001d01d8361e -01000000dd5f3ae3d2c2876ffbfe0956b914fe72750b160b667b5bef5aaee61400000000434d2b0f298874c3f6d8467c07dea6883a650de00d48298cd6fb48e8322e1058b4234a4dffff001d0161f3ff -01000000f814899e7f50c4494806f75523c9d8ea6c0198d13f1f14431fb541ff000000005b1015187325285e42c022e0c8388c0bd00a7efb0b28cd0828a5e9575bc040011d244a4dffff001d0579aa5d -010000000f72c6372c87d91f2df95b0c9e91cafab596f29270cb01cc67186040000000001fe6898ac074a680fe7458ff87a03956db73a880d2ace6539efcc43002bd97ed87244a4dffff001d0434b3b7 -010000007cb39114d2372ca1d5dbcc3a1137cf9314a666349dd79b268be1f15100000000b17cb4572964d7c6d671e7cc67b04b9fb1b68b31e52e6b4f956f3a0b72ccc4ccc5244a4dffff001d057875e3 -01000000f8d8634fa1aab0666f63fbebfd61e0ffc1dcc647e218414c528e17dd0000000073a2c54d536c19f0d09156efbad18ca6f96b1e9f3bc8490342958f24ed8fc32d28254a4dffff001d0130c923 -01000000943aae5118b0abf4ff55e050b234c21d223871e815e9fae6fdaf693c000000006fd85c0213cfe9863573596a4d5f1509ac41a91b572e6c1bdafe46d9249a5fa4e9254a4dffff001d05878bcb -010000006c6040618ce7a449cc26ad0578a7c897b4464ee32260014fc5ce6bf20000000096567fa4ac682f9bec7e646452d3bd69088000b19bf7a90eaccc197b632fa79bf3254a4dffff001d02a22cd0 -01000000c067deb4fa218c0f26a247766a969af8a475e5c88c004c300c1c69b100000000ec5a827a707edd70451f070665bf6a9e6f4dd8f815b0265296790f24024142b181264a4dffff001d00e76cbc -010000005cba08b87cefedceed1e60297564a3eb9e9e2bf942bf63f74fdd7f3300000000e3082dfad468d5c0c8e2f8857a999f898081c8cf59e48857997152445a57218095264a4dffff001d05a30a7d -010000001dcc225203fab8d972215ad2311203570fe49707799e6871908e37d900000000cea1cec6febbeb980af51f052dc20065b95b2d65520205616a95284480a4219abf264a4dffff001d01b05d9b -01000000644fa81c1f8c64f08712b41b616a24d3e8af833a4f370c188068133a0000000069f2096bbede7015fee2fb307f7d7dd084641b7f4af5c3074dc7b2b6df03277c80274a4dffff001d01dcf233 -01000000ba750a8cc870173cd7f17dff4c23c228282d9aebc2bbd5ebd9449c7b00000000b28b51c3a1a322c8e29c2b6808ded7981dc085cd7fb529184eff6ce556e09ccefc274a4dffff001d02c039a8 -01000000e0f40d912882e77044fee84e325fdfffbb3aa0fb1fe6ba864d5be65d000000006141e05ebe4e62fc76d0c9f1e61a4d17e6509209309f6fdbaab476fa227f1f4fc9284a4dffff001d0306d223 -0100000003e8e5f89f6d5ee55c6e8ee0d4c1e88d8e4a3a5f05f0c9ec32d580e5000000004e2b02e05fea22c5067327060d3c00482569021252423d372cad30746408d0fcea284a4dffff001d0410f81a -01000000f389178af7b0ea88a83ae251392f7eb336771c8d7ae666d1219f2455000000005f98a8017e8458e6081be384b89f4ed68a6aaee5ac41cc0ad2331929e657deb27b294a4dffff001d04c90ab8 -01000000d8cec9c7b6dd3093ad29b64c234258bce36693f87a4167d6234342cb00000000d5cfb9095ceb210b374686dfc11fb8d8c7932c30b4a3916c7fa4fa7b760a0831122a4a4dffff001d01708f58 -01000000d850850454d9b392ab01e886bacb717a5615f8f70b6a4ef9bf788df50000000075f11e157a482aa640ea8dc7e038ffcbff0e9aa758ff092222fabc325b9c1a56152a4a4dffff001d021f806d -010000003cf1b7fbfa5978d5ce1cae5a5f454d41f840cebb72ad3d600f551901000000004503bb32aa7568d6abb1df7a05b80be6ffad47e5a55886488736b5c344a41d431f2a4a4dffff001d048df744 -010000002d7f6a8f2dec6f914a7a63052facc546567fbb02742dddb150427ab10000000031ea5d7ad7f128ec4daa2855b7944503da503818a75f049dd6980e636aaf59af242a4a4dffff001d017a6543 -010000008976cdb2c5a16c0929b45f29784ad52cf3db3035f112e562ed42447700000000bee2958fb6624ca2382e4a6a1bd7aedc2c58edcb7266a106c76d4504fd39eb89682a4a4dffff001d04d4a620 -01000000d6d7f91896014f1f4419628791a5bc39263704165d3e14e23895f57b000000001ae0ce43e200fa010ca331ee891ce9ee93d468c602703a23ca2eeb693c1e05e1862a4a4dffff001d025a8bf1 -010000002be250378c6001da52d435aaa1240522ccb14a94880ff0e0d1eee82a0000000046297804a9aabf1d08096b034a84364055573c45d09be862c33ae30beb3b5ab5ae2a4a4dffff001d01a34339 -01000000064ac21081e5a5c6509f634ffae17551bd322e46d3396ac49b8d68b300000000d15854d1e5ba349daf72089f470b24557a2be25105b7831a3f18a62fb8bab677342c4a4dffff001d050c273a -01000000ad1cbb656f4799fd8e9de9acb70a47d589ef5311dadade94c494ff60000000007546bbac9ae1c8980da6e8c154b368eb4df305b6f3f27ff38f195a13c9ee0484922c4a4dffff001d059b5c46 -010000009f0d835251ab6812b04939a5889a36d50f4d7486ef98a7f61e45f062000000008dab4ee487e33f872140c04372bbdb6c573b7e9e4ec31cb5d8dff36da17bd8f20d2d4a4dffff001d016572b5 -01000000d1105edb3d0105e862f3bc95a034c0d0815a79505b4b68fdcce9083e0000000061573706774bc7a579a7968281e10612b4551195e16c8051381cdd3a6f93f479292d4a4dffff001d039dfead -01000000d1e7c872bf92ed9d9007926fbe72d976079ae35efd6f81ba4101a98600000000b4bbecee818dd986e5ab82f36dbd5ccc29ab134614e304c0a397e14082fe7bb73e2d4a4dffff001d00b8c45f -010000009287b073f80a1a91caa1f664b8c9c578837f878e6ff04108db28d9c8000000007dc81aba2560e72756db13b1e427c9fb4bdec85486c65da8aca5bf968a5bf51e412d4a4dffff001d03a98277 -01000000a3f00f008ca15686450bda91266f8d01a99f345c7846e9e5bfcc2628000000005ac244c2a763cbc311a245df0d6f98a29e187165048a9da449d29edddf6b1923d42d4a4dffff001d02df0172 -0100000012ced3b143532ef3999faae421b6bd79c8ad62a4dc8db862cb05bbf70000000060e6e42fad3fdc3d353a22f1699b5ead453eb11343a0e603ffd8c77cdc773be2892e4a4dffff001d04945d60 -01000000f0c39624b690456af00d742f323762471854e1db5c96099adad5e53d00000000a2367f2d2214ef900583269eb812ed05d4a8aba11d40081eef999ef16af1d5ebd72e4a4dffff001d02d98796 -01000000294a2e12b2716816a62d761c624248fcc10ae22cc1a80290432c85cb00000000fc4f1ed498c5f31fe90b10389f12566a3350a5080db1dba1f01f8834e5813ca9e42e4a4dffff001d054ad0b6 -01000000774ed03a366b9909cb163ca0178cc6b42847461c4a672a537fb7aee600000000225666176205fe41ad268ba6f5d15633a5381c18fbb6cd2f83700ef928c58fd7362f4a4dffff001d04928537 -0100000083900a5d5ac952d05976df43ee7e280faf6105038a4afa75c4d8a2a50000000091cd49f33c9f5b51fc61790d25539d2e896e87c8c195cf305b499bdf42e029a0d82f4a4dffff001d03994aeb -0100000010336b8cdbaaa1bd6ba9b1e41e85e17bec5b68bc8ff043e5731ed09200000000fc5eecfa90d46aeeda36bb1a2f2da61e4f9be81253033ae55625d00acb13ef35f92f4a4dffff001d049e0a22 -01000000ec5b52a76675e3b1de2e75ad45d6498684a0e81092c5ee36e7fbf60b00000000474d71b72f905a8084842ce4202c2ab9795f3abcf51aa7c458349d21eb6e310498304a4dffff001d015d80bc -010000007af7e899b49494f77c351fe434981ad8b6352ad62527ed9d6d23a8a700000000bcc43ee02af281701574077d6916c07d6bd15cb96c623f6f304de260f616bd57ec304a4dffff001d03a0956e -01000000f22be93799f6fd1527bfa224601261300d38571dddedd804c0c7b94e00000000ca1cb89732eb51c0ace08a564445a2ee762a2cc819209886cd0a09993951544ffb314a4dffff001d03b10c74 -0100000099146a7924d99cd7a2c1e17ce7206712a8349399b34ec98eb706d3b3000000002c4fb29a89bfe568586dd52c4db39c3daed014bce2d94f66d79dadb82bd8300024324a4dffff001d04edf452 -01000000e5139dd4cf7511d9eddccb69d2c7aa0917cbe49eb660fe9293667aa80000000068e91b23282bef6f06f22e479587d03f6e1a2e4891b5d644541f1e10275e52e142324a4dffff001d03ef54c9 -0100000052a5c0e3a6cc34383a58d939053af3261acf266ba6cfd3165435bb2f00000000a32d9b10b7b75323db98d486828a5ea4f9e7a2609b76e496f6d86e0ab13a31587c324a4dffff001d0031025a -010000002ed6742b063239cad1841ce6bcf676a59c66e65eb4a0ccf68ac4eceb00000000efbe4df65aa1137ba3efae5236178fe6646d6eb96a177d5394bba48066a87448a7324a4dffff001d053cfc69 -010000004d4a3f638bb32808c3667937b3a0847eb780a3b3fe70875027adac3e000000000ecc7b73d8cd5d377d74d836bb6e3473478554a923154286ddaf6985948fd9d3f9324a4dffff001d05bead3d -010000007b86d803ae4a477ebf754711cab10b1b7799dcd50fdd6f25cec45e1c0000000033c06971fe80386570f8daafda6e4ab7e72a18624e211481e7b96633c625a52b3a334a4dffff001d01146b3f -0100000034231ba96cab51515ffaa9831930a46d1a8df9bb83d343690edd9ca000000000848736034ba62c9f4f3410b11d2a5ec921592f40b2ad6b1d442ecb3188049e27f5334a4dffff001d00a7bc36 -010000009427d53219ae3be5d968cd3dbe9f52232b0b32f662bbf74b4c2cab8f00000000755e1e0417036010faf0520d2524c806dda1e3fce2ea99dd4e70a42efe44f64011344a4dffff001d02c03350 -01000000db9740f3109d4450584d3223ec605be1f62457d8af2c22671b93b260000000009e93a056a6515e7916fc049578708d188c2146d3c12638acac92e0b72e076edd72344a4dffff001d037e783f -01000000de444daddd51d48d32e2119e59629110ecb69dda27ba85d7e85d40e00000000069b02fd420c2e86a575941a89e46d174a4e0fbc1379dbd6f6d88f3ee58613e5087344a4dffff001d001d016a -01000000a173420cdd0ccf0695a0a341d4f8cd0dc7cd8fd3aa3d01b68066561400000000cf0fb8b5f6fe33f698450ec147ef896ad953e677b4033e50400ec15454d3067fde344a4dffff001d03475525 -01000000343f2b87a053dfebef86bf7108c93e449c6e289e71a75489fe6125130000000088d412c44abb44236383afd182862dde877813143d21d92a3cc373d4bd4017455c354a4dffff001d02b22dbe -010000004375b71a891e69ba37f9c0cc54373be6796f43ba90b16b12564414a400000000e3abf5981a1bd6457ec0cdcab76cc2a176dc0d7e16f6d3781aebc684f13cc4fd81354a4dffff001d00caa9dc -01000000f7b2f9d9a6f44012728b6e09c48750838780f1e1cac9cbaa09e011420000000014bdd0dbddd8e6c917324a49df6459de897031f514b77999c8476d287e47f23b84354a4dffff001d026719b9 -01000000a688cd51d1d4a0cf1b438ae4347bd2e0b07fef348ddeb6a4168f71e000000000e7da7a46f5efaf4fc835468b21620987dbdf8b5f66daa0ffefcca5b0cae2e533a8354a4dffff001d0017ef75 -0100000010f5b842b85241ab32f795ad605ee899389c64c77126503e8eba7f4d00000000df686a7f31c2c1de6a608553b26d6336434719fa45428eb3df59bbef75ce9e7ecf354a4dffff001d02e94089 -01000000ee47f9bf0d5d6d59bafc6ade45ae6da0702b2ae98b792f7a6b95d13f000000009c13741588ce9e729f1b29b82823a97da91a3c6bb89d03c9b33c6cda9d71f0aedc354a4dffff001d00ab6a3b -01000000a0396d99b1042613554a8fe19f38a485daa2eb5b65f5347f3375a838000000008985dce081d487c7eb8f8b871738869922dd73120c75242333c45895bb91e64638364a4dffff001d04d09fc0 -010000000787ce301e6110773cfffc92ae93a3e017ce136ac2fbe2004bfd06ad0000000069ed55457af8174da637b03acdfcaaaa36cf822ec6e72145526cbfc03a6a83f546364a4dffff001d02fc547b -01000000ae76485a78a7a225541cf8025578b9085d39b45d7c2f68669f05eb7c000000005ebf1334d253dd7a7ee381625bc200973e7af65a8a022de034d6955e37823c628b364a4dffff001d06e25145 -0100000057ccd09f8dfb8ff31d4ec9e743ce56ed5c5c501046d709f49c356f08000000003f818cdbb02b1a468aa23e9795f7518ca5a92276559fc40bca459a79e010bee2f7364a4dffff001d04a53656 -0100000042284cac669ab917936f5b96469048d55214c074eee3c7aec95a07f200000000334a4de0559a4db974ee451fe484a0376a44470a1495797992b9a6a0ec7b24cea5374a4dffff001d03a8bda4 -010000005d820c5c53908a13f372a860b57050b9c60ac3360a7bc865fec2029200000000d29036af962f1d725133c89721cc7dea6d3cffda3a529c82e39397027aad7efbce374a4dffff001d02146600 -010000003c3b2d4120567d650494757e86595b7e9c70223af627fa1857ae9cd000000000a4f56464ac27919b3cf8c9ae4390e679cbb2f878dd7098057431c0d92171fb29d7374a4dffff001d01dfdf26 -010000007e74fa0f82027865fdf1aa434e494c2a60e6a9e1b70d2f7c4fc21ae5000000008a360dec0defc12a33c3d959a7ed168aff8e34547db15b516e1b8cca754c0de543384a4dffff001d0568ea46 -010000004960b70d04579667192055ae5e019eae175dd65050e58be04d10b7f5000000002eb73ccd1a64ddd448405955586fe5c95bc54928eb34679f74bfb4c9da8e1b92aa384a4dffff001d00cfcabe -010000008954c37766bb7293e105c476cf2b320cf9932b9543b1398823757c0400000000f85f4ed98adf68f14127aea968a338f2109597b484a808dfc8638112ad0623428f394a4dffff001d036b2da4 -0100000052d3ed4b6951d3d5db9100bf46b7dbfb177917539341431898a0aa5700000000d226fea91b99c5a31a034d340f647b722e50950c96a876eb96569efaeaf3b227a13a4a4dffff001d0051797f -010000002d54616f93e70461538548ac861c860a8bb9077c3452be5b4c00d4c5000000003f88cda74f26fa4ceb0a97161e771a8b1f6caff1069f7b53ab49386916f3820b213b4a4dffff001d024510e3 -01000000e226b7f57fe7d32fc6166057172a4c2931bd4bc3b619a036df08c95a000000005b7df01117c335ca3e8a802376e171e537f090dbe2e3bd1fc291e45e219a8717323b4a4dffff001d05d6def5 -010000005412ebec87fb8c61287f1d2fa1c52617ded826adec22368b84c42bb5000000007992420cd0f0f24840c8d92a4a865e6c906e473c23f1cbe3c183de70c2b2bf42453b4a4dffff001d02a246ad -01000000ba24ca40c17418d7bab5a3cac3c0bf00b9d3a0c09ec5771d0b14015c00000000a30e3f1429bf2a8ed14ca6ec9f3396b8593b8bb6ac1e4d35bd435f05058094ea983b4a4dffff001d02c75930 -010000006e823e852756b7106a0ba02b1b51045d87582001c006a2e8807cd612000000003c11b146d43fd62ec36b733942a52ba0c352c95a3f078808a38d080898cb8330dd3b4a4dffff001d053f9e6a -010000003f03adc125b43a2c8cf9d47ac43dc81fddbcf12ffccc11ebb226520300000000b17c3beacfe667f4014c9da9057fdb6252978fa76dc4dc2d9ddef0562d293d39333c4a4dffff001d0467b375 -010000002bdffedf5912eb0e14baefa637c22cd523c8eb4147bb111db143ce9c00000000e24fd45c98a5b07ef9b236be48aaa1085b1bdf993a1c0db1dc04766895b8a2fb813c4a4dffff001d01c464fc -0100000011c1b397772463dcb8430f661d548b3c55c61d415918681d6c4d4180000000008c32f04b4b70f43c849a8f424c3a82352cc0bc6bb25b2c2ec4a039964ea563c4893c4a4dffff001d05292e68 -01000000a0e705a21be059d1f8780cdcea04e7008b7497cfe8faa0fb59a666600000000059f060dbd892c1499758c7ce9bf8779d8e4dc298484ceeeca6467c17769fad5ccf3c4a4dffff001d013a65ce -01000000492c5c9b8543822db5ad8694cce758fa2019bd5b6f12db4160bee95b00000000f640c60ea438dc020048599869836f5323ef47477ee17caddf076ed428898f71da3c4a4dffff001d0065ac66 -0100000095e3a7f3bdbcfd7a40901eefd95edb7d6d60562f6a427f7986d0861e0000000059ac3c37adfa89b9a907ef9d485c57262e9283e1eb96069c2de04369ef1b3c76e23c4a4dffff001d046e85da -010000000a3f0effcb7af394aacaaa6e2383ec478034ae4ec4d488e47153d21000000000e25e353605728130ebf943b1f468937fc489589975c13765fd677e5050b487df2f3d4a4dffff001d00fe3805 -01000000a1f0d96d647241f42d4a3e02ea933690a4cc33542ed89de511c914c600000000153aef1fb8837f74a82054a0d9df9c566ea9d50df292ff62288082f311dd4212333d4a4dffff001d03d34187 -01000000f78b3189170c0de482943849707aa16247e5d62772953eb54bcc4d9a000000002183968b34446981f960895ed3713dd60fede3a9eeba1d40389123c6c409d3ba6a3e4a4dffff001d03d38a89 -0100000059835cec3351179502bdf8f4b0a0542d3ad336e22549c2a78f1af97d00000000f7f8e1a8f0b4bc0337d67fa4a2fceac7e83adda354d6fa3ba18dcf7e6fa2f2b2c43e4a4dffff001d01558b25 -01000000c6a2e4d395a1899b4be7d915c8dc660efc1298a34b66263044f5a5bf00000000e64b9c2a409a4a1310fb4b4f59559f79b15dc85e686eefc07b0b0a6b7fb6ee5bf03e4a4dffff001d05113e7f -0100000067e62d9c29833a10aa99f00514ec678c06a234e05f5a1de4412988ce00000000e4a12fde56c03eea1acb5eb1b57d35ab1da6e55d544e8212c47ce277416b1b3e0e3f4a4dffff001d00652740 -01000000d468ac8c936b469fdbc0510d88d031ad3d22c3858abb8f89184f0b84000000000fa35a88c8fd0bf5897b921ac75fac304760f6d60ed2355cca82e689ebc0cd53513f4a4dffff001d0405baa5 -01000000d69dcd4cfb5a9ecda166293b3c0bd72e21a804b3a565c8ec4783f8e900000000b3ec99d78bf68d284104779999ff447ab7bc73a783e9fab814c6741e71849cf0d63f4a4dffff001d0355fe58 -01000000a4ee15d19e3a355d221af4e4d6b69a84510a60857ead0af7e3b086c1000000001c25b8c364fd6f8417d45b9501384908824493931b544baabf2299e25277305540404a4dffff001d052500d7 -01000000deea32ce4f7ba1bee123958ad36ad37df8d53372f518a88761d14ff600000000aaeef85b297622ecf311dc5d29669fd4e3863454c6feea361ece4f547ba52e6a96404a4dffff001d03a82644 -01000000b8751c32196c89a35575c5ea97c6395e6dde705aa771287c867b909200000000cad183a8636b222a8ab775d34658b1de92ed57818e26203ee43ffbd4d8bef95b28414a4dffff001d0587f431 -0100000035a68fc6ca182ccb6663ee8b7e44556b950a8351bf2c64cd75dc2d0400000000d59d2a49b1883c6f7ac68a9d2649dc0dde3f0205e19d8fdaf8065381f9ba61cccf414a4dffff001d0592553d -010000002e5b592b34f37b1ae9fe17aa093d2d9c815aaafc5ce3dfb8b91e33d200000000a2990b3a24b766c99702c1d157925089bcd0d377cb70cacd30be33a3c90bd067e0414a4dffff001d03c217d4 -01000000773bd09b330364f704d0b3fa46d8431c5572a100faf117958fc15a3f00000000e739176d62b588566afa47f5fbbc0ec01aa3f058c036ca0ee8f3cd13e4223e01ed414a4dffff001d056b45a8 -01000000e9aa44db469453b2c657b1e4f3e29aba0532b1ba7ce4a8bd8dd00c4a00000000fa5f2cec2dd5e7122182c8e4b2f10a1cff77ce7972ceb53308b827aed06751fbf1424a4dffff001d00523f0e -01000000337df8fe8603beee390360abeed7e956a280fda2dd5aa238e110de090000000071f85d3e358a18a3a3465a1bc93f17e7725549a9507d1b218dfe6d1dc349641e9d434a4dffff001d0042c372 -0100000048bb0f9a7dc5c4fc15e8a4c5ce0adefc49c10db0a582e0476c1498ea00000000640a330a8e9f920e7684276e987d7f5a682838ef8510fbfdc9de08474ed3e74ac5434a4dffff001d01a51ad1 -0100000098349ad38c19d6e481627c6523d9d4f52c031525b8660ed55c215679000000008c06f072a655daa64b9910b1894ca250077f930333c0281c843a1198a6a0924629444a4dffff001d02e40f45 -010000003ad363a33fab1606f7a32896d093b06b84a7d6e9784047cf8b9bc953000000003093ae1fa781fb09af9fe147aa05ed26e90f6e7312a448e934afcb4554d74c11b2444a4dffff001d0029912b -010000006b8abc2fe01dc3a118f4d18c4f0b36b640fc85987db55437099aad3600000000f2e0926ac96d0c8010e095b34c5089f549f2fc8fa626e20b2f0b68dd46a72c2c06454a4dffff001d00149193 -01000000665559872e38dd76cd839459a94b0f6efeaded839d785b2c43c0be1900000000c305ed4fdbd3a11585c8805863472f53be7fb65b7b4404a688c070e8197bf40edc454a4dffff001d01b3084a -010000008fc81523766707ea9cdc7926f5771527eb6a5e6810f86a836ec81d5900000000408efc695c947acb1c0239a9b011d77e55b702fe9c2f6082571ca3bd9ad46bccfb454a4dffff001d05bb7361 -01000000efcd6d1c267d0b764044e85d112b6a32cabb8698bd13b4e947c178ed00000000fc53d40de77f595e1419b205c2dbda50be0a5595c45e001f8dfeaa8d3f19d90f1e464a4dffff001d01fe7935 -01000000339acd071c0a09f678896b302b2c79833152e048f4536994737db5f5000000003c651e6ebe94d51b8d1d1542f3b43f0c26298e4e5c8fb3d275e4e13062800f6c9b464a4dffff001d05eb40cd -01000000ce3f890a2580af6e15d0305dbf50d1fdce03678b626ef2c6f7be3c7a0000000092b0e20be269413c7f519a5e7fc316074aa24e930b8a3edb8a618077567aa832ee464a4dffff001d03713885 -0100000006f4241b0703e90950c5ec74c3e033c39e7b0c7b9b877d5515a6ef9600000000eceece737cbc2bfaba21cd1cd8515d614c2a39ea26d9b41b7daa77a17dd5ea5121474a4dffff001d0326e2f6 -01000000e65e080e4f1df42a905b85fd5d0f0b2d70f3e987e0fbba97cb41111900000000812ce3ea678b31aafecb99db5b0ca6718f9fb3474e0baed35aa6aa7290f5a40972474a4dffff001d043e313c -01000000ef823ae34b33e5aaba6945f46e6c2bea1df86769d877ac0b8ddb0811000000001962162ca36701e79b5ee44367d46a8ad8421b1f80aad651a02022a7b9e1e0a3a2484a4dffff001d0259a126 -01000000c65b1537a27f39bbe1a2884f77807c958faa56f3819aa5e4d49472bf00000000ba78186dcdbed13712e6c29812a54fa620fca9ccf297b8219f7ca736e36e46b7df484a4dffff001d036752dc -01000000d48b9919f537d161b9ba4404e9ba71bda419efe7173ec3569243364a00000000501790f1566c93f0edd817937da1e287147de7bd62629b65b395935017fdc80758494a4dffff001d023a2b4b -0100000083aa1f8934efdf864a78a3594d5c16f7fc8303fa38c01cff7c0c94ec000000005f8a10b8f3b9a4f159bb071ed05f349849e16774cfd79990af242f0ff6a60ea5314a4a4dffff001d04ad807d -01000000f699462ec6c1179023d1504bd5b9510cad887286984b783c943a33610000000074895c719bedafb41d7e5833189d876220fc5cdca55c6ad4b94a971a8e96a259374a4a4dffff001d002f84a0 -0100000077393e4b34076f0a6b6aa9350c799c7b32756a200eb1a7619e1b036f000000004c6b88dde02bd09335ea8bfb6db1e0094a58bdcb59d5ab78303034ff972b8538484a4a4dffff001d013ccb67 -010000004828e19e639deeb00d55f748421f46dc94eebd75e376104740535adf0000000014da74d7e2da39b2b2d676b957e3edc3619f4999922f3fa66c95b64be8fd92a34b4a4a4dffff001d0260001e -0100000092f7a9432462b827705bf9b31224972d61cc9fa8d478939e015ce3540000000076cf4d344b2c5db45b55ea38207cc477342c74b993c401b753378509761729637c4a4a4dffff001d03396962 -01000000b87a944ec8bbd6a73f5a6054efcea696124dcfacb88876995bcff95d000000002dc8a455f4bd8723a5d58a675c5a5e833ee411490a443f6d47f08a6fbf7594a2024b4a4dffff001d03699294 -01000000bc2c1291105e0c6209906934c0f1fe57c4ad13dd74e43830b293c6ee00000000070ef89563a7d8b1c7232b9e391813476ce93c9160051ed55bd396c6747618ee364b4a4dffff001d03bbea80 -0100000062db800da374d1b83b1b460566da0a35d277bdec5a6ef743132b2499000000004af49eb22a467e87048f4625dc9021249c16561d372366a21e8c20cad2c65aaea44b4a4dffff001d0142e34c -01000000e09e577320f539aef8178a3ec09dc306b301acf52e135839fb3fc55300000000734d92340bc4c287b0ef2b88001bac1f41bf5c6d3c725e0fc39e7c593d6ebd4f9f4d4a4dffff001d00bd8009 -01000000389998eeb4bc9b68abc63e8ed99218d00b857dcc5591966d46af4eb500000000752857853f92f5ca863f3254bf18ec5e3c62e1223c3f7968894048d40413daf3e64d4a4dffff001d00cc8cd4 -010000005faf1cf2ae1e1231a1b5aab191614ffeeec0ca86d86e105233c681230000000026dc493ba668f17fde5156a19662ca1a5bfd93b2376edf51ef9e3d623e4ef4a0f64d4a4dffff001d0183b4ab -0100000005bf42fd63d8189e37f471cd3e8a411bf81b4ff8e65532897b755caf00000000e53a837e9e3c05a4b635531c91c39c3c45565dc75e413228dc93d0c764327f86154e4a4dffff001d036f8a98 -01000000dd081cffd3a2812f5c770b8e79aea5e63d67b972ebb5d9dfe8cea3a9000000000803c135f2c72cbd06b77cc2a2a13a3c063028bf4b188b4760bafa112e71e579f74e4a4dffff001d05fe4d4d -01000000a9496d62f029c4b765548666b71a84adeeb9dd5674148b708b7aa70e00000000ad1924dbb0711c96b12ad1376816374008b98ffc43677b0990bca7973432f814334f4a4dffff001d0190dbb1 -01000000ffcc01d81e891bb248fda71e6338614dbea2d46b8e5f71460e6ae2aa000000005510b8c188460a26868d9bb3fc9bca7fca4d9b20f573e182466398f793d5ea8e44504a4dffff001d004f08f5 -010000004300ed388b39e36268421a7b15d337598edb40c8c290166b4376f2490000000054d4f73e569ddc7e67130ea0a43a352064bf3ded26f80877536b0e7277237a7857504a4dffff001d0268c158 -01000000d7e1a7d5fb8d460e90f62666eb9891f9fab06cc2c220899498cb01ec000000006a6a5be5a31aa8a7ced02f8ece18f44261e96ee9176b772fe654f1764cf6a4fd89504a4dffff001d02c96f9d -0100000049599a3ddafecc620c9ad61cc4520a0c70fae3d34dec595669587d260000000018073767fa7a1ef0c4a570f373492a822b5fad5fe3092dde239bcd8081fd3e8c8d504a4dffff001d000e0681 -01000000eed0b252aae103849e6805f28147abd17f294fe55c5c2d966d8850a500000000e15a0907e27914f317962823d82981df6f2dbd256738860027c740ac3f842bcba6504a4dffff001d05ebd48f -0100000031b485a9bc2b16f2ae5108ec786708f3f14447551e7f0f0a8575c75a00000000f6dc88e1c894cf88e930d30adcab0380af8fe00c3ebce9969c0e43242ca422b372514a4dffff001d0103697c -01000000ed18faa5febd8be98c42fe2a1a5dc9e8ddb6a618d0a05d924c522b4500000000811cb2e938cc88f159a82f1e160d80f4c6b429ef51c63ac9f2724810ff7694880b524a4dffff001d0097c6fa -010000008738d8fc729ed970f5223d77d8e776d5e0569ef2385a33596dcbc77e000000000bff98f2293caadd5f7fa74a7c5b3e2399268c171e5adb490d8e1dde1d4926d7a0524a4dffff001d02132278 -010000007ff2786f280df6f5039bfcdc1d2d18eab08e4120a5f67c769b8b464a0000000077b5007a1d08cd2a6abe2cb56a279ee4167092775aabf4245a55723455f7297059534a4dffff001d03c30540 -0100000002ddd5983c40e70e36643ebbe8567a8c115dd7a21262b8c61d693acd00000000504305d5fc375c8303ca009ce2bb783798b303208c8744fce95d0656375b682ab0544a4dffff001d0483c2bf -01000000bc5ffef87baf263ab01ed870a064c46731fdb99beb941bb6ab73fb05000000001679c9d394f4c959d3fa9e054a4e89af624f9206a777368a00d1cb6b175ac5f7ce544a4dffff001d02c1d1b7 -01000000a0fa21e1683774f057767d4545610a63a4c0ffdb774a6577224116cb0000000025db6d92e12ad8376e7e37c12b541faf358404c4b5617b9b287a43c2db4a067b6f554a4dffff001d04cfae4f -010000003abf3b8f61bdfc588bb0440b0f61cc8894cee1291298996712b3e3c8000000009160b7843ed42d0b5ba734634abb2dbb231e68bc37a1d508b2f27ad88d040e3e5a564a4dffff001d00028074 -01000000f23f3229508a7b80a755b69ab0dabb405f5eb566419eb60e2cc1ce780000000015819a3494e7b49042529989b007e8f89a6f69f6d22acd6f0132c270923a192eb9564a4dffff001d05ecd17d -010000005fc1bed214932ceb26a0a81a4dcc6fe290e5b7fbcdbc490f89c310e900000000c6fe4434b767859a8b403df5f195e223e622058ea98abcb0517bec7c5a734fd4c4564a4dffff001d030425fe -01000000390b6d99e31e1f64e6c16a94e7fed310d80bcccf9c7f9e82fd8bb1120000000012d6f8906065837ccd176ea73171077e73a29257d7e0309377e710ebb5629009fe564a4dffff001d0391c3f4 -01000000005ca35550b9d7bb3026a8a9e5c512e0c4714f11e3066f99be7323100000000045ab4575f33ef6bfc4b1c9fce77ea21cb9b606acf2b9a0331b8f9f931169fbbc64584a4dffff001d03f6a4c3 -010000007f0ab1ef14e058aa9823bc23ecaefb694cabcc7de8ca93966dc1cdd300000000272ef40d0354ece93dda9c8370dbaf29c6a2894fecd84a063c5d3de0ba90a088de584a4dffff001d049fcb9e -01000000f6707f93948703990287c88f79c47c2171dbfa2890d69c742ca6dca5000000001f75bdfb31993e02ff9de178dd3f1d765fd7bfb4dc87280c40f21270d7384df6fc584a4dffff001d00b0d294 -01000000096d0d56aa45bfdc9561a804aebf045d86dbe4538ba8abfc483800a9000000007a22463cae54d2b07238b58272c2f47c7bbc3bfc92a15d836f014d34160dc3c10f594a4dffff001d03465905 -01000000edc840e0c2f736161507190b975b87e70ee7842a0449b1bc785975070000000073998e2bd1d6f08ceccde03077d9d86adda70cd56234563c8d37e275767765de74594a4dffff001d03c9895c -01000000fa8f5340eb43544d2562339f1854add2ca2336be9ef3f1659cd2b3c300000000048d698b6d1dbdaecb6b5fa3cdf3c0b06346e43c2aa592606736404a17c7080af85a4a4dffff001d02cc3a19 -01000000683e618822053eeeb0d0a85cb955b3eff25df82e41beb94adae2e81600000000ef84f5c1c80ce84101f205ed007bef67688a709a1638b20bdec8e2d5404820f6cd5b4a4dffff001d0004d110 -010000001a4ac80ae8fba6ec44d500b823515af90fc24eae8aed36d88f73b39100000000d20b7be0fb4d88ad841c2d111b49b33e7d3b786ab431f3b32e6a75d2cb8299bfcf5c4a4dffff001d02b5e1c6 -010000005d8227de291d61223a71e9c11f27298dfda9b82538dc67ecfbbae9b800000000f75f109d50bb4674cee3023c0780403b4998067852cdb56881e69c4412c445b2485d4a4dffff001d00bd7afd -01000000140bf311410ecb5324301a67d5303bf817dc0401cb674e1c9d2b05e600000000cfd1b67825492351322e5e64da5db259d9eb1fa2b309a9917c921685232c9435775d4a4dffff001d03dbbfd3 -01000000a51f6b0e1785a625b71505e4c9ffe60acbae34d5a8e463376b0dd37100000000124c2dfbc87a28fbf04646cef5ecc103f568b8d28ab19661327995a7389d7325c05d4a4dffff001d003facb6 -0100000017b0e14d03cd3cfd82a7e8d54fdf338b7679ffc731ee9eece8d10b3500000000c96f851c0cf08646a15dfc49640c994343795b9609e87350e83f7c69fed804eecb5d4a4dffff001d0180f4c6 -010000007efda66c68e131be2f78ac7331d1d50f0203205a1532e96bebf3c3a10000000075eebc78e8a107eeb04c122618d963c038a00c956a67fe0c4933351c92f68def235e4a4dffff001d03a98d25 -01000000528b90ace50435d962ef0e1457a28b1c140e887060f6b277b37211de00000000739c079a15781e97e60a15e05212ca04c97d6c7509737d5daacdcc61982672e8355e4a4dffff001d053ea865 -010000005533106eb5b75af3ca4e3fb1196fa4c0d4e22413617c385e4ae0984d00000000a6b546b2b262c57c6691555d6f2720383c481ad64f7525c0c266669014632fa2ab5e4a4dffff001d01af78b0 -01000000c6d164638ea706719ccf9a75c7b1cba7a4ab982815490ddc3b2567fb00000000ba99c12105363f09230c6331157d8cd67336745aa9e0ecc46494634e26f875439e604a4dffff001d012bdbc1 -01000000364f362c384a75bde3177d475a8c85340d4fd4ab0ed0b30f17c3317400000000df6d00f0aa27587fab36da531d0c21a27e8b9ba3e7be77a780dc8277fdadad078e614a4dffff001d04ab300f -010000006fe6f7e2e0d1df2b6d71c090c4fa296a2d7d175c9b7853851d0fb03500000000610e56ccf020380fa1918b77eae3eab93231c4bb8d741efdae7c5256d7f01604d9614a4dffff001d032e0df9 -010000009f469645bedab4134a07b9bf6108960de1a2ddac68d59eef58b493a400000000faff99059c41eaf7d7ebdd38efd9b0e5a3ceb2ecdbf2df4b266f4bab573363371a624a4dffff001d024ad9f7 -01000000d4767418fc518c1dad34cddcdbaf06e38a73f680556295a88bae600100000000be0a584aa45ca81a0ec8e4943b91a7e3cd4b33fa67da59db3a15979326eb5e0973634a4dffff001d05e4339e -010000000bcd63dc71092a95a3cfa24deb7a99c097b5f74ee21389f4cf2cec0600000000c590cf15019323e3eef49355d341374d4eb747c85118d2af7ccf749bd6322d81c6634a4dffff001d0453fbbc -01000000e244d491df952155b701e23db092c318752154d0c94b7f1918c139b800000000a7f1371e40c1c7479a0182184e7858b9fc654b553014683443fba375927f9d4f36654a4dffff001d03e0298c -0100000028836ee71421916bfbb216200b5943426946b65d28ead2f6f6b639f3000000000494ca74bd3ac3a44c3e8d2bad9337945f89e45eb63fee5b9860d46a7d4c9d893b654a4dffff001d00ef98f7 -0100000017116f1db86d264512d1e919a74da904290965abc0492169532572230000000060081ea832d5c3e9f675736cf23993c36e8eecdde049a44fcf955ea24e7e9366c0654a4dffff001d034412fb -01000000e79cb282d213491706610e7fc8b02ea62a98e437829b076db087e081000000006fd1b2d70cc93f628dc0f1ec50b4fa820007225cf827e3f94aa581c30f5ae51528684a4dffff001d02c8f506 -010000009539a568fa254f13b10401a64dbf10d2709111822efb587824955f8a00000000a4cc887854ee5ae17aee01ff839bc7cf869aaea30fef9c8782eecf239da4e83f30684a4dffff001d03f4d7dc -01000000b021d8608d5c1517ed201830c7ab24f957ae2d71794ff149c7d11af300000000e58177c0a9f4858d209aa9008b6fae86b6b436c84c906e5faae402e0b14093cb39684a4dffff001d01e43108 -01000000b9d79c9f24321d231a894313febb7c5c264796a1bf60815a0cbcc96a00000000951b66c72f193f3b8374fcf39baa8183795f647fa69a5b2e21ee6505ca3ffe2ba2684a4dffff001d016977c7 -0100000083cbbadd846fd2fca57ab49a7f4b5ad6b1b64889b046ecc00424fe15000000002e26a89403d2d4d2c0cd13b959f9b86c6b6baee4ad0d99e6d04ce21995039981ad684a4dffff001d05ba9aa4 -01000000e435195dc29f89337100e0c2e80944137d2ca37e8e00256fad8b3bf200000000a644a58880e151d73b166f2ee7264025292968dfc2ac6b19516b9fea051a001b3d694a4dffff001d00a59466 -01000000fc27d9c3e7632342b188f423df64d41d8b8ca4c75b7d8a47fadfb13400000000f092bd85e17e84ee69919ffaa3a1936fa24ced5b3d0d0ca073398a256c5293dd4c694a4dffff001d004914dc -010000001dc0cbac620aa5469e889e5709b5ffd3dde92cce25715e084d2265d000000000bb549c5ad4bbfcde450dd1998da568ba168ce940479f92d795235e95ffaff538c4694a4dffff001d01cf90a7 -01000000403be502a01dc5d45288d1f305acdc9e15cdad638ad918392738320300000000cb513c7878b4d2c2376dd1a8d91aafcbfce7fb3ebe6bf419ad69e7408d8e620cf2694a4dffff001d0000764d -01000000919b3148b047d8639e8b46bcc4845d91654c03c6249ea4c443e9b99d0000000061a3e0d8305112ea97d9a2c29b258bd047cf7169c70b4136ba66feffee680f03b56a4a4dffff001d03c843b3 -01000000f90755f869f150d7c4a7191ffb3f74cc1752d0e1c8fa6ea51ed182cc00000000cbdf8c487a3679669f416aa49e20d8665e75ad2895d1256589b996a7f57fdfc6f76a4a4dffff001d003cdf61 -0100000047b42b4f634f26c6344841cba855c2cd7ad377cb35a8774e5e7f58d000000000cf16ae92ffab695258610ee3db7e1681447afcfe60c28ab3ae30e3ecc06de718036c4a4dffff001d036703df -010000009c57f3083374e7552e56d053b0f07fe93a47f6a30430fd36eb40b5250000000017eec598976bfbc55ab4c5d48e00162f31b6aca31bc42ab7084f1f139049b2c60d6c4a4dffff001d03b92cbe -0100000087de9b5ae134e6f3c94361941a079bc41b84ccd02a3416e43369ebeb00000000a0fed8fa4afb32368c57427cc0d9b44869fe8faee44f71910e9408636b82f3b2166c4a4dffff001d02379365 -010000000d544d94180289b766a4cf81e3ce5299f938c7ca3f6956424558ea700000000016164d5a284a0b308928c567c1db87c566e87d1f4810489c8256edb290b21512776c4a4dffff001d003abad2 -01000000555e499668283fc21cbbf2d5d911334ef50c6a58264fe4a9f1c7406b0000000042bf33d98dc089614e3ce83d39736949489ae64bdd1fc477f451c2b6b523c8b88e6c4a4dffff001d0210c9fa -01000000fba43e3e3dda545e1f21d1743123d5b717b0ca9c3b6bab06ee978fc6000000007b3e06d1951308c10625b2c7eeb400f1d9de694922b34bc48bc31cc57945ed609f6c4a4dffff001d0256b7c5 -0100000046b8f387b47ed742c035e8619551c1ed480d111d4e8d8fb231265fb400000000ebe3b715280fa9cb3a6de1d7ed2b27c7f769fa8db53956a443bf9fb8051c96502c6d4a4dffff001d0587e243 -010000009987e9a48351803b25ab0eb6b84ef62d92e33a73b2133687e126c09d000000001460afd3c98403c75ab5858f765e6bdc9a91a9a7377d64f262b0c4d4764fea93936d4a4dffff001d04816e32 -01000000f38c31b10930176f539d4c5c54f22a4e65bdf568ca89ca65518207d300000000ca13d344cf8d51261573a71698c8fe10b7e5d9f7134ae4e60682ff793b1b0278cd6d4a4dffff001d028a436a -01000000f0cc611660dbbddda4cc05700f1ceaa209e1d9e166117e5a4c2748670000000014f341b19c7417fc5b4231ae70027556174a78af7e554174541c36e2e1af9265e96d4a4dffff001d00d47799 -010000003f732830a72d4d1043e43e627abb770e9586c38b530c03331655c0b400000000a28bc5d7b507b81bd9208b9e304460a400dab435a53afd843782a9f9e7ef0b076e6e4a4dffff001d006eba5c -010000001c219fb9bf6eab86c72b3d3bc789b446d5f214222d91c752c4cfdbdb00000000a62967c97b01f47d3a252fd612e772eba117edc1f6033fafae4fa66eabcefcc7096f4a4dffff001d019c3e0f -0100000006de9b309fdeb6361b60029f1c7d6de6c99ff2819609a8c236d9feb300000000cbac2ac965c6b2ea471a630cc99ffa835915fd914c107b2db2dae5050b2ea9f36b6f4a4dffff001d05df3994 -010000002b59084f6b07d1210181294223741d72117914a497e7a07d0c730d4000000000b3ff096b0e79008a55e1816779ba4811e3ff6f3a064b6cf84bb4b1dcc433890cbf6f4a4dffff001d04090899 -010000007001e49d2d872afdb4cc1836b2d91ea483fc7aca9abed6e2e78a8438000000007444e881fd0c51e363543a35b27effae3cff02aa828a8de3c37bdc2db2b090bcc46f4a4dffff001d016b52c7 -01000000d5c3785332c02c192281491fb6b1af615bee7e2a2fcbbc124ba72e8700000000787f53156727d75d5b5a8d88aa93400ca4d53b9d90ac33da81545750405cedd3dc6f4a4dffff001d034694bb -010000009309d876716d2ead60108db4f93782659182759f0b351cd92ba9644900000000fd05849b870af4a38ba121721850a8cd344ca95c3aef88c1ccf25288776264d0b6704a4dffff001d00d1727e -01000000e9206fbdca986700b3747c62ab8169e60181ffdd3f5ca43923ffe8b900000000e08afbe6f2f42beeb5891d78d6774548971dcc9b3b7d3407821e3df29fa1aa0fc1704a4dffff001d045d66ba -01000000bc31e83685c5e76b127e81f12e8867ab8342c02ca51f137a6abed1b3000000001e6e383300d86f0ab1c84d68a38e3a64f94eda07cb5d7b6b20072cd5a610cdaa42714a4dffff001d00cd948d -01000000048a5ab82d24f3dd8bcf472d9081d4aaf4f16a16113821e0ec9d244000000000c1f04bbd361fc5125d1721c032aa88337bfdd16267b16498a8f80f00e2d3ab23cd724a4dffff001d02989202 -01000000e891684a9cdf9608002bb1861338f42e0a42ab96d9656f9f40edd3280000000055248a96fb577bd5c2c929f6b0c5757284ebdd13d09200fd4c342604ea3e5ccb7e734a4dffff001d031094b0 -01000000904984b520e8c777654412655520279fad1f546529d4b255136e42430000000035c50c2c01355804c412bece60540459c86d4a93f336396a664e88acd642347600744a4dffff001d017ae930 -01000000a31367e28327fdcc4b9c28664e5aceff0c6439f86378f8d88a42017200000000c26f017904f09d6c5cdd1b33194d0505a594a6b37ce0a7635ba56ad35e63183f14744a4dffff001d023e46b9 -01000000e78b13a567fa3b7f4329ea4a3700acba52539ea92128bd929e05853000000000980fb406fb9cd2562abbcbd3d2a9698da8aeb255af37c1237a552dbdddabc17d39744a4dffff001d057ca591 -0100000085f94fc42a95c9958bc3e963daf2c1550d97ca945988180a9fa276d100000000931a84625efbff3f1fa30974dc3b58d89a3a6c8c71b673e6a9b84e659fd657d3dc744a4dffff001d05acf2dd -01000000877bc8f841c9fc5f943d51655b089a4d7f545cf233f7b3289d6b113600000000d9df6431534132d6fa686d7496a4825304f8aca55654260c56d4edeaa4ee7bbae2744a4dffff001d05c15bd3 -010000006730e2f111da5208e30dc182cc59c9318675812c24b596e3e5398a4d0000000092c49fe9e2c4008f430cb72949871a174abca604b3e4731d51dc02337cda177ea2754a4dffff001d059577de -01000000a924ed313100b3de054fcb9e9748a12692e0f66d375cc05e01f163760000000039cbb3487e69c00c58056f6cbb3d5a3c136effa76d0d9f0df9fa8963ac0a197bd0754a4dffff001d050295f7 -010000009d977cb94b7caab58fbe8bfb6339a7bc09dc50a8aed9dec7a624e25000000000a1275135d09b38392ea718c862397f389bd358fc242242072db18a35a211ca93fb754a4dffff001d025f7654 -01000000f03542a950904c6e1ff7e8ddcd6c53a9438000df6d3846300afe005a00000000ba9ebb9774f0bacb321c7960e0e13443d58270ddc5493313d96c7784c47f1ae4ff754a4dffff001d042989ea -0100000092f5763855630332ff4790e27b1a8a37975899d435190bb50f8448d800000000c0e15d72865802279f4f5cd13fc86749ce27aac9fd4ba5a8b57c973a82d04a017d764a4dffff001d03bc04b5 -01000000b2dd87c5ae6f6368f5c00991d7d900c14441b315e0fe3cce598cf0a8000000003e0462da7bb4bbbf44948d8cb4af46d7fb0017f598329f2139f52c76a433ff819a764a4dffff001d01486ffc -010000009369370b1d364678e42fbb797a4ee0121fbc3916e5cffbfc5a8e1a620000000031774efc0e33444c762baf022787fbede880fdf466dfd754e3e457f4afe839b32a774a4dffff001d043d36f6 -01000000514da16d5dd2a4f82d4e52941092e8508c4cb7339e4895eb255cd87d00000000b6b3d4911dd13b8bb3d06b75eefd834250ee263cec3e94d9b4c93f600e1de90f5f774a4dffff001d01e3c40d -01000000f3a31ef7b1009ab512e3f3f03860dec8a09c3e7ec246e75163708bd80000000035f2a99aa12f8fa65fa0ec244ebc42cb7161e80bfcbfb1bf3bd89c3585368fe504784a4dffff001d01275ec4 -010000003526d4c92a0e4a1ef78043d2832b94108ae0d3dd21f7738e2033f3c700000000a5ce8a4c43d3b59b6fdc38416eff39c2d1068817022c79a4426b071b85a30cfdb9784a4dffff001d0052c6fc -01000000875794831d6f2c236759cca424704c18b8d89ef9f39347aa4b4fe46800000000dd4ed8001a3ef95027770fea474b5e63fefb27ec2f6b8648865f15e69308ff8734794a4dffff001d004298dc -01000000fb0922edf49601327afef737beb3d683f98b19d128f1ae64725b5abb00000000bf3d088f283f962487807e618960923be192a236beef35f4392d7ecfeb6832ed38794a4dffff001d049e4ba7 -01000000046dac6511ee9b24b34cc63cd704497d6383d1794cc058b28badd5d300000000e885af2ab2be11c610d75db7eb1bd6eaea463efae811fec483ffa41aa7e83f8b687b4a4dffff001d04f872ed -01000000a658975dbe7c08a66b40f3a2e2f0ef98a255d60a79ba975b89a06204000000001e7d0335d1b38ddfa9aa6303ef27c0c6929af97154ab2062f3934a8a29b78a58137c4a4dffff001d04ecec44 -010000008c36b480e7358039d56678918d633d9e92a8f3bca09cfff8286e3fa60000000013ac254600fca551cfb3665dc3beaf8114aec034861d36308d5e6b213f7c01c5a57c4a4dffff001d0061a279 -01000000169009ccd47ab6783ed3657ecb5c962b3b3d3d0edad231df0c9f193700000000623d61fe4724621efeddafcda266ef8edb29c8f2ae051f4c6cf6eb2edd214e5ca87c4a4dffff001d045f755f -010000000b89ccf6b22dc7ff1668cd3de5d6a812f1e5ef46b512cc9e352f3f3b000000007c644560629caa21e1a3fb2bc113deb42f78541283833c4a3abbe6a6fb6d877dd17c4a4dffff001d0588650d -010000003f9e8ff2fbb3e04c36c9683dd534a2d4fee5607825e10a2b4885e8e90000000034dbb7fb145e4c0ef8b98d4a03758ad3e9fde5016b147095494046dade14e834df7c4a4dffff001d0320c105 -010000004ee7497463e160c70196b1412a2ccbd2cc41062a773c4a3202b7b047000000007cd53c97e3e7d4f9f8e172a6168aee8539dcf2f4aa98caefe37be637000aaff9fc7c4a4dffff001d04b19e89 -01000000999ad8365c277b20b05558240e3c383ebea0d478faa53122dfa506b50000000088b03731e11466e46268a2473feb0bfb996a77f1d39d1ad9a23d27aa158ef8719b7d4a4dffff001d041a251c -01000000864569f3105e048d65a9151047f0ca03a5c3311c39dfd84c35bc279b00000000b0c3d72e0b5e89d3cdd7b5d44396e6a4ef92f4a2e7e198a6ee583768d86c839fd47d4a4dffff001d0348f715 -01000000783b15ae83eabb19aac502a6fbae8c6b4b2d8dff30a1c3cb2af0b318000000005e2072b31fecdf48b38a60a1613a73f8c370cb4a857c74844ae17ae30adc9677ca7e4a4dffff001d05a98d10 -010000009b974d3c625f7fcd4e18d7b8e5d53ec6db57b0987f7ceef46e9175c20000000005c8b8ec09654909eb66cb5d6f22c7ba56afafbd3e6486fe8885c7f0ef53b77bd27e4a4dffff001d03cabe9d -01000000d04963c151d6298a97a6ad4c762ccbacec3dabe179b3c39ab96eafed0000000004aa8cff9a7ef9a2029c8f3d45561888c3c50d9d7e9610de7c7976f159bd0d55ff7e4a4dffff001d02e2bf3e -0100000032b6290c64c98539ce9570e69dec2e354bce3909fb62badb2c6dbbdc0000000027cb02841e5e22c93f1e2b61c1cb40553e97205e0956a3b01777c137d3264cdb107f4a4dffff001d03e0d16d -01000000b96ea7181758239d2d12e3c43cb81c47110526fe397595956ec24e1800000000e89deade7ce10d96cd17b1371d1bd50a16e04c997331c3a49baa0ba0cf84e6c5de7f4a4dffff001d02ea02c6 -01000000c80ecafc4bca833c5f2b956f4acd585becd120bc9712517eca873bd5000000003c4a3ed10ee0ff614113e34850ec14018c7286ba1868f4eb541ba0c68a0db05def7f4a4dffff001d05c8b8b2 -01000000c451a1fcaa893e25e72b921e74bbbe82e4489aaeff82806bae8e2ff3000000004d8c8758514bb308bd043ba7c6ab04555831f523ef439b44b6c2d26755a110b86e804a4dffff001d01868381 -01000000b8d4747b5c3a2d6c8e50e389fc938ef7b8c04eb4104c17a2e2694f6000000000aed381b06d2dfe28d0ce14b4f43f5c167dcfbc80d44e37054a014a828a2c8c7236814a4dffff001d05517119 -01000000d0a1893dfc1470c05078598f83a28af1e44df83621ef6a34319f1f79000000008c68d3c55f59e4264a26c2cd1a6a3ed4d45c98eefd14bbfb9a26cf55ba30611d2b824a4dffff001d038d2dc8 -01000000d892825bf696f9c10eead1e3e97dfd043618e0123b72dd058988f92a000000007b921b39ee758310c934e9fc074942513e85716327fa08526e089895530fe6bbca824a4dffff001d0276d82a -0100000062f08100a53cfee15d6960d2915fecda72ac40a116600d176bd6eb5a000000007d4eefd21df4c8472009c501a9c023613b9b67c27231f130cfa72d97978ae996d2824a4dffff001d04f2f222 -01000000c5b9489065fa7e1ac4facc51a5a0ccc2111911609f43386ebe7ca1d200000000a0db3bbb22a2a8441d84dbe335c24959ea3d3d6e91bf67e66bbcb0d7e0a9c4836a834a4dffff001d04181366 -010000007c967c39b155d44a57d37c46bcb47506c0b00a7987d9debe642c4c1a000000009969fab4c50985190c20867d5eb2622f8994a72c05fb9c91ab057be79a80526d94834a4dffff001d0391a66f -0100000015276dffb7a0360993a5a83751944fc88a2d3f13f8e9363e5f3cdce300000000cdaef86e7120eb9f7e0e9c1b3009b4581d1133e5e2371f0da2a0b7d314465f8dd8834a4dffff001d04184062 -01000000d9e737d6b012027382d48297bfa52d08eac8ff7aac62810a3bc6798900000000be2b0f66f65fd65f4d4e387b96041ee0aeadeb736b467f8b64e12663a7f8b92971844a4dffff001d016cbc40 -010000002059d85f0b361f764b21d2254602420fbd84fff571daed5304862a42000000000c0bdb3ed18e03a8b3b92ee43926dfcab9a2bc048c98afa86c1f24e1f7f1ab7e23894a4dffff001d03dc41a4 -01000000c34c5ce16980a5ee4c66a17ca4d8619600a15f7e0dff5edec12209ae00000000e7be4fb74031df2ddaab02750360d6b806cfb54cfb9519ee517c20fd9c636b2332894a4dffff001d05c8f18a -0100000071f7cdf7526fe514f6a17de62bfd240d2eb1fd5f8e406da3833394490000000025156dd8c9381fef3564ec230644a84f35524ee664c3643ccec644088b95d86f7c8a4a4dffff001d054f7dff -010000005b09986f4fe70f0f864a258266fc73e908e170c29b3cfcac9ca9fbe800000000e0f8760379c70b7d7904b5a50c59bc16afc4529114d9b9ac1de43e698debefdba18b4a4dffff001d04457234 -0100000067391d93a161d82b8f968b7041a48507ace6bb30d4dfcc789e0b6f7b00000000a035032fecaa07e192fa2c97f683fc201a50f90c7ce4abcc33ee37aa528503e60b8c4a4dffff001d02bc415c -01000000ddb642656ce71cdf2052b12984eb8c297eed7803ebf000dc63a262ce00000000b9bb4103d0d93289e9f9448ed7e63a8ac751ceaa41d1cc9627d2bca7d7c28a16598c4a4dffff001d02242de7 -010000005705c3df459247a82aaa9c3d836ee2661cfe00c826faa3f2a8462222000000002204f4022b778f21a952719904fcddbefad0afb48be8305e89ddaac4ec8b133c8f8c4a4dffff001d01ef8ecc -01000000560f99e148e5e82dc838535b9cbb5a6116eae26b586531fc2e2a8315000000007760f7a3f07d88e8c7361e1223ea4a9e4fc5f9d8c421037578ac06d921f11095528f4a4dffff001d0392d460 -01000000cb6dafa616960c0d1b87c67ce99dd7238f3891d280444d7a15099f710000000090adecefcdd85452dce9b830a3ceb9240da10806a62404f8b7048c2d85ea0f7d818f4a4dffff001d0331ed48 -010000008f7e1c2ed57b82e56977639379c6cc7eaccdfde5f181fa381b0495610000000023130ef1dba152270b2153aefbb5d4e29c22be3e79b2041ca20620c1b381e099ce8f4a4dffff001d05e4da4e -0100000005b132a4f74a8799a57a4202d0eeb09612cc08d295401f007c4530dd0000000073340035d03933e01bff3c47f14a5b0a8ceae33be12a8dd521315628ebf42eb3f98f4a4dffff001d003a7958 -010000004e6790a025117e8aa81fd453c7c6c236da838f3dacb169abe51897d500000000091aa6ac0aa796201482553ebe24961fdb79bcb2c1b0902f2ecd2c9e7c705d830e934a4dffff001d001badf1 -01000000ef72b16c3d1e58804b715c8ca9d02f2158524171a8a4742d0a07974900000000ecb21277a56d483af3a7ea1615a8a6d0566bf87ef230146ed4a8cc8fbae417b2fc934a4dffff001d0370ca3b -010000004fca0bc6408f652b0d9f79713e880890605c993fe954bb73808f2cba00000000a70a8a17b106c669acb346ac08ca99344b307121658cb8cab8d00eba9adf7c9138944a4dffff001d0328fe63 -01000000077ee2849664864a66985199aa49b030f66c79f8022116c979e234b30000000087be9e1e4f0bda5f90e3c1db350737e4f390064d8aec43d6e00ea92a27c2957ee4944a4dffff001d03af3fb8 -010000008b0d4a2ecef90647f9d1a923020adf2bc138626877f0f855fde5000a00000000ecaa67add6b1f10ff91e5df491b59ab1594c357b39ba9f1f06022b078844375e99944a4dffff001d0037c556 -010000000bafbf706c6cdcd91f5fd082255862927a4d3a0457f7d7fcc6ff3e7600000000087028b6299590346eafb168c13132979b89b4912750975d9bac131a7d4c68c3e2964a4dffff001d0525ab4d -0100000025d15b892b9a091f18e865d579f536c655f18a4994e960b06227a643000000005a2a640ca55a1660daf5363b670daa00560628bc3c39a6dc88d7d59cf2dcb669d0974a4dffff001d0226a908 -010000006843e8fc9750cbf5174a0a778ae5a6a63186683d1296a8514359770d00000000c5eb73e7834883d87b8c0ceef4ba9b850fe503039eee9b28bad767afdf0d0416d7984a4dffff001d05d4fe47 -01000000e3756d4e486befea24a302f095aa87c984f583a66687fae68d92ed1c00000000549848fd7d128b20aae864145aa351ba58eee3feffd7a8089c7adf4445b8de874b994a4dffff001d0496907a -01000000cb8461389ac8693f9f277f037cec93d37eb8b6a6558cbe10bdacd1c3000000008aa6ad7fa12e8ce311c1c659166e587c880e3a6fcdae871eed1bb350d713f25113994a4dffff001d04744479 -010000005573c2792f3790bb99c05da5d71c9a24bce92ffeec84093243a1aeae000000005945dda5801905c0a507e521331b06a9263279c4761dfcdaef431c0a76698688b4994a4dffff001d0546400c -01000000afbc89759982446b305b9f48cdb547f3c95760014fe738ec3e32dc8e00000000fea6f2fb7688cb32351b15857d3f250e581af5b20d9379070b5542a00c42ca70699a4a4dffff001d00ac7c0f -01000000e17f97a9d791f0724271f652f057075f27d96aeb365838d8ab17191500000000a91c00538ff6917dce0bf745e5a040479862ef7134de60320297eb029f7bc07f469a4a4dffff001d03b1cae3 -0100000050e436836fe519456bd7faabec5d522aa80bca6a53af3f9d57457c4f00000000c66962dac9d02aab13c8501636c123f672ab771c8e088e1b24275b105d222c7e569a4a4dffff001d02c1415f -01000000dd654b9a8a51371c852e448ca417a3fb05413a70672783ecb1346f640000000044fae19fa72a7abcbf78d966a5097415b961a316322184bce818191677a3f129fc9a4a4dffff001d01c6aeea -010000004386a29fd8c55a0c47b8e97c6d04e1267549de89abb6db75a577d6ee00000000fa993f2f31763c2969af7e8c181a32cb663e07bd210ec14e29fff768621d4b58459a4a4dffff001d03c6039f -01000000c5cb299e1b345b77d730c527034828c846f23bd3630ff74355c2d9ed0000000056ad317661356b368d8589f343000fb68353f92172d8c7f68a9c9792cc94ca5c779a4a4dffff001d0485feb1 -0100000028fd73f5c4415839b41e887ecd606661462ad914da28c2140afdedd100000000af9d78520fff7f6212f88c7c98521e2c9a8d2a23740ed2068e1b2a55e0c7aba71d9b4a4dffff001d03a07cff -010000000cb32bab66fb7c93a66f841608c74f61dc36d662cb01f30a8f01efd400000000f8bef1ce0194b9aee865355e8e5b0881092bb9fe8e3842c4f7110f7306caec26629b4a4dffff001d004d55fa -01000000c2a8b9e3677de7a6f7286c8a458cd5f09409c254209d9d8c445e0d24000000006bf3416c661bd39443f16a48fb560e97558e2cdab18da1e598086cd40a2ac6ca379b4a4dffff001d02c8a75b -01000000653dea66e42fd4d1019adec51e1f7493b06f458f960a6b08501d8534000000009ec37ca4395220c81233283dfbe020c1982b43c3cec6b82ff425173ef558a51a5c9b4a4dffff001d05681cfd -01000000443c685dd9cd61dbb1d4c1964e8eef7a1e6c6688b38775c2707b2f2e00000000cfb0c5cc863b3809bb9c642a497ab8eb5a2b0e6cb448fb1a12b08c3d0f3b1e13989c4a4dffff001d04a008e2 -0100000059ded6607bd4ccfeb4348c41b04a13343602879158b8d9aa1f3acc6b00000000af43000d9c2194875f48dbe377b839bfa2157758b941b5020e58b55e2ed04fb5de9b4a4dffff001d05540f10 -01000000d04014b56c58d45f823589d9d36bb755c50ee96359ff44449d71cfc4000000009d6e5c4cadaa256c698491f2c3086ceafc5f73eda5e54d4ebd50ac8ed90eefe0c79c4a4dffff001d015a6219 -0100000098fbe05200b867e000286338ee405f70ce4362f54769db2bc9d919db0000000078b787d3d8da61dce5a9fe4d4a9232e804021e439906e6fd52cf8f041f948b3d919d4a4dffff001d05774a61 -01000000c5f311edc79caeab3404ee358871e5f886712e56005f4c67141dadd7000000005545fe6585b08eceabf29cb4ff68ba07020fb36520301d4d5e7f30dd1489aa6e849d4a4dffff001d0505dfe1 -01000000f24700786a174a784f2d99ad24d4c0165e2f64acdf0893cd4839590a0000000022c09454ffd3a434342bed475ee4e9f7a34b99d26b65f2ab92bcf7418e77f732e69d4a4dffff001d04872d33 -010000009849d7f7915299b00804b04d89a946033b4bac82b431a04781ee1c6a000000006801e653da56cf733fbab3ebb4d3f248ae5066f00b0b879a178ce3522c7e1572cb9e4a4dffff001d01e83192 -010000002cc41fc32ae1712dbf174b8d810498ea52c9908a96100cbca447858e00000000a9eefb8c49a77795e353cef1a18ddf9f75556b599049cc5c326bbedbccc3cc5aac9e4a4dffff001d0559b918 -0100000029bd58b2759e2398dafa0ed714764e7ea87a61e9966b4777837ad0520000000073173503f0ea326597487757ead4a2afaded9c36545e6f94578d3dc6e5d58fbdef9f4a4dffff001d01bb0d51 -010000008d7f3d0a93bb78055f440276924456111c24af5ed639ca3b3a2226d600000000fce8d0f71b20ad1d4797818e77da4739eabd906dafb8baa38bed17cc3f8d723906a04a4dffff001d04416634 -01000000e26e977c4cabd28830a8e1f87983e91ecbac81030dbbd7cea6efd4c40000000029045a4c17ed6ba6bfc40396d8b9d2640a705fd487c3c0271eafa3c503d0f54b9ba04a4dffff001d02477ab9 -01000000f3249f94c4a61be9fe426f496ddc9670874206c5034c68fb03a77edb000000008f1c9da6092af60d73b296ebbc796caf1b8a095f7ed33078bae45cbd2925029961a14a4dffff001d0253c63b -010000006f6cd48debac250a7b42738755888a7571eb9935bae9e94d7cc28b1100000000d42144297dd9954a62226db7fa2de24cba50b4c963ae6226ae5fa652946dd0a7e5a24a4dffff001d003cb819 -010000009ff0cf741383d94f79a6efeff2a317aaf6375ac3d252db55362280e00000000029e2f50ac5d203e020e7b59855380dda3e918c80627117c6249f987b28ac807bd6a24a4dffff001d030ba92c -01000000f61d5499f92cf040f17a16d02b348dcb3dd041b224625bc99acd35a400000000400de7fdd4b27e6d8d358cbe3b329417d75352a9aaff9af70c1f685cf842560675a34a4dffff001d0271c0e5 -010000000d1e2a2e2670286100f862dbae397fef5d8dede11bbcb013c453e8ec0000000043db438150141c0240a7f3f03cca32f4fd0ebbd6bae6daf898a6c7aac99b8a85c9a34a4dffff001d010d4882 -01000000abcc3483c5e1adeec60646454065ae3a116dc60aea65be6d0e66bc7c000000006c0e3cda9dd0367de3a4e1d356c0ad23cd88f26cdff41b412b0ca1de1d9c738cbda34a4dffff001d00b44c37 -01000000e0d79f654270f553820b56d0332b5ec18a4cb5d969c5d67c8adf9b2a00000000f2cf8413e5df690ebfdc8441586639e39ee7d8571d88e07853117ed693bc0b8d35a44a4dffff001d017fc225 -01000000ee4c6ec5ebb31e14991634916e68379e6f08617bd3e2b0816c0605fc00000000203f6062b808d073f0471cc4bad3fe9cc51cb9c732ab53e46a4127fbf0b960fbbfa34a4dffff001d03592dc6 -010000008000bccda2bdbf0a6293178dd1cdce1a368824e9c99587798b7fc1c600000000d29fc4754ff52a23715d3147c6a0ae31ddf06fa70465f4d09d41b4aa08da707bc8a34a4dffff001d05e36843 -01000000386cd6cb2551941a87716c2c618e1e56e9fe7acb49b0a71f414047eb000000007bd7a97b969168050de5f20cd3d0ea212b138f4b43e3c27755f46aa08f98f1ce06a44a4dffff001d019dfd3f -0100000053402e2e9f85db9774e0193414436cfbbc70b658c4e54913c67bcad300000000fbcf82e5b9b5c1aff879c25c172d4db531905915b205187bc3ae1425603e7c764da54a4dffff001d0154db1a -01000000ded3e38a879dcbfde2c9ff5690db8377d0c596e20b8be94dafe611df000000009d8b84155b519e0c1cd97837329fc3505f76944245c1bd686617779dc700c15850a54a4dffff001d00ea1441 -0100000011a98d2176e7952434447a06a9ce9f726651737d3a3e006373183b2400000000a50e90ca36c2cab93fd8acec6eae0755d7d2e710688a26fc16557bb5c038d12c0ca54a4dffff001d044b4279 -010000008cffb590fc8e390cc07b0fc7d7e1f83033a7f09c20ef114f6efd73fc0000000098f65f5151c0fdce2398474d0987d7a531aab1c2659675c07658b07cd954f80b29a64a4dffff001d03e15e65 -010000000a7213bcde17cdc86191ebe8580e3a9e893e3b9a189e2787394c5cac00000000230d4c63ebf11994b50ef9c5f1b75b2b8ce6950f63fad01665fec3ed5ff2bcd243a64a4dffff001d02706123 -010000002c29a0a93ef692c20f7a5d0a917a69be60ec5bd73788f9ae92a2e7f90000000048634496267a248713364570b8c4cc6ad5b1a3f32fb74cc1f11fd22c3b293e88b5a64a4dffff001d010845af -01000000fd50cc2daafbf969480d2675a4cdc41f397d1d815a2aeaf863236bbc0000000086d723685d916a3b3aec61efe9b88a845d96fb903e78760e0759aa2089de4e2e66a74a4dffff001d0389da36 -01000000e897be2520f0c6faad2d0c4be209e0d4cb2edfacb7579a6aa939a10a00000000ae3f02363ed042360b679fece5726b2499e74f27f1bc596c3beaf701463be4465aa84a4dffff001d04ea7f5c -01000000a4f61773f2105205cff43c8ccb188a0ebe56f0811834cc0772a5a1e8000000003b776a5a9f039715342ed278feea0e87f1454ffdd086ec1e3663cc738965e9d536a94a4dffff001d04479ccf -01000000cd182da4f3e6641784b8035ac96d74b182939696dda02368f01889b7000000002fa23a7882a373528b5403d34eeb13a26fbf25d668e7019e7a0403ccb5ded71387a84a4dffff001d033151e9 -01000000913cb00e5db68a01cd2c2c469773d0946e3e1589cd72c56349d0405c00000000e04420559afddb03dcf51c67a8317370080e517e24ea38dbbb5bd529680c1d2c3aa94a4dffff001d01ae2ae9 -01000000f87f4f7f7f99202d77747619865391ed07d87afb9c7c9a48b7f319ab00000000b4e21e67bcdbd54bee76d62b5cfdb6b5cdfc5fd1c6ffe9fd6b1e2f39677aeacd2ea94a4dffff001d03275902 -01000000c7a1220a895e2a83917ab688040dea8a000bbd5f4858e8bda00f3bd100000000fcddd0541ddd056f19fcfac0e637cc8fab7503352757707daf37da8e859434f397a94a4dffff001d02d171f6 -01000000c5711e518c4a53e9a6d684759ecd07d69b5d859e1edffcf4bcd3896800000000e4ce2882f8c5b8e467a080c647ca97b8c11070b7ad10a1eaeef13e1b49d0028cdaaa4a4dffff001d03ac5ea8 -010000000a1bf9a1db633b5c817be9ecef65ea99ed980a58d070cfab68b70d5200000000c9fca844eac0515369a587359fce6a2cec83ebe565dbf46b92928ca831a1abd54ab24a4dffff001d0370f65f -0100000081f9fcc96f7824b23225d5526b65d3d5826bfa8b65c083028e7b287700000000163cdfb6b5d8589c539ef411a96eb96ee49dcf03ef4538d8f752762893db209515b34a4dffff001d0215c77e -01000000a563fe8e23fd9acdbd8ce0db616cb72c1b05fc8610c4e89fcd32b21f0000000074fccc385cc517580daf8966fcbae398b81ce1f077bdc5732c529d6c3502e16183b34a4dffff001d033652b3 -01000000de5ca94254b771527679b5dc4862a7eee044409cc33ab2960cbe3920000000005f20491b7a3093fe2b342e816a5b8d409916c2f11a6cb6743dc528e8c7ac51b7ccb44a4dffff001d00d437a6 -01000000f8d57b05a64cb39a5adff645ba434bb707aa118322851cbce137df2800000000d760a34f6e7b07b3718a8355b71b014f07fadb917707e4bb635cc1277cb8ca7f5ab54a4dffff001d00d8ddeb -01000000a54d55adebdea113e46d6911a15712f7545709577a5ef6684a37974800000000849ecac186963e52f8b855e51f70e9cfc90cd0f7054c23f1bcbc1675206a00bb4db54a4dffff001d01cec36c -01000000f2f0b39c9e0f8ae81ceaf09ad25ee9166e8f3d33addaca1ca1366c5100000000060e3cb266839d6c8155ebef78939c33b659156bb2cbca1cc95b50e58ad5100b2eb74a4dffff001d02e282eb -010000004a016d8b02a6e3c33705715c29754230218f04485693994b29d78a2c000000007286500c919f491aa5a0721558e4b8a64230ec2d1d955c45ac871da0e74c898d3eb74a4dffff001d036714f3 -010000002d24b64aca8efd3a0a948e813c5303891d1971e6295be97c1923e05c00000000eca7286e07ea252409b51cb2124e3fcd6adb8e6fdcf87046de18666e36037511e6b74a4dffff001d037e372e -01000000dc8280b9a38ed7829f3ae49bf8f01642c0b16b90642b2e911c2cb69000000000a10c2661ab1b02ab9f3c5bf928db087c27c06ee7537b04ee66ea4785fb625c6205b84a4dffff001d053fb75f -01000000280fd86185912d306966b6b7bd90a765e659bad17564825f0c997f2d000000006637b339af8cdf579a250267ce7ce41f19de798c7ee6ff7823312076e0950962c7b84a4dffff001d00c1fc82 -01000000993b4428fc00d1eef46e5fb166b32f32ea75e3e49105a04322845d2800000000fbdd76c6562c86af0e63ea9a6c46a91b8d92c4e7df480977ec0d53b7f3c25b9812b94a4dffff001d0099e992 -01000000c3b9d6eb714b91e367d7a44145f498cdde7f579b68c66bc1b9af7886000000005b0df3f16d5bb399b09989beaf8e0665c695ef49b7aa8473ba8690f0b029ce0094b94a4dffff001d036efa36 -01000000a702519acf76d7519ce42d6c0bfff12644be3694621a942a55e4b36900000000f9357358ee5931b907a8c3df01115891a740ce6f4df224eda4586eaf450d8b9f3bb94a4dffff001d02d9d39c -01000000931d5230c5a2b7d43d322cebf9026ca68fe1a70afe0d8c8abed78d320000000005634a2446d5fb785d1f1582e6f35418bc6fbfb6abb9507213b010e58dac1c3ce0b94a4dffff001d02e9d793 -010000009c7bf22857a46add066ce2267450ddd5a6f280943e961b1db4d3be0a000000005eef5906ff42a8baf4a8a2d8119f88112d802484361ea778d22e44300f6ab20c55bb4a4dffff001d0179f4e9 -01000000e2a926d9239573962e534a47311e7875482832ecc6306bfaf1137c0500000000fe6ae11390e7bca224e9937759c658c9aadc8971e8ba384caf2a58de311826e7abbb4a4dffff001d01d2102e -01000000dd3fb5ca9283091e24a2dec99871d9c033f39b1009f5ac592ae2cf190000000086a971609dbe58f45f99ae1a769c07ed6b0575ffe811844b8f6e04edac722bdae9bc4a4dffff001d037251ae -01000000a7f31bcf8d5a86bda0ddaadc3c8b77ec71af748584b3a5eda6b88c4600000000adc6c0ba4cebd8e2b0154e9f876f1e6ea54e293e6505a5200a4a75d394521a7882bd4a4dffff001d02defce7 -010000003846b6ba73428b23c1aea96cb3a4cf8b72ea4f40268ed68fd16ad9bc0000000050a4b5b4d3fb6c72d198506c83d6e2792262134ac07813baf355921ffee7c6579abd4a4dffff001d04687d8c -01000000df7e6b1a5947867dda62ed7a79f75d939d4190f3a575b447c31308f9000000002523ea33f4e43dc2dbdb14116d5d087aa3544a7f886a69693caa154ae0abcfdf05be4a4dffff001d030a6d3c -01000000799f7e9b6d0ef1bcc5d4e6b82936272e3492df8a920b934dc9e1973000000000d0038b40a4b3c20cb7a6b431d6c2edcd235c59dfaca4698dc0f4a057d89eded6ebbd4a4dffff001d01e9924b -010000005dc85295d33956fc24736fe54dfaa12ca98cae2ba02ef7eb9655a12a00000000b7bae6ad3a263adfc01e5e76acfa7dbdc0e60962230af6fc59003d59b437b28d90be4a4dffff001d032ce3c6 -01000000a3b52bc4a8ade1fb7764462099a412272fa13b3d9de508c356a3d7910000000001eef5a3b0e24e946235bdbdaf78601185042a5974a6f9aa7d8deab62b6bc49c18bf4a4dffff001d05a9f6dc -010000000e816fbf3db7c990098f50722e36029dda668e9aa386c23a201e9d8e0000000027d9b4ef4291c5332a05c4a2918b5526b96a117c0bb2bc97cd18f5a6eea15caca7bf4a4dffff001d023f105f -01000000514062fccf6e88a8ad9d0ff0fa2ca4d2716c2b5fcc577f52e4557fab00000000ca12c4c5fa9b8106d21f12f4bb24e1954ee95686b849c643e0504328653198fe1cc04a4dffff001d022e817e -01000000b8631eb7fbe8abdc32f81b54c6f86c96cdb5d7c270cbc8e8026890e80000000032510d84003ef4d4b634cb4bc914de16f8e9b72b6f1ea20dd9eb847f11351641f7bf4a4dffff001d011d83b5 -01000000bf3ce738c0692a474dadc784640fe4e2f06beef2fffed0bfee65cff100000000a463353790f4669516f33c405164df2ee08f7738bc91ded3ca2a025e18143ac967c04a4dffff001d01fcc651 -01000000fd4bb907a2089b41433dde0fcfa70db3ac3a6f075be657f0e15144d1000000004bc439544765cbaef9a184ce7fb26bd62cf1ab32267eed5fb3bc7050a8f0c427b4c04a4dffff001d05d07be8 -01000000d0d3565bbad3a5fd165a7fbd978fb2ff2974dac1fb4ef21ee0c6282200000000e4e9ef647dfd719c086990944594c3892d0deffc18fc90e092d61a3e586e4cf8c6c14a4dffff001d0188a8b7 -01000000d2d5324fd546db69e8c42e6f6c5f2f686cf29a9fae985224d450ca7b00000000b3c4d587370073598ce1a226be2f70e0ccbe446e80f88f0446dc5b179782186b78c34a4dffff001d027bf975 -0100000074b16276f3e902ba74a5a938a86ad7249db7c620b06023385b515109000000001b94a65422bddf5384bb8da9d866fc7a7e5c5abfbd5867efdc8eada3b78b8e3babc34a4dffff001d02d402ae -0100000057f6b87254267089a1d84eeb06f20c3b181177372b88cb9152f356dd00000000c70258c4f96177b1cdd9d6fd5ad0e9a65abb44e7fc3dbe507f45e2984ab830d9c9c34a4dffff001d03cfee0e -0100000078eea9a9282653e1e213c716004ee3c5b7d323c37bdec7a64565831200000000ac37dfa5948ecb63e944a61eb0e83cbf7dff61cd61cf66d21f447d9a97bcbec123c44a4dffff001d05c7a466 -010000006c0d72985fd57581d55754a3dc631a89e6e4e1edbad1696ec271d6c200000000c1d26e829e285126d03a1943bc46d72c7e68f7fe1855393079dcc6406328ebc53ac44a4dffff001d01ec1ff0 -0100000060f628c70ffabdde8c265ff6aa1b49e0f42d250a0645ac0fa2963ffc0000000074f7d49e03dd5ccae2109db1e4ff11507238642d86fc771aaa999ae48b06f3d26fc44a4dffff001d044b6b47 -01000000f2c8d522c94e93a8ff5d947c057e4125a4deb167e5eabed5dfb56736000000005127f86da79df2980cedb16ab9a4b167e6daeadcda0d645f83deb48a3dcc065eb8c44a4dffff001d0561c0ee -01000000e6c388d72c717914e507f11c58a139137fd483dbd746e9c5f2a1eb0f00000000afa8dd6f0e319d4ddedfa1425f6c03e461dfa005d42d3f355a04cae42626c9b121c64a4dffff001d059f05b2 -010000001b354bd6d10f5a24879851bb2aff42548cb66cebda04e7103bc2521900000000622c689b318941bef087640fddab2c5ef6dd6024f133ac28c1ccfaf30e380bfa4dc64a4dffff001d00484506 -010000003e226e00e126f0a4a35b1c6c09509e0d999122428262a5303e563c6000000000d7432b21fd48689d7e79f9b6f7f624aefe8b72503fca13b814d355618b9023cf23c74a4dffff001d0247f874 -01000000fbb3060018eb1f40d734cc64744134d96536c4a331e00d4c05e2cf9b0000000061b34d561ddfd18ea3381d48a8bbe4627727c6ead00a84030e7f76eeb788148a71c74a4dffff001d012e783d -01000000fff008ec46c2d35cf469eded16dfadc77ca6e9a9680cea0b0611661b000000001d1e1087d20d41da1f0b4a5423aeb281ecd48cfc434feb45a4c6c31b6b61398124c84a4dffff001d05928767 -0100000093ebaafdaac804feef3ec352e40cc78be60e7ef1edb167891ccd99cc000000006bf225e961b1f1b8e042c45966c2118f20871551e0996eaf51bb628cd9d49b7a45c84a4dffff001d00381daf -01000000e85fb976eb4817418c0ed2987dba1674c0fd757f70b470f83d01a2d300000000fd6717e5d49bf303d41d861fc50503aa8575eb52243f426de308869a8cd57c57f5c74a4dffff001d033a590f -010000009cf5f976b9ae634b4c867bf78cb602bee8150ea1838d0ef3d06ce94700000000fe6ce75c462d7d09aa8d917fa90a49bd6a4c41f02457ff40ca47ded089021042b0c84a4dffff001d03a5f6aa -010000002eff16b6669f88de6f40810c57349804014f734c692a44ee822b7f1200000000c095ce4ab7e0e02110b75a33012da97d75e26b83de5ae0bd392fc3b8191b77e8e8c84a4dffff001d032c2bf6 -0100000001aa2c494f2d4b7ecf367734c734b931d3592b1572dcff557186ece700000000a10e60b120c06cd1be1d2153abb7901e2d9f1a3f43de9e6642ad269be1cae22e44c94a4dffff001d01f2005b -010000003d04e058642d22428704ad4337f372bb8574cae072c2a4b469b2e1dd00000000bff07e723c3859fe85bb849d860b21a325b1baf1494a3c1e73435dd7992bf8e53dc94a4dffff001d00262757 -01000000272ecd270665dc39e924838516da62f8588270f1e37812aabdb1d48c000000001725d4769aaca3cf86c5b0dd199bf93f2d16dbb13fbd4029633bdd1085283fdd13c94a4dffff001d02f79a8a -01000000705f1bbf68b4976a9ade4ff01ae933030cfe4cd43e8092c9604442a2000000000cb7f30461a3563992f7b02095263fdceb13984123a28ea68d0989601655e84ab8c94a4dffff001d0017e0d9 -0100000082d6e6bf4ed6c5b989705920effd072fe6b7119ea5b8c8fa6d0bf5c70000000071959f90386cdc263655d36033817a6f69cbc2d99fc56cc81f893b9787907a4fcfc94a4dffff001d000f9093 -01000000374e3a88a3a3eef84b4212e90e863754ac2a6999747c22667c0b29e0000000003a0e3693a8455ac94beb574efd98297948c5b5f69eaf0b813e6d5e57426e39e279ca4a4dffff001d042b079c -0100000003f06b3017023d1cbddd4cf169c4e74879754683f0d7670f1d1197f70000000098b12eacd55084fe2807a33dc2c89e6fc25f382aba3c6b4c7ee2f74a6999a6bbfbca4a4dffff001d03ba1eb8 -010000009c0730eadadb66fa486e40dbddd14b635ec7939f788fdfd999e043f2000000006b0a86109aea3d5e4b7dc320da600dff19d81dce7b77dab9596204c20c6125b06eca4a4dffff001d01c88a1c -01000000410f77945e68dba04d76fc931b26ccb571159c9bad438df5f8fc4d190000000004d902fedee34fce75de583a54e1fe7ef26a7946b48b93b9b0834dbf19a0b47f3dcb4a4dffff001d016618bc -0100000025ec91d09a451f18667262004e0cebb2ad66262407ed0a8f4ddbff580000000092f8e1be93272aae6b36766d721df3d80444582edec0143174c5fafad4cef50c79cd4a4dffff001d031ee0cf -01000000d8d0cea1249f726362ee78259d97d98efa17ab0efeb1b9d0a0cf0d880000000035c3dc39e544b855457fb0711697a24123fc3ba6c439123714b193b9d1d9ec7514cd4a4dffff001d0526c906 -010000003e824b7a8cb7bea1dddcaee7bbc4720e8c5d2f53c9c28dbaea4662a90000000061ef7a1ca4f6f61cc594d040490d3cb2f11054639a0a964c67cebc6dbc079e36cacc4a4dffff001d03af40bf -01000000da9201093da940fb6badc420406540a979cd5c06fc2f47db3215130b0000000069577de9d33e6351fb0ac1be26158f94c217d2522c35e9f813e47bf9811fad72dacd4a4dffff001d02f70faa -010000003dca51f6b97f7c05a44f329c1c9f4d7cf03eeb3b16d94bd56e34b50600000000092122ea597797ea0de7841945f09c221578800d0c44de4961cad7ecfb93c47323ce4a4dffff001d03bd9635 -01000000a560b2ead8a3f50df84385c1d5a51654c22a321268e077dfcb9ef90c0000000091db9cfec3e6c44a790d6295a2effcb8dc94f9f1c0fc4f6d867e90e140c1e9f325cf4a4dffff001d03a86875 -0100000056e6a9a6b93f9ad3ad847ee845ee9c366dc9376489516c31d892ed5e00000000bf2f3b6867855fe1058092fec7c5ea89c15cf8a70d0c565c26362d10129221af47cf4a4dffff001d027a9b69 -01000000d123e40889dc9dd8039943b5b1a0de53026e9ce92cfc69d5f8482fbc0000000022b49f0319707490d002d5b2c04adfc7a6433c2931ed04545e9c33f37a12b5bb924bbe4fffff001d00b7fffa -0100000065aa216d118366b22580747fb4d876d80ae3be145e318563984e0b040000000000c2b33efaf934623c6bea64570558d6551524e2f45d022b0fe935387279e6a37b51be4fffff001d0511e593 -01000000eced0b25fadf8818fabbf65b9c16f39874336d7faca51b74698ad55500000000ee49643ded3202eb46b451c55a652c6cf38d82da93de97a2f2bc0e8a28c1be7ba951be4fffff001d01f82bc0 -01000000bc9c266783225bfa273dbba2342f54809dcc2b263e1e6bf3269bda300000000001aa244355f8827bdc7eaaa0defe1a928816cf7d919890781c1fe3ee58d985684d53be4fffff001d01a443c5 -010000001b7467dcebcf2baa4814161dd6c7ab966ba082d670a69eaacc1785910000000050098a241f8df957a6bbea8ecc39473091636a4e55d673ae723edb6a3f50b9835853be4fffff001d013788f6 -01000000f5023ad6b3432b6b2d5afe707cfbfa0a30e94000799c8430a97da151000000007a53e7dbfb43a28ee9d5956be8da4190e5be6f16da4a5636f6139742754ec0cedc54be4fffff001d04474930 -010000002077ea8e53ba9a132d83b91e40fb1f4c724217b8197c4533a5bee9e90000000096a376627bd7b42278fb33609713b83665f195d100316b9e1651638cd4d7d47cfd84bf4fffff001d027c40c5 -010000001936a4ef861f194c15f171e843866f33ec3b3cf09394bc323753beb8000000002e3288941ec156d0fdc90d314d85a71a418d272704e12f2a99576fe3201e2d1b3887bf4fffff001d027aefaf -010000006e5c2e805629d476b92e0a8d74c3ee0dea0c24e9f35ab4afc6ac77b400000000d26cbed9a7c1e51fe657c6b3cdf202926e0b6e371ebf41ccdcbc0909470d56256e88bf4fffff001d05a2db35 -01000000e5f26b5abf56353520e1f9baa35e9cdeb57f257f59ff6a4ee42c3795000000007becb215d446a70b351fdb14659d105b3c258802fa4314b536c4e5249adaab2a9c88bf4fffff001d04e36b51 -010000003cf3550994f31a27c040b1340c7ae9ccd36d554a1bfa797cf46504c00000000005f56011e8d4bf55bca3dd8c9799e0d83304e43ae8b66ee58c688bb9d7f7fefeb088bf4fffff001d0314c7c0 -01000000ad48a4d4922e3834375f8c50e8cb1842688829c8952204f66b89a7e9000000004579dc3ff13abb920007843862e9091b0e142564cd0a75f5fc3272982b816d4ee988bf4fffff001d00becf18 -0100000098eff668afac04d3d8531d9bc31aafcd48f7ba68b080b40641dfddc200000000a91184d97bec523016c15dfc3473e7407278b70638f4fd6c9dc1ba210454f7fb1189bf4fffff001d042a1349 -01000000ed2b2b04575642de5fc665cb8e30f3e39dea66299592405204bf6b5d00000000f3af0d684b2c16f307b6ddf9a02b58b9079e858dd2d093aa29288856b83b82183789bf4fffff001d002cfc38 -01000000a398a8e978de6f1e7b9b84523d45e5f2021feb29f6d39890a2f48afd00000000f4a78ab4703ca95ed478e78e526f1a8198c3cbfb8a9ee6455338d517aa18173f3e89bf4fffff001d008b40b4 -0100000036bef7eedabe3b05e1e049efcf66823190285d64d11ccfd2eccb5e3200000000243f2ed308bd48cd3dd25d4cc649dea0d0518d6e12612e03c8a0888aa284bf2d6189bf4fffff001d0498f47c -010000008d84b4fadc45563b60c0f50797ffaf71046f287482ab9fe629f64e4e000000003ae5c2515afb4117d032de958e0ba535e484575b80ff6d6e2e0a23e6dc95e0ea7889bf4fffff001d0518a2da -0100000020ddc91a15f8c9ec5161bf1709ad7f37c33ecce9809b353dfd3df2a400000000f2b6d372af2c7164d36dc1c369090f4f9179b0870676ab6ec2641b0922b1fd179289bf4fffff001d04bbff73 -010000009701e67638ec4e8b47c547ac3125ac6c1892a98d77a580ab88f069d5000000007c740055656afd61883f9c1c102fec710315e6e4d58904accd184cba85c9f958cd8bbf4fffff001d03f8f01b -01000000fa9f56e3e4fe1352905b3a1f12567caa3f9f4251f0bda94fb07f1684000000009ff7fbae47f6afb47a1723662d196155b5f4bc1c62e882a93f54ba2d9a10913b508cbf4fffff001d02d1c97b -0100000002ae1c66166259ef43d290c6a60cf8eb5783e6c91293a3566946673a00000000846d597237ea76576bc49381badb59bd509cfda3095c2c1ce5c75788b96aa144718cbf4fffff001d0139c1f5 -010000001ed0a06499985c4cfb05371eec681819d8e193b66011f57b66792565000000008980b714aeb09568fd34128f4c7ff84d3e09223dcb2b290c5948816cc636d69fa58cbf4fffff001d0122c5f4 -010000008c045f9e0e200a8eea9c0957b12e045e927dc768a8a5fc2d8fd8d9ad000000009925a3f617c025b95f6329247379b7ef7bd081e52838676671c7360eec07255a098dbf4fffff001d0099c40f -01000000a6adbd81b12cff9948911af583db14484c4c0d30e91b1af2e7fd4d4f00000000a70e4b2057854c71170f8468b799f03d0344905213872216f4210f7bfcf76980198dbf4fffff001d002b7c3a -0100000059e1e5ae6727e02c2acf95bc5f24d8274e42495c790125ba52a581170000000043412a5a9f1749688460eee46b62851641fd9b17f9ed5131b3f50e4f160eadc45cb3bf4fffff001d03a966ba -01000000c704e90a0c4cb992d6973d636a7094ef2790a60231db345a926b6cb6000000006f98c89001a2e89ea35aaf00b85d965af5598b61bc48d9d9847609331995383effb4bf4fffff001d02ee5af9 -010000005468467a64f255415f3ad770f0d5393275f2813fd0e1e915a2b8c28b000000000566f29ed6b8cdf85a4b197dcbb0135dfb7b671f83ca67970bffea903309ab7445b5bf4fffff001d032ac068 -0100000021ad75b801d48a30fa5b4e6b1e43106a294a5e2763307a992fbd5282000000002c20851e58dc1a2ceb7c7771822ed41c7d0994731d01829628c3e938f4155a276eb5bf4fffff001d01a1420f -0100000002954bf32d68d54adac42cb5190efc06f18ead35208dc14a8face6f1000000009002c5c2dfd0259960507e69399c688f0d74bbcd52c810cd2d2507a829133f4941bdbf4fffff001d01724be9 -01000000add5df18f427437ace8b40064b3806583217a3f724672cf72cf8c18300000000bc652800c84513b2de38e0e97be92a582a628e1e49a9fe8d49aea5623251eda54abdbf4fffff001d045ec8ea -010000003b0c953fed585c1ac952df84e4c3953ba551da457c700035f6f3fc0c00000000831c01723b0fa955a6fbd51d9ddc5c77964814868f96f52ea3eaf3b66098e6df9dbdbf4fffff001d00cb77db -01000000f6667e8c4557c28f88b86a6892d03509a5afc9a89088a5bb8638eafa00000000ff61d87fbc86dac7f80962702153a2a6d9a84dac13c265106b883ed7ef68fc91cebdbf4fffff001d00e07f63 -010000002cb99b76cd981a422d02d61684f76bacea92669298e552e412ce41df000000005f2a9977b14cf34078500f956be0cc154291ce5a0e34c00a3dbbae97bed5e930f5bdbf4fffff001d008fd760 +fork:000000203dd5063677584b973ff13e95db6d7deacf55b89293bededfb4eecfcd180000001ca60703d74686818e214ffa1177cccb3534b202dc6cfab1c7ef467d91f18f3beac5b263ffff0f1f6f05000001 +fork:0000002056c3cf8437d4e22237f2959909c88c7c4315d5039168b03ea14dfc0921e40b00b8027f999b111a7f189ff9fc8173b95faba4cbb9bc00c0091a46c3baf4cfb9dbc4d6b263ffff0f1f370e000001 +000000203dd5063677584b973ff13e95db6d7deacf55b89293bededfb4eecfcd1800000091c34faf58277c508aede93dde3064fb0e940ceed36e3e460da35e98cafdad040f75d562ffff0f1f00003d5901 +000000209565edd79ef272c8573f88ddd434ed7c02952c56d4cca572782ab0cc241603006ce709450e02e5f3730820b29d8b20180b0a7876e7d2d30ba9f31ab70673c9b21075d562ffff221d166663a601 +000000202806a4b7fbc5b36d409836e9b33685e53314d381daf5b0efbec8edc1180000005b7c3595accced45032522a7e8b52d7f204050600f7b1f7a6cda601c17db853c5e77d562ffff221d0141b19f01 +00000020ef30f3e170cc90fec0828d7e3c27e41dff7bb6b716b14046eb5725c321000000bc0af863c690cd719d7e1c35f46cb05d5cb4fd35d8323178ed8ad34945bf8de35f77d562ffff221d0cf7f9df01 +0000002071a53a3a0d4fa9cb38661c4d6d0670ecd86aefc932b23d94f1ceded21e0000002b33ed8c441dbd9873ee341c7d34cea02c7ff873974239ef1ab60cd2186020d96077d562ffff221d015dd68201 +00000020240042d9989681c2e55c7f6c3872310dbe80bcd0ea4f93ad0efc6b10000000001d93f3eee16db646e8e7a6c98c86fc52122d56320a2615034485bdcd900cd29c6177d562ffff221d0d1e6e3001 +000000203526230824bfdd7fea737ed8d9c23882594ea92252c347951ea5c94d0a000000f601e3e39f29ec811723f9e204a95cadf3476779030eca8d117bda188a03f8f96277d562ffff221d000dd1dd01 +0000002048e848c09a149178ed12c65d74ec46339a963a45a42b0fb94d84ce1c0b000000899068c185d02da2c1af9df1c251c85fb48633477301aaf9823b5117411fb39c6277d562ffff221d072bbced01 +000000201982f26ab08c6b201e6bf732f67eeb8f8760e2308aa9f1229e82c40b1d000000e7a71ea33a6e40535bea5bd22e17871256068ca234ad4f0e41d68491b4888d176377d562ffff221d065c5aa801 +0000002079614bcc644bd7235fb05da311cd6268a9cfa4a44b324e2b6be2ba250b000000b679c4c98c51bca35ce694b8a2a48307c9ce69157b634107e14d48a7413d929f6377d562ffff221d02d3723d01 +0000002024346f140de54f3218af6a5c93ea15cd94876d01ea2f44557d841ef7150000003dcbd5fe2a7709c841119794e4db71ed33523d4347a4031e6c163eb1692b6c496779d562ffff221d01586bf301 +0000002014945a42ba2cd12f77d2964ed029381e65367ab55bc58e1f0e5061de11000000e8642654c519b7fc2f9c1c8f9ff0aa962002485a42fa4323db8514752fe131d16879d562ffff221d0a06e3a401 +000000203ddaf189247626d13506225327089da33bed7478e8f224e39a135a341b000000933a6a92b7bfe55e706b2e50b9de004b37d3a24a2690d885ec0b953e310637cc6979d562ffff221d043b78ee01 +0000002062b9533b1b6b0020adc12268cad50077e405cfd869d97919fce5f1491d0000000ffcd46f560de1d7f5051279163e52143b106610d95e7d2174d2d2dbdd6315ca7f8cd562ffff0f1f3c09000001 +0000002059efda9a31435e412bf8880511dc5f524c8c0568d66154406765b599f5870c00f0b7f51a14f3ccfdbe8b9c0515477a8c80b5fecc376c492b3fe3b643557eb5bea591d562ffff0f1f050a000001 +00000020497da78a288152976fb8db30f6068bf51c3459b94639cd8ec840b7abf1370d009224f29690e08f0ee3813475d67463858831da04b57a14e08d1d7a6c9c0bb9d07196d562ffff0f1f3a02000001 +00000020a085caa5ef42492b5980ac5a63dd7c3aa0b4b4c02ce40b3c9fd3e60650d30a003ea6fe49191ae974da1770018de7c77c41ba0c53fcc91255d2a8e03800c83b40e39ad562ffff221d0b23f11201 +00000020e5d8e46a24f799d3a754749585fe8b861fa44fc2906701bcbfbd054b00000000e9747e0fb7b51fdafdd90ffa7f02e3c97a121228b7dcd22f97a1c9c3dd8bca9be49ad562ffff221d04ca1e1401 +00000020633cda9157ed358079fe1f8e5e094b95c36e8f8d485f7fcb19313282000000009271587f87803a2b214ae813f012afa075667521c59373d6508ca7243e4a468ee59ad562ffff221d0207960c01 +000000203bcd1efa12b78b67d8169f998ae354fc4efba2c18ff633c2ef5bbc6a2100000009d243cc36230c1622b2ab1ad6171ff40f24c0de2bb7ea44d5f4df7b9b146b2ae59ad562ffff221d0387669101 +0000002041735e76a611d0aead749beb34f5b07af8073eed7410055d6df724d00a0000006f6252ecb861a367b95a363da5e27ab300daa218847480c8902484c8de349fa7e69ad562ffff221d060d250301 +0000002062d392e84f480cc968c31a41d0a2343520b4d80afabfe56ca7603b4a1a000000aa76b50e91376bd67c0db2ff452d014e354b0d803c7021390a49a385a95f7922e79ad562ffff221d0319530501 +0000002099c136fc88fb3b9dd35f6ea56e3104ad70d1bbd4f69fa59a7ecf0eaf1900000097c46c823abf139fcf5cd270cdbb78b022ecd4b5f2a8c807bd82bd1735884120e79ad562ffff221d139ec65001 +000000207b1570f6324d6bff90ed55a8593c4756da30ab8cec27501d951a2f240400000044f3bce1e3787fd68c5df7c36bbc16d777ac3cbdf903a908745071d9c93e5810e99ad562ffff221d06e9ad0401 +0000002035986bebcb808466b17ddf8bf683e50d24d7d26a5671abc13c23b4640f0000002689944561259b22bb13ce324bb6d08940f1bda856f24d57a0ca0eae82c3dfc7e99ad562ffff221d031f10ed01 +000000208fb1b250f1922c8b8d368796bd89514a6255992c034027dae6f98b411b000000370910c7fc5585ec12f0b5f0ec044de213373c82d217659f6a266e1635c99ed3ea9ad562ffff221d001e192901 +0000002085ba333e02a33791fd021d026f4da9df9fe437a53e70ddb0856d1628010000004cf620afcc9628a1d92bbdd516268ffa8e55f379ca546aad0d1b7555c0ba66e5ea9ad562ffff221d064ecec101 +000000208d3343a36ccf7b1ec897858fdb0fec10e6200d8af7bcbaab27c0ef911f000000ff3682755f4c0f5fb829db250d847dff7e33e4ce6c4107a589249bde88382fa9eb9ad562ffff221d07618e4c01 +00000020a9494c58e31e521ad56467b3e7beada8a17f70056ca3e926f659619f160000004d721a7ae0d2739d21068b9049172af46664eaee1f898cf4a0f2e50687d4717bec9ad562ffff221d03635c6a01 +000000209573a2efcd7451f6bced29df888329471b263a43d0bd98170ad02d961c00000033fc08f465259c9993618872a45234954e6d840a4456d6dc459dd4841c9bbd88ec9ad562ffff221d02996b3801 +00000020dfc8388d6f57bf0e276fba23cde3006835dfdbd7fdf22d96f62a916b0800000002da640a96e1472f345eae31e3e7bfb1f1bb289e61e4abe9293647ab1ade3a95ed9ad562ffff221d00ef45c501 +0000002066dca431aea8188586be1469fe92c028dcaacece4997627d06b2568b15000000e16e136fce359b2a0f30f39350efe9ffb8848976970196cb82c439489a85e339ee9ad562ffff221d022bbb3901 +0000002098a667775be21f289790c7d7a7b659428f380ba8bb293384f60d5bae03000000dfe1502515b678c9dacf72d1622c14ba4539c9e0bf7861e86dc303f48feebb8aee9ad562ffff221d06d6918401 +00000020181219f8f7d3242213a26d73afd775666dc567b754900051c5fe7bd507000000f1770cae88be1f1af33e09cc1632c6b34962fd7a8a426a8a41fa0aa756d5aa09ef9ad562ffff221d01105d5801 +0000002095f129919a44a22d8c8adc3addcc9d6fba8c6a01872d7516a3dcfe621a0000007e2c5d68f6d6dcda7e8fbc6a5e29351df35eaf3eca3665e494447552834d9a41ef9ad562ffff221d0762bb7e01 +00000020e2648b60d5d35a0fbec9803a054eda28744992c8a4d767a98b4d319e160000006f1739f457b3ca3b65f878d1a2e6b7ca74590f9b2d7268b6c5f40556d3d26485f09ad562ffff221d0b1ad1f501 +000000201b0e36d1f31beb363227252838557bca99405d37eed86265e563855f020000009274e664f87026346c500c2b7ab9a07e8cb0b7827033b4322158e8d4ef7896abf19ad562ffff221d03525cdd01 +00000020d0394b635d5d8416b17dbe923637ad8ce28f85ee7fa54d6c68dea5870b00000089b48b8d959e76c3ec9dc96415eb35955caaa10e4f556a1c814b60cbec9fc399f29ad562ffff221d0cd4299e01 +000000204034732e9c3abe87cdd142bc6d20c714e0ba7f8f9835b33203e3b68c0e000000e3d08cc9660f383de1780f18b9ff607de4e8afa7708ec6d5afcb2d3db564e14cf39ad562ffff221d07086f0b01 +000000208ca30b57b44500f7594af2c88b96f815e45e127e2d595eac7400afc516000000ba5f42836fd770ae2c6188d4fdee86ff885e1e63376ad0c68476fd85fdf45064f39ad562ffff221d0479be8d01 +00000020af9867eb0851e28084898a1eeaafeb659a888f8c42b4ae0243638561140000009635d0a0e5aea5c1d8c4d4e6b978949a114102388ba261857f011f94dc663792f49ad562ffff221d0a5f995101 +00000020d75c79789bf2938d2f6219d36f3ed6af2ce708ba0c11ba94bf1011381200000029320f716db0512c35d66c25b695e7d7b3635b9c91c3629e6b9bb2d599b59954f59ad562ffff221d05dfa3fe01 +000000208a97dbe86f97f2ab2d4d9b41de6a92ff46fe02fb060b7100ccbafd4b0f000000dd587b1ffb44fe99f2ae4124887a676d031a870deb47510d290104ceb523b914f59ad562ffff221d04ccb8f801 +000000202cac0ca5bb970811f70afa9e9e9a2dbfb753af8a7109d94581c2204618000000bd45da0da24d277e0e03b74229a622dde9d082cfc203c38d3f1b728a8d99764af69ad562ffff221d05ae129301 +0000002080c3e712e242b53878c0ce4be2a27ccd5efa679a7c685d6c0bdbf1490e000000319a7a08ea9469348bd8384d6822fc68750a614211ad32202bc74741ee3af180f79ad562ffff221d03a73d5301 +0000002043334a62d50e04d15284442b62a3ba2c75c7016a7aa349b5f1e729ab12000000555bee58e5fa036976d83bb0d1892f78fc507a92efcc250637cfbda605122116f79ad562ffff221d07fea66901 +0000002008a7375518dac70be15559268aa783c2b063a3b51b039264874faf93190000009d76ee4ed782f8d32fca725280a33897615cc64e4a098d252e497f142104ebbef89ad562ffff221d093987dc01 +000000201fc70e5a42b6dcaa93b7ef439a740f0b6331e313975509629ce22d63060000004e5abd8246411811734ac9f7fdd9f6f2c8643ed1dfbdbaf79e964b6688bce064f99ad562ffff221d001c095001 +00000020f3c7bb3a030c9081e5198cb8b40f9859666b45096aaa9562f42739021d0000007efea99f823ce117cad823b43c4813ac0f6c594cacc1d6fb3beddc3c62d29816f99ad562ffff221d013f177701 +0000002057452380379a00b1d2b345e76d2307d25477e3d0f96994f13be39abb13000000db61449a8a5af017fccc5f3931e1d0bd94deec1312327104ff63a7e5c1d3b613fa9ad562ffff221d28817fe001 +00000020a5de87534d5a9c6a6e89684c8402600f01152404ab812e96b8a66f5f1500000067e9d44b7b4cfaa4c0b2240c27f939d6560983b31d06b2ac8b02f4fee0f37888fd9ad562ffff221d169d0f2b01 +0000002030060a9b27d45082c6a6abea97c33eb5bb87a136ba2ab3b0109745961900000027b8565958202af5111289b491380daab4012ec418659bd04df436d26503da7dfe9ad562ffff221d0efe3c8a01 +00000020bd501e7bfa9d0c3b83d314cce4e7d347e2b5ddee335560eee1f6644314000000d8f58fa9f0ffebcb37b3deacc4495424b0cd150f18a8ff48c1238832777895baff9ad562ffff221d0749c9cf01 +000000204d5d69f31914a1b971b091d4f1fd4816d9e23401715d8634b5560d5c00000000dc998616e6f796e4f473b18d5c5b2e7c5917523e23e422aaf33826ca05c36eca009bd562ffff221d0256824101 +000000207551dbe1597bd395ed7058eaa1f0f255e1d3cfbdc93891ac182b66d304000000bcb9309d20f1525c4e82fb36153975bf4b23def2820962652a0d65cd6b5f9681009bd562ffff221d0240796f01 +000000204c43a182a9e701a2ec5e562bab21f4cd3c7b30b765b4505be07c1b4511000000b83ee9a11ee4f88b2e160dffe11976b47274c7b4ff4b5f7784e671427545e6ee019bd562ffff221d0c34fc7301 +00000020eeb9979724abeebb2ad657abe27a468c917a801aa460440cc744796b0d000000c892adc3bc83e0e740aeb7cae3572e10bd751d47b6912f200e83590b36953c1d029bd562ffff221d0366eb8e01 +00000020a299dee28f8b94661b51430769abfdad5c651220220c143e11e1ca9a0e00000036e6b50e0c719c9977f639ec1a8f74fb69fb2d6431d90bba35bb9fe79467f051039bd562ffff221d0411930d01 +000000200c82b5f04bf5a719a24fe0cffce0b7de7da57b0659fb1b256b94c2650c000000a9a10f78d70753188675766d5cee7a417e489ef401da5556083a885de10ac419039bd562ffff221d003aceed01 +00000020968b63f73c23c39c27bae6b950e066c4d98fabf0534b96ab34bf4d5d2200000079b257d756cd5b6bfc265d24c81ed9d3c729578d682a91bc03815f6e94cac9ed049bd562ffff221d0709b83301 +000000209232e4a1be5f3d35f5c125fb645e08a5d8b83df39eb4865e11d0355f21000000f9ef0dcb51a9cc076f282b013385fd96147dfa8d76b283700739931930937451049bd562ffff221d0341e9de01 +00000020abf278245f00c977266df390e468c43bdcf8d2c5812223b566194a560c0000003b4a91b9d9937564b085f80de2d3073845962668716d983539bf837a52a9d589059bd562ffff221d076f54ba01 +00000020f014f18b19daa82d32c562d1209403b6262bf1815a60f59f22918c261400000010a0f944f67189dd09316d7e2b73b9306b6018b32251397fa5e8e123c0ede5e8069bd562ffff221d014e631a01 +00000020cd5bcec843d52f8cb634057ebd8314b422c3c9159b8ee28416ebe3260000000029948a25e440a74a3129c8c8820252f5d11f9a37d76093a67c72fb56ecb57ece069bd562ffff221d0d7467e201 +0000002024f36f3d06cc30a1d51f345a56788dd6b56581418dac93f05cd34457220000009d4ba248eb2a434c598ca1d0847915f5b9489ae61e67bd0fd2f4a7f278135fb4079bd562ffff221d001d0b8c01 +000000208714b9c53dff312dc59d70e22220dc0ea6bfedc812c419acad919b47070000001bd793c5886995436f3a6a8cb75c2ba37e23ae9a242ad566ec98b6b7ab0b69db089bd562ffff221d095fd4b101 +00000020e2dbb07cf62003dc8c8278bfe0eaf85467268552195a7053e09686d221000000db20fd6b4548f20d28bcb6d7e5aa06c69826ceb6f9318088dc459c146d403bcb099bd562ffff221d010e124101 +00000020ff6ea8c5322ffa8e6de73536e3a20c0a3695d1768af1535610382bc20c0000001678d9a1a1696fa5859a1b8de32173cdf60104ee492dff4d24a54c0b4c647f6a099bd562ffff221d2119081e01 +000000207b3f810221a8766f615bf20f2818d793c5fe2a1c82e20ed6872f9caf0b000000e355d3d9cba7c040990c5b7355d32328d25a7798bae25a30cbe582706ae53f200c9bd562ffff221d2176e73f01 +0000002058f8a305a0ec3da6e3aa5a9ca8afddafcbed202e0af23d35203806d4050000008562a40aa794221d691a9ed035399f5c1ce4ac52e4af826d57a7060445d30c260e9bd562ffff221d0717a8db01 +000000202974ea9564ebfa141d53346b1cdb51ed5e989a8a23484ef1607a509f08000000bd375d3d3806d5dda226697182ab1a3e7aa45132eac87a394666f7d234acf8230e9bd562ffff221d0466cd9c01 +00000020842af5ead6a165954d9a4d39437183755f4f6172231a7ebb56e996c6020000005a2bdc878727da397dd1ffe64dc3e86dfe6897829bc9c06959c9980b5d5489f50f9bd562ffff221d0f23f1b701 +00000020073e994e0d1b5551918b103c104e3309bf80a477642d6e50e918eed413000000faf28575c477a37b0ad8b4c8014c10423c51eed5e9ab2cc491a5505e99cc28c9109bd562ffff221d089e728401 +00000020211c522b9e06b1fb98bdbda57b1c17c4964d3b1469744f18cbe87fd910000000cdb3be3d9c8129c5ffa75bb088c2ca40dc49a6b447587c8a8fca133a5dd7b855119bd562ffff221d08ff1c4101 +000000200c2af958f8cd28085ab57a2a7b7f1a0d0dcb85521a7888061970375e0f0000005bc478c0da1dc5b283977f4807d244b37da9f612053c2728dca1b838fc648341129bd562ffff221d0601bdac01 +000000202dc8b8f07c2827cb367073e1980663e5967280cdbf11fddb872d00141c000000445153d99add6ac8a7f08351bbb030c261702f0df11146119cd7729b372066d5139bd562ffff221d016a176601 +00000020fbe33fe8fbd6230e345cdd78abf54354bf697d109a804f8516d4c4fb1700000012f082d1a2f187a74987300855c969f896f0ce881f54652d8bf39bd156ad0ade139bd562ffff221d083b928d01 +0000002082445b57fd65baef85a6b140d1ef22bcd2a82466764912a7dcf9872418000000f341b2ea97ebb3ce2f706b72b9a6c8e5af9c0abbb56d812409ce1bd861015d49149bd562ffff221d039187f201 +00000020bbd5472a77ce2afcab42d140aafda0780fec6d2555d39aea757cc461220000005e2929cf251eb98fe4f65902b54e51f3602ae0dc53f378fd24d6109b8468cf81159bd562ffff221d0254852c01 +00000020875f95eca47739a0759071f9f5bfe944bde44a1d2cd852835ee3c223090000009c8bff5db6b25a273250b05751c28c1596f5a481c5e361f398a9baa4172f7e3f169bd562ffff221d02b5acdf01 +0000002047c8f9383766fa9e09789ef800975c9a5021555566b53556990455c11400000013de0ecdcef846ebdbf2f8961bb2d39a0838fc0ce9f4280a364579c4e7557ec1169bd562ffff221d0843ccb901 +00000020d2c583db399636b8681ab3d58986e690112fec7c0bc7819493e174521c000000b839aaaaa25045e3d020125d43d83439a017c37abba9ba5150b1c55cac40a1ca179bd562ffff221d03fe865d01 +00000020ed43182db9a56ad534038f0670b0d8964cdcbb2cf51088369f4aeaf71a000000462d14881a5d5f590a56ae5a638f07936f3256c2e50ec11d2cba67ee52cd677f189bd562ffff221d042aa8ff01 +0000002048d457624aa794f1667f7b0613f72978cdc48cb1265ada266bdf69dc10000000cff3332cf592553c8f4bc22e085968586f5cca54bda98a36296c7b8ecd32f1f4189bd562ffff221d015c6b9a01 +00000020e0a2ffa20c30eebf41983eb4f44e5ed20945c509b42e27f02df5b7ac0b000000cba2216e0bd8ff777bdc7ad039e521cea42cb3f9b25f521a52499bf35c43a88d199bd562ffff221d03abcc1a01 +00000020919052dfa1b736abda17c17690fa6e13b31d303fae580fc6ee50ec3d0d000000e6f3e4427ff0893e55a59192e674db5439c884c2cd03da0385925c7c1fa291ea1a9bd562ffff221d0894024e01 +000000209fc31dbeb84cec2786f5bfff5978fbc8c7df1c7c05c0b38d48b6ca660200000073ed3b919c7cd0125bab589e56c722e691eb688ab34921677650eb22f9eaefcd1b9bd562ffff221d08bb7d5901 +000000208a0bf7ad0b43f4efb593c86f97ffdc38985d0bc4eef9d3faa1be4d65000000001accca4c1f13bf39546ebb5a92fcb66fbb5cb4fd2522c2fde56f2d70731f8c681c9bd562ffff221d0132e80d01 +00000020a3376b5897896dffad9fb938229a579fa38bdaa06d7fe58a3014f76f15000000b0c7e056da091766dcca539df886668a7e84ce5266100d87b30c9ae9ee0f0c5f1c9bd562ffff221d1651244001 +000000202537814e3dd3efae6de6e4be89570edbccf597045c30e5d7aa191f060d00000095d2a16e8f2947a4623780d876084e705ce94e9baff0590a5549bc1bdd3bde131e9bd562ffff221d026fc0b801 +000000203702d81805ea81397d476472bfb7e3900ed45c5f01cdf43cfb04ae5d1e000000524d05792a488998af1b798baa4a7349eb64a3c7f74b249d3541fe155f3892fa1e9bd562ffff221d02a5c4ff01 +00000020ecfa955027022e34ef8d48a5f2f90f150270b62059ba03295cf41da30e000000def336beb7789ada150e397e83437b81f3f7be965fafae6153408695c5ef0bc21f9bd562ffff221d05609cab01 +000000204f56ea2d12d31e11f6209172473d965dd89679d9c9f14f843435bd79210000007d28a244a9b39d6ee01cff9807d34650ffeef2da02c0f7f89c435ce05b8826bd1f9bd562ffff221d03ef84e101 +00000020ae8ea03693972900ffdf61a69092880be7bbf7c048727cc80d8485761e00000074abcab7ca4cce91e136e427385622c6bfe770d96c5de05dab0483973f49eaae209bd562ffff221d0667987101 +000000206b16465f9ee21583f90a6f4b1f844e5020b73cc4f08caec4697a09af0700000074ba7f7f4d4a8ee500fd3ddb08139468ac27f3e59023d406be2ed6d6ffeaa83c209bd562ffff221d035e9b4a01 +00000020ca3669178a478ebe67a4a0ca8794ec87b06ed58ea465c84843d43a65050000001056a1c701e60087bd1fc1e98f837ced9cf6fe9d66e959a8e8d47a9d1669bf37219bd562ffff221d0be309fe01 +00000020b7cc884156c5aa112a4dfbd1ca9ed5120607e7035e0f3ad6d8a04ffa190000004e63265af7433e936b8880ef60e8e338dee5af13b339c052ff2583d39abadc24229bd562ffff221d00c7512c01 +00000020ead1a198c0120eb286ec047284bc8fd22c93c1bd283d8a5ff425f10c08000000306144ddbf2bc7b0717ea10b1f85c440fbb38f6cd5adbcb7b3d0c62ecfb82920229bd562ffff221d06a0ed1e01 +000000204e65797aeb59d3f6cffd8547d9ca809c10152faf4e97afb50efde6001700000086f088be4c6eb0dfc1e771912d53c17d8a377fb71cadd601c6c76ed35310ed5f239bd562ffff221d0020cbd201 +0000002094b222602fc7e9736729c856ba3384db0b389de220e0c2413ad6ae0f0d000000df83e5dbb11942065c1dba2dd5c3a8c8964da45fac3dc25552915fdeb0c5eca1249bd562ffff221d1aa19f7e01 +00000020d09e4a28694d48cc327cfa1bc353d662d63394a41c37a9008aab39ad0e000000062def6572cf323b953a1bbd419ba9f996280fd6439b62641b82a2aa1bcbed5c259bd562ffff221d0bda5deb01 +000000206e1792139fc6ad7f6e0ff66c3fd650a33dfde422014f413ffb551d8a15000000990f74892c209061ff10baafee7b213106debc46d1e25d16a1f50c93fa12ad4d269bd562ffff221d038f34fe01 +00000020f0a457e34a534c76dae964c632f22b6f5fd5ec7137e86b82be4840640f0000009b6cd97091f45282388a6557ea52b31b02e78e685541d650353c4b3e041d141e279bd562ffff221d02187a6901 +00000020b6c6cdb552ffcf480d9ba91926f558024a50c054170c1631006a80880b000000b0be77d503ceb6012520266212d2e13eef47c7e466da38519b734488cb52e33d279bd562ffff221d0ab0cf4701 +00000020671fa1f6418701141ed42c52c2c3c3d56b76d3cbe4f702bed7983c9708000000e3a56c5a872ea835d36241a337dc53e71b333e123abec35ea55a38c169c22e26289bd562ffff221d07380f1201 +000000204a52bc4a34d8e38b897bbed7642532581a76bd17726d710753c35a3c110000005a1ab12b7fbd34506aebc76b788b615fadd43dc00b89e5da56e9d73264e5f4fb299bd562ffff221d0a3d1f0c01 +0000002016ec54bffb95b6ac8c282b14b36c1b6aa12d4d1a5e2f7919fab0044310000000bec5ac846abb16fcf4ce85fdc599b154c548755fed44008c4e476ae09691bb282a9bd562ffff221d0163e13f01 +000000208a2d0d5c5edb494adbd76402d5aadb6d4c5e71e40a0a18bb7f0120d21e00000071bcfc229f8ae305d01400e65d261ba33162671d06ea89dbb3918f8d90bb25182b9bd562ffff221d0a3ad60701 +00000020952561aa3364fc6f52b62119ab76c18817a30a1134b4092d356437d20f000000447a7c9bcf23c8a7c01a6c6fd39199103fefcdefadd4422743fa79dbd00f6e222b9bd562ffff221d0660195301 +00000020de5c85d94a096ea648ab3603777bb194f93447e1a762d884012f40a40a000000a1960aaabbb155ab4d1d99488b0e913deea65ebb3112e751e03506047073186a2c9bd562ffff221d00d3e80901 +00000020b3cd1d1296a5984e8557f8335008a6e8191d777436025508a0a5c76209000000f0e9d720c535159065d6d49fbeea5db8b2d88dec37d1772f6a325697a9ea68fd2d9bd562ffff221d02d0855101 +00000020692fdf84455d2d39573540b8829361244bc2d5abdb1306a3c057ff7812000000d7414dcf1b101cb6899d62a59b8868e87795c2a5749f46b56dcf8cd9499771842d9bd562ffff221d06f7985901 +00000020a3f32653c92721df31e3052b904d3295e0eedcf8b91f6d05e9ff8ca005000000fa3f0c134570e7d54b8d73150d38b29dce561f0c79b4da942a8309adb04dde492e9bd562ffff221d035a14d201 +000000207b19a669fb3fec78ff01c8687e0d34952148224b0906bd38a5a2d7f8040000006a923ea7bbcc017b7eebc13da366f1b450a112eac182c4222711566513b5c43f2e9bd562ffff221d03a04c4501 +000000205b994d782d8edc0ddf72ea3e017670cfb86171d7995da03085255c0e07000000fe68e4b347fd23744dd70951faebf0f4583c93ebfa04f2787097a83ba3876f962f9bd562ffff221d0007bf3501 +000000207a7f534cf8eb4494afc9259d3b22f1b4ca807567bdb8ea615e6478bf1500000098fb40b3d12a0ba819afa613019fa25f02004fa2a8173dd4862c3db434c2dca2309bd562ffff221d0738a19501 +000000202e4147fe26c54685ab00d85c2ffad44e4c76aae4af3aa244bdc0ddbc13000000ffa1df44f180648f553b14416410ae13e512b6ccc715a0fe8b7df0c3834df2e0309bd562ffff221d0198658601 +000000208f4f2b501135cc233d07a29dd517eac07ca4989a4d06c2f2bdf142791c000000e17a21618c4b5ce2a1de804cdb0e0ca3b8362e7839b4f213fa428e540d8f63c3319bd562ffff221d0cc8dcb001 +000000204d872b944b70ebcc77b5fa2e394e5f72127becc973697a5183cf93a40200000033ee1669446f846494dabb0039d81c7e0938139684cd43a20fd0666b250f13e7329bd562ffff221d0052ff2301 +00000020e2fb397993f6eb5419443b07d6f1948fbf5d262dee62a8116f0145ee16000000a3a5dd9bddc3944650dedbf3e54e12d9a76b67808d0f15eaa545c29794d9b549329bd562ffff221d02a01cc001 +0000002064d699d350c4d0aa18d45ea9753ca3e775f97846d5704adf1ad19b050c000000ad76b9c4aca4c42c73e01a9c6b5c9565a6d78744cc5495482eef8e467bc3032c339bd562ffff221d09363ae401 +000000200d6085c99223b70f5d46881acc4dab18e6db97f7533f26fb63cbc21021000000504fa638b397648b2e9f35326eeb6853b8bcdf828e1c08e114d0ca0d6a1cf756349bd562ffff221d080de9e001 +00000020df714df2b1f9c4db3b1cad8f583907dc52f72a169f03ee1310982e3005000000f33dd85bee54d5257efac7dbcc00377bec45da0a3519a7ea582f5eabe0bb91e6359bd562ffff221d0fa5e09801 +00000020aa10b05aebcc58936afab9451ab13dcce94e407f6b0f217b8ae11e1506000000300cf4d72b783c4418b32e6ea89fb4a7067759cb1763ce8449316ab9eb8a70c2369bd562ffff221d0942309d01 +0000002024cc5657a194c445ecac2b2c0366eba3aaaecd786a99f47e20f6c95c120000002e2015a948ab859364b1cb11e0e0c642a478d002a84bf00abd575b8b5ff3abb5379bd562ffff221d0439952c01 +0000002047379a66d115c41ff0d4d97543fbe5d6ae95ed4dcb5cc350ea1a0b551c000000c44f3fcb6df3c0b2802ef1e3ce332a12f02543deca954b46a0a27c7e0f501b23379bd562ffff221d0aadf8f801 +00000020bf0e1802f47d5ef4168ca381c8440b80dce29e68621886a41958c7b1130000004dee347dc88cf9672dd227992bec8e2dbfa44dea7ffbb01b58ddf66595059776389bd562ffff221d08abe9a401 +000000208fa9c3b568ef5d8962df465b2b9b08545bd23a0585ed8bfc91b6f9d605000000806e25360451c19c6f2a7325f9c96a00f84aea949b52d15d184e0a54c0a83c81399bd562ffff221d0474d1c801 +0000002098252fe4476156c23f53e7e79f7e9d7d3d55aedf15c3b2cd8dc39b251e000000fdc84d4cabebd0858f111c2cb5a2cca2fc64f6c97065bfc7eaf3f1dfeabee6c03a9bd562ffff221d019b3b3501 +00000020df13f6ee2a62c3019ac31928d04ef84a7b8e739a587c2be85dce3cd10e000000f7f459f9d9f469feedc390246b33f59fe74c44967312ae86e69623bcdbf300e93b9bd562ffff221d00d0741601 +0000002091eaa65933744e62738abecc018b84b66e25c06e5b005aa56674ee410a0000006112d2c63b448d6655a32d9817d4170493aaaf1e6b5d93f7ab7d5ab7335f748a3b9bd562ffff221d0cdc201701 +0000002074b55895a14674efeaf470f218ff839c5b55018483b3be66f225c6a40b0000004a4e8e3c98c8318ba7c2be8a4e75cb4b9044365314f1d0f144b28023135ba2493c9bd562ffff221d01750cae01 +000000202fdbde306c72e374608f39df57db68862c7903458adf3e0e813fa9560600000099a5dcb0800dd5fa1b198fd7e35cdf60ee4553cd06cef4c23a57cdcb37e5efca3d9bd562ffff221d0f99592701 +000000209f55ade9b9ec7145e5e72085a8dfdf41504cabf6baad75f77804cda804000000be3fca83ebdf077239928a5e3116e340a0d5e4a4360d4d2bf46411d24637b7f13e9bd562ffff221d0b681f0801 +00000020a4bd8cafbf568fb32de901abd76626ab16d373ecc6728512f3bab2071300000040f7a1b215ec07eb25eb8f36ba608189e6371240bcd7a1909e7344db24799c7c3f9bd562ffff221d077bb8b601 +000000201c369b58893dc4136c0b364a0f01f3768dc23eb9a586bdbed027f73a1c0000003f9ce8a8c15d7ff3c18932f1c9c58475daba2bd6867a68aa71c0a3cb2af089c33f9bd562ffff221d10e0549701 +00000020c0de2d4d17a7f0463959c999e7e9ee1a7ecc1887996eda4bd287cea909000000e5ab59a7d4c4c9b2f70d63e61fd8e85dd7fac4ad8271f35b1b8823da11efbfc1419bd562ffff221d0b4fca8701 +00000020bfbe6a94e7d108af51af9539eadbfd57f4d5cb6c2f9864294060eb1917000000c5b76c756a2e420b15a7dd31a195ba0fd195d68aec973a63c1bba4fae0da4085429bd562ffff221d0c28261901 +000000206142e69485a4fc8a66a1105da8af4063067bf8435190d132e183ccb91900000067920a20374670d35d2ba9bf8521340cf4787901e13aa436d2314d903d232064439bd562ffff221d02b21d1e01 +000000200e3aea12ebc5acbf7590b18b6654ab4f3acbfc0faa46444b8a092058000000000e07b5517fbc61bab6e64f09703a5eac313ccf337e0c5f0dabf483a9e0243fd6439bd562ffff221d15f727da01 +0000002057d13a49d1bc50cd5918d3f7bf894c7f46bf49b6eb83205775da932e0500000087ac1f444d28a03e8805508c54f93ee8a9a79da90d2317d1164ce6db8b3acf93459bd562ffff221d025d7e7701 +000000202ff205370294870436f8c6265d33f5274d21640da5d2127d0d335fb30b000000fcf7d2fecb8b34498f407c172634b44211ef13d8e56be93e4939cdebe0ad9d76459bd562ffff221d0566801701 +000000208bcde0e52e225eea0182ca46b7d32d40b10059fb85296236d3e199f70d00000081fabd71f4de0c3283144948e60a390c597e7dec8dbc5f8126487f2426486974469bd562ffff221d0085ecfa01 +000000203fb22278446e050a89325fe988474a429e70763dc756279ce66c44be0300000016a6180ce8b589d1d3bf8a965bb5bb7cb136c6655fc55c8027ac68e3e86aa44e469bd562ffff221d03fdfe5c01 +00000020ffe5b0d6d7d52d36932c995dab928cfe1ab4203cc27418b67a14b7e20b000000645ab565f7274cb26dc113371aabcbac8e185b31a89ccca0d546a2273f655d60479bd562ffff221d04da3b4701 +00000020c560d3654d5131c82f9780ff4ae336c0b791d92bda3cd3ede1e87d700c0000006892f374ecc7fc93c3cbb9a7f490caff6b98ad9adfc357c25838b7fa19c836fc489bd562ffff221d0e02045f01 +0000002079680e7d2eaa754ae27697eba4f2ba240311b710c848f6b45d946cb50e0000002cffa281a6548e87f78ae97b1237d320db5219131867f2543ea101d176d3ba8f499bd562ffff221d04853aaa01 +00000020b8b5417014e8b39eefd7c4b67a7bf2b32a503d20d6006135c15738ed0000000035fa966f144e2e01fe859a116e20a4a718ca27a68575d34f8388ae0b3aec1b5d499bd562ffff221d07542f5201 +00000020ffcc929b1dc79ba6f55173945470bcad629205211567578fa316fe4c190000003069a228829e248f9c2ea4bee85e36b980e2b13dec769b1be151159b5349d0554a9bd562ffff221d03eec15701 +00000020171b03eed52fd1a2cd55e46c87fbcb9d97931c10b271eb5beb36cf48100000000894584ae49cd7eb48c83ae2b5e345ce095d26d92ad971bc3010a04f08cc23264a9bd562ffff221d128c606c01 +00000020033c251c8c45e920d35d2b13bc64d64874fd5c0318f8793d2c6a64231d000000083d38fcade6fa8e63f7a35a0a96bd125b4c98694f5e7f967693b83701066b974c9bd562ffff221d00efaf7201 +00000020086358574aae7aacabb8719798dc0bae859919af264b682f27ce607d1d000000b7e007dc53813ad03e1efdbcaa33946ebf7664dca65913bff77a07b12bd217114c9bd562ffff221d011600cc01 +000000202d3987047a3ae543bcabf2b8a9634301b08d9546054fafe1a4d6dbcd030000003318f45b9be7f346cecd36d0ff8fa4e9aa239c4d80723b760ca0f29a7463c4fa4d9bd562ffff221d01f5c0ad01 +0000002033d1991173329f158c8b11c9e8138ed08b6e52c0419d3dbb8b90bb8422000000861cc4ded6b3bb425b41ce75c99f7143c9ea9c81ac09de421b0b3db05d93891c4e9bd562ffff221d06006fb301 +00000020910461b0e077219a951575df8bb761c08fb71666f298c9f0479f33ce06000000b394e94a8bad8a8c5948af613a9e28622cb8364b45a69b08303cd835855a667e4e9bd562ffff221d0990d50501 +000000204a993532054948e1d00897c3c6fb3a64f49315510f9c4f2166e27f7a070000007879b5c3fb6b2a63bed011ac9b264cee8d446d31b6c9481ed1763b45e4e8f1994f9bd562ffff221d078a9d9301 +00000020d8786c33f91373de7cd391876ffea8ded15604c0493337ee1cb2b3cc09000000f2a6aefeb8df5b62605d84709ddd7a3e77bbec6045dc22799a9d0526d25081f1509bd562ffff221d032bc2ab01 +0000002080d1d7401cf8c0a790fd5879bea92592c250aef24ce4d3ee306bf36904000000dcf324651898284668df8113bf73fc4da501e7705622fe37972a4d4732501b27509bd562ffff221d10a0da3401 +00000020fdb7f642894e54c7e60cb82032a135c84a8400d7f1b90a12e20f8c5007000000a6eae90165840cfd933ca5a34485c62c841fcdda85ac3d1c1123b16f974be259529bd562ffff221d0d94242f01 +00000020b0d01b8b2c4ef616124ffc7ceb0045317e65e7b4fe32f77377d9fec61e0000003ea4178abe3fec341ccd279f61c3388bd396f6d8bf2f3bf39fbe5ba0e51e3181539bd562ffff221d0930066e01 +000000208d74e82828ba6a245600233fff34f3cb5739d2a58e201dca5cef96ae1000000000d994f6ee18baf7c5b3866b931da0e8135f7002d4d24d8022e9d54f6de5298a549bd562ffff221d03949b4801 +0000002023a7bfedeeec2415121def4b33e1c99af4a6ea8e4556d47e3afa3a4d20000000b4415094ab7b5f64304f619f8131ec952fddab94426606bdec2306aeda3b788a549bd562ffff221d00d56fef01 +00000020559626a83c7b35dee321b2566871945d9a184d7392ac3b2b3bd703430b00000037ca0ba37f83dd42801778ae4ea056c029bc7a2dce2aed705d07438722ed9629559bd562ffff221d09fb081701 +0000002062cc2afb53f850ee0a89dc12b34b8836ba88e258c80ea42301cf25b015000000c9fc7fb19b6d5790393766ca80f2355853c1886bf8953039ac481da9f93ee05f569bd562ffff221d00f4250e01 +000000207152c921dad199c5d46ac20b27f4a088872e202ce312432e01ec05561a000000049e29e6ba681d7620a2985e6a8e61de0b2e1cd77a1874236e22bf056ea2c6d1579bd562ffff221d087731d901 +00000020ee6f9919f27450d4ba45cbe268f35f2e289f504cc78433b7b90fd6cd0c00000058cdb8b44f3c68ce8d90a37df9d09482afb6b3810fb7778dcc177f28735d1e36589bd562ffff221d0226497101 +00000020c3bb550666b7371bc67eeea6c77d40caec42e2023c9e53a870e3e2aa13000000059714be1d0799e3451a9208ddd82eedfc0b6c1bfdb1b5c110d47f9d6a222cf3589bd562ffff221d1528011001 +00000020e813d67f6a73c57eca38577445cad1ef8ace03008c06b90f72484c4902000000cdd9e6f0758e84b204d78028f0bbcd064c1138a7aacb439c01daaf9b6937b4205a9bd562ffff221d02ca290c01 +000000206995c279bad8f7836e42c8d96a174406fda0d9575537c26d9b3b5af403000000573538df4dc868f41d180599ace8a43a2e67d453db3949d0e4574299343b1e405b9bd562ffff221d0f3b129301 +000000201846e8672af4ea1a4302bfb076399cd035b5176c904feb757b5e5b1d05000000943b7647430061b2a0d0151d75960e908eadda9526e51c65459fdbf5109d2e395c9bd562ffff221d102c3c9d01 +00000020bc0686ee48924b322ac0a244799a82290af685554cfdf941ffd5a255120000001b6242991aa4927b772dd6018fa2bba04fa5a30fdd6dbd550767f445acd3f7585d9bd562ffff221d081193fc01 +00000020a9c9b6af40e418ed30aadb5c2d9e794f78e2d43beb13add268340f2a1d000000439ed9578d340c36b22441b7fff79bcf483c541f0b115f3dd14e78d47c1711ee5e9bd562ffff221d01c982ee01 +00000020e5421b09e41edc203c754f1027ef0c44856c0fec37fc072dc2b4e961010000002f8ac0c6a02413f607952cf8325a85e795f87719770a881ce7d23d4b0818ceb95f9bd562ffff221d157926dc01 +00000020581c07cc4b3a2a234a172a5b6545fd550232fc45f35fdf702e8170f41e00000007d8f042dc3a545a10b77db8707e6aa0eec25a5e443a1ec867e00bd6d66f316a609bd562ffff221d06bfa05701 +00000020394e8da5eb8747ba076c83792013d023fdc8a73c1b11a9267abb482e220000003b0a160afe013f66f0eaf451096f03018a70f0d0e4ca48b087b303ab76e814c4619bd562ffff221d16d36a4301 +0000002005cbba61fffce576f7aa63ee7748326190d452f045700816ed4184fc0800000093b5d7ce02b0a3c29917340a125c2abaf91196f2858462120853755924dae823629bd562ffff221d072be52d01 +0000002009a5515c8e85c57f3ee7115bf4c7680eb86b1e6842d7f2dd6e717ba40e000000b27a732e801862a925b6fdd624a3c3ef28a02280391be54c9d2df21595557776639bd562ffff221d0ec08eb301 +000000206e932440818b0d6a7552b80939e491a9636d3e193148a5f20e7aa9091a00000084da14b45a90f1d894b06e5b07a6b9d9b1af0f58cf8951643a8ecfefd70e574e649bd562ffff221d0738029901 +00000020e20ced22469702470091445ec840884e0fe9f4765c41677382c103270700000069caba3bb16efa2ac531078a6cd77c2a27a021557d97914b166a3e702a22c488649bd562ffff221d0251c68001 +000000200d6fb6a5b79ca82afad390630f0322f039f4407566a81816319007b41b000000eaa49f1f80f6096fcf9cd264880c998d89b7ceed7d0e536f1afbaa22c527b4e5659bd562ffff221d0774d07a01 +000000202cf47f4bf978eb682b1e3500ceeb6c9a02743275adaa943bd9f5cb3b1e0000006874ddf8e27d486ea01f6f2471e662c4cc72bbf6c82a52a0b07caa6be71708af659bd562ffff221d0478f5c201 +00000020189bda8d7b7ddc0dc8e5bad1c2207779a4f0a1695f194dee9daf5f0c2000000008bdfc1619bdeab4b2252b90a2eae423cb5f7be6a10a2031998551fc8a1addfa669bd562ffff221d0bd1402c01 +00000020cfb5d7af702419bd1343edfd6ba084a115352a14d6c2fe73e0d571931f000000cbbdafe18278026cabce8b2bbf948c88583e12e82ec8640ac3e9381b38ebd1bd679bd562ffff221d0213bddb01 +00000020d02b4aca45afffe0ff5246626e3640ff7f1eeccf66240f9559543158180000003053dc429e306d15831d051416f96957e44c0b04333eaac46d8e4812dd0dc3df689bd562ffff221d1416f20f01 +00000020030835bc3d2705fc3ed5f8b8942209d0331cfbcfa829891f0a695f8b1a00000066c2deec161e6b957e79502f172eb4dc8e33934b5afdd3ae26c61611058c15b9699bd562ffff221d0786703801 +00000020208cac95f53427d7d5dfbb3b3ac60ced380833a6cab14e07463d2b8b09000000c167c5e9564e59c69419b0b3e40a3134015d38f4252aef834d951a01760e956e6a9bd562ffff221d01af0f6001 +00000020bad9303513dd6a4000615167e7655cef852470a60baeab5283fbce1a1400000067ee3ec4f18dbd740c94c9d2dc8db0e1cee1ed507a1fec35550ff27261d412a56a9bd562ffff221d0266de1301 +00000020022b415e3e7c8936c3453da1ae40afe0abf1513cd1ffec3ad720273f050000006a95c152957e250b341e21a7d9dbbfedfc2c3250d12d2eed7dbb1bbab0def9306b9bd562ffff221d0005292901 +000000209e364d03d4f63388576d52ddb3c46cc646e5488561e830c846e2bb5203000000760cb0041d71ac08679eb3f70e0d4b99d84ccb33025d45ff5af72d278b99bb7a6c9bd562ffff221d000f85c701 +000000208d7d585e01f4ca51ffa2cb1d1fe67fb9960c56f4874642f3de57227908000000727f479cc034fa4d0fa0d42baf786a3de96f9353f1bdfbe888fbbec5d2aa9881ae9bd562ffff221d0a870a3b02 +00000020de0a31718eb01e0951db4a58336c690cf42571b95aef28bb54eb70e407000000754535a93eafb283ae12b5e6cb30c0ebca02bbf517c590b663aa63f38681cd03af9bd562ffff221d002ef0d101 +00000020c4219fe06e6432c66eb8b450700a592d53214a37241424344d1dc420050000002fa485819a08c97ac17d4e8620021d4c21fb632092d81cd024c919ed58f3295ab09bd562ffff221d086478c101 +0000002042500a65206c7f9424ad807c743bc81a59029538743a070bfb19055716000000665af8d0a215ea0dfa3e9be39fcdd8c1e5e2d3e2a85914ea48d27a71ae758101b19bd562ffff221d07eaa67f01 +000000209e7ec7b86fafe6d41eb264a1fdd2994fab2af751050354f592035f8e01000000ef47c2c03bc0a431579e1ab670408d18f1863d73b5d863815f38a50bdff0a0e8b19bd562ffff221d00c0761b01 +000000201e9539dfbd1733afc16a3780c25df9ddae2128d70017289f0338976905000000051a0db7a6431e9290da435dd15db0cff05531db9e0bfc39709c754471d6f99db29bd562ffff221d0200ddab01 +00000020a02da7c6bdbd45752fba8e4e66aa0462138b5f96fb78db99a71d68a91100000046acee824dc47281ba1b086d087a99b803b2cb208f806232a9c18f0058f8a7aa70a1d562ffff0f1f070e000002 +000000205c710ae68fecf1a92fe7426f60dcb10af044ea339ac1b0d50b910aedc3b70d0022c87f8341f08708a0fa78e411cee44c03341e5455372803a51e68d954f1307525a8d562ffff0f1f3404000001 +000000209e2bee3bcedd6394b68572b5cb010114c95783dbbd9d04a5bbc08b1c0cc20b00a8e52b82946b36abc1f807e2fc326fd7c03e1f983ea1ec58b2ebc1369db8a2dfe1aed562ffff0f1fb102000001 +0000002068e4b6632f46d548e7a1bb3835c67ac03646e83725fc55769e4f984dbf4d0600cff21a7119c3c46c23196637a501319f0f7ece5cbca9202e4194c81b297e825e9bb5d562ffff0f1ffd15000001 +000000208fd45aaf29be96fd8ae401758de8e1bda3c9b9cd87a4d5b0e11111801e310800119fe87a5b96247774958d33a37ad5d4f41e00664cab9dcfbf37532d77fd297052bcd562ffff0f1f700d000001 +00000020fe7f46f1906bcd4edd742c3830e36db83d4360680cc12e39d091c2d58ad90000e8552eccdb61630baaa6f86156e2d6a48ec7bf294e5390d9dc48ff71cdb4444806c3d562ffff0f1fc303000001 +000000209b65e3cae53fa9050aa40beb7679649cc6984712fab86b1c82496ccee9650900237aa360b92cb331d925d35b9953ef69d6a5e83e4d0f2425c6914527398d7629b9c9d562ffff0f1f6817000001 +00000020d130e0db8302b1645d01b496e22ed3c862c70aa8df143477eb0bf54b65a90b0009e0c29407a29d3c41fc318fd11d55b9b2d890010cb2df6e2b4a845811f3f8446bd0d562ffff0f1fe20a000001 +0000002038fd815e1532057fc085844f4f6d97f7bb1bedec143bbcb1248e095884790b00bf2934d2a6839df8d22f9f68ff713324aeccfeb48ccab08406c836a315a987c721d7d562ffff0f1f3201000001 +00000020eea034dee4f8828494c012a5a8a4d08ddd1a266412faa84bc85bec2a07240200a708edae2a0e8f003a2fbf1b309044ee362ba91cd35da7430819eb587c0cf4aed7ddd562ffff0f1fd60a000001 +0000002046ba6f0f80debe2ce2a0dd1533b2d72137f82be736e8a6cfa723f668d5520100dbd6c92837391923841bdea373afe74caeed7c3f70f3681c3f75838f74300eef8ee4d562ffff0f1fe711000001 +000000203ea571497d7b0dfea2d0e4d9d31c6d4662131f2b0e465acb87aaca3eb26c0800683669689e296790e35751b94632560fe447c57f5a3059cbd3f89574e6d3abe53eebd562ffff0f1f0a0a000001 +000000205ed12fd74ad6d017f146a29e6ca4857f95c37361f481bcb9e7737bd666ce0600c54f5c44de8b4e46437d837a59192bcdb35e378a2070ee7a333fee15fe0af983ebf1d562ffff0f1f5d04000001 +00000020dd5e09ac83619e6d3e4936cf2402a68df4e4fdbec9a42299aec41fa049ba0400e7d8e4349fbc50e4eb3f04c77c39a1c00b7b384b278bc0b3ef347262efe25feea0f8d562ffff0f1f2912000001 +00000020b8e326f75a7346d442925a60e4dbf3de72849d1b4ce34be6899a29b260570400d9e0b6b74549a2df8b44e40f30dcc33070e79a20b307e95be40bcd4b4f6fa87557ffd562ffff0f1f0009000001 +000000206f72db717c7140dea8a260e31bde9ebd63633d7d578f573504bf8ee38ccd0800b45612b831d9e464efd972beaed295e48bcf310c37c74d35c3bcc1fb3c47f78e0e04d662ffff0f1f1d09000001 +000000200034f6ddb88e0fbc416e5981d6a3822f9e003b6606890ad3b9c1ee604d8d08004165245d043b68ca2c31f95a8576479c2de9f775938b03a30206b4d4e6dcea0f7c07d662ffff221de84b080001 +00000020d9f4fa60f3624dd1bcf5bd42d5308d671c8de531ac8390192288967d01000000a606a6d96caef5d01292b15f25ffe0dc553b471f02d1ccafd0cb60087bd514c83e0cd662ffff0f1f390a000001 +0000002057eb2bf4dfdf669c5f00dd21f75905453d24361f72e4cab0a2a61748cd330d00822587817a987c61f404d0af1117221aef514d809a035eede02a953eb0fec4969c0dd662ffff221d81410c0001 +0000002047722c8cff981fc7df18dc1d4e1ff00657a2f6d9b0859fbf44da7bd505000000c37f5203a2b13d3287ba4bd0b233cafd442d7538523195d2ffe0af307b2ae80de50dd662ffff221d3235080001 +000000208b010a836cd0d46d870a5d444d9f9b65641d30acc6cbf5d147b5d7a50e0000009b6ee20eed03fd47c933c7978a6f3c78abbf4a37d81c0ece63c8eaf605187e94480fd662ffff221d02410b0001 +000000208c76f24ef7b91cb0c46ec572c63a3b0459c4da05fac023224a57a46b12000000d013a47f81ca13a46d71c648292535f76daa5c687e50efc2953c82acf2efb2c10214d662ffff0f1fb608000001 +0000002055f63d803fedb18498f084bde0e6f57cad6dfb78096c0e20bd495192e57a0b00d59bb37908b01d1c11fdfdab32a6c7684f17c2317e16fc20f580b790c118bd3bb318d662ffff0f1f2704000001 +00000020162e215d0b891e8062af55ee51008bdf438956e0ded6d5c4e8a31fdd31b906003560760affb6b82f52ac4e4e9b2cdbbb6c53fc63dc09d76d90ed9f2911f69ef6691dd662ffff0f1ffe03000001 +00000020eebc54278ebe7f7dd7eb73570091e16f1a9a8fca448dcf6a888407fd03e00f005b54925b79dfdc2bd53035d0a42711a0482bfd47d7ac1b44bd5f3b445d7e05e69a1ed662ffff221d07b1060001 +000000205eb2bd57c57b09a12500cc89d1f7446105fe84a4cf861b76d3f0b9ce0900000057e5d508bcda0b3dc9da6f3d745666898185637b1beb55ac7466017cb6e893235023d662ffff0f1f2d33000001 +00000020f7c58795feea39b431d111438d6ce6a6ed8907d27181728d6f39c20066350d00da7308fb96f3274dd867ab302b940ede7d846e8f22b1d406f2ceef16d36473904426d662ffff221d0cc6977301 +00000020618bbc383102fbdd1f9a3af9aebfd80ab71ccbfce51e8655b41b09e905000000e6a553bef8d1ccbc874c186f7e4d85770b6f82fa17d615e3d1896d9b4d0657c84526d662ffff221d00a6d5ef01 +00000020b5288510febe11daca7542d48099a27828a5b6867722e89a843b2ebc1a000000622d4bbce558e9cc2c038a17373ae27916a335a411e408173f6024a30fdfe45b4626d662ffff221d0031333f01 +0000002096bf5ce02d4ead8a0bf4196a5c547509b6934feca85cd74c6ff47393060000006f3fe06314b147c1fd556b67b83ccbdf8b93b26f7b11b09246fd605e6a633bff4726d662ffff221d038f0e7a01 +00000020c6079621ec3dc20e90764b6479c63b1ae3db238b5d65b6253160d3491000000077c7b2dd4fdadb2feeeed7f951b20039a293130d3784280ddad703cbd47d3b394726d662ffff221d020d345a01 +00000020682a0f32e7b521fd681b6b0cdf1581a602e23a409d7868f396ec081f08000000d9241cdb671ae1b4ce94939da99ece4889cf869b993b86f4387c3b86d95d96574826d662ffff221d070f9e8b01 +00000020e0805f34f9c8ccfaed93dd578684c1b72965efbb6db2f72dcd23d49a060000000cb3fe4ee870eadae7067e69b4e1f7660dd33e0b8b6b06e79d887108ee969b5e4826d662ffff221d016022db01 +000000206a6110171ca81c868caf7b318f42c45f0cbe11a005698baad70c819e14000000338bbc549d1d84b9496c2cd498b0d6e07478501cfedb9bda6757496d9b0695244926d662ffff221d080d6a3b01 +0000002011698a70ea177d78c43c36c804e78169386066332274f43404d06aaa1e000000e859c2928514b4998761e8d89c1307f5e830d01f1149a2f22912b697c5db12ce4a26d662ffff221d018ef6fb01 +000000208c215d9ba3bf6d93b5f0c7ac4b359ba62df93862fd9bdc35db4e0622220000007aaf13469f612cec4366bdc97f03877ff0c0355e2438ffc718dc0046a659c3ab4b26d662ffff221d05f90f2101 +0000002005185bd41696aedd011ef93f5c5215780404f1f73f04db0b61d22a2815000000f24393153f1089619dd21fe33688c3f17fc9b80d1430fe62a1c67b53f26085684b26d662ffff221d0293517701 +000000203b848cf4094def86ae42d5d531cf4588639ce0cb0a624373156f42cf1b000000fc5dfbc32920d966aa24c10b83fe45c8d54ab712c4854bed75dc6f20bac78efa4c26d662ffff221d0e378ac501 +000000204d35605fda7fe64f1cc23ff5ae44a01c0983f6f8ce85295060e5350809000000366f21e62df9fb72582ec031c7f383948b459a662b6ef9a935976b435c0441a64d26d662ffff221d0268c3aa01 +000000208ffcd1416657e85ab9e7b39043578a7bc9b811c5a0e2bb35b5210e831a0000005ac75f8bc9d0c6d2758735eec042484f5abd9b111a70fbc28bb4eba16ec73df74e26d662ffff221d03ee6a1d01 +000000209237a674fda5563108508c463296ccb936f514746dfdd97b62f8db18150000003dfd490f64bdff9a6d58e66de13f0e6d95bc71a961e7543144ac0a321f9d8f104e26d662ffff221d00cbfccd01 +000000208a706ae68e417701ca104fc5aee73639af4f9c366c92eae4288cfbe113000000f40336a5c7aa030542ef755340ba577e1a12c647155cf8ac9693d077561796464f26d662ffff221d008a990101 +00000020de8fdb65848fc8019293964621312ee2d8445d695e7fa14906a999fc1d0000007151ae018e38ea2e5366f9c8f90ba031f90bf73ea91346e2f6efe025bdf6da0d4f26d662ffff221d02f2184201 +00000020b6794dd5ca9b3bc974a71ca1fd54772d4f3ebdafc3ce9d86381eeee5090000000903265f2a69d26be91d10773e0d3f2fe10ecc81a5542dd366c0cca66e1241b85026d662ffff221d08448f5501 +000000205e08732571d0797c86d3c934ccbfe4484073465fa07e0010ad336388160000003d134045705e4d6599c983ea8ec87279442c708827148c5bb8979e8c8dc245c05126d662ffff221d00ae0dde01 +0000002020ed320c672773c8d03357c635a092c2c8f4f0a20f04a8e0a68ba6710a000000ceaab8be31b7db7efccb47acc92ff33310e521eda0501cf329eb3a0c7ed387b15226d662ffff221d03345f9801 +00000020853753192fb1fd687dd7bbbc28ac53da9482960a058ee230e9fabe6b0f00000037549fb6c9bd2b194b90dfb5fa8b4b138c54bf4778d16d99aa72c8729010b7545226d662ffff221d07fa570c01 +000000206716c9222b7bda7b46a53041159f57449f2542c0acdd3cd1d37763d001000000f699246cf28c5be586b38640be63ab8d233bbe11422991c6b9aa6ff38e5724f95326d662ffff221d0f5633fc01 +00000020c6699d405afaadf9f26328a828dbe10c2bb70f4b3e687ad3ec3e32911d000000bd68028590e2e03b08d9725854d20188367bdbc4de57d61779e26c422cebb8035426d662ffff221d0b5a515a01 +00000020c3be061c4b274392307ac14c2d38b02bcb884a0b6875ca14654ed23a040000001418b5d251b5aad1234ca35c37534e3948633e293893591360cea4930405b57a5526d662ffff221d004ef49b01 +00000020d9ac4cf82d091bfc56878993694ef05701f5eca5508ff4606179c0451f000000373327aaacc6b336e9ad4459d692fb3af0fa6269b301ed4c835b03cd41c257a25526d662ffff221d12f2246101 +00000020b7e5491575519a68568e060216321e2fef2b8f99a2799d08bd065e4e0d0000003fcd4691ab1aec2a838373ab2645705812f252a3b99bf3e754ab09470d82b59e5726d662ffff221d00a330c601 +00000020c29d922ca778af93d209bde3f179b7fcc4dad8640c0916ddad0aa866080000009ecc3772c4717a35daa655dc9d491d348105b9d702d6a0b16277bcd9c4e62a065726d662ffff221d01c4b59901 +000000205084146e79c413076ebe38f1db806e42abc20a681a13a2052abd9725040000001cf7c583e7bfa42813a3e7da4aee7dac5e0ff2172d1f331472021393f57f68f05826d662ffff221d05b30f0501 +0000002099a59db06a63675e272ea8b634cf389a93ad86bd57c5d53ea3632afe18000000dc595ce46466e2d9bd8f7ab938e9b2e764ed458d535de94ce92212d87a0cb6625926d662ffff221d041bc59f01 +00000020dffb72b35d80b890c973e94b162700e8b2f4d0050cdcaad146edfce311000000b5e52b7920021e407d15358e3dbe59f0fefc3d62ebcb55a5d46ef0f53f4338165926d662ffff221d079957af01 +000000207de8a19698e797f580e4526e8f97f53b3137f1df2942dceb95564b591b000000786b5863720c29c19b12967ba604eaf3ba8eb0a3dea9e16893fbd816848172055a26d662ffff221d0850588001 +00000020cce150f5e3d2e559f68b6ed53d0c1ce1c2e6d59668e4e278a969e08f1d000000b370dca5ec182c625b668977b47d993e9ea2f8f6eb90171d4ca3217c0dd280ef5b26d662ffff221d041a9be301 +00000020b95ea1e57d3c00a9c6d8fc73e2c1812f56440d750388c531b6bcbfe70700000050613d909e7ba2f8d06251996bb595ab4c5f56b4f6fcf8d6364c53033fb4541f5c26d662ffff221d0519e23901 +000000209d943131b12dbdd0417e4ae5ec624ba1374d8bd16aa4b141f6e8bb27050000000ffc64ac2dbbf19be2e383eec4a1424b6de62c620bf58e041c76965da3c86bd55c26d662ffff221d0356094201 +0000002056e02226aa43715975f932db7aec5cc033265e7a333d274ddc49da371e000000f39103fe528600ee9acc592940b5d8535258a7eb08fe9c6fbd73afe7873723df5d26d662ffff221d035d5ce001 +00000020adbd5f8d54adf8129860d5a09414c144cb1d812b9ec1afe356aa6fb90e0000008e7ac28de0723d8cbdc5cc063b152c503ef67e628fbd4337b6a5050334ab3f365e26d662ffff221d0a5da3d701 +000000205eae289a4c6231267f8a37866e596706270c8374c788629ba45d8560070000005f0de8cf34a3a5ad692e19c6639e415b08b47f6d627a25a01e9836511f31bd615f26d662ffff221d029a04c801 +00000020771d63c0312ff48728d8ba568620a8a8f73f79d9f192eab6754d559215000000f011e377a60df56cad5ecb3c1c80e2d743d0ed0b72a7cc7d726cd7ccfab4b34a5f26d662ffff221d01371ee501 +00000020630b8f1234e9cdc5fba3765f66a1006b6cf0db4ca72c989800f5e394110000005e128844ccfb35487dd05d5326710f01bd55364641b9684d831b2c96a056d5f06026d662ffff221d03d23b0a01 +000000203675f727c8f57143f55e404c06af2415314ce67e159b46ac07e7f49a09000000308820f9d7e5b40ba6abcf85d0cb20419ab77a40768e1243e4c7683aad27c1f96126d662ffff221d00208ff901 +00000020c94c5c267b93f2a75dc487a20bc02b5a74deb4224b75d720b324584722000000974068c5eeba212ee8b9f8207e9d5d0d68179dae24964c5ffa767c24cdae20a8142bd662ffff0f1fa43c000001 +000000204e7d117e5c03e70acd3402a543c42f6f393068436c0ad4f81802df7b50a30c0012a166106e84a505f6e6ae8fe032057d6922010663cad4eae3b98c28c77f0882cd2fd662ffff0f1f820e000001 +00000020195f9c5d37aa58a7e3764b6c4b16ae268cd77c0d24aa04275d4db4e178c50c005de6b329bd03b1e6077c194b58bfee0157f1e152175829ed3876342d13213a817130d662ffff221d9659010001 +00000020a40924a24c2d49e8dbafba6133845d7c67e20463492f10de8f513a7e180000003fd05433a66cc7ce78cdb15d0317b1a19bd747250ddbe606ec59395ed56140002435d662ffff0f1f5c0d000001 +00000020796c03c6d9b9aa4f2ea502f5ce9caa21e34a71e23098cba91de201dc7e3b060063befc369c9c273257405545c1a0817aeecc4e7a54be4b4b2e7eddfd71b90794d839d662ffff0f1ffc02000001 +00000020d050cdd9d16f3069c981582c090327a2eb63adee882454914eff13bb450c0f0041bc3ca3828b4db670c11c8d3b164dc907f72dcf869ec319b7a95f17767b0e6da03bd662ffff221d1afd0a0001 +00000020c3127cf8230411e6ce59d7ba1228a1803f79776f1fa6608909e8ce1a1600000001fa14d571d5e40a8f3119aa45a8a495d12c75eb697e2cecffbec1863dabe8585c40d662ffff0f1fc11e000001 +00000020123c46247b9901aa55b400dda2b804bad98d57447d745991e7f277b56cc600004a3a06cbe8a778c0196a3f28c0894ce25a484167a7d1224c84f0585a240cfce70f45d662ffff0f1fc50a000001 +000000201a51d44d9622e48ae6f2990371d0c36cc9e0e5b425378642d4d45c164bc404009fc857ad78008e85b72b158ec8e68e16a1c1464fd7d6b2d31e129c27fda3ae0cab45d662ffff221dfcad030001 +0000002077563e87cc1dbe36c5cdfbec2bb878ef921dfc3cec9caa571707f5071e000000d13fc16dce26b54e71a167dd628d818dd7f4b16f8b64ae9f0dead474589a18de604ad662ffff0f1f6314000001 +00000020496b1292f2d70d31c84969659759f03b5525f2485eb04367da3b691f9ed507000953f42358ac6684a65a58ad9fade159ec17980443251153b66f35c7cb77359d824bd662ffff221d5925000001 +00000020b1dbdfe089fd230422a601f561c1a2f080c77c3a5a6b914846d2c4b6170000002e93c10985ba4e7b9f239817deec29d3e197d86901c6346e73db0ce1202802c74350d662ffff0f1f1723000001 +00000020710bebc622f40246b87474d014676190c96667fbd8d056854b26d7ca7fc6000006f92abe2034c9135485ae6a20980b95e38e425ff99005acede1b390fc7be8ba4151d662ffff221d19ed090001 +0000002080313f6f524cfe7eea7d36ba156fa889f92490e0b06ca9fc6eb446931e000000931ab46abaa67957d06476cd1452a9b68dceb6ac92337eaa1e97b06d62f06f11d951d662ffff221d5a78040001 +00000020b45efba34d21f97b4e677ce469d92bd6cc741da887a6c712fd5ac010200000003a00bfed4a6f626910f649d49de50a38e34205359746edf618772881f7bb76523a52d662ffff221dcbf5090001 +00000020572b719fcc00bdd2301bc5cf2e8214b1f2f763a4e6d8e4b9525f15d01a00000003cb5a98e736f611621f1635cafa1ced7d505020c5563daa4e5ce06e8da05c2ef356d662ffff0f1f6d08000001 +000000203822d6460eadcfd020a639051b7bfcb340f3f95f002bc354b56cf0e3400f0700ee1cc6ac477d072f08ae577206f83c92d2bddecf2a68fd08f6c64680abbed1ecaa5bd662ffff0f1f051d000001 +000000204d510f53916ec5decda1a97d3f94f4af7b1249a961047fca54621852596d070022883c7722bc703ace415752f8fbe660107b0c2d5c8af57ca72bc52878fe66b3c95dd662ffff221d8fde090001 +00000020543057c20010f9ea5efb59f0af1cd5377ca6411d0b54b491051c00df090000000266123cc2febc5da5e36429665c08901fd9fa2224862d7910e81e8943f233515c5ed662ffff221de2b8020001 +00000020ec12fcf3aacec494ade3bfc0db419bde186da3001110f041d5d0d1420b0000007ed5232325a4455f0b35a62387d72ffec9ac4824c5d767308f0f525532c2bd1e2663d662ffff0f1f6407000001 +00000020df43826a26c110fc07ba430fe16762b8a6fcec2c1c464550ffde577e48ed07001aebd3b6f24bff72d8d8fea278f8a8ba866f35ec7dec73746263d39b2bf1a0e4e864d662ffff221d46a60e0001 +0000002013fc62a75243353c22db0750310418977cdae985f3b317d66409d7701300000058c0c777216a744f11969b5e458ece947cf2db565f2c1787f0cb8d1ef5a70f699d69d662ffff0f1f9e05000001 +00000020d3e9a2bb4dfa9ab00ca7de0c3a8c8ec9f1c81eb767c14e90a8840af40ce00800d8c487ae57e162d0d89cc075f543aad99c34b14e7b892095eee1db4da055535b666ed662ffff0f1f5611000001 +00000020e0458a5b8213d1b7394cdb154aada8dd60ab4d866ed3e3755d9ab47cb39f0700bda381e9ad5a82c050b65561e718de0faeaa1c3307230f474f59a16548e73d900f72d662ffff221d933e080001 +000000208d2fb8cb417003d475275ece6612b94c08e608489791142ccc7097ad15000000d6734420136fe2267b5025934290ef5d41639d88b7b3eaebf5efdeb64d1debdcc376d662ffff0f1f3601000001 +00000020beadd3a82f405672cde41c25fce861e23eb11b640542eff4fdd07b83990a08003b87a44e12b66e288bfa28c9292533e15b5fd82f510e4c83573aa10912db43302478d662ffff221d4aee0a0001 +0000002039b872cb97b6b0c8cc0393646f732e64c57e4b61918d7b2934ee684b220000006471a37b63ef4d58cfa6a5ffb1e9a265f3bf743296569c32f0bad824b7c902a10c7dd662ffff221db94e0e0001 +00000020deadcc4ab0f7c66218614c8cc761fcc56ddefd39eae74ae928a383c20700000033aca0d370c2acfcb46f379fbb72d857d83b38c56688bb317ef9c423f01c613fbd81d662ffff0f1fd129000001 +00000020a6fc94875535fa0bbc5c8fa80809b23bee6c16f374084cb7843431e864420400f4622e6718158130656f1e90a1ffea840bc6093b203cf1138a629633f88300657486d662ffff0f1f200c000001 +00000020a9beda266e6ea0d38810710f7eb85b3c111a75b736746ad5d61f3a4915730a0086b6f28eb45ea2806ed54bb443824e7599bb78a61f4aa70f79caa03cd4a241218e89d662ffff221d078b090001 +0000002061d227ba110e4fcb06bcbeba1fb4c86e0eb62a8fda90fd69f911dcc922000000d2844b5d30278996ec5e1520df0d92f8676b38cb315d5100858103dde9c75853238dd662ffff221daea3090001 +0000002033b2407d05c8a93e1d2efdbae56096f90bd65ac476c59bac43b156a1010000001b7d75a5074f92ebdbc1a478b561e096d12341c065f0da0d27bbaa2c855179d4d491d662ffff0f1fdc11000001 +000000206471634d6a92e7887490ed02d52ccdd1087db166a26c1133bad2fbec060e0b00985f49d17422fdf9c123f06a854713f38229373da00e8f38f75f238b0cb53cc94492d662ffff221de770050001 +000000206156bbae66210fca8c6dbcf02e0677a2600acd6954f3d5c86efb3ad318000000370b72a4bcdca84e746753c5946aed85ba107827d15d9ce21684683d6e6d4d9ef696d662ffff0f1f6101000001 +00000020a75af40b1711974b17c9722b520706579678237a94cb861336b8f453a2610000217d858b32f27ca8261b79ca231b820dc150b271f27c5a3eaeb918112f86bde4329ad662ffff221d09dd090001 +00000020d831e969130a4dab28926fe170955b188adacf9b1906f6ddd04a028600000000efeca6d9a0d84ac4ef05f41f522920282b9ec2a6ada92c5bef3bb4aa811e8d20e69ed662ffff0f1f7106000001 +00000020eb2d7df4fd08d015134333915a20cdcdc472cc0abccba4e35ce9e9fc5376020020494dd8da46e147f48795e2df268091d0a900e57fe63e3cc8f5893542af928b75a2d662ffff221d1ef9040001 +000000201dd2e5b83bc139dddfc68b08a97a7502d1fc2c80ca6ac09f16f4359e1a0000001f7d4298c3082fb50b711500f2587f8a91a8551106334091b82bdda5e59a83c789a3d662ffff221daad6070001 +000000205459c337d9c1fccd7cb3d024baed07992b7ca5250a04b0bd94fbfee30c000000b7c662ec8ae10da22ce2fb6e2d86f35daa58426c13ff6d239dba912184dcd0b558a4d662ffff221d3703030001 +00000020333537be16454a653f420b24021c4534987d2e820a808c84a98df46101000000fd032293f23fd3ddbd293e659e76327816400b6c4325a1d1f29694bd79a8bbf31aa9d662ffff0f1f8926000001 +00000020ea170ff3d64fb6c742835328159b35fe92529889cc19d358bf140a498be10d00fd7cc7b9b08a32de16a02ecf411617176d162536951f70a7af7c20dc89f2e096e4a9d662ffff221df5ac030001 +0000002065911d32b94601d098ac4e11fe37ce115b8550daa4db9d7417d132e905000000806651351bb2d0507c745c671907ba137e48803432f042c9765b73e652ce65a124aad662ffff221d5c4e010001 +0000002069f876afb05d15f28549ad6d6645488c85885ec462fd2946d7fceecd21000000872f16a1a0f20efb17d9bb18d9a264522ae4df1d5b1bd10ca0dc7879e88462d8f3aed662ffff0f1f8504000001 +000000201b7256eb21178ccb442780f2101ff0d82ec50c37e198398fa079e57d76de0c00bddd8175de2ac41df6271811f86790355476f9466e2003f059f7948e43abc1d624afd662ffff221d96e30b0001 +000000204933181b65ce12c5ab5d6a8beb69c5148a4cef5c0fc1b9dee12825d6060000006e478fb524e29972d485fec550f93ae1eba894eb537fe35b2eb2468522d266c4ecb3d662ffff0f1fd412000001 +00000020468283c19ecdc948360a8a259e322105861a8d71eea0a069317c03a753920d0070825e28733b481d3d9c35a62b6c8504b98bae49b0832f38f93d35d6277a7e1caab8d662ffff0f1f6e16000001 +00000020e4d29449c1e84d4ae256dd3226bd750a44bde56f3cebb35837b0d83f880d0800a63d2bafd174d1ebcdcb5cc6ee3b1ebf2ea0867180ce2d47d12899960fa12bec5ebdd662ffff0f1fa41b000001 +000000206d3a709e10740c8f67d77978dd23ff6708140de51082e8eb14c62dffdd730f0021ca85e9ece17557e2666aa98627fe43b579b3a93e181995a67c12d7ed695e1228c2d662ffff0f1fdb04000001 +0000002035aa305a272ac881630c9790d3b0eef7eebe610a78694401351a3905630c00007464ac07f1c3b9afb58bbf2ee443c1f14a5ea386f16bce8e9d03bac54f23b3f7dcc6d662ffff0f1f9200000001 +00000020913a02d2ee8e805ed05bdfcca6f2d39b433c3e611349738903f7751459690900f4ed0f11e51a25b520592666965c34ac47593b9062f61fe4e66cd4c6fc2fc6edc2cad662ffff221da0f8060001 +00000020b99ac9e1b8a42e7236bca58374d20262bd0458cafde0274c07f021301900000097f4e584f5ff31ae139dbfdd6176aabcd383f01d1a05768beb413ae8368ab9678acfd662ffff0f1fc02b000001 +00000020ad2e6a11cef987dd5c7787cdff6b6d6dc75b5ae71879bbffe2d1906b0ac3080014fbb085d519fa58628fa50cec97ea24ab23305aba36c41bf3dc5e7e8252a92940d4d662ffff0f1fd325000001 +00000020d6a543aae3dd9bc0edbe87e433846205ef8d548732306148a8e00d53c3f90a00c1459e4c6b5078623a921eb371c3a9a9072f4f11149d86bdceee6a8552a0f051f9d8d662ffff0f1fd206000001 +00000020414a7ad1ae9ad7147c57acdc50e7f0da2d553fbda6d694b7083438964c720e00db3daa38d359ff0ba61ddf43432ff43fe8eb5ca96a6e84588867176c60d83a4656dbd662ffff221d7aa20e0001 +000000200b9f1b1bc0ddb976d00178b4df1848aa7b580424078104eeb95a22fc150000007679189f6e437df48adc37f73e9c5839f3a6f11a9c8ed68a11b5810cd39f9d3b0de0d662ffff0f1fd111000001 +00000020fe7e60102d2b44bb42d34f7b53661c5117e7eca4fa80cf299f498e1896b60900111d69313d4f79ce14973006b0c55aa84b9425efbb82bcfff527dc3298b0b554c8e4d662ffff0f1f4501000001 +00000020a81d842a388899f7ac042a86078e529e36428fe2a04d619b19fb77d76b140d004d780838e12de4597013905f9efa91ca1539ab193bc6e583ef564cf02d61da9c93e9d662ffff0f1f3f08000001 +00000020503c11d832aa9b7483668cbcc1a7391e864ed1c62ae150e8875e3ee11fec0e00c181ab45082c42d9a835a0c490bd4750d3d10e036aaf471a497b29325e0467d23aedd662ffff221d186b0d0001 +00000020c55f96a08e27fd4f6ce75fd93b31b4f9a7abba67e65fc63203d0c27f0d000000b6ad2b97a134f403fa5d5059af441aa00c98e889514225fdd1cb5cfea8cc1012fbf1d662ffff0f1f0102000001 +00000020742fa6d41272c5ee8917e33b5431790b15d7fcf9e45a1e03b102a3d19cd20c0065b7c14e4ea88492897427bdd94e8eb20329cc0ff3f16f18e778cc287597739a2ef5d662ffff221db113080001 +00000020db41089e8b5c766023445c25c6810231a4b7439963635be1c3a2c7c10b00000082fc9a8d1f10b34471e019d19dff399c0969747bceb8b56c1d0033e983da9cfbf5f9d662ffff0f1f0103000001 +0000002087017d099c2a0d89a50470058c06e6d070db7c83dfb7207512c2920ff903030012b63fbb2ca00be0cde85f94a0d9450f3b0d8f7e388c9895eb3cf4396f8305aaa6fed662ffff0f1f5003000001 +00000020c0e21fed026cc6d2e08c43889e1a0fae9ef2ea498a8ff4c4e6e76177421b0600b57fa525f1b9a5bc338fb8d8c9ba30b6182221897f2b4c90fee48c31c105d1216303d762ffff0f1feb07000001 +000000200da992476539c680e291e2bbf6915acec218a929c6c3647710464b7bdfff06009e15e9f7b436893cd2bdd9343c485c28af6c5e4012e08a366b38ad6bacdf01251b08d762ffff0f1f852f000001 +000000206b1cbb7044da2a80f31a74e9eeb6da36e86ac13b0f92067674d1a1c1a3c80e0015e7ea7874d174353debe9d4414189ed2381db8b9bcab4721f01864c51de7884d50cd762ffff0f1f4f00000001 +00000020cd737300c5649b765965aa98113448577ab694aaf13bc38e1b90483dcd0a060051d81fa5ebe6d8d890fc86218cf6d0463d62597d58053217569f6f0d91d3ef1e8f11d762ffff0f1fc81e000001 +0000002047085f912480a300385596508e470cf86ac2bf82fbb5b06a22a654b7ffe70400a07c5ea9fb1902e796b38fe74607f5f339bf088c0da81705728fecfcf8e76e394216d762ffff0f1f9e02000001 +00000020df50f8c236705a30935a5c3a95cdbf4f24278e63f43b07b37bf1cb3700290c002919f17e156cbbc07176c3b12dc6fc01c31f673427dff0e957e89c3b98361cf7f216d762ffff221d559f050001 +000000208b6eff17733e905b4d17173e6f9cd227ddd7dc46aaa3492860cf7e8806000000d62f909f97d7e8ad718572784c86c4ced2d629b16da814b261975146db6c17a9951ad762ffff221ddd0f000001 +00000020d9a8fa558d7b7d162bac7c26317091a1bf8f6a1bd55712dbdad068ce12000000bbaf0ac00207ce67a25c5268f7253f5d47fd4b55fee9323cd7a6dda51bf284d67c1cd762ffff221d8b74050001 +00000020853e68d93fa962ca3f31036e9a6f5288d2b2028ce962ca4828b05ecc050000009468cb777c6f3d345491bbc8432c4d8540df0f97e006f512adba741db12a99cf371ed762ffff221d62fb070001 +000000205f44d48b7a620522fee03703c102871b9922497a4ffff06d94c876a400000000120e61bd9e305ad27c4206eeaef4d858ed92e444bf79e9196deff3ed38bbd595ed22d762ffff0f1f2f22000001 +000000203c4879fb61194179ba2c854a175d486f7c6ae374f3273858b29fc4c65a4b0600ab75a83e96bd811012a88f77274138fdfc9c1289c8b42148bf9880e517ff84a3b427d762ffff0f1f211a000001 +000000205e2f43f3237c4d7f13cd8d75a90385b3a1f0f182694cbbe7bf7399ca90b80a00ab2be378f1deaa3fd17046fdf0e7460331f95864ac2acbcb1670b73211ca031fd827d762ffff221d86b1040001 +00000020e182e45db21f2e09821f2f6aa66208217e483e796bc30c6c56e762d81a000000574cd2d4829d7c152760b8d0418624c21594a71d290ceed9e9f03502455605c6992cd762ffff0f1ff101000001 +00000020de7cc49fc9b7f410e699aea86bec0cb948cb3fa65f48927547da0e2e9a090b00b8eddb678217d985bd83821898af1162525bf798714eb27ffa902076747ef8c2922ed762ffff221d0c0e040001 +00000020dbf06358141a039181ff53f2844274cea8ae878eb7f64902c38fc02508000000719ed6eb5a126578100ceb9ff867ffb0c957cc5d1f83011e95fdaa26415440b88431d762ffff221d0c660e0001 +000000206613868dbb3b3dde9029494ab474b03714eb53f3e127d6db7ef83c1312000000a5a55c7a1067737fc803ba09673a11050511a829ffad68b82c6053128dea76aa7f32d762ffff221de09a080001 +0000002026613a5a67fcbcd8f24d95ff8833fca484851f0b046239188d7e0c40050000001e6d67825846d0fb9069c62ee9dd95603a18146619c3cbfcc29b6fd9130935e1f135d762ffff221d0e0e030001 +00000020ef2d5f2fa407354b8381e67a98989f0068a47892f05f2f4d684f18f709000000adc1f77a79d93dc3cb4e27375b4122638d572b6ec34eaec4f8d4b13727b8c1f2a23ad762ffff0f1fe40d000001 +00000020f401549cf0a3650d2334d845b9aabab44ab9c0a30c8b7cb766b1e7de1aa80500afae56185756ea8a26ebc15d3744494bffaee1dff23cd21466537701f9ff948d623fd762ffff0f1f971d000001 +00000020c97b785bcfe8cfc181a37f05b986a58e9d4e505cca9cd92c999d4d067b2401008603d488c1f06de01a4616317db3b4721c4bb0396eaffa81bcc991b54295afbab741d762ffff221d6fe40c0001 +0000002037c2102a168d4a99d22f6f1257f43f9ca6c5128e634b92cd3ab79ee41f000000319d1f97b55f691a5d12a3afdbdfe2e30449eba02391026d5fcd453b010f7bef6c46d762ffff0f1fca01000001 +00000020624eda18f1bdf2edac44f3976c2a4049ef6c074e6d4a09d4b1cd747bab1d0b001c43ac18e99d122b9a2f4d00524fb4440f3032bb0685ca53c162d96c3e522e8b1e4bd762ffff0f1f6109000001 +000000209f0f93260f09ac49028ef9e3139a7cc08aa9766635232cfc2bdece9676970a007265d7a409d3ad77c0812e99c012ea3bc3ca224fc4f6f513568f0a00c9c30e3de44fd762ffff0f1f0600000001 +00000020bb9e9793143e5e26475636b9c2b0481dd060f3a03cac5a2067494be494810b0040835a1854af647094248fb4e52ff4d99416a610d3c71010df414e4817b6d0b65550d762ffff221d9480090001 +000000203bb0a88ddffa55d9a61c25a5b2b49fd6b52bee72fe79e91a52ca35c308000000aede8e648d158a7e47bca81a254e581eac4ef148df3d1890d6eb99cfc99a14360755d762ffff0f1fae1d000001 +0000002050345fa1985b15fe37adb0538ca0d2d48cd297b6382ecf9d1f88feddbf45000067a63e1f1281fa6f5d5a9e66b1044f096f016498a8d56aac23b206ea26dd938ddd56d762ffff221dd0610b0001 +0000002054df63e7eb1090e22babcc609abcead3c29971e8839a9985f5ba887b05000000c0bf4e73f3c31ab508076660e8d44d0165b2a60d76c677fc1435114be55a2533a35bd762ffff0f1fd849000001 +0000002086c3e1cabec585c7eeb3e295634cd69078370694b72839ec2d743cfdfcc30e006bb6234ca3738069fcf9bcda6b3f8a13cba4f556b523811a8c4a8359653bc8d92b5fd762ffff221daa2d0b0001 +0000002011ca8b9b95799a549fefc398222a2f8b89137e4393078b3dee414d500a00000077757524326c1c5e8d3893fa8007689e5e9b16b56e1bdf965eaa63dd01c2f3bc6b63d762ffff221dec9c030001 +000000200ba1cc2b8cbe6c4a957e9900e39f513a97b7633c8227d3ec25e96320210000005c6bd151488bd23a6151e72f477afa92d91562d15bf9975bc95a4b90032239c82d68d762ffff0f1f100a000001 +000000207d4cb1ea6b1c69cb04a19682c74fc7df3bbf60f90888adc7b1f7dd971ab50a002496f79c92d8cd675e47fa4e670029fc1869518bdb5b0092253d1782be16aa9ff76ad762ffff221de0c6000001 +00000020d0f0f66da003de2a5f9920c063a80c6e46debe82d59380cf1f0124781600000065bc1d0bcaf2b01dd9c3d04255b38fdeb9f07b6481b11d6303e10ec6cc39624ec66fd762ffff0f1f1e0d000001 +00000020858ff6972dbeed43d3c5562a88698950acac180b542fb84f21b5f3f6b6440700f80a001ed350726c670fd961bb078f72439e8cb471697c383b6e937a722efce79374d762ffff0f1fbf06000001 +000000202d31e35101d74b4930478fdf5cb16a658d3ec420271c3cb015e7264c1aff0700c103b59b54127be7237d1b54c72b2c858fb25bd519a690bf614d4c1575cd6d608676d762ffff221df6020c0001 +0000002098966d28a5f0bf96c393707e383d4ab0448eeac19d9ba46e49d96cb820000000bb3326262b13134f6230020a89651b1045bfd59b263c0bbb60101ee8c4dfde26507bd762ffff0f1fe924000001 +0000002072f12c7d461b8237878537d52e49c6da7cb3dc837d75f41e26ab19348c640d0029934f28b5d2f9975f7715399fe10778274ca0d4ec475be7c3089e3dabf350c11780d762ffff0f1fa201000001 +00000020ebadc0e2da4316cf795092cbda282f14bb0cf7a5d6ece0d0c38dc1bcc04d03004647db8fa5a483460baa4a3344f74d77c2da54125028c3ac1dce0e78abaf5abc3782d762ffff221d5767020001 +00000020eb8e8d8c244d0f72c06666d4875aea7d5aa68fb1c6e687246e48d48413000000e79e47b6eba23452579cdf55e503b04b76a3bf4dd32f88f6f5e93f837dc68110f086d762ffff0f1f1905000001 +000000208f650a0b6c8898b3cd792fa17dc42b86ffbb96737276cb33e8a3bede2d7d02002422b8a64d85507142ed38ba67f1fbd227b4bd9bbf057a90b5c5cab177c3f2e8a18bd762ffff0f1fc205000001 +00000020dea3e53bdf98a6aab55586dfb0f700bdea89758ff9719d80084ed503056b0d0055b25e147e0c0cb389a3d024dedaa93a740bed140a180ca0bbe36319b2941a296390d762ffff0f1f6311000001 +00000020763393cf2184725a7d2be2dca161011308e4a3116785736428ce75c88c750f00364d9a1f3c8e914360feb422d976acf3fb1641d561924fefdafdd5e57024d1a7b290d762ffff221d53f10e0001 +000000202e0fe89c0ec9b094ba3aae6c8f0da64eb2ee890b0585dd789856d97c1c000000deb89e606770fd613ef00e6aa08767b36644fc792f10fa6d0741df76f9229df2b193d762ffff221d3f76060001 +000000201340bfbc89191c7884d34b6df84f38fdb4877550ecb80b68426a440114000000ae56ad62b8c2045d451cf72674e22bcb363b5af7d4245e41da841b89d113d0bd7198d762ffff0f1ffe2c000001 +000000202e97fa5a982ddbc320304cebd7031458c34248d59b33be1ec74b3a206a8e09009b3cc6757b2374b2b846ddf6130e016fc12fa9077f26537a950416be67e9fa93269dd762ffff0f1f0405000001 +000000203c703d94aa8173c6f1b7fbfc83dded8649c959dd0a7885d6ec73c9e34ff70f00fc4f811e1befe1622955cda67e0f43f080b4066705fa60e21d03d007246c7268d69ed762ffff221d077a0a0001 +00000020c04ae36d39caa415712f3e2987409d3e02f8f99212cfecf071521331220000007c54ace1b616f93aa2c9f3b5ccbd4f70a84c90f1eacb4f03393b6b0c36c4974997a3d762ffff0f1fc50a000001 +0000002093e1e6c0ff4a0df72d1b44ce60835d9a8a7af247c281d45a91db8db82e160000db182823fe6c4530bb24e52d2f6ebd273e294550fb1a787e015574672dce57895ea8d762ffff0f1fa41f000001 +00000020a84032024a7c023e7fa5977a00a5f46f2638fae21ce3a999a611deae99590c005cc0f80f8f67fd2cfd73017edc5ba34efbe965baa1e0823b33bcbb9d87f626d11cadd762ffff0f1f882a000001 +00000020760fac173b4237431780c6cd2a1cb23554f17b046ef783e03d97e69b58690600a168b73097fd09380dec7d96efbea86775b5ac8c4e4edf0ab3c6557ecae56bd0b3afd762ffff221d2261050001 +000000205cbf4e38beeb0ed8e4e2c917ad037664dbe8d3d61d934bb9418d63060f000000791049d69c4d7b1d621c053a76ab1906cb68f9a006b8d340bea7e0172707daead8b3d762ffff221d94380a0001 +000000204b02d39e61082f9c173befabd6f844c5a0609dc7a51437b1c7ade2961d0000007988f19469a85ffa2c644656698d63e1b46e9134cae6d3fab231821047afb583dbb5d762ffff221d49e3010001 +00000020668f069ed1bde4c905a801fefb24e048076070c84d97b53cfd21c84e1d000000f2c745311c47d9450f58864ca3600753d7084ee71ecaa3a503170705ae84606657b6d762ffff221d9647000001 +0000002054bbf1f01a1ca03c8a285339ac9d91b75be1a6a766cd695e2a35a27819000000c5cd3e63989ad5c3057d8f3746eaa594a186fbdd47d7a104ce76446e9a5847550fbbd762ffff0f1f0908000001 +00000020a218ec0fd58273a953f5e1ba4719faed6243cfbe9dd0f70167a31c321ae00a00702b453e84781ca83b39e605bab9e17443d02c2d4910675326f333e26103d3a6cebfd762ffff0f1fbb03000001 +0000002036fac43895f9292dcde71b3b091f8278c6fcc539f34de4aed009cdc8aeed07001a7944967071ea47657a86ac28e58fce6c3dc557b7dc1eb49addf718cb2768a344c2d762ffff221defb90b0001 +00000020afe56896b1a72ee81e0cd41a90b22c4370730378b7bf14c0e03f0d8f05000000c7276db0daaf2c51727dec8ab55a3d84d1d36a5a6775653dd85605a55cd6c438f8c6d762ffff0f1f310a000001 +00000020fb16c5b2aa586098aacfe565f0d6a7604fb9e8db10c10e1f4907c362b90e02009e1a2d91e551fa6cc35325a7a94cadb8cf268e377e6b12e4bd8e7447fbc055e4b3cbd762ffff0f1fd411000001 +00000020c1543b92a09f6c84d8db5832db70d3a4305a5f3b365ab9bed5f491eb5d3a0200e8c4d9ea692766a30d88de0ed8d285cd5a05370822c9e6d48d71fe8f5bd855af97cfd762ffff221d0540714701 +00000020550969fbda9a1cf24771dedc7cf67b2050d19ebfcf513c18675b029b18000000e99b9503840909568b76878fb8913911344385907aa20cb27b61d6367e5b9bcc98cfd762ffff221d0861aeac01 +00000020931cfbdbcc4cc42ae9ab5dd1c5cc910203a07ba927fe710d08a9bebb0e00000025e2f5f35c6cb13ed8f1252af0be22dd6d001f4363556795c34198cefeda847599cfd762ffff221d10c5f15501 +00000020d9ffdfef211eb247d2b6155a7a4052e1522be685a8e001c3e17d061b0900000003c593401f157982a7d05a47a3bf9072eb04a0429b438d4b0f82260d8db7adc89acfd762ffff221d03edb57901 +000000204c4b3d2ec71e4985c5ed60094a0b5b63808cd7ef73e2233a8457412814000000e0a6f6b7d63ac3e9aae0f20531cde49ae9ed165bdc2a3648e706ea1391d2eb229bcfd762ffff221d0077e74e01 +00000020997ff8b2e066a02bab866ad10794a3fe4998808b0106aa509ef1719a1a000000b4c32077164dd6f97afa1790c914828793b3d43f8fb1ed9fdf76b3400c498c789bcfd762ffff221d072e920a01 +00000020657ff30432b6866ae500deda3c7c0a7cc9b8a1221d734634115f99e716000000f3bedf2c25e120d735b9dcbd8f12c43ca6839e694b92b5ba712d7e8acc7d549f9ccfd762ffff221d004f506201 +000000200f7de88f91cb92a406d57e89cc5144dcf8d9b8d92e097357bc823f4611000000c207fbb0d754a92dd05fed167f9b1178d1bde28afdf6271d06ab2dc4d438d9179ccfd762ffff221d10d956db01 +000000208ff44b92a6df908869e3ca4daa70d5294d9d65dd0f890aa6cb63ea8a13000000061ffb17e9c3f69f8aa1d1c51ca114e25fec3ca254db0c0fb0876beffb06eed59ecfd762ffff221d10df790401 +000000200a2c44c2dcd68e6760de852dc6135ddbcc8c76f5d01c6fc5096a399902000000876f0ae165cdb76fe3905aa5d39c12c222a1948993bd3aa2e625fb01679b78b39fcfd762ffff221d016de1d001 +00000020f9f7bbed22cae177aacdb3589202a0a0ab00008de1eafb02810b565c1b000000878e55db8206f6218535cf34606345c67ff1ff6a48bf52214e9eb2b2fafbf061a0cfd762ffff221d007c3fb801 +00000020e95df33c38c7ea59f95fd5a72b9c5098c37ce3a413a50902269188821e000000f936b22a2609a773480a7b8d89c7e77abe71e253ba89ec85cc6f50dfb4b5b060a0cfd762ffff221d114502d901 +000000200547ebcd6e8ce50fd6a8fc885def6e375ab019028ce40f9f5428875202000000dd0836770eb25414019e2ca4a1879929b00edb58caec23f5c59774186bf2e4f8a2cfd762ffff221d112fb3b401 +00000020a86b140bfe0ba406b5724fc381a00c6ae67b88b8e2142306f15311f4150000008316f575a997aa153c4ad807e18936288333d5a24a6d45fb2460dd6e7a532ad0a3cfd762ffff221d013aaa2201 +00000020e59a9f9e97dddcd18c5f25aba8a9d7b0f0e1ebf3e2303ddff65eb1df0c000000cf4c8bf0c6b7dd5e275753cb73803be01d438b2c711b6eedb721f8d2a76d519aa4cfd762ffff221d022a613001 +00000020295bbd452e20bf8875f4898fac534dea61e2df60dbbf82bdf3459b7101000000c153f52d1c65110e323a6ef80c0ab9f03d197f25cfb04768549a2830d85467b0a4cfd762ffff221d002e7e1d01 +000000205ab9725c66f3c8f2cff8bea532cfeef369f920be55a4b828b14957990f000000f1263aca8d0a20172f4400d110edad5c6980adb63c92304ee6b555da5897624ea5cfd762ffff221d018324a701 +00000020f39ed64e22a0f13445248c83dd8c7f5266192e864a05905f030bf56e1a000000b4abfdeb82e98a730aea0448ebc51019d7894b322262495246debb60b3e0a4c0a5cfd762ffff221d1059409f01 +000000208de76780926779a37871b737acb6794ffe5646ba0360a0e981f879d40e00000096441ed7870ea31fd8fc257226ca8392abf4233eb40ec8aab99f49d10e6dbee8a7cfd762ffff221d046cf39201 +00000020d2ae3975265a87d7c09877cd4d5cbb359a21aa4fa4b5cb541b45fd0d0e0000001b168457789446f19de67533e27b7ac4360d613fd47f969f2bfddb877d0a6d9ca7cfd762ffff221d15e5e1c001 +000000202e38bec4dbc9b1cf76d68d93f01dbe7c28452043d2d66dcdf4f950af06000000ea71d6c235531429ac5af1a1d17143846fbecb22db9454785b4b8121fbff172aa8cfd762ffff221d0183527e01 +00000020e31bc85b430f4cccdbca97effd90d9d404c208930a41e33e66c9e8e00900000006f82e246ca5c7b8bdba59af54f374112dea79ffc00c198796db7d34603bbcf4a9cfd762ffff221d00fecb9001 +0000002026e067a314eb4e88b6a1ea91c81151b38e0229d16a2384fce2fd172b00000000366d80405970dca14731004314863e888020dacd8d7dc04ece2eb63bd9a3fe8eaacfd762ffff221d00cdd67301 +0000002004b5c396c953dda115d04558fdccb8b9df633f71aecbe4f4ce6d22cd1f000000b909af1eb46bcc527bd9486dab74f4c98aff6bb190b86f70e4d7498573889953aacfd762ffff221d037e30b401 +00000020fcadef3abfe5084fcb7625761cc237e73395a51ec24f97d7d5d588461100000059cc3cff4f79bc1ad3dc98e6ec7b2fe9942e8c1e603239a2703f6a2737689be8abcfd762ffff221d0276f42201 +000000202a4526b7c2424e06d5fe4b96c87cd8646a36c61cc93a766d6d3b31db070000005a648e31e13ab4c9a931880a568ad462e6c7bf0f01a97b351adc88114a81afd7abcfd762ffff221d055e533a01 +00000020a01b262ccb70a5b4ea9c868c7c181249159d67290be67a25c8be5b5c0a00000018be8a338cac2baef9903f660aec6d0b3df4b8d7f173377febba6557ecb57bafaccfd762ffff221d0000b7f201 +00000020aa782e47c4ca9884e5262e1d52a0a6409995d1a4da525b6cd34a8a5a1e000000f705c73945721bf5d2b07b71b85af9f8ba4ff6cd24eaced62184a5b4152c5bb4accfd762ffff221d07bb20fc01 +000000209f948e984976eb1ffe8bfce52e995a346217b8075aa4ff93f49427af01000000462d19e099638cd4ef84b37ac58786ddb1ab128d24ff7a9a892398d5383a806dadcfd762ffff221d034156fc01 +0000002048f49da88a21c95fd03e91bd69cd2cbe07275ba55064c09129f79d9816000000e0e23f632214b71059890108036caebb4f21f0b08c3ff8a8addbdcb08c9202ecadcfd762ffff221d062129f301 +0000002033ca798ed1a349f24d76c1c887715028af302899fd441693d6a449910300000052f6f56e3fa43443884a1607afa6d16c5fab148320ce86a9b099154719c2db91aecfd762ffff221d03f50ca501 +000000205eb0b8293951fd92beca9edd6252f41af2e7e82961d39128334d86df1300000012ecfaaadb0435208c673347c035409942cb8b7c6e02d335f87698856ffa902dafcfd762ffff221d073a0c0f01 +000000206207a4fa2c5b2059a04243563d56ee53ea8481a94e63647dd8d2adef03000000db99c6509d45d01ab1860214e5df7df66bf4ebb04a36cac42f47b009424da9f8afcfd762ffff221d04474f0b01 +000000204dfb903884d5fd9ef86bd7fb02e070374cba8c751915ab81f4282fb4180000006c1361bcd0b9d7131b3fb51c18b1be522d8130f1aeb3f6eb4ba65767e70b0afbb0cfd762ffff221d0659323501 +0000002075bace105ff22adde9cc91dc0a2350bb7a58cf580b4f47fa3408fab5050000006f92c49bf6789aa50c456bd7256649a59e7b56cd14099aa0c484b76476d7bbc1b0cfd762ffff221d02562b6f01 +00000020be6dddfcccbe0d74405e9f2af870f9cbdcd1b90b650eac54fddd3cd51a00000000687bc15a23446d65510f50c60d13ca014738eee953829614812e4e58a382a6b1cfd762ffff221d05e8477301 +000000202e501f8395ab9a0368fc95458fa684fc3962b166dbf046846143d9100000000092cacc8f250170b2d90158e5ef77ecafa4006baeee06406d4d3f61adc526a7d7b1cfd762ffff221d0fa866e401 +00000020f86adb29d85cbe62f8fcd2de4910d8fc9274b48ccd2d4b4d4836c70f13000000b375a5cd84e2cb7e87938910457b767f88fffa52830e73e2e6ebeacec9de4f52b2cfd762ffff221d0248cca501 +000000207423d1a635543e0fd625458378b2397e7acb54ff69fc0c938f5747842100000010f792d37e36d7993ad15b799f66eb1cf755bf3c241a735a584b47a2a76739dbb3cfd762ffff221d10262c4001 +000000209446dab7a7bbfcfaafc0744e018a1f8b36e3fa873f2b96ec6a0cf384020000000af59716cb96a246aeeb5b5aeeb785603b8e92e843d01e75cbe416f32e12ee91b4cfd762ffff221d0cbbd91501 +0000002040ac34d49c0592f2130ce8711c7387b8ef3da0f686ef75bf7c59aabb05000000ba328b573e517d4a35527b35e99ebb59a310c3abdd7483e8cc602de4d854133db5cfd762ffff221d0386890f01 +000000204d9aba69a198c3c36c078ffcf7e43be11b52609a8a12a85aee9ae0b52200000040ef117cef17e0e0edd7ba5802f5abb3663033dc98be98c790a0197b936e3ce4b6cfd762ffff221d060effad01 +000000208b47a63f14484faeda27a33154243630629b0b26060020b5a72d6fef0d000000fb009e2dedf53be07e24b831173c9d5e2ad294e35419a2a0c58d7d704555ae92b6cfd762ffff221d04bd792a01 +000000207638875152a9b8967f46990a6685f429a74f556141f6ceaa15b2b9491000000018e3b43b892da9cd3aab72291289560cf383e14277433486708317b3045dee79b7cfd762ffff221d086def5701 +00000020afd3e32e321f27f1bf3e49b32884c8f8e62d14ccd331d2f5453f21ca1f000000b9bd8c8daf64ecf0bd4fd5d8a9cc20aafe39c7de91025fb7345c044f3772c5bab8cfd762ffff221d031ac6ee01 +0000002039e4c8d98010cf35190ba5902475ebb8d5d0b9ba83042a59dc32348d0c000000c1b532567a92869b56c28bdb51d994ab57621c334e991afa8ebaaaac01c65217b8cfd762ffff221d0512bc8301 +00000020b6935b38567f12c4b2adb903ca83a123a6a1645a5af39db78f67b4b916000000a430da888238c21feda1a9364b319ab62f4c02e7c5f519843ba6d67878f6e92eb9cfd762ffff221d0be489f401 +000000208fbee247549efc98839fa889b0ee173c5f08c5a19e3b2e538e0552a61400000055bb230398ec692ad04613c71e0c2cfe9578336d5a05575e429739b3b3351f0bbacfd762ffff221d0391cd2f01 +000000201b193036c97e7f8a4a07b39a72951d3c7f874e2d316e6c618b0f1dc905000000839dd5b300236ca8756d4e83c7620377e703d5d6506db9964e87adfbb0359682bacfd762ffff221d095e212d01 +00000020670d36d932c5aceb8dd818941b94da708bcf1948916502989db7e5b01f000000b2442c955aa2f2ba7ce3084bf654442bf62cfd5cddff0a284db9aefdd6a75aeebbcfd762ffff221d0059d32401 +00000020fa3faef4326e380812525e59e230de98b6853fb1ac9a5d56582f8dcf0900000031e4f8c72cddd66daf1dde05f0f21d8c43d0b69499c368a29c49bf58d9e37e16bccfd762ffff221d086d90c701 +000000203a2d1fcafe8e00f92f75c1b1844c487c20425fff3179c896da6d61fa0f0000009ed5d9afc4e1632ad2aa749cc560a27ef48f51f99d2f7648f05199e32aad6581bdcfd762ffff221d0261827001 +000000208d2c8deec248b8f7430877779ec5db2affb34600cb6ad163b3f144ca1d0000009f1dbc0d4febf6ba4b790746ab8d8638a859c6f1dcdddfe4633e86a745f843d1bdcfd762ffff221d00bb4d6b01 +0000002088241cd9b429a1a35a27250436ac6b936153c8ccb71b10e2cd32e0d6140000001354f0e566640b634b1f69f2e858f70a0334d4f00dbdf28b89db967c9580a13bbecfd762ffff221d08b9722a01 +000000202f6a14a994c2be318517fbb2b9dd038dfee330cb88a52426f1e119d008000000bce6368ae4edfd5713f45b98a50f9108a5f92f0fc47fb7d86405254935adf673bfcfd762ffff221d019881bd01 +00000020be14e940e996204d2527609ecd49f74f2339719dfec2f193f2970d581a000000d5cda7e5ed33c1e006ad5250de95d859d8dcf37586c68ca3b46cb48f40a719ebbfcfd762ffff221d05ff4edd01 +000000209f694d2a06dcf4c9a3ab00dfe2a10e4f18fedb24b2c11954cb4b45ba0d000000057f64b8175999fa47c21a5ff1753ee787216c1c259b871b80794596b716df5ac0cfd762ffff221d01ffb1ff01 +00000020e182402d02e67aa0ebb87caf6f80a04ac6a4ccb78434bc2913587aa711000000b98a76868e80b7b2fbd66e6b3518d3fe4ca6a927444a4fd23a01db44e1a9b13cc1cfd762ffff221d0144422201 +00000020a50149dcee90c86eb6f97cdf3140a1e55c94bac5e06e13bd15955e660b00000029f9616609708ee062f43655148201ae7d506cb48d400a73b52cad3860f338c4c1cfd762ffff221d01fbf4bf01 +00000020d22f54f5c829c734af59704ccb29d145d58e34697ddc0b9d35c50eaa1b000000d20130b56e07b2394c5deaf10dd3a5808b27dc0769eec4f99ad01dd4814e7690c2cfd762ffff221d04dec7c101 +00000020fa3507328740d94858ae61029160bfab95bc7d4e5a76416709acaa9c1b0000004b17d3a45c6c1301008d8b9728895899cfb828a58df6f6886e6e80797322b8f3c2cfd762ffff221d04cd55c001 +00000020b89101957e1a54d75057cee039dc334e28a6cf911c95cc815b282dbe04000000d59b9693aef7f5166262c7c3270e381892bfeb32946fa2b7ae0e7c8c0eb21ffec3cfd762ffff221d00ae8e8e01 +0000002095b61c718fa0ee30b0753001d10c96d2c9a846967066cfd228a08e7c0f00000081a52300f276a47f038eb087d0a75316ede5ac040aef30084315e134d56351bbc3cfd762ffff221d1a1dc51c01 +00000020130a795553d15b7eb7ac4ab7c5dd62330a899dffe7c633d3a052119f020000008166bcdccef75307e4c6b5e9d18cf50eaa95ea8b89cdb1958151792caa393366c5cfd762ffff221d043d17ce01 +000000201dd9afd8938a4825e05414a0551c48bf2ffd5d712063154aab9c293d0f0000001001ebb4ffa63fae72fef7e570cfba999cacbed904152177d2799b9fc923826bc6cfd762ffff221d001226ed01 +00000020851231dcb85b5836c01bed67ef2da29a4f4f3f88759742dfa4eae80420000000d6b2d4220f51f88f9c510cf2846067754fe5fdfbea406a54d87f22732573e5a7c6cfd762ffff221d04d9b3ac01 +00000020aac7255c7ed2ae09890999d00f2fa5895eb0cca9ca0f875a4768cc1119000000cfce4fa22ed9225d65d4bea043a1c13ba4111425dba2189c0f05c1fe0df347f3c7cfd762ffff221d0c2141eb01 +000000203b82066b34f03e36f4b483c49dee60f2ad4060d1da4579e5e46e9d4f03000000501d6aa42479566e27ac92c46a465e577ac643a5224510ec7534437ccebf24a9c8cfd762ffff221d04c77a4f01 +000000209d8c139422bd8502450ff15bc7abae473adc3fc3af073dfdc8a571d4110000005bb9c421b0432890a0cbc015b3fed3e9637b6026f6a719fbc2bc8ca48c17786ec8cfd762ffff221d007f8e1a01 +00000020ecf3233e7e8757050c92cdc400918fac74619241328c00ec73e895351400000035a977fb24daa3ba56d746aef84d922e9652a5c8014472fae1fd2e36d713743ec9cfd762ffff221d0a5d50f401 +00000020268e2ea738706f7b09e66d93b83eda69dc4e28ec00cdd5aa15b18cd61e000000679b33ad4fc9d67dee33d4a9e4e4ab5f247b40fef0da57267e618df5595a41facacfd762ffff221d04cf837801 +0000002045ff785efc2107cede30af8bf0e2165ab3c4e49bcbefd49a9f08356608000000174acb7d4e6bf6e36f2d5124e150e1f11d327ed788fc125fcb78a26f0b838667cacfd762ffff221d004c184b01 +00000020bddd8248b5ab2feab24526a811c365551c69396f1782e4a5da0449821600000073393e61347a720919956678602cbdcf042a7041e72fc7b78e2fecc12e246d3ccbcfd762ffff221d00c5751401 +000000200fc53f58e90ad55eba380018a28e3e97a7013abaa326efef4a3b11c80e00000099b9df43b2336f7f3b48febafb4d7ac635f05f5d6badb4748772c2f243bd3d17cccfd762ffff221d099cb57001 +00000020d38580af9c3e39d1d6e07874340e87d169c4cc97d281cc421732109e180000009b82879658a31236b4812bf5177754d3596bce060272635f56eabadbc3a4dfaccdcfd762ffff221d05a1e3e801 +000000201420e34540065a7a8b75a280e5b5077847bb74f1397e1760757b42f01600000029d37e2dc766088f2860565b08994c8aea212864c90b922a445a7ba3a3b2f50acdcfd762ffff221d01ab161301 +00000020d3fed0f35ce79f90119e5f21fb748ce95a3961250094e5f2892bec2d0c0000004de4065ffcbf94b5d20a8f409c4bc38107eb426ef2ea3e0b91ee9a5dbafe7adececfd762ffff221d0056cc1f01 +00000020d32fbd2fb115c973b1d6656fc3f97b63dd918d25fb364045025a1ce00800000033d9de68fb5a354697673c562e143c6316ffcdf0a7622df7234b0b36dbe79ca6cecfd762ffff221d028491de01 +00000020559ac16a51f368eddf993625e8ed463e43f324c1df1d99651a6caa2c2200000028a8969fb42f8189392771450088741a8a95400b29a90603b1783a79638b514ccfcfd762ffff221d02ce9d7001 +00000020e57936b6cc16eded408e530e06f89ba7d8cdaaf87cac6b481f3cf3dc020000000e74e13e95aa97dfc7d29641da3d8af1162b9f7316d0c58cf4a25793d5e599d2cfcfd762ffff221d01aa602801 +00000020e22288fdcffe4d3dcb7faf49e3c89600bc04c440d3f4ff82168fb368020000002f72f6f52a3a705030417c97c8235bd068fae5b4f0ef17992481b6bd3eecc83bd0cfd762ffff221d0f38d37201 +00000020b9d25eeb57217e20adae69c4a6f74a7922f7db3d6154a9597244b2391d00000094a962795d63955da012c71ac377b05a2c7cd32cc2fa7c52ac3a094c139b1ab3d1cfd762ffff221d054b67cc01 +0000002048513a35d076ad9a5642d54235490d35ce57e4f1f407d19dfccd0cfa07000000c085c88f45c30764e8f059deed347146042e5b15209222138b8a33d03dceed79d1cfd762ffff221d07b81a9101 +000000204f638f8ee6a0f32fd3e0e7b4e9898702fb0ccb7d69602a8fb302ee870b00000040dd724e9677d88d9d77be0f345ff5fbd8fbba512ca0f3411dc404e5c7f55096d2cfd762ffff221d00ec5a7701 +000000208bb03f09f510d254c341c84afb9d9f885feacb5091e2a51fb00267b31c00000057d2b627ce95268b1193c3086f8641ced10e9cc19152afe0581e7555880fc247d3cfd762ffff221d0b913a4d01 +000000201b42a7b8bc7cb8428af3226b40e79885ef635b85ed72d2fb72f3c5da1c0000009a836fb4550f7fc61d4cc231bc8b7594633bd25d7d2dd1ad7c7158ca42c5011cd4cfd762ffff221d05a78b2b01 +0000002059352d21f8520bb7a8b50b0c1fce43d75a0e741d586e18b37483b743000000007f317c6d539b6c436b3e3f5460d61f24b31aedea5fb96b6cd91b1e706ca93d3ad4cfd762ffff221d0c2cbe0a01 +00000020f40f7933bb173553c1e7a5af649811fa1d4f093025b9fbd8f4ac51820e000000c200092480e21013e3bc64792add2062d845b249bb86a84e278d80b7ccfc5402d5cfd762ffff221d041bc8a701 +00000020f0a9964c433eba9e58cf4a55dee9408e40aa50b6971554f0ab491fb31e000000218aa2e0fb4575d024fed4931cd604621ebd663fa0684f78bc2adc611385a763d6cfd762ffff221d0b0c13b501 +00000020aae87713a5ee2ee84ad5cab44a9684241d1f5d86cd1c51ea05bcfa8208000000b47a7cadff5bcd14fd3cd9564b00bf2ba39a2adf540a5509f8d909bb3f54dd73d7cfd762ffff221d07099c7e01 +000000202d92b9ede687e45c1ac312f2edb4127178a0037073d564b3416feae10f0000008848a32af21f5c264433d07abea1a417dc233201eb002dc5304486fc3b191ec7d7cfd762ffff221d01b8abb801 +000000207ea10c88d57641d1c8ed115221f30d0078edfa75803af1cc0ebd08dd11000000c5d21094db1998b807c9bdbb81398dcb79eb0b61b3ecd4658327ecbef91bcef4d8cfd762ffff221d01f34c4e01 +000000204b42469efd731fd9ca81b754f40ca2548a3377950af5cae1876e94eb19000000acde202497bcc81295df204431b271de90f7e8595890f4a70d4d6f54c784e1b1d8cfd762ffff221d070737b101 +00000020d36cc1823445e921eb6d74fa7c0115ac92867a1697c40ea5b50b8cd50f000000189c16fb3be01fad3e1397834e0b7ebab6b27c81e5f68cfa769147d0061d8642d9cfd762ffff221d0912ac3801 +00000020ae3a50fb369917400c789f521b7b04972b99de74d2480a39bc369310000000001d5096af70c1e9d2cda26f113b39d52f1bb6fbf6660b30ba8b4898da9f54dbdadacfd762ffff221d035141ed01 +0000002058b0b6ca49a6838c45c88744539c2a4b4d900e19439516a03e5c55781a000000e52fbda310328bc4f903466db3047be84fbe6e9348a2a5a381c209534e7caa67dacfd762ffff221d0078037801 +000000202e650c1d3c30dec280076d3115e2cae036464e11fa7bdbfdf912b8e2100000005112a9f327414ea757f0f5e601939032fa2e85c7bed0655d2e79ff06604c7398dbcfd762ffff221d0a776b5201 +0000002071811672c57785797663ad9709971b12fcb545ad7d21239611637e2c1100000063265c95054ee4aa90f88c978a19e8c7f11d11b5c251d8954c473cf0fc1c85a5dccfd762ffff221d012d65c401 +00000020053645dde3d36f326c45b6cb9613fcf99ba57aa249052f74d8830d3f22000000fbf9a94d34a13016210d3549b02a616a05782c2504727a860b22eec452c6084bdccfd762ffff221d064f6b1d01 +000000205b343555f6af549f0a73f96d2094c7aa8477ea88ffffbffc7b6aa39816000000d0394a83b4bb34dcde8dcc3126aafffc11a62c410d0ea58dd053d8a406643498ddcfd762ffff221d0a47e72801 +000000207a1c9cd28c72ab816b1f1838cef693871bf771178ded2ec7639b946e09000000405166b158820f9bbff1dee2e4a017ff190d1f15cfc3751a4a9edd0757bf3694decfd762ffff221d02b68b4c01 +00000020ad19be391c02c18ce4553d8e6753808f1e5ada4af8d7317f96339aaf1900000093b0dd0fc4c7828ed4bc2b6b991d4356282d020f497377e068a9e0a5527a7751decfd762ffff221d06c2ed2a01 +00000020319f5b3bb4fdae6cb8c97951855b41d2e24dc7577eb645d0f40d176f130000006153ae8ec7a071b9047b623245fecdcc3a45b7558e975ef84760079455faa9b2dfcfd762ffff221d10d9785201 +000000209b442b2290567ed3233a71a0185531cf86cf54cbb933fbc94271f6a6170000000de14b05751643e590ea43320299cfaa3e930628ac0a2bb6f7156498af8d22cce0cfd762ffff221d058ad88801 +000000200fd163e6c4f2ffd5a50eca90e33031d594455e73731fdedb6f511a18070000006eab7acb24d0410716607608e94114dcd9dc24eee8cdc88be78532fbe8627a49e1cfd762ffff221d027945fc01 +00000020b9bca844a34194ab496f762ea9d713cac3db87a12e0df4580f9ff30304000000a0745fe142c42aca392ce26a9c9d5d61d95e8ffc0a3e9f0ed86fb73575dabcf7e1cfd762ffff221d09f2c8ba01 +000000206d742615bdef4464da7eaebb828def10b23e9d8dc01adaa5998e35fa1d000000ad6c99e65ea16e5f225fdc7951db80843317efc17b8d40ecdc71a3a8a7537eb0e2cfd762ffff221d0e4c6b4b01 +0000002022c73688c5ef110cc33c7145bf6085fabe443ead5d3e2ba1176b7f5002000000e5191278bb7a31bbdd086a78fb16055c5cd9f6595a53658de65a5e78a0f495e2e3cfd762ffff221d0176527c01 +00000020d09579b6b0436b589f1a86c89a048cd2cbb06b23e057bd45e208172b160000009a4e104c541300b3221e9dcb1109dd33ced0e81dbcf33de68c568249d36b64d5e4cfd762ffff221d051ace5e01 +000000206eb180dc0fca60a716e77c7270ad24e990942d466d008082c4541b7d0f0000007ef73874fd2b9c1e4e10421d413e3c5bc253a6bbbb5926d0990471e68af72bc5e4cfd762ffff221d0aa635fa01 +000000200493769510cba71fbb9a961f4a2faa5e2eb0dc93129c096bc31f8ce40900000038578da9c548970398a8ef04b7d8b2766c6052dac9f5b0e65a6c130624dc5a4fe5cfd762ffff221d007920fd01 +00000020b4ddfbafe2a957efbb3208b8acfef82f06cf1e691838991c6696e4e50800000070a7429eef70a10ca62cb59edbfbc040da2a002301cefdb8aae3df52a2d58036e6cfd762ffff221d1777784101 +00000020fe82038dc341ca253fad146b816aaf2edc952d3de1c530400987c80206000000b993a9a8fd09d2644aff804e0b76810e1b23af98bdf699917e400f76affac247e7cfd762ffff221d00ea713201 +00000020b0baf3c5f8bfc336b73ae3798322bdb29c6f05c421f4714e110f2a3e06000000e8e48ada5d7c0a777aa6f64772487257b3ee348c9b82469d9d6085ff4fb00a95e8cfd762ffff221d013857e101 +000000202b28ade6ce2b29526eb7d302ba517f9c5591c10317329b508533c05209000000641672dc635f2bb69cbf2fcf732f7c8c3021105a607ec8861727273fa04dcbfbe8cfd762ffff221d0249b3d601 +0000002017d95acb6739b38bdb7d26b4c6876815323a11a5ce27d2d155e197011b0000005b5191c8b0e0987ed3843618d6934426e895263bb75933cf6e9e92a130892000e9cfd762ffff221d014ac46b01 +000000206f8cd5ec312f15d95af6753b59decb61dd80a8d4564a98c333cf2d282000000041a8dcd941992ce33ba5fc4dd73f971d5b1d0753793c8483cbac669377ece7c3e9cfd762ffff221d0cf2d61701 +000000202c7b49ad2c22d7c3d529c2d35fc94ba013018e4c7792baed06873dc800000000b34a46294570f434b9e73625596c556b2fa1463d3338ec961a11af85963ba9ffeacfd762ffff221d01e749a401 +00000020bd105a7a0ffa889584ef257e424045612f646ae5f2b0fb81612716351900000023ad5e7fb6a906add06796f3e4630d5d800a4b1ed1374f210e076426ff05f783ebcfd762ffff221d0003177f01 +000000209c8cff71d8789e4b1eb4ec95f53a65789d50a9e26452a2b0cdc8da3b160000000c9d5baab27e18afb76dd2a39ce2bbf70d0b17e784bd196c92b33c7f100bb5d1ebcfd762ffff221d0db55d3c01 +000000207824eee782a526c5a561d94b08bae64b8c93bf6b5208a32f18540de40a00000024d0d1e404e8bc152d4702489efd8f4c7321267b4767a4fc32af64c440291782eccfd762ffff221d0a0585b901 +00000020c02a89a06e37cf15cb75a08e8d730e5471b6900a0c970caf91885e4b120000006ab4b829d3ecc9a0c380657f4c2db428796ec3a31c6a5964847276fff109e59aedcfd762ffff221d0263af5701 +000000201be7b5ed8d11b150bc868e67ae0043cb3bfc52a3cce8f704d0c0a4a3200000001da0ba9c2397f94c1ac5da6ab7cbe674ccbdae6df4863b0902d3f0dd7d9eaf1ceecfd762ffff221d012af0fc01 +0000002005efbb49c6685be4ec2332033c7ff1b1894f99d44a2bf1c9f71b52861d000000d6bd44e117a1d64adccfd45d4cd4ad6c11be76128c4e82661b9be7048544c8b6efcfd762ffff221d07195fd501 +0000002048a1573813180020d92173b77fceef32fd7d2ed1d9eef381998b082f0b0000005e59c200ec551296680557b951b1b9780806e3afdc38ff78f95c4eebbcadd266efcfd762ffff221d0163d1e001 +00000020c9c10f13e304fe225f7fb132d422becdb1a3c78535d4c8ae870df58903000000c03b6190c6fc9590d207315d725bda0cfec473278d8cdf635cf46df949dee753f0cfd762ffff221d038809cf01 +000000206dd62691af0462a3af925e1adf8c591616c8ba952404d7c1f4ba33eb13000000001a0d70fdca7ee7f0c72f713a3af564e1b1e8f2e3a7fd87d304921c845fbb84f0cfd762ffff221d047082b201 +00000020142c6db97be2310e93ccf4f7da93acf6af73b1c6bcf3553b54617d6007000000a206a0c463793cdf56bf92a67c368cd538d106356ec5d43a8fb0248f96864b63f1cfd762ffff221d130c3bdf01 +000000204a3f9c9a43d71edac24ae009fd00a434b6e39fd63d863e0878ea6aa80200000085e60f5fc58906980a258196c452388d7f4bc0c529780f0ebc108584ba6aa218f2cfd762ffff221d1f4cdb3801 +0000002086fd0183a738d9872b2df0d9ecb7dd9c9b589268f67306b4309a614a170000007cd4552e107f300005a121ac2fbf561dd24695b6823fd8d1073c038df868863af4cfd762ffff221d19f94eef01 +00000020bfbb0d6bf4a43d4ff941f3f645bcc5442eb03a094e22f9d940c8aeab0a00000035c336e046d2d2280c223bf61be2302454e72efee633211e2d5218f5136aa3e0f6cfd762ffff221d0be3850101 +00000020d61016a9e6f1e6552ad166401ecb421cac20998f5378683b6ca3eb191a000000fe6a0f2e6b1b370fb8202fe52d0c2e0051c48bb522c2abbf9624dc30d2b2d94ff7cfd762ffff221d1701fcd001 +00000020c35213012da4e42fa2ee70f0ba8633178ca0a213ad68848449347bec0b0000001c89c13c6993c5da252b7eee032a4e8586feacc47a0873c9915900668a5b7ea2f8cfd762ffff221d1661a9e501 +00000020b41ecb771688ee44d336ccf7f1248e295b4e28640849b07036c1c3910d000000d7dbb68a4552088da890f67d66744d9d3064158ff3658adf32447864b2f1249af9cfd762ffff221d0614e6ea01 +00000020fa9ed0ce0e2beb8d23e854371a74d048a5b21e8610576b1a7fc93d441a0000008f717c7418be712c2e0080b67d18636788de1e2a49e83cabaf9193de6a096df7facfd762ffff221d1131789601 +00000020e59380c52a9f7503daff64f081c9ac129d8419eb0966b3dcad107c34100000003900d5383f3f45fd900d421ce6ea6568a25bbb1a36fce1097ddfe7130fa83305fbcfd762ffff221d17fd3fd201 +000000208268b66e11397d386a39579087c6804ed9fb9fb862b8eed55c44f7811400000003f06e0a93f58f94d23f50c447850479a5b91e56d94b386c7e41d52ac18af4d6fdcfd762ffff221d0399efa701 +00000020581347c0783dfc376a6ee790a27716b85028e8b8b9e0d97c99741ecf1b000000ab279f941d626ae6aff2c57533b2219cb87a3e13cec4af06696f86d14ff18e04fdcfd762ffff221d0bed0fc701 +0000002052b0048d9e36d38f51e599d2615ef3fc4d16f325f62f6a148766ca9904000000816c677f3cb94e1586aa6971fb0f33fe9afdb910a4c024f1b60f883bb781fbd9fecfd762ffff221d0213a8cf01 +000000208fc575d71db2af49bdc5d2e846946ee044c38cae5449c3f08511f5bd03000000be91d6bcd1b1a922805dfad85a5f5a2a6a474b4f3fc9b62da51634f4db90b78fffcfd762ffff221d0dbb90cf01 +0000002091dc8a323671a67de147d9c0944781875ddd5773876bdcad050ca7a70d00000079e28644006ec1db7444279f725e13c06f10a55665d75a8f1cb8540151a25ec000d0d762ffff221d0216714201 +000000200054bb3647e1846e60e00ea5b295d13b7fef4ad01161bac14690d45220000000506b4f74bc4278cbff3b79f567882674b314b87ce018b03dc410690e5f6fbcaf00d0d762ffff221d0bb404f301 +00000020e2510e3a5db4e7ab6fd851691588c289c49f390d304df60d08123d981c0000005ab8bc7703426863e0a5c4e31e55e2bb081fb4332dc39bb4a2a18b899d741bda01d0d762ffff221d09a2880501 +00000020e5b0ec428dae6630be05fde334d54f871595eb0aa7afe65dbc37caa711000000b0ee4b51259c06f6b9a6c44cf250f56c220cf41bf9169bf0cadf83d039e9251b02d0d762ffff221d00bb1b4601 +000000205417bb51e791e65f527e275518bece0e123f269b427d7bebd4f48e850f00000073f023e299599f52b0dd138129f9989e06a78791df81b9f767616608fe0f28de03d0d762ffff221d0a5aa0e801 +00000020fa6dc9a4d39e765d14ca006056a330f03636d54d2971d07dd0f0674405000000eb6de9127e4644a42262347ec05f789a5eef417c8dd1fd2c2f4070d5480da08b04d0d762ffff221d041244c701 +00000020546ebc24ae264fb52a878d19743f0852ec293f1676e339fa2b68c7eb1b000000572339a0425ae1de4acb6d84db1b7320e96b9e8c6459f02016866683c9cb149204d0d762ffff221d010e49ff01 +000000200255d121974829b9a8d22c5d0bb1a46b7e7ec088b3d48811f943e4c61a0000008de12589e10482117e40b9a2021c3a75579825f14fa75d4ba7bf6f422fad6c7f05d0d762ffff221d01bc8e7801 +00000020b63dbd3b74789e9333b401049f0433cd1f3d9bbc68cd7deee76dc3061f000000d30401e5df894d8e0a95a83c30d8584bbb1d1188782a6fdb08cc27c803dc8a4105d0d762ffff221d02ec58a401 +00000020017667274ff9b6538d15981b2421c6abc86017ea72293831c452c7b505000000f6d5e0672350ff84b2521f35775535000d8279d240acac21ee59d3c263431a0906d0d762ffff221d02b386b301 +0000002036d4c0341d71181f3f0a5e0f35dfd9f0cb84b0581839fed3fcff870111000000cff0eb510a8c374286dc87a060e2ef7d3489f8814d2175851edfd984961dbc9e07d0d762ffff221d028901f001 +00000020c0f41e32456bc6504098ced4ba3d892155bc37f92edbc939dc5d5dc40e00000054c0cfbe3cc91254958c31718aceae2f22f617b429ac34218476a2d5108c913607d0d762ffff221d01da7da501 +00000020e9156adb601ab8df62e716894b773977e03f8ae98a565b9004f17c5d00000000a33ec73fe4679186ebf25fcce50a81d2eb9400e90f435a4c9813231749b25f5a08d0d762ffff221d001347ee01 +00000020931c9f8e51c888475c44d5ea596a7db2a6e233eda4a9f2e78cd531cc030000005b3627190d4b278fcacf27d0061dee8956b5247c7a9f3aff52402d41509cad5e08d0d762ffff221d037ff8ef01 +000000204a9c6aa1431baec4e645dcb2186eeaafd445b9ceaaeb3bc9eb4769b919000000e830cd90a94990544ba6a9a6c419485b9768271fdba42ba3f05ab68f0f6dcb8909d0d762ffff221d05d6b91101 +0000002049dc30e54e6d0298e7987db6192c59ee9bad3bf2d7c4ea965a22846b01000000d5c1b3fdfecc828f0816fc2b9c82cfe1f5e63d7a5d5b109c920ad45ddfded8470ad0d762ffff221d09d3d69501 +0000002078e8f3fa2fb27d6855579988fffb8e731d0dacf77f45c1fcbea6ad56020000009c3a779651eac7a57937385dc93f19958e337c16ada2b57dafd587951ae1b2580bd0d762ffff221d0b5af0fb01 +000000209d9be212fa07bd6d71f1a4b570781ef4d8ffb29441ee530a705aac000400000033650d696eb5ae0256d339dd574eab0b8a508b23ebea6238876b1df600edc0470cd0d762ffff221d092ed38d01 +000000205d98bc0b8877a5817f5d985f16a657255056722a7be2ccee8a8f90d8180000005081203ce5520ad5fb2772b8055c42d2a044675da056554c99e7c70f5dfacd660dd0d762ffff221d0cd63f2e01 +00000020ab2dfdc145a9ae9cfa5396f8740daef9c3b8ff8de0ca0b265994fd6000000000dd823c1202364c321e2e47f5ef7f1ee50f9a6dc6da8b351a3e5746e1ee72833c0ed0d762ffff221d06350c0901 +00000020e20511c0400b912bebbff654f805d63bef5710a112d545278f8d537308000000709fef3481162a51e2d4328ed3d94984b13a5f48146864c1264bf617d1aee5970ed0d762ffff221d084aa40501 +000000202c6a9c0b8ebdfe3721f77dbb180dc3815e2bff5c8fd2a92f00a7c6e5190000008e8cb1251aef336c2254af84328aaf63b017222e7a57ab1c4341cfc14341fd700fd0d762ffff221d0c576fb801 +000000202b53808c120a6b384bdda6a4b73bfba7af64a36b8155b787dcb802f11500000028437b642d046fb89fd828d1fa2113471fcb652d2db68db5e7b4617e99f05c2f10d0d762ffff221d05a5cbd801 +000000201a1f1840a6198f1c72a0ffcee233638d276b5f0a27cbbbf32b09455213000000b4576a838a2b9029233963db100e200f960a9051a9cb99b02344fa6a2b28035711d0d762ffff221d06b77b8e01 +0000002058dfbb268c58875c89ef1eb8df9102307e3ca6a796600036fcedcab40f0000006e379e0db185b0a4ead546f810b2bb5f1c921c8f2ddb58c86eb8771c1eb51f6e11d0d762ffff221d00fd610e01 +0000002075491c27ac6bd24157284aaae42e6b338f05fee423121d7c1ce499021d0000004f976aaed17ed2f7d76f066ff639f21379511a88c9754368a62d332069957b4312d0d762ffff221d1157acab01 diff --git a/test/functional/p2p_dos_header_tree.py b/test/functional/p2p_dos_header_tree.py index d271dc0b61..1fcc82ab70 100755 --- a/test/functional/p2p_dos_header_tree.py +++ b/test/functional/p2p_dos_header_tree.py @@ -48,9 +48,10 @@ def run_test(self): self.log.info("Feed all non-fork headers, including and up to the first checkpoint") peer_checkpoint = self.nodes[0].add_p2p_connection(P2PInterface()) peer_checkpoint.send_and_ping(msg_headers(self.headers)) + assert { 'height': 546, - 'hash': '000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70', + 'hash': '000000033f0ecd6bc1c46eb98a2856cf2fe48bc3e90ef11ac24ea5272c1adbf8', 'branchlen': 546, 'status': 'headers-only', } in self.nodes[0].getchaintips() @@ -67,7 +68,7 @@ def run_test(self): peer_no_checkpoint.send_and_ping(msg_headers(self.headers_fork)) assert { "height": 2, - "hash": "00000000b0494bd6c3d5ff79c497cfce40831871cbf39b1bc28bd1dac817dc39", + "hash": "00026d186a158d1afe0f7c46c66db4e8284ed43f87bfb55000b0100892bc026c", "branchlen": 2, "status": "headers-only", } in self.nodes[0].getchaintips() @@ -77,7 +78,7 @@ def run_test(self): peer_before_checkpoint.send_and_ping(msg_headers(self.headers_fork)) assert { "height": 2, - "hash": "00000000b0494bd6c3d5ff79c497cfce40831871cbf39b1bc28bd1dac817dc39", + "hash": "00026d186a158d1afe0f7c46c66db4e8284ed43f87bfb55000b0100892bc026c", "branchlen": 2, "status": "headers-only", } in self.nodes[1].getchaintips() From 0dfd8c1c4fe570081bbac9979b690c8e3e35d27f Mon Sep 17 00:00:00 2001 From: Korrrba Date: Wed, 4 Jan 2023 15:25:14 +0100 Subject: [PATCH 072/144] chainparams: Align BGL signet genesis block initialization with the BGL testnet. Align BGL Signet genesis block initialization with BGL testnet to allow the RPC to initialize. Without this change signet initialization failed in the rejected PoW. --- src/chainparams.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 80bd61bfd3..974ae1b91c 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -364,7 +364,7 @@ class SigNetParams : public CChainParams { nDefaultPort = 38333; nPruneAfterHeight = 1000; - genesis = CreateGenesisBlock(1598918400, 52613770, 0x1e0377ae, 1, 50 * COIN); + genesis = CreateGenesisBlock(1585958400, 0x0278eefd, 0x1d22ffff, 1, 200 * COIN); consensus.hashGenesisBlock = genesis.GetHash(); // assert(consensus.hashGenesisBlock == uint256S("0x00000008819873e925422c1ff0f99f7cc9bbb232af63a077a480a3633bee1ef6")); // assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b")); From fe2d5d0c09b5106d9ea1e80e3e9e10112a1bc345 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Wed, 4 Jan 2023 15:28:36 +0100 Subject: [PATCH 073/144] test: feature_signet: Update Signet test for BGL network. This test case uses custom signet network generated for: ADDR rbgl1q2lk0e5yjen2vq9pknxcr6xc32wp4hhpa8fgk2x and PRIV key cQ7AMSUGQcAPy3HwVRaZqAqnC4eVaAF8naEWekPHoodmV7uFw4kA and PUB key 03d47f70342433a1e56def6965f63ac147f5292a2054dfba4b98535a87d32f13db Mined 10 blocks with payout to tb1qnl2gquva8mzuc05y3pvad43vvju43wf0utk4eh with the following BGL signet network configuration: signet=1 [signet] signetchallenge=512103d47f70342433a1e56def6965f63ac147f5292a2054dfba4b98535a87d32f13db51ae and BGL signet mined block hashes: 00000013f89b91fcb42990104959470e328670fa9f340d877a2f3962d80c1069 000000008eff18e829bf5fb7dd5cc2dbedce988d75f41b3284f50ea1752eba12 000000163f459d97b733950f52680182e5dc7d0dc0f8045a3da53dfbcf90dcb3 000000126d81eb5bbf89a6bd9aa1dfb2eb95606c27f8484cce3303b4dd0cbc0f 00000021c4c02b1e39f0dfb38a31e7a22f44ca1700e758bd34e99056b1cde7eb 000000163e5c118a7c15ad94cb598f8989421450d020a611f0fac127b552dc7e 0000000e150500c71e3a819f35e99ab8a5d16cc4e57e334cdf567c355c7ed3a8 0000000fc159cbf36ee52c9cde8f66b1acfec8bd8d1f5ee0817f4b90c16b005d 0000001dbc9305b21556c8c13cd19929c003d8eafa702f9b9073b847b832a159 0000000c297942cd68ae2154ff5c18784c192bc74b373229f2b434ef3d016b42 --- test/functional/feature_signet.py | 47 ++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/test/functional/feature_signet.py b/test/functional/feature_signet.py index 555a9f6d9c..17a9c2a94a 100755 --- a/test/functional/feature_signet.py +++ b/test/functional/feature_signet.py @@ -9,17 +9,39 @@ from test_framework.test_framework import BGLTestFramework from test_framework.util import assert_equal +# This test case uses custom signet network generated for ADDR rbgl1q2lk0e5yjen2vq9pknxcr6xc32wp4hhpa8fgk2x +# and PRIV key cQ7AMSUGQcAPy3HwVRaZqAqnC4eVaAF8naEWekPHoodmV7uFw4kA +# and PUB key 03d47f70342433a1e56def6965f63ac147f5292a2054dfba4b98535a87d32f13db +# Mined 10 blocks with payout to tb1qnl2gquva8mzuc05y3pvad43vvju43wf0utk4eh with BGL signet network configuration: +# +# signet=1 +# [signet] +# signetchallenge=512103d47f70342433a1e56def6965f63ac147f5292a2054dfba4b98535a87d32f13db51ae +# +# and BGL signet mined block hashes: +# +# 00000013f89b91fcb42990104959470e328670fa9f340d877a2f3962d80c1069 +# 000000008eff18e829bf5fb7dd5cc2dbedce988d75f41b3284f50ea1752eba12 +# 000000163f459d97b733950f52680182e5dc7d0dc0f8045a3da53dfbcf90dcb3 +# 000000126d81eb5bbf89a6bd9aa1dfb2eb95606c27f8484cce3303b4dd0cbc0f +# 00000021c4c02b1e39f0dfb38a31e7a22f44ca1700e758bd34e99056b1cde7eb +# 000000163e5c118a7c15ad94cb598f8989421450d020a611f0fac127b552dc7e +# 0000000e150500c71e3a819f35e99ab8a5d16cc4e57e334cdf567c355c7ed3a8 +# 0000000fc159cbf36ee52c9cde8f66b1acfec8bd8d1f5ee0817f4b90c16b005d +# 0000001dbc9305b21556c8c13cd19929c003d8eafa702f9b9073b847b832a159 +# 0000000c297942cd68ae2154ff5c18784c192bc74b373229f2b434ef3d016b42 + signet_blocks = [ - '00000020f61eee3b63a380a477a063af32b2bbc97c9ff9f01f2c4225e973988108000000f575c83235984e7dc4afc1f30944c170462e84437ab6f2d52e16878a79e4678bd1914d5fae77031eccf4070001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025151feffffff0200f2052a010000001600149243f727dd5343293eb83174324019ec16c2630f0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa2490047304402205e423a8754336ca99dbe16509b877ef1bf98d008836c725005b3c787c41ebe46022047246e4467ad7cc7f1ad98662afcaf14c115e0095a227c7b05c5182591c23e7e01000120000000000000000000000000000000000000000000000000000000000000000000000000', - '00000020533b53ded9bff4adc94101d32400a144c54edc5ed492a3b26c63b2d686000000b38fef50592017cfafbcab88eb3d9cf50b2c801711cad8299495d26df5e54812e7914d5fae77031ecfdd0b0001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025251feffffff0200f2052a01000000160014fd09839740f0e0b4fc6d5e2527e4022aa9b89dfa0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa24900473044022031d64a1692cdad1fc0ced69838169fe19ae01be524d831b95fcf5ea4e6541c3c02204f9dea0801df8b4d0cd0857c62ab35c6c25cc47c930630dc7fe723531daa3e9b01000120000000000000000000000000000000000000000000000000000000000000000000000000', - '000000202960f3752f0bfa8858a3e333294aedc7808025e868c9dc03e71d88bb320000007765fcd3d5b4966beb338bba2675dc2cf2ad28d4ad1d83bdb6f286e7e27ac1f807924d5fae77031e81d60b0001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025351feffffff0200f2052a010000001600141e5fb426042692ae0e87c070e78c39307a5661c20000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa2490047304402205de93694763a42954865bcf1540cb82958bc62d0ec4eee02070fb7937cd037f4022067f333753bce47b10bc25eb6e1f311482e994c862a7e0b2d41ab1c8679fd1b1101000120000000000000000000000000000000000000000000000000000000000000000000000000', - '00000020b06443a13ae1d3d50faef5ecad38c6818194dc46abca3e972e2aacdae800000069a5829097e80fee00ac49a56ea9f82d741a6af84d32b3bc455cf31871e2a8ac27924d5fae77031e9c91050001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025451feffffff0200f2052a0100000016001430db2f8225dcf7751361ab38735de08190318cb70000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa2490047304402200936f5f9872f6df5dd242026ad52241a68423f7f682e79169a8d85a374eab9b802202cd2979c48b321b3453e65e8f92460db3fca93cbea8539b450c959f4fbe630c601000120000000000000000000000000000000000000000000000000000000000000000000000000', - '000000207ed403758a4f228a1939418a155e2ebd4ae6b26e5ffd0ae433123f7694010000542e80b609c5bc58af5bdf492e26d4f60cd43a3966c2e063c50444c29b3757a636924d5fae77031ee8601d0001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025551feffffff0200f2052a01000000160014edc207e014df34fa3885dff97d1129d356e1186a0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa24900473044022021a3656609f85a66a2c5672ed9322c2158d57251040d2716ed202a1fe14f0c12022057d68bc6611f7a9424a7e00bbf3e27e6ae6b096f60bac624a094bc97a59aa1ff01000120000000000000000000000000000000000000000000000000000000000000000000000000', - '000000205bea0a88d1422c3df08d766ad72df95084d0700e6f873b75dd4e986c7703000002b57516d33ed60c2bdd9f93d6d5614083324c837e68e5ba6e04287a7285633585924d5fae77031ed171960001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025651feffffff0200f2052a010000001600143ae612599cf96f2442ce572633e0251116eaa52f0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa24900473044022059a7c54de76bfdbb1dd44c78ea2dbd2bb4e97f4abad38965f41e76433e56423c022054bf17f04fe17415c0141f60eebd2b839200f574d8ad8d55a0917b92b0eb913401000120000000000000000000000000000000000000000000000000000000000000000000000000', - '00000020daf3b60d374b19476461f97540498dcfa2eb7016238ec6b1d022f82fb60100007a7ae65b53cb988c2ec92d2384996713821d5645ffe61c9acea60da75cd5edfa1a944d5fae77031e9dbb050001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025751feffffff0200f2052a01000000160014ef2dceae02e35f8137de76768ae3345d99ca68860000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa2490047304402202b3f946d6447f9bf17d00f3696cede7ee70b785495e5498274ee682a493befd5022045fc0bcf9332243168b5d35507175f9f374a8eba2336873885d12aada67ea5f601000120000000000000000000000000000000000000000000000000000000000000000000000000', - '00000020457cc5f3c2e1a5655bc20e20e48d33e1b7ea68786c614032b5c518f0b6000000541f36942d82c6e7248275ff15c8933487fbe1819c67a9ecc0f4b70bb7e6cf672a944d5fae77031e8f39860001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025851feffffff0200f2052a0100000016001472a27906947c06d034b38ba2fa13c6391a4832790000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa2490047304402202d62805ce60cbd60591f97f949b5ea5bd7e2307bcde343e6ea8394da92758e72022053a25370b0aa20da100189b7899a8f8675a0fdc60e38ece6b8a4f98edd94569e01000120000000000000000000000000000000000000000000000000000000000000000000000000', - '00000020a2eb61eb4f3831baa3a3363e1b42db4462663f756f07423e81ed30322102000077224de7dea0f8d0ec22b1d2e2e255f0a987b96fe7200e1a2e6373f48a2f5b7894954d5fae77031e36867e0001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025951feffffff0200f2052a01000000160014aa0ad9f26801258382e0734dceec03a4a75f60240000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa2490047304402206fa0d59990eed369bd7375767c9a6c9369fae209152b8674e520da270605528c0220749eed3b12dbe3f583f505d21803e4aef59c8e24c5831951eafa4f15a8f92c4e01000120000000000000000000000000000000000000000000000000000000000000000000000000', - '00000020a868e8514be5e46dabd6a122132f423f36a43b716a40c394e2a8d063e1010000f4c6c717e99d800c699c25a2006a75a0c5c09f432a936f385e6fce139cdbd1a5e9964d5fae77031e7d026e0001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025a51feffffff0200f2052a01000000160014aaa671c82b138e3b8f510cd801e5f2bd0aa305940000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa24900473044022042309f4c3c7a1a2ac8c24f890f962df1c0086cec10be0868087cfc427520cb2702201dafee8911c269b7e786e242045bb57cef3f5b0f177010c6159abae42f646cc501000120000000000000000000000000000000000000000000000000000000000000000000000000', + '000000203dd5063677584b973ff13e95db6d7deacf55b89293bededfb4eecfcd1800000030015276a8c59e9ff65c8bfe8685e66e8d4572daabb63e32b14528cb6fb808847c83b563ffff221d740eb30301020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025151feffffff0200c817a8040000001600149fd480719d3ec5cc3e848859d6d62c64b958b92f0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa249004730440220403385e7e2bb11edc4694d57c880218aaa0012dc23c5a334be26e4ff4c132449022048607eeadc5a61449c6af9593bf9675291bdb8477a2187416dae405ce526a5ba01000120000000000000000000000000000000000000000000000000000000000000000000000000', + '0000002069100cd862392f7a870d349ffa7086320e475949109029b4fc919bf813000000b3171b076db303a3e90d8ae4754e08b85e251f89206ee8831e5bd2191cde399fc283b563ffff221d95730e0201020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025251feffffff0200c817a8040000001600149fd480719d3ec5cc3e848859d6d62c64b958b92f0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa2490047304402202464836b5f594d52b132f4f7c4db3553bd2e16a7fb836aa83255f82ec500c7b702201f51e854b0bb9c73fa9516fc42d220aaf595d12fd747be39fd16c5f101fa333301000120000000000000000000000000000000000000000000000000000000000000000000000000', + '0000002012ba2e75a10ef584321bf4758d98ceeddbc25cddb75fbf29e818ff8e000000004720710f89b44b0239e100351cbfb3a5eff9dfac0a03502e12d0036451450ea0e183b563ffff221dea5ec80c01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025351feffffff0200c817a8040000001600149fd480719d3ec5cc3e848859d6d62c64b958b92f0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa24900473044022019f207dd04b42bccfd1b8c403d1242776506d12f50c9236c8e53290f46ed46420220245cf45e5d54c81d7d21049ea007607c6e09b3e3e4f21dd4601a11bafb93f38b01000120000000000000000000000000000000000000000000000000000000000000000000000000', + '00000020b3dc90cffb3da53d5a04f8c00d7ddce5820168520f9533b7979d453f16000000a5210bcea1122650bbbc1825d89441ccefd4bd1809fa7fb18fe782f9c4307bde4084b563ffff221db222f40101020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025451feffffff0200c817a8040000001600149fd480719d3ec5cc3e848859d6d62c64b958b92f0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa2490047304402206ea2f6b41222027938a44a7b996dc65ac24a59d32de9680014efd8b7cf80e18c022031b9d9f99b81e52c1e4a1ff9f0d202e356fee6672a30c16dac5509101ac28ec901000120000000000000000000000000000000000000000000000000000000000000000000000000', + '000000200fbc0cddb40333ce4c48f8276c6095ebb2dfa19abda689bf5beb816d12000000dd4a0d92d17cde54cb011097fbdcea40ae4657236e0aed91dbf175f3e7c72b635884b563ffff221d7fa9430801020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025551feffffff0200c817a8040000001600149fd480719d3ec5cc3e848859d6d62c64b958b92f0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa249004730440220199bc1a076d82a541f62bbc111710f7fe5ce10c0565bb4ada36a2c4e0337e04302203cccf1d8b71c4e4cdad57fc3be86c449f0ce08031c417b546cf2dce04573d98701000120000000000000000000000000000000000000000000000000000000000000000000000000', + '00000020ebe7cdb15690e934bd58e70017ca442fa2e7318ab3dff0391e2bc0c421000000bf24ceee9608686855f86a251293a3ba3616ee0a0322b8451855d49441c8fe4aa384b563ffff221d988df60701020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025651feffffff0200c817a8040000001600149fd480719d3ec5cc3e848859d6d62c64b958b92f0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa249004730440220695a7e797d159eea3daf8555391907c3f7183ef1f0196abd098c4ffc9d16cc0102202759be86c9dc93a78b81dcd4bd2a6df2e8bcc77b1508d95c3b2509bb965c864b01000120000000000000000000000000000000000000000000000000000000000000000000000000', + '000000207edc52b527c1faf011a620d050144289898f59cb94ad157c8a115c3e160000002d1e9ae1fbca16e78ed0f8d5241aac7a7665355e4d663db554d3a7570b37c959e284b563ffff221d5430590701020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025751feffffff0200c817a8040000001600149fd480719d3ec5cc3e848859d6d62c64b958b92f0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa249004730440220488dcf844a667081802b39fed26e0b519f76748972f6965ff45bdf689b6085a30220008faea476d7d41e25fa52e3592aad81fb05265eff084b11e90a86cb2d8e5c9f01000120000000000000000000000000000000000000000000000000000000000000000000000000', + '00000020a8d37e5c357c56df4c337ee5c46cd1a5b89ae9359f813a1ec70005150e000000af87a67ebd1e0dafea7c38ceed1d138615b9003caf789fcd7cb2f8ca5fbe312b2a85b563ffff221d1a0b7d0501020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025851feffffff0200c817a8040000001600149fd480719d3ec5cc3e848859d6d62c64b958b92f0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa249004730440220324d312586357ecea2d4691a626357fb126b9ddbd9d9a4b8947c3c46a6089b1802201c51a189e284170b79ca60d8aa175f03e35ff9693541af023396a9dadd65455401000120000000000000000000000000000000000000000000000000000000000000000000000000', + '000000205d006bc1904b7f81e05e1f8dbdc8feacb1668fde9c2ce56ef3cb59c10f00000053e0f01f829148209112325c0c9f5261bd0349253c4d102a3207ce0a117890545785b563ffff221d7136f60201020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025951feffffff0200c817a8040000001600149fd480719d3ec5cc3e848859d6d62c64b958b92f0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa249004730440220272174dcc431da7861e1ac812ac8d5cb41f62d4f438aeb924651db99a780d3ea02206a4a10c6035adba4b4343861301bedf9f846f50b0d353695ee2f2857954b928b01000120000000000000000000000000000000000000000000000000000000000000000000000000', + '0000002059a132b847b873909b2f70faead803c02999d13cc1c85615b20593bc1d00000082e59ecb50fc3f72ba6fceba81ad9b9aa7bbf3ad3305aa0eb9bd35186873cc717985b563ffff221d2d6b611a01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025a51feffffff0200c817a8040000001600149fd480719d3ec5cc3e848859d6d62c64b958b92f0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa2490047304402207622fdf1ef37b7d06c72378dc56ff40dc4da5fed45d59528c4bc905eef2da10e02205c2249157c5dfe607b59a24840e3c2011c83162941dbbab959ad8cf07a2422f201000120000000000000000000000000000000000000000000000000000000000000000000000000' ] @@ -29,8 +51,7 @@ def set_test_params(self): self.num_nodes = 6 self.setup_clean_chain = True shared_args1 = ["-signetchallenge=51"] # OP_TRUE - shared_args2 = [] # default challenge - # we use the exact same challenge except we do it as a 2-of-2, which means it should fail + shared_args2 = ["-signetchallenge=512103d47f70342433a1e56def6965f63ac147f5292a2054dfba4b98535a87d32f13db51ae"] # challenge for custom BGL signet network shared_args3 = ["-signetchallenge=522103ad5e0edad18cb1f0fc0d28a3d4f1f3e445640337489abb10404f2d1e086be430210359ef5021964fe22d6f8e05b2463c9540ce96883fe3b278760f048f5189f2e6c452ae"] self.extra_args = [ @@ -51,8 +72,6 @@ def run_test(self): assert_equal(mining_info['networkhashps'], Decimal('0')) assert_equal(mining_info['pooledtx'], 0) - self.generate(self.nodes[0], 1, sync_fun=self.no_op) - self.log.info("pregenerated signet blocks check") height = 0 From 4efefb401cd38273c8e122805bd6d100e15659c4 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Thu, 5 Jan 2023 22:36:44 +0100 Subject: [PATCH 074/144] test: feature_coinstatsindex: Integrate missing test case from Bitcoin core. Integrate the missing test case from Bitcoin core: https://github.com/bitcoin/bitcoin/blob/fa48ea3067698954dd6630748964429686d8eaba/test/functional/feature_coinstatsindex.py The expected values will need to be adapted to Bitgesell. --- test/functional/feature_coinstatsindex.py | 284 ++++++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100755 test/functional/feature_coinstatsindex.py diff --git a/test/functional/feature_coinstatsindex.py b/test/functional/feature_coinstatsindex.py new file mode 100755 index 0000000000..f865661894 --- /dev/null +++ b/test/functional/feature_coinstatsindex.py @@ -0,0 +1,284 @@ +#!/usr/bin/env python3 +# Copyright (c) 2020-2021 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. +"""Test coinstatsindex across nodes. + +Test that the values returned by gettxoutsetinfo are consistent +between a node running the coinstatsindex and a node without +the index. +""" + +from decimal import Decimal + +from test_framework.blocktools import ( + COINBASE_MATURITY, + create_block, + create_coinbase, +) +from test_framework.messages import ( + COIN, + CTxOut, +) +from test_framework.script import ( + CScript, + OP_FALSE, + OP_RETURN, +) +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import ( + assert_equal, + assert_raises_rpc_error, +) +from test_framework.wallet import ( + MiniWallet, + getnewdestination, +) + + +class CoinStatsIndexTest(BitcoinTestFramework): + def set_test_params(self): + self.setup_clean_chain = True + self.num_nodes = 2 + self.supports_cli = False + self.extra_args = [ + [], + ["-coinstatsindex"] + ] + + def run_test(self): + self.wallet = MiniWallet(self.nodes[0]) + self._test_coin_stats_index() + self._test_use_index_option() + self._test_reorg_index() + self._test_index_rejects_hash_serialized() + + def block_sanity_check(self, block_info): + block_subsidy = 50 + assert_equal( + block_info['prevout_spent'] + block_subsidy, + block_info['new_outputs_ex_coinbase'] + block_info['coinbase'] + block_info['unspendable'] + ) + + def _test_coin_stats_index(self): + node = self.nodes[0] + index_node = self.nodes[1] + # Both none and muhash options allow the usage of the index + index_hash_options = ['none', 'muhash'] + + # Generate a normal transaction and mine it + self.generate(self.wallet, COINBASE_MATURITY + 1) + self.wallet.send_self_transfer(from_node=node) + self.generate(node, 1) + + self.log.info("Test that gettxoutsetinfo() output is consistent with or without coinstatsindex option") + res0 = node.gettxoutsetinfo('none') + + # The fields 'disk_size' and 'transactions' do not exist on the index + del res0['disk_size'], res0['transactions'] + + for hash_option in index_hash_options: + res1 = index_node.gettxoutsetinfo(hash_option) + # The fields 'block_info' and 'total_unspendable_amount' only exist on the index + del res1['block_info'], res1['total_unspendable_amount'] + res1.pop('muhash', None) + + # Everything left should be the same + assert_equal(res1, res0) + + self.log.info("Test that gettxoutsetinfo() can get fetch data on specific heights with index") + + # Generate a new tip + self.generate(node, 5) + + for hash_option in index_hash_options: + # Fetch old stats by height + res2 = index_node.gettxoutsetinfo(hash_option, 102) + del res2['block_info'], res2['total_unspendable_amount'] + res2.pop('muhash', None) + assert_equal(res0, res2) + + # Fetch old stats by hash + res3 = index_node.gettxoutsetinfo(hash_option, res0['bestblock']) + del res3['block_info'], res3['total_unspendable_amount'] + res3.pop('muhash', None) + assert_equal(res0, res3) + + # It does not work without coinstatsindex + assert_raises_rpc_error(-8, "Querying specific block heights requires coinstatsindex", node.gettxoutsetinfo, hash_option, 102) + + self.log.info("Test gettxoutsetinfo() with index and verbose flag") + + for hash_option in index_hash_options: + # Genesis block is unspendable + res4 = index_node.gettxoutsetinfo(hash_option, 0) + assert_equal(res4['total_unspendable_amount'], 50) + assert_equal(res4['block_info'], { + 'unspendable': 50, + 'prevout_spent': 0, + 'new_outputs_ex_coinbase': 0, + 'coinbase': 0, + 'unspendables': { + 'genesis_block': 50, + 'bip30': 0, + 'scripts': 0, + 'unclaimed_rewards': 0 + } + }) + self.block_sanity_check(res4['block_info']) + + # Test an older block height that included a normal tx + res5 = index_node.gettxoutsetinfo(hash_option, 102) + assert_equal(res5['total_unspendable_amount'], 50) + assert_equal(res5['block_info'], { + 'unspendable': 0, + 'prevout_spent': 50, + 'new_outputs_ex_coinbase': Decimal('49.99968800'), + 'coinbase': Decimal('50.00031200'), + 'unspendables': { + 'genesis_block': 0, + 'bip30': 0, + 'scripts': 0, + 'unclaimed_rewards': 0, + } + }) + self.block_sanity_check(res5['block_info']) + + # Generate and send a normal tx with two outputs + tx1_txid, tx1_vout = self.wallet.send_to( + from_node=node, + scriptPubKey=self.wallet.get_scriptPubKey(), + amount=21 * COIN, + ) + + # Find the right position of the 21 BTC output + tx1_out_21 = self.wallet.get_utxo(txid=tx1_txid, vout=tx1_vout) + + # Generate and send another tx with an OP_RETURN output (which is unspendable) + tx2 = self.wallet.create_self_transfer(utxo_to_spend=tx1_out_21)['tx'] + tx2.vout = [CTxOut(int(Decimal('20.99') * COIN), CScript([OP_RETURN] + [OP_FALSE] * 30))] + tx2_hex = tx2.serialize().hex() + self.nodes[0].sendrawtransaction(tx2_hex) + + # Include both txs in a block + self.generate(self.nodes[0], 1) + + for hash_option in index_hash_options: + # Check all amounts were registered correctly + res6 = index_node.gettxoutsetinfo(hash_option, 108) + assert_equal(res6['total_unspendable_amount'], Decimal('70.99000000')) + assert_equal(res6['block_info'], { + 'unspendable': Decimal('20.99000000'), + 'prevout_spent': 71, + 'new_outputs_ex_coinbase': Decimal('49.99999000'), + 'coinbase': Decimal('50.01001000'), + 'unspendables': { + 'genesis_block': 0, + 'bip30': 0, + 'scripts': Decimal('20.99000000'), + 'unclaimed_rewards': 0, + } + }) + self.block_sanity_check(res6['block_info']) + + # Create a coinbase that does not claim full subsidy and also + # has two outputs + cb = create_coinbase(109, nValue=35) + cb.vout.append(CTxOut(5 * COIN, CScript([OP_FALSE]))) + cb.rehash() + + # Generate a block that includes previous coinbase + tip = self.nodes[0].getbestblockhash() + block_time = self.nodes[0].getblock(tip)['time'] + 1 + block = create_block(int(tip, 16), cb, block_time) + block.solve() + self.nodes[0].submitblock(block.serialize().hex()) + self.sync_all() + + for hash_option in index_hash_options: + res7 = index_node.gettxoutsetinfo(hash_option, 109) + assert_equal(res7['total_unspendable_amount'], Decimal('80.99000000')) + assert_equal(res7['block_info'], { + 'unspendable': 10, + 'prevout_spent': 0, + 'new_outputs_ex_coinbase': 0, + 'coinbase': 40, + 'unspendables': { + 'genesis_block': 0, + 'bip30': 0, + 'scripts': 0, + 'unclaimed_rewards': 10 + } + }) + self.block_sanity_check(res7['block_info']) + + self.log.info("Test that the index is robust across restarts") + + res8 = index_node.gettxoutsetinfo('muhash') + self.restart_node(1, extra_args=self.extra_args[1]) + res9 = index_node.gettxoutsetinfo('muhash') + assert_equal(res8, res9) + + self.generate(index_node, 1, sync_fun=self.no_op) + res10 = index_node.gettxoutsetinfo('muhash') + assert(res8['txouts'] < res10['txouts']) + + def _test_use_index_option(self): + self.log.info("Test use_index option for nodes running the index") + + self.connect_nodes(0, 1) + self.nodes[0].waitforblockheight(110) + res = self.nodes[0].gettxoutsetinfo('muhash') + option_res = self.nodes[1].gettxoutsetinfo(hash_type='muhash', hash_or_height=None, use_index=False) + del res['disk_size'], option_res['disk_size'] + assert_equal(res, option_res) + + def _test_reorg_index(self): + self.log.info("Test that index can handle reorgs") + + # Generate two block, let the index catch up, then invalidate the blocks + index_node = self.nodes[1] + reorg_blocks = self.generatetoaddress(index_node, 2, getnewdestination()[2]) + reorg_block = reorg_blocks[1] + res_invalid = index_node.gettxoutsetinfo('muhash') + index_node.invalidateblock(reorg_blocks[0]) + assert_equal(index_node.gettxoutsetinfo('muhash')['height'], 110) + + # Add two new blocks + block = self.generate(index_node, 2, sync_fun=self.no_op)[1] + res = index_node.gettxoutsetinfo(hash_type='muhash', hash_or_height=None, use_index=False) + + # Test that the result of the reorged block is not returned for its old block height + res2 = index_node.gettxoutsetinfo(hash_type='muhash', hash_or_height=112) + assert_equal(res["bestblock"], block) + assert_equal(res["muhash"], res2["muhash"]) + assert(res["muhash"] != res_invalid["muhash"]) + + # Test that requesting reorged out block by hash is still returning correct results + res_invalid2 = index_node.gettxoutsetinfo(hash_type='muhash', hash_or_height=reorg_block) + assert_equal(res_invalid2["muhash"], res_invalid["muhash"]) + assert(res["muhash"] != res_invalid2["muhash"]) + + # Add another block, so we don't depend on reconsiderblock remembering which + # blocks were touched by invalidateblock + self.generate(index_node, 1) + + # Ensure that removing and re-adding blocks yields consistent results + block = index_node.getblockhash(99) + index_node.invalidateblock(block) + index_node.reconsiderblock(block) + res3 = index_node.gettxoutsetinfo(hash_type='muhash', hash_or_height=112) + assert_equal(res2, res3) + + def _test_index_rejects_hash_serialized(self): + self.log.info("Test that the rpc raises if the legacy hash is passed with the index") + + msg = "hash_serialized_2 hash type cannot be queried for a specific block" + assert_raises_rpc_error(-8, msg, self.nodes[1].gettxoutsetinfo, hash_type='hash_serialized_2', hash_or_height=111) + + for use_index in {True, False, None}: + assert_raises_rpc_error(-8, msg, self.nodes[1].gettxoutsetinfo, hash_type='hash_serialized_2', hash_or_height=111, use_index=use_index) + + +if __name__ == '__main__': + CoinStatsIndexTest().main() From c1a6185cf56d4bac7c8e3ea6b6076811090b7f15 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Thu, 5 Jan 2023 22:42:03 +0100 Subject: [PATCH 075/144] test: feature_coinstatsindex: Adjust expected test case values to Bitgesell chain. The coinbase value corrected to 200 and rewards with fees adjusted to Bitgesell network. --- test/functional/feature_coinstatsindex.py | 48 +++++++++++------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/test/functional/feature_coinstatsindex.py b/test/functional/feature_coinstatsindex.py index f865661894..8db201e644 100755 --- a/test/functional/feature_coinstatsindex.py +++ b/test/functional/feature_coinstatsindex.py @@ -25,7 +25,7 @@ OP_FALSE, OP_RETURN, ) -from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_framework import BGLTestFramework from test_framework.util import ( assert_equal, assert_raises_rpc_error, @@ -36,7 +36,7 @@ ) -class CoinStatsIndexTest(BitcoinTestFramework): +class CoinStatsIndexTest(BGLTestFramework): def set_test_params(self): self.setup_clean_chain = True self.num_nodes = 2 @@ -54,7 +54,7 @@ def run_test(self): self._test_index_rejects_hash_serialized() def block_sanity_check(self, block_info): - block_subsidy = 50 + block_subsidy = 200 assert_equal( block_info['prevout_spent'] + block_subsidy, block_info['new_outputs_ex_coinbase'] + block_info['coinbase'] + block_info['unspendable'] @@ -112,14 +112,14 @@ def _test_coin_stats_index(self): for hash_option in index_hash_options: # Genesis block is unspendable res4 = index_node.gettxoutsetinfo(hash_option, 0) - assert_equal(res4['total_unspendable_amount'], 50) + assert_equal(res4['total_unspendable_amount'], 200) assert_equal(res4['block_info'], { - 'unspendable': 50, + 'unspendable': 200, 'prevout_spent': 0, 'new_outputs_ex_coinbase': 0, 'coinbase': 0, 'unspendables': { - 'genesis_block': 50, + 'genesis_block': 200, 'bip30': 0, 'scripts': 0, 'unclaimed_rewards': 0 @@ -129,17 +129,17 @@ def _test_coin_stats_index(self): # Test an older block height that included a normal tx res5 = index_node.gettxoutsetinfo(hash_option, 102) - assert_equal(res5['total_unspendable_amount'], 50) + assert_equal(Decimal(res5['total_unspendable_amount']), Decimal('200.0002592')) assert_equal(res5['block_info'], { - 'unspendable': 0, - 'prevout_spent': 50, - 'new_outputs_ex_coinbase': Decimal('49.99968800'), - 'coinbase': Decimal('50.00031200'), + 'unspendable': Decimal('0.00025920'), + 'prevout_spent': 200, + 'new_outputs_ex_coinbase': Decimal('199.99971200'), + 'coinbase': Decimal('200.00002880'), 'unspendables': { 'genesis_block': 0, 'bip30': 0, 'scripts': 0, - 'unclaimed_rewards': 0, + 'unclaimed_rewards': Decimal('0.00025920'), } }) self.block_sanity_check(res5['block_info']) @@ -151,12 +151,12 @@ def _test_coin_stats_index(self): amount=21 * COIN, ) - # Find the right position of the 21 BTC output + # Find the right position of the 21 BGL output tx1_out_21 = self.wallet.get_utxo(txid=tx1_txid, vout=tx1_vout) # Generate and send another tx with an OP_RETURN output (which is unspendable) tx2 = self.wallet.create_self_transfer(utxo_to_spend=tx1_out_21)['tx'] - tx2.vout = [CTxOut(int(Decimal('20.99') * COIN), CScript([OP_RETURN] + [OP_FALSE] * 30))] + tx2.vout = [CTxOut(int(Decimal('20.995') * COIN), CScript([OP_RETURN] + [OP_FALSE] * 30))] tx2_hex = tx2.serialize().hex() self.nodes[0].sendrawtransaction(tx2_hex) @@ -166,17 +166,17 @@ def _test_coin_stats_index(self): for hash_option in index_hash_options: # Check all amounts were registered correctly res6 = index_node.gettxoutsetinfo(hash_option, 108) - assert_equal(res6['total_unspendable_amount'], Decimal('70.99000000')) + assert_equal(res6['total_unspendable_amount'], Decimal('220.99976820')) assert_equal(res6['block_info'], { - 'unspendable': Decimal('20.99000000'), - 'prevout_spent': 71, - 'new_outputs_ex_coinbase': Decimal('49.99999000'), - 'coinbase': Decimal('50.01001000'), + 'unspendable': Decimal('20.99950900'), + 'prevout_spent': Decimal('221.00000000'), + 'new_outputs_ex_coinbase': Decimal('199.99999000'), + 'coinbase': Decimal('200.00050100'), 'unspendables': { 'genesis_block': 0, 'bip30': 0, - 'scripts': Decimal('20.99000000'), - 'unclaimed_rewards': 0, + 'scripts': Decimal('20.99500000'), + 'unclaimed_rewards': Decimal('0.00450900'), } }) self.block_sanity_check(res6['block_info']) @@ -197,9 +197,9 @@ def _test_coin_stats_index(self): for hash_option in index_hash_options: res7 = index_node.gettxoutsetinfo(hash_option, 109) - assert_equal(res7['total_unspendable_amount'], Decimal('80.99000000')) + assert_equal(res7['total_unspendable_amount'], Decimal('380.99976820')) assert_equal(res7['block_info'], { - 'unspendable': 10, + 'unspendable': Decimal('160.00000000'), 'prevout_spent': 0, 'new_outputs_ex_coinbase': 0, 'coinbase': 40, @@ -207,7 +207,7 @@ def _test_coin_stats_index(self): 'genesis_block': 0, 'bip30': 0, 'scripts': 0, - 'unclaimed_rewards': 10 + 'unclaimed_rewards': Decimal('160.00000000') } }) self.block_sanity_check(res7['block_info']) From d9afefc97bbaaac4b19ab7195fd8711a6fde170e Mon Sep 17 00:00:00 2001 From: Korrrba Date: Tue, 10 Jan 2023 23:51:01 +0100 Subject: [PATCH 076/144] test: functional: rpc_psbt: Sync with Bitcoin core and adapt expected values to Bitgesell. --- test/functional/data/rpc_psbt.json | 60 ++++++++++++++---------------- test/functional/rpc_psbt.py | 32 ++++------------ 2 files changed, 36 insertions(+), 56 deletions(-) diff --git a/test/functional/data/rpc_psbt.json b/test/functional/data/rpc_psbt.json index 0f6cd97fd8..21daea144b 100644 --- a/test/functional/data/rpc_psbt.json +++ b/test/functional/data/rpc_psbt.json @@ -29,12 +29,8 @@ "cHNidP8BADMBAAAAAREREREREREREREREREREREREfrK3hERERERERERERERfwAAAAD/////AAAAAAAAAQEJAOH1BQAAAAAAAQgBAAEIAwEBUQA=" ], "valid" : [ - "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" ], "creator" : [ { @@ -50,13 +46,13 @@ ], "outputs" : [ { - "bcrt1qmpwzkuwsqc9snjvgdt4czhjsnywa5yjdqpxskv":1.49990000 + "rbgl1qqpmtreykaj2jphmyf3358sn3wudm6thfypzzut":1.49990000 }, { - "bcrt1qqzh2ngh97ru8dfvgma25d6r595wcwqy0cee4cc": 1 + "rbgl1qqzhun7algln9jg3734me3ch679yzu06spda08r": 1 } ], - "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAAAAAA=" + "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=" } ], "signer" : [ @@ -65,75 +61,75 @@ "cP53pDbR5WtAD8dYAW9hhTjuvvTVaEiQBdrz9XPrgLBeRFiyCbQr", "cR6SXDoyfQrcp4piaiHE97Rsgta9mNhGTen9XeonVgwsh4iSgw6d" ], - "psbt" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAABBEdSIQKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfyEC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtdSriIGApWDvzmuCmCXR60Zmt3WNPphCFWdbFzTm0whg/GrluB/ENkMak8AAACAAAAAgAAAAIAiBgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU21xDZDGpPAAAAgAAAAIABAACAAQMEAQAAAAABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohwEEIgAgjCNTFzdDtZXftKB7crqOQuN5fadOh/59nXSX47ICiQMBBUdSIQMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3CECOt2QTz1tz1nduQaw3uI1Kbf/ue1Q5ehhUZJoYCIfDnNSriIGAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zENkMak8AAACAAAAAgAMAAIAiBgMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3BDZDGpPAAAAgAAAAIACAACAAQMEAQAAAAAiAgOppMN/WZbTqiXbrGtXCvBlA5RJKUJGCzVHU+2e7KWHcRDZDGpPAAAAgAAAAIAEAACAACICAn9jmXV9Lv9VoTatAsaEsYOLZVbl8bazQoKpS2tQBRCWENkMak8AAACAAAAAgAUAAIAA", - "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAAiAgKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgf0cwRAIgdAGK1BgAl7hzMjwAFXILNoTMgSOJEEjn282bVa1nnJkCIHPTabdA4+tT3O+jOCPIBwUUylWn3ZVE8VfBZ5EyYRGMAQEDBAEAAAABBEdSIQKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfyEC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtdSriIGApWDvzmuCmCXR60Zmt3WNPphCFWdbFzTm0whg/GrluB/ENkMak8AAACAAAAAgAAAAIAiBgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU21xDZDGpPAAAAgAAAAIABAACAAAEBIADC6wsAAAAAF6kUt/X69A49QKWkWbHbNTXyty+pIeiHIgIDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtxHMEQCIGLrelVhB6fHP0WsSrWh3d9vcHX7EnWWmn84Pv/3hLyyAiAMBdu3Rw2/LwhVfdNWxzJcHtMJE+mWzThAlF2xIijaXwEBAwQBAAAAAQQiACCMI1MXN0O1ld+0oHtyuo5C43l9p06H/n2ddJfjsgKJAwEFR1IhAwidwQx6xttU+RMpr2FzM9s4jOrQwjH3IzedG5kDCwLcIQI63ZBPPW3PWd25BrDe4jUpt/+57VDl6GFRkmhgIh8Oc1KuIgYCOt2QTz1tz1nduQaw3uI1Kbf/ue1Q5ehhUZJoYCIfDnMQ2QxqTwAAAIAAAACAAwAAgCIGAwidwQx6xttU+RMpr2FzM9s4jOrQwjH3IzedG5kDCwLcENkMak8AAACAAAAAgAIAAIAAIgIDqaTDf1mW06ol26xrVwrwZQOUSSlCRgs1R1Ptnuylh3EQ2QxqTwAAAIAAAACABAAAgAAiAgJ/Y5l1fS7/VaE2rQLGhLGDi2VW5fG2s0KCqUtrUAUQlhDZDGpPAAAAgAAAAIAFAACAAA==" + "psbt" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=", + "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=" }, { "privkeys" : [ "cT7J9YpCwY3AVRFSjN6ukeEeWY6mhpbJPxRaDaP5QTdygQRxP9Au", "cNBc3SWUip9PPm1GjRoLEJT6T41iNzCYtD7qro84FMnM5zEqeJsE" ], - "psbt" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAABBEdSIQKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfyEC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtdSriIGApWDvzmuCmCXR60Zmt3WNPphCFWdbFzTm0whg/GrluB/ENkMak8AAACAAAAAgAAAAIAiBgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU21xDZDGpPAAAAgAAAAIABAACAAQMEAQAAAAABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohwEEIgAgjCNTFzdDtZXftKB7crqOQuN5fadOh/59nXSX47ICiQMBBUdSIQMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3CECOt2QTz1tz1nduQaw3uI1Kbf/ue1Q5ehhUZJoYCIfDnNSriIGAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zENkMak8AAACAAAAAgAMAAIAiBgMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3BDZDGpPAAAAgAAAAIACAACAAQMEAQAAAAAiAgOppMN/WZbTqiXbrGtXCvBlA5RJKUJGCzVHU+2e7KWHcRDZDGpPAAAAgAAAAIAEAACAACICAn9jmXV9Lv9VoTatAsaEsYOLZVbl8bazQoKpS2tQBRCWENkMak8AAACAAAAAgAUAAIAA", - "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAAiAgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU210cwRAIgYxqYn+c4qSrQGYYCMxLBkhT+KAKznly8GsNniAbGksMCIDnbbDh70mdxbf2z1NjaULjoXSEzJrp8faqkwM5B65IjAQEDBAEAAAABBEdSIQKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfyEC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtdSriIGApWDvzmuCmCXR60Zmt3WNPphCFWdbFzTm0whg/GrluB/ENkMak8AAACAAAAAgAAAAIAiBgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU21xDZDGpPAAAAgAAAAIABAACAAAEBIADC6wsAAAAAF6kUt/X69A49QKWkWbHbNTXyty+pIeiHIgICOt2QTz1tz1nduQaw3uI1Kbf/ue1Q5ehhUZJoYCIfDnNHMEQCIGX0W6WZi1mif/4ae+0BavHx+Q1Us6qPdFCqX1aiUQO9AiB/ckcDrR7blmgLKEtW1P/LiPf7dZ6rvgiqMPKbhROD0gEBAwQBAAAAAQQiACCMI1MXN0O1ld+0oHtyuo5C43l9p06H/n2ddJfjsgKJAwEFR1IhAwidwQx6xttU+RMpr2FzM9s4jOrQwjH3IzedG5kDCwLcIQI63ZBPPW3PWd25BrDe4jUpt/+57VDl6GFRkmhgIh8Oc1KuIgYCOt2QTz1tz1nduQaw3uI1Kbf/ue1Q5ehhUZJoYCIfDnMQ2QxqTwAAAIAAAACAAwAAgCIGAwidwQx6xttU+RMpr2FzM9s4jOrQwjH3IzedG5kDCwLcENkMak8AAACAAAAAgAIAAIAAIgIDqaTDf1mW06ol26xrVwrwZQOUSSlCRgs1R1Ptnuylh3EQ2QxqTwAAAIAAAACABAAAgAAiAgJ/Y5l1fS7/VaE2rQLGhLGDi2VW5fG2s0KCqUtrUAUQlhDZDGpPAAAAgAAAAIAFAACAAA==" + "psbt" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=", + "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=" }, { "privkeys" : [ "cNBc3SWUip9PPm1GjRoLEJT6T41iNzCYtD7qro84FMnM5zEqeJsE" ], - "psbt" : "cHNidP8BAKACAAAAAqsJSaCMWvfEm4IS9Bfi8Vqz9cM9zxU4IagTn4d6W3vkAAAAAAD+////qwlJoIxa98SbghL0F+LxWrP1wz3PFTghqBOfh3pbe+QBAAAAAP7///8CYDvqCwAAAAAZdqkUdopAu9dAy+gdmI5x3ipNXHE5ax2IrI4kAAAAAAAAGXapFG9GILVT+glechue4O/p+gOcykWXiKwAAAAAAAEBItPf9QUAAAAAGXapFNSO0xELlAFMsRS9Mtb00GbcdCVriKwAAQEgAOH1BQAAAAAXqRQ1RebjO4MsRwUPJNPuuTycA5SLx4cBBBYAFIXRNTfy4mVAWjTbr6nj3aAfuCMIACICAurVlmh8qAYEPtw94RbN8p1eklfBls0FXPaYyNAr8k6ZELSmumcAAACAAAAAgAIAAIAAIgIDlPYr6d8ZlSxVh3aK63aYBhrSxKJciU9H2MFitNchPQUQtKa6ZwAAAIABAACAAgAAgAA=", - "result" : "cHNidP8BAKACAAAAAqsJSaCMWvfEm4IS9Bfi8Vqz9cM9zxU4IagTn4d6W3vkAAAAAAD+////qwlJoIxa98SbghL0F+LxWrP1wz3PFTghqBOfh3pbe+QBAAAAAP7///8CYDvqCwAAAAAZdqkUdopAu9dAy+gdmI5x3ipNXHE5ax2IrI4kAAAAAAAAGXapFG9GILVT+glechue4O/p+gOcykWXiKwAAAAAAAEBItPf9QUAAAAAGXapFNSO0xELlAFMsRS9Mtb00GbcdCVriKwAAQEgAOH1BQAAAAAXqRQ1RebjO4MsRwUPJNPuuTycA5SLx4cBBBYAFIXRNTfy4mVAWjTbr6nj3aAfuCMIACICAurVlmh8qAYEPtw94RbN8p1eklfBls0FXPaYyNAr8k6ZELSmumcAAACAAAAAgAIAAIAAIgIDlPYr6d8ZlSxVh3aK63aYBhrSxKJciU9H2MFitNchPQUQtKa6ZwAAAIABAACAAgAAgAA=" + "psbt" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=", + "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=" }, { "privkeys" : [ "cT7J9YpCwY3AVRFSjN6ukeEeWY6mhpbJPxRaDaP5QTdygQRxP9Au", "cNBc3SWUip9PPm1GjRoLEJT6T41iNzCYtD7qro84FMnM5zEqeJsE" ], - "psbt" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAAiAgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU210gwRQIhAPYQOLMI3B2oZaNIUnRvAVdyk0IIxtJEVDk82ZvfIhd3AiAFbmdaZ1ptCgK4WxTl4pB02KJam1dgvqKBb2YZEKAG6gEBAwQBAAAAAQRHUiEClYO/Oa4KYJdHrRma3dY0+mEIVZ1sXNObTCGD8auW4H8hAtq2H/SaFNtqfQKwzR+7ePxLGDErW05U2uTbovv+9TbXUq8iBgKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfxDZDGpPAAAAgAAAAIAAAACAIgYC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtcQ2QxqTwAAAIAAAACAAQAAgAABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohyICAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zRzBEAiBl9FulmYtZon/+GnvtAWrx8fkNVLOqj3RQql9WolEDvQIgf3JHA60e25ZoCyhLVtT/y4j3+3Weq74IqjDym4UTg9IBAQMEAQAAAAEEIgAgjCNTFzdDtZXftKB7crqOQuN5fadOh/59nXSX47ICiQMBBUdSIQMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3CECOt2QTz1tz1nduQaw3uI1Kbf/ue1Q5ehhUZJoYCIfDnNSriIGAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zENkMak8AAACAAAAAgAMAAIAiBgMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3BDZDGpPAAAAgAAAAIACAACAACICA6mkw39ZltOqJdusa1cK8GUDlEkpQkYLNUdT7Z7spYdxENkMak8AAACAAAAAgAQAAIAAIgICf2OZdX0u/1WhNq0CxoSxg4tlVuXxtrNCgqlLa1AFEJYQ2QxqTwAAAIAAAACABQAAgAA=", - "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAAiAgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU210gwRQIhAPYQOLMI3B2oZaNIUnRvAVdyk0IIxtJEVDk82ZvfIhd3AiAFbmdaZ1ptCgK4WxTl4pB02KJam1dgvqKBb2YZEKAG6gEBAwQBAAAAAQRHUiEClYO/Oa4KYJdHrRma3dY0+mEIVZ1sXNObTCGD8auW4H8hAtq2H/SaFNtqfQKwzR+7ePxLGDErW05U2uTbovv+9TbXUq8iBgKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfxDZDGpPAAAAgAAAAIAAAACAIgYC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtcQ2QxqTwAAAIAAAACAAQAAgAABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohyICAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zRzBEAiBl9FulmYtZon/+GnvtAWrx8fkNVLOqj3RQql9WolEDvQIgf3JHA60e25ZoCyhLVtT/y4j3+3Weq74IqjDym4UTg9IBAQMEAQAAAAEEIgAgjCNTFzdDtZXftKB7crqOQuN5fadOh/59nXSX47ICiQMBBUdSIQMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3CECOt2QTz1tz1nduQaw3uI1Kbf/ue1Q5ehhUZJoYCIfDnNSriIGAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zENkMak8AAACAAAAAgAMAAIAiBgMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3BDZDGpPAAAAgAAAAIACAACAACICA6mkw39ZltOqJdusa1cK8GUDlEkpQkYLNUdT7Z7spYdxENkMak8AAACAAAAAgAQAAIAAIgICf2OZdX0u/1WhNq0CxoSxg4tlVuXxtrNCgqlLa1AFEJYQ2QxqTwAAAIAAAACABQAAgAA=" + "psbt" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=", + "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=" }, { "privkeys" : [ "cT7J9YpCwY3AVRFSjN6ukeEeWY6mhpbJPxRaDaP5QTdygQRxP9Au", "cNBc3SWUip9PPm1GjRoLEJT6T41iNzCYtD7qro84FMnM5zEqeJsE" ], - "psbt" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAAiAgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU210gwRQIhAPYQOLMI3B2oZaNIUnRvAVdyk0IIxtJEVDk82ZvfIhd3AiAFbmdaZ1ptCgK4WxTl4pB02KJam1dgvqKBb2YZEKAG6gEBAwQBAAAAAQRHUiEClYO/Oa4KYJdHrRma3dY0+mEIVZ1sXNObTCGD8auW4H8hAtq2H/SaFNtqfQKwzR+7ePxLGDErW05U2uTbovv+9TbXUq4iBgKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfxDZDGpPAAAAgAAAAIAAAACAIgYC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtcQ2QxqTwAAAIAAAACAAQAAgAABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohyICAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zRzBEAiBl9FulmYtZon/+GnvtAWrx8fkNVLOqj3RQql9WolEDvQIgf3JHA60e25ZoCyhLVtT/y4j3+3Weq74IqjDym4UTg9IBAQMEAQAAAAEEIgAgjCNTFzdDtZXftKB7crqOQuN5fadOh/59nXSX47ICiQABBUdSIQMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3CECOt2QTz1tz1nduQaw3uI1Kbf/ue1Q5ehhUZJoYCIfDnNSriIGAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zENkMak8AAACAAAAAgAMAAIAiBgMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3BDZDGpPAAAAgAAAAIACAACAACICA6mkw39ZltOqJdusa1cK8GUDlEkpQkYLNUdT7Z7spYdxENkMak8AAACAAAAAgAQAAIAAIgICf2OZdX0u/1WhNq0CxoSxg4tlVuXxtrNCgqlLa1AFEJYQ2QxqTwAAAIAAAACABQAAgAA=", - "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAAiAgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU210gwRQIhAPYQOLMI3B2oZaNIUnRvAVdyk0IIxtJEVDk82ZvfIhd3AiAFbmdaZ1ptCgK4WxTl4pB02KJam1dgvqKBb2YZEKAG6gEBAwQBAAAAAQRHUiEClYO/Oa4KYJdHrRma3dY0+mEIVZ1sXNObTCGD8auW4H8hAtq2H/SaFNtqfQKwzR+7ePxLGDErW05U2uTbovv+9TbXUq4iBgKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfxDZDGpPAAAAgAAAAIAAAACAIgYC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtcQ2QxqTwAAAIAAAACAAQAAgAABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohyICAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zRzBEAiBl9FulmYtZon/+GnvtAWrx8fkNVLOqj3RQql9WolEDvQIgf3JHA60e25ZoCyhLVtT/y4j3+3Weq74IqjDym4UTg9IBAQMEAQAAAAEEIgAgjCNTFzdDtZXftKB7crqOQuN5fadOh/59nXSX47ICiQABBUdSIQMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3CECOt2QTz1tz1nduQaw3uI1Kbf/ue1Q5ehhUZJoYCIfDnNSriIGAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zENkMak8AAACAAAAAgAMAAIAiBgMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3BDZDGpPAAAAgAAAAIACAACAACICA6mkw39ZltOqJdusa1cK8GUDlEkpQkYLNUdT7Z7spYdxENkMak8AAACAAAAAgAQAAIAAIgICf2OZdX0u/1WhNq0CxoSxg4tlVuXxtrNCgqlLa1AFEJYQ2QxqTwAAAIAAAACABQAAgAA=" + "psbt" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=", + "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=" }, { "privkeys" : [ "cT7J9YpCwY3AVRFSjN6ukeEeWY6mhpbJPxRaDaP5QTdygQRxP9Au", "cNBc3SWUip9PPm1GjRoLEJT6T41iNzCYtD7qro84FMnM5zEqeJsE" ], - "psbt" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAAiAgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU210gwRQIhAPYQOLMI3B2oZaNIUnRvAVdyk0IIxtJEVDk82ZvfIhd3AiAFbmdaZ1ptCgK4WxTl4pB02KJam1dgvqKBb2YZEKAG6gEBAwQBAAAAAQRHUiEClYO/Oa4KYJdHrRma3dY0+mEIVZ1sXNObTCGD8auW4H8hAtq2H/SaFNtqfQKwzR+7ePxLGDErW05U2uTbovv+9TbXUq4iBgKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfxDZDGpPAAAAgAAAAIAAAACAIgYC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtcQ2QxqTwAAAIAAAACAAQAAgAABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohyICAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zRzBEAiBl9FulmYtZon/+GnvtAWrx8fkNVLOqj3RQql9WolEDvQIgf3JHA60e25ZoCyhLVtT/y4j3+3Weq74IqjDym4UTg9IBAQMEAQAAAAEEIgAgjCNTFzdDtZXftKB7crqOQuN5fadOh/59nXSX47ICiQMBBUdSIQMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3CECOt2QTz1tz1nduQaw3uI1Kbf/ue1Q5ehhUZJoYCIfDnNSrSIGAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zENkMak8AAACAAAAAgAMAAIAiBgMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3BDZDGpPAAAAgAAAAIACAACAACICA6mkw39ZltOqJdusa1cK8GUDlEkpQkYLNUdT7Z7spYdxENkMak8AAACAAAAAgAQAAIAAIgICf2OZdX0u/1WhNq0CxoSxg4tlVuXxtrNCgqlLa1AFEJYQ2QxqTwAAAIAAAACABQAAgAA=", - "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAAiAgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU210gwRQIhAPYQOLMI3B2oZaNIUnRvAVdyk0IIxtJEVDk82ZvfIhd3AiAFbmdaZ1ptCgK4WxTl4pB02KJam1dgvqKBb2YZEKAG6gEBAwQBAAAAAQRHUiEClYO/Oa4KYJdHrRma3dY0+mEIVZ1sXNObTCGD8auW4H8hAtq2H/SaFNtqfQKwzR+7ePxLGDErW05U2uTbovv+9TbXUq4iBgKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfxDZDGpPAAAAgAAAAIAAAACAIgYC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtcQ2QxqTwAAAIAAAACAAQAAgAABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohyICAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zRzBEAiBl9FulmYtZon/+GnvtAWrx8fkNVLOqj3RQql9WolEDvQIgf3JHA60e25ZoCyhLVtT/y4j3+3Weq74IqjDym4UTg9IBAQMEAQAAAAEEIgAgjCNTFzdDtZXftKB7crqOQuN5fadOh/59nXSX47ICiQMBBUdSIQMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3CECOt2QTz1tz1nduQaw3uI1Kbf/ue1Q5ehhUZJoYCIfDnNSrSIGAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zENkMak8AAACAAAAAgAMAAIAiBgMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3BDZDGpPAAAAgAAAAIACAACAACICA6mkw39ZltOqJdusa1cK8GUDlEkpQkYLNUdT7Z7spYdxENkMak8AAACAAAAAgAQAAIAAIgICf2OZdX0u/1WhNq0CxoSxg4tlVuXxtrNCgqlLa1AFEJYQ2QxqTwAAAIAAAACABQAAgAA=" + "psbt" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=", + "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=" } ], "combiner" : [ { "combine" : [ - "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" ], - "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAAiAgKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgf0cwRAIgdAGK1BgAl7hzMjwAFXILNoTMgSOJEEjn282bVa1nnJkCIHPTabdA4+tT3O+jOCPIBwUUylWn3ZVE8VfBZ5EyYRGMASICAtq2H/SaFNtqfQKwzR+7ePxLGDErW05U2uTbovv+9TbXRzBEAiBjGpif5zipKtAZhgIzEsGSFP4oArOeXLwaw2eIBsaSwwIgOdtsOHvSZ3Ft/bPU2NpQuOhdITMmunx9qqTAzkHrkiMBAQMEAQAAAAEER1IhApWDvzmuCmCXR60Zmt3WNPphCFWdbFzTm0whg/GrluB/IQLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU211KuIgYClYO/Oa4KYJdHrRma3dY0+mEIVZ1sXNObTCGD8auW4H8Q2QxqTwAAAIAAAACAAAAAgCIGAtq2H/SaFNtqfQKwzR+7ePxLGDErW05U2uTbovv+9TbXENkMak8AAACAAAAAgAEAAIAAAQEgAMLrCwAAAAAXqRS39fr0Dj1ApaRZsds1NfK3L6kh6IciAgMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3EcwRAIgYut6VWEHp8c/RaxKtaHd329wdfsSdZaafzg+//eEvLICIAwF27dHDb8vCFV901bHMlwe0wkT6ZbNOECUXbEiKNpfASICAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zRzBEAiBl9FulmYtZon/+GnvtAWrx8fkNVLOqj3RQql9WolEDvQIgf3JHA60e25ZoCyhLVtT/y4j3+3Weq74IqjDym4UTg9IBAQMEAQAAAAEEIgAgjCNTFzdDtZXftKB7crqOQuN5fadOh/59nXSX47ICiQMBBUdSIQMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3CECOt2QTz1tz1nduQaw3uI1Kbf/ue1Q5ehhUZJoYCIfDnNSriIGAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zENkMak8AAACAAAAAgAMAAIAiBgMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3BDZDGpPAAAAgAAAAIACAACAACICA6mkw39ZltOqJdusa1cK8GUDlEkpQkYLNUdT7Z7spYdxENkMak8AAACAAAAAgAQAAIAAIgICf2OZdX0u/1WhNq0CxoSxg4tlVuXxtrNCgqlLa1AFEJYQ2QxqTwAAAIAAAACABQAAgAA=" + "result" : "cHNidP8BACoCAAAAAAFAQg8AAAAAABepFG6Rty1Vk+fUOR4v9E6R6YXDFkHwhwAAAAAAAA==" }, { "combine" : [ - "cHNidP8BAD8CAAAAAf//////////////////////////////////////////AAAAAAD/////AQAAAAAAAAAAA2oBAAAAAAAKDwECAwQFBgcICQ8BAgMEBQYHCAkKCwwNDg8ACg8BAgMEBQYHCAkPAQIDBAUGBwgJCgsMDQ4PAAoPAQIDBAUGBwgJDwECAwQFBgcICQoLDA0ODwA=", - "cHNidP8BAD8CAAAAAf//////////////////////////////////////////AAAAAAD/////AQAAAAAAAAAAA2oBAAAAAAAKDwECAwQFBgcIEA8BAgMEBQYHCAkKCwwNDg8ACg8BAgMEBQYHCBAPAQIDBAUGBwgJCgsMDQ4PAAoPAQIDBAUGBwgQDwECAwQFBgcICQoLDA0ODwA=" + "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=", + "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=" ], - "result" : "cHNidP8BAD8CAAAAAf//////////////////////////////////////////AAAAAAD/////AQAAAAAAAAAAA2oBAAAAAAAKDwECAwQFBgcICQ8BAgMEBQYHCAkKCwwNDg8KDwECAwQFBgcIEA8BAgMEBQYHCAkKCwwNDg8ACg8BAgMEBQYHCAkPAQIDBAUGBwgJCgsMDQ4PCg8BAgMEBQYHCBAPAQIDBAUGBwgJCgsMDQ4PAAoPAQIDBAUGBwgJDwECAwQFBgcICQoLDA0ODwoPAQIDBAUGBwgQDwECAwQFBgcICQoLDA0ODwA=" + "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=" } ], "finalizer" : [ { - "finalize" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAAiAgKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgf0cwRAIgdAGK1BgAl7hzMjwAFXILNoTMgSOJEEjn282bVa1nnJkCIHPTabdA4+tT3O+jOCPIBwUUylWn3ZVE8VfBZ5EyYRGMASICAtq2H/SaFNtqfQKwzR+7ePxLGDErW05U2uTbovv+9TbXSDBFAiEA9hA4swjcHahlo0hSdG8BV3KTQgjG0kRUOTzZm98iF3cCIAVuZ1pnWm0KArhbFOXikHTYolqbV2C+ooFvZhkQoAbqAQEDBAEAAAABBEdSIQKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfyEC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtdSriIGApWDvzmuCmCXR60Zmt3WNPphCFWdbFzTm0whg/GrluB/ENkMak8AAACAAAAAgAAAAIAiBgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU21xDZDGpPAAAAgAAAAIABAACAAAEBIADC6wsAAAAAF6kUt/X69A49QKWkWbHbNTXyty+pIeiHIgIDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtxHMEQCIGLrelVhB6fHP0WsSrWh3d9vcHX7EnWWmn84Pv/3hLyyAiAMBdu3Rw2/LwhVfdNWxzJcHtMJE+mWzThAlF2xIijaXwEiAgI63ZBPPW3PWd25BrDe4jUpt/+57VDl6GFRkmhgIh8Oc0cwRAIgZfRbpZmLWaJ//hp77QFq8fH5DVSzqo90UKpfVqJRA70CIH9yRwOtHtuWaAsoS1bU/8uI9/t1nqu+CKow8puFE4PSAQEDBAEAAAABBCIAIIwjUxc3Q7WV37Sge3K6jkLjeX2nTof+fZ10l+OyAokDAQVHUiEDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtwhAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zUq4iBgI63ZBPPW3PWd25BrDe4jUpt/+57VDl6GFRkmhgIh8OcxDZDGpPAAAAgAAAAIADAACAIgYDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtwQ2QxqTwAAAIAAAACAAgAAgAAiAgOppMN/WZbTqiXbrGtXCvBlA5RJKUJGCzVHU+2e7KWHcRDZDGpPAAAAgAAAAIAEAACAACICAn9jmXV9Lv9VoTatAsaEsYOLZVbl8bazQoKpS2tQBRCWENkMak8AAACAAAAAgAUAAIAA", - "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAABB9oARzBEAiB0AYrUGACXuHMyPAAVcgs2hMyBI4kQSOfbzZtVrWecmQIgc9Npt0Dj61Pc76M4I8gHBRTKVafdlUTxV8FnkTJhEYwBSDBFAiEA9hA4swjcHahlo0hSdG8BV3KTQgjG0kRUOTzZm98iF3cCIAVuZ1pnWm0KArhbFOXikHTYolqbV2C+ooFvZhkQoAbqAUdSIQKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfyEC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtdSrgABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohwEHIyIAIIwjUxc3Q7WV37Sge3K6jkLjeX2nTof+fZ10l+OyAokDAQjaBABHMEQCIGLrelVhB6fHP0WsSrWh3d9vcHX7EnWWmn84Pv/3hLyyAiAMBdu3Rw2/LwhVfdNWxzJcHtMJE+mWzThAlF2xIijaXwFHMEQCIGX0W6WZi1mif/4ae+0BavHx+Q1Us6qPdFCqX1aiUQO9AiB/ckcDrR7blmgLKEtW1P/LiPf7dZ6rvgiqMPKbhROD0gFHUiEDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtwhAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zUq4AIgIDqaTDf1mW06ol26xrVwrwZQOUSSlCRgs1R1Ptnuylh3EQ2QxqTwAAAIAAAACABAAAgAAiAgJ/Y5l1fS7/VaE2rQLGhLGDi2VW5fG2s0KCqUtrUAUQlhDZDGpPAAAAgAAAAIAFAACAAA==" + "finalize" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=", + "result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABQAdrHkluyVIN9kTGNDwnF3G70u6QDh9QUAAAAAFgAUAK/J+79H5lkiPo13mOL68UguP1AAAAAAAAAAAAA=" } ], "extractor" : [ { - "extract" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAABB9oARzBEAiB0AYrUGACXuHMyPAAVcgs2hMyBI4kQSOfbzZtVrWecmQIgc9Npt0Dj61Pc76M4I8gHBRTKVafdlUTxV8FnkTJhEYwBSDBFAiEA9hA4swjcHahlo0hSdG8BV3KTQgjG0kRUOTzZm98iF3cCIAVuZ1pnWm0KArhbFOXikHTYolqbV2C+ooFvZhkQoAbqAUdSIQKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfyEC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtdSrgABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohwEHIyIAIIwjUxc3Q7WV37Sge3K6jkLjeX2nTof+fZ10l+OyAokDAQjaBABHMEQCIGLrelVhB6fHP0WsSrWh3d9vcHX7EnWWmn84Pv/3hLyyAiAMBdu3Rw2/LwhVfdNWxzJcHtMJE+mWzThAlF2xIijaXwFHMEQCIGX0W6WZi1mif/4ae+0BavHx+Q1Us6qPdFCqX1aiUQO9AiB/ckcDrR7blmgLKEtW1P/LiPf7dZ6rvgiqMPKbhROD0gFHUiEDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtwhAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zUq4AIgIDqaTDf1mW06ol26xrVwrwZQOUSSlCRgs1R1Ptnuylh3EQ2QxqTwAAAIAAAACABAAAgAAiAgJ/Y5l1fS7/VaE2rQLGhLGDi2VW5fG2s0KCqUtrUAUQlhDZDGpPAAAAgAAAAIAFAACAAA==", - "result" : "0200000000010258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7500000000da00473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752aeffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d01000000232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f000400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00000000" + "extract" : "cHNidP8BAHsCAAAAAnW+Lz1bxhOKrThu3yKxpTab8hf8FHC2lQh8ZQ2XBuTlAQAAAAD/////RugL72ZaJG42iI1RUGJnAp0T9a8Fea457XRWR66BcjgAAAAAAP////8BYFP3mgAAAAAWABSGdZKl1Ehoh8BLHl6/fHONlmfxRQAAAAAAAQBxAgAAAAH9lB1ICU9ruvLb+h8oJ8BIQ8MRoi3hkYyfhc1HYINV4wMAAAAA/f///wJ0e/r0AgAAABYAFFvq7sT8Gs+fAQ45eFLXyxeA5wODAG18TQAAAAAWABSTdTQhb6j+uj6vW4B6V/lE9Wzl6c4AAAABAR8AbXxNAAAAABYAFJN1NCFvqP66Pq9bgHpX+UT1bOXpAQhrAkcwRAIgfU2F+/L+cT28oaoMQo39OLwRQNRiGeIKGaDTr0Do/TMCIDRBb1uac9aj7lWZ+kig/V8Vme6RP8TiqxTaFQKhIJAGASECWhPQb/0C99USGvwpS1v+Lt8jtFcS50Hrtll/VsUaqrgAAQBxAgAAAAHl/S0arMPyMcOT8FruLkR+QBUR2udzHRouW1ayum35+wEAAAAA/f///wIAbXxNAAAAABYAFE7Su7Cfzm+RKDp0QDIJ+bvlPKtdqBcwbAMAAAAWABTmpy7c5r9NA9Ptp3utJvCewK2s8M4AAAABAR8AbXxNAAAAABYAFE7Su7Cfzm+RKDp0QDIJ+bvlPKtdAQhrAkcwRAIgcmPhXtYiCseojrB4L8w5luz2dJ5YGuaplcq+OMnnwVECIC73eDzPI6upCCvvQFsUa3I/wOpXSQoWG2KxQWlu5d2cASEC5GxDl2Jm/BK+hrxO+cqtwn5dIKCrZ6PpS6Ghco3IbnkAAA==", + "result" : "0200000000010275be2f3d5bc6138aad386edf22b1a5369bf217fc1470b695087c650d9706e4e50100000000ffffffff46e80bef665a246e36888d51506267029d13f5af0579ae39ed745647ae8172380000000000ffffffff016053f79a00000000160014867592a5d4486887c04b1e5ebf7c738d9667f1450247304402207d4d85fbf2fe713dbca1aa0c428dfd38bc1140d46219e20a19a0d3af40e8fd33022034416f5b9a73d6a3ee5599fa48a0fd5f1599ee913fc4e2ab14da1502a12090060121025a13d06ffd02f7d5121afc294b5bfe2edf23b45712e741ebb6597f56c51aaab80247304402207263e15ed6220ac7a88eb0782fcc3996ecf6749e581ae6a995cabe38c9e7c15102202ef7783ccf23aba9082bef405b146b723fc0ea57490a161b62b141696ee5dd9c012102e46c43976266fc12be86bc4ef9caadc27e5d20a0ab67a3e94ba1a1728dc86e7900000000" } ] -} \ No newline at end of file +} diff --git a/test/functional/rpc_psbt.py b/test/functional/rpc_psbt.py index 6d490d5d73..e785a20def 100755 --- a/test/functional/rpc_psbt.py +++ b/test/functional/rpc_psbt.py @@ -100,9 +100,9 @@ def run_test(self): # If inputs are specified, do not automatically add more: utxo1 = self.nodes[0].listunspent()[0] - assert_raises_rpc_error(-4, "Insufficient funds", self.nodes[0].walletcreatefundedpsbt, [{"txid": utxo1['txid'], "vout": utxo1['vout']}], {self.nodes[2].getnewaddress():90}) + assert_raises_rpc_error(-4, "Insufficient funds", self.nodes[0].walletcreatefundedpsbt, [{"txid": utxo1['txid'], "vout": utxo1['vout']}], {self.nodes[2].getnewaddress():240}) - psbtx1 = self.nodes[0].walletcreatefundedpsbt([{"txid": utxo1['txid'], "vout": utxo1['vout']}], {self.nodes[2].getnewaddress():90}, 0, {"add_inputs": True})['psbt'] + psbtx1 = self.nodes[0].walletcreatefundedpsbt([{"txid": utxo1['txid'], "vout": utxo1['vout']}], {self.nodes[2].getnewaddress():240}, 0, {"add_inputs": True})['psbt'] assert_equal(len(self.nodes[0].decodepsbt(psbtx1)['tx']['vin']), 2) # Inputs argument can be null @@ -187,6 +187,9 @@ def run_test(self): elif out['scriptPubKey']['address'] == p2pkh: p2pkh_pos = out['n'] + inputs = [{"txid": txid, "vout": p2wpkh_pos}, {"txid": txid, "vout": p2sh_p2wpkh_pos}, {"txid": txid, "vout": p2pkh_pos}] + outputs = [{self.nodes[1].getnewaddress(): 29.99}] + # spend single key from node 1 created_psbt = self.nodes[1].walletcreatefundedpsbt([{"txid":txid,"vout":p2wpkh_pos},{"txid":txid,"vout":p2sh_p2wpkh_pos},{"txid":txid,"vout":p2pkh_pos}], {self.nodes[1].getnewaddress():29.99}) walletprocesspsbt_out = self.nodes[1].walletprocesspsbt(created_psbt['psbt']) @@ -199,11 +202,11 @@ def run_test(self): assert_equal(walletprocesspsbt_out['complete'], True) self.nodes[1].sendrawtransaction(self.nodes[1].finalizepsbt(walletprocesspsbt_out['psbt'])['hex']) - self.log.info("Test walletcreatefundedpsbt fee rate of 10000 sat/vB and 0.1 BGL/kvB produces a total fee at or slightly below -maxtxfee (~0.05290000)") + self.log.info("Test walletcreatefundedpsbt fee rate of 10000 sat/vB and 0.1 BGL/kvB produces a total fee at or slightly below -maxtxfee (~0.04500000)") res1 = self.nodes[1].walletcreatefundedpsbt(inputs, outputs, 0, {"fee_rate": 10000, "add_inputs": True}) - assert_approx(res1["fee"], 0.055, 0.005) + assert_approx(res1["fee"], 0.045, 0.005) res2 = self.nodes[1].walletcreatefundedpsbt(inputs, outputs, 0, {"feeRate": "0.1", "add_inputs": True}) - assert_approx(res2["fee"], 0.055, 0.005) + assert_approx(res2["fee"], 0.045, 0.005) self.log.info("Test min fee rate checks with walletcreatefundedpsbt are bypassed, e.g. a fee_rate under 1 sat/vB is allowed") res3 = self.nodes[1].walletcreatefundedpsbt(inputs, outputs, 0, {"fee_rate": "0.999", "add_inputs": True}) @@ -589,25 +592,6 @@ def test_psbt_input_keys(psbt_input, keys): assert_equal(analysis['next'], 'creator') assert_equal(analysis['error'], 'PSBT is not valid. Input 0 spends unspendable output') - self.log.info("PSBT with invalid values should have error message and Creator as next") - analysis = self.nodes[0].analyzepsbt('cHNidP8BAHECAAAAAfA00BFgAm6tp86RowwH6BMImQNL5zXUcTT97XoLGz0BAAAAAAD/////AgD5ApUAAAAAFgAUKNw0x8HRctAgmvoevm4u1SbN7XL87QKVAAAAABYAFPck4gF7iL4NL4wtfRAKgQbghiTUAAAAAAABAR8AgIFq49AHABYAFJUDtxf2PHo641HEOBOAIvFMNTr2AAAA') - assert_equal(analysis['next'], 'creator') - assert_equal(analysis['error'], 'PSBT is not valid. Input 0 has invalid value') - - self.log.info("PSBT with signed, but not finalized, inputs should have Finalizer as next") - analysis = self.nodes[0].analyzepsbt('cHNidP8BAHECAAAAAZYezcxdnbXoQCmrD79t/LzDgtUo9ERqixk8wgioAobrAAAAAAD9////AlDDAAAAAAAAFgAUy/UxxZuzZswcmFnN/E9DGSiHLUsuGPUFAAAAABYAFLsH5o0R38wXx+X2cCosTMCZnQ4baAAAAAABAR8A4fUFAAAAABYAFOBI2h5thf3+Lflb2LGCsVSZwsltIgIC/i4dtVARCRWtROG0HHoGcaVklzJUcwo5homgGkSNAnJHMEQCIGx7zKcMIGr7cEES9BR4Kdt/pzPTK3fKWcGyCJXb7MVnAiALOBgqlMH4GbC1HDh/HmylmO54fyEy4lKde7/BT/PWxwEBAwQBAAAAIgYC/i4dtVARCRWtROG0HHoGcaVklzJUcwo5homgGkSNAnIYDwVpQ1QAAIABAACAAAAAgAAAAAAAAAAAAAAiAgL+CIiB59NSCssOJRGiMYQK1chahgAaaJpIXE41Cyir+xgPBWlDVAAAgAEAAIAAAACAAQAAAAAAAAAA') - assert_equal(analysis['next'], 'finalizer') - - analysis = self.nodes[0].analyzepsbt('cHNidP8BAHECAAAAAfA00BFgAm6tp86RowwH6BMImQNL5zXUcTT97XoLGz0BAAAAAAD/////AgCAgWrj0AcAFgAUKNw0x8HRctAgmvoevm4u1SbN7XL87QKVAAAAABYAFPck4gF7iL4NL4wtfRAKgQbghiTUAAAAAAABAR8A8gUqAQAAABYAFJUDtxf2PHo641HEOBOAIvFMNTr2AAAA') - assert_equal(analysis['next'], 'creator') - assert_equal(analysis['error'], 'PSBT is not valid. Output amount invalid') - - analysis = self.nodes[0].analyzepsbt('cHNidP8BAJoCAAAAAkvEW8NnDtdNtDpsmze+Ht2LH35IJcKv00jKAlUs21RrAwAAAAD/////S8Rbw2cO1020OmybN74e3Ysffkglwq/TSMoCVSzbVGsBAAAAAP7///8CwLYClQAAAAAWABSNJKzjaUb3uOxixsvh1GGE3fW7zQD5ApUAAAAAFgAUKNw0x8HRctAgmvoevm4u1SbN7XIAAAAAAAEAnQIAAAACczMa321tVHuN4GKWKRncycI22aX3uXgwSFUKM2orjRsBAAAAAP7///9zMxrfbW1Ue43gYpYpGdzJwjbZpfe5eDBIVQozaiuNGwAAAAAA/v///wIA+QKVAAAAABl2qRT9zXUVA8Ls5iVqynLHe5/vSe1XyYisQM0ClQAAAAAWABRmWQUcjSjghQ8/uH4Bn/zkakwLtAAAAAAAAQEfQM0ClQAAAAAWABRmWQUcjSjghQ8/uH4Bn/zkakwLtAAAAA==') - assert_equal(analysis['next'], 'creator') - assert_equal(analysis['error'], 'PSBT is not valid. Input 0 specifies invalid prevout') - - assert_raises_rpc_error(-25, 'Inputs missing or spent', self.nodes[0].walletprocesspsbt, 'cHNidP8BAJoCAAAAAkvEW8NnDtdNtDpsmze+Ht2LH35IJcKv00jKAlUs21RrAwAAAAD/////S8Rbw2cO1020OmybN74e3Ysffkglwq/TSMoCVSzbVGsBAAAAAP7///8CwLYClQAAAAAWABSNJKzjaUb3uOxixsvh1GGE3fW7zQD5ApUAAAAAFgAUKNw0x8HRctAgmvoevm4u1SbN7XIAAAAAAAEAnQIAAAACczMa321tVHuN4GKWKRncycI22aX3uXgwSFUKM2orjRsBAAAAAP7///9zMxrfbW1Ue43gYpYpGdzJwjbZpfe5eDBIVQozaiuNGwAAAAAA/v///wIA+QKVAAAAABl2qRT9zXUVA8Ls5iVqynLHe5/vSe1XyYisQM0ClQAAAAAWABRmWQUcjSjghQ8/uH4Bn/zkakwLtAAAAAAAAQEfQM0ClQAAAAAWABRmWQUcjSjghQ8/uH4Bn/zkakwLtAAAAA==') - # Test that we can fund psbts with external inputs specified eckey = ECKey() eckey.generate() From 70c6c0e2db221e55dde44c2cdefda08c33b78c09 Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Wed, 27 Oct 2021 11:18:57 +0200 Subject: [PATCH 077/144] test: MiniWallet: add P2TR support and use it per default --- test/functional/mempool_compatibility.py | 12 ++++---- test/functional/test_framework/address.py | 28 +++++++++++++++++-- .../test_framework/test_framework.py | 5 ++-- test/functional/test_framework/wallet.py | 22 +++++++-------- 4 files changed, 46 insertions(+), 21 deletions(-) diff --git a/test/functional/mempool_compatibility.py b/test/functional/mempool_compatibility.py index 39d18ca716..dbc09dc885 100755 --- a/test/functional/mempool_compatibility.py +++ b/test/functional/mempool_compatibility.py @@ -7,17 +7,17 @@ NOTE: The test is designed to prevent cases when compatibility is broken accidentally. In case we need to break mempool compatibility we can continue to use the test by just bumping the version number. -Download node binaries: -test/get_previous_releases.py -b v0.19.1 v0.18.1 v0.17.2 v0.16.3 v0.15.2 - -Only v0.15.2 is required by this test. The rest is used in other backwards compatibility tests. +The previous release v0.19.1 is required by this test, see test/README.md. """ import os from test_framework.blocktools import COINBASE_MATURITY from test_framework.test_framework import BGLTestFramework -from test_framework.wallet import MiniWallet +from test_framework.wallet import ( + MiniWallet, + MiniWalletMode, +) class MempoolCompatibilityTest(BGLTestFramework): @@ -40,7 +40,7 @@ def run_test(self): self.log.info("Test that mempool.dat is compatible between versions") old_node, new_node = self.nodes - new_wallet = MiniWallet(new_node) + new_wallet = MiniWallet(new_node, mode=MiniWalletMode.RAW_P2PK) self.generate(new_wallet, 1, sync_fun=self.no_op) self.generate(new_node, COINBASE_MATURITY, sync_fun=self.no_op) # Sync the nodes to ensure old_node has the block that contains the coinbase that new_wallet will spend. diff --git a/test/functional/test_framework/address.py b/test/functional/test_framework/address.py index 98a96cf8d6..c2d9db6f65 100644 --- a/test/functional/test_framework/address.py +++ b/test/functional/test_framework/address.py @@ -5,12 +5,21 @@ """Encode and decode Bitcoin addresses. - base58 P2PKH and P2SH addresses. -- bech32 segwit v0 P2WPKH and P2WSH addresses.""" +- bech32 segwit v0 P2WPKH and P2WSH addresses. +- bech32m segwit v1 P2TR addresses.""" import enum import unittest import sha3 -from .script import hash256, hash160, sha256, CScript, OP_0 +from .script import ( + CScript, + OP_0, + OP_TRUE, + hash160, + hash256, + sha256, + taproot_construct, +) from .segwit_addr import encode_segwit_address from .util import assert_equal @@ -29,6 +38,21 @@ class AddressType(enum.Enum): chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' +def create_deterministic_address_bcrt1_p2tr_op_true(): + """ + Generates a deterministic bech32m address (segwit v1 output) that + can be spent with a witness stack of OP_TRUE and the control block + with internal public key (script-path spending). + + Returns a tuple with the generated address and the internal key. + """ + internal_key = (1).to_bytes(32, 'big') + scriptPubKey = taproot_construct(internal_key, [(None, CScript([OP_TRUE]))]).scriptPubKey + address = encode_segwit_address("rbgl", 1, scriptPubKey[2:]) + assert_equal(address, 'rbgl1p9yfmy5h72durp7zrhlw9lf7jpwjgvwdg0jr0lqmmjtgg83266lqsylg5sy') + return (address, internal_key) + + def byte_to_base58(b, version): result = '' str = b.hex() diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py index 1ad75314b3..613a80fbf6 100755 --- a/test/functional/test_framework/test_framework.py +++ b/test/functional/test_framework/test_framework.py @@ -19,7 +19,7 @@ import time from typing import List -from .address import ADDRESS_BCRT1_P2WSH_OP_TRUE +from .address import create_deterministic_address_bcrt1_p2tr_op_true from .authproxy import JSONRPCException from . import coverage from .p2p import NetworkThread @@ -777,7 +777,8 @@ def _initialize_chain(self): # block in the cache does not age too much (have an old tip age). # This is needed so that we are out of IBD when the test starts, # see the tip age check in IsInitialBlockDownload(). - gen_addresses = [k.address for k in TestNode.PRIV_KEYS][:3] + [ADDRESS_BCRT1_P2WSH_OP_TRUE] + gen_addresses = [k.address for k in TestNode.PRIV_KEYS][:3] + [create_deterministic_address_bcrt1_p2tr_op_true()[0]] + assert_equal(len(gen_addresses), 4) for i in range(8): self.generatetoaddress( cache_node, diff --git a/test/functional/test_framework/wallet.py b/test/functional/test_framework/wallet.py index c87fd98584..d29620f49b 100644 --- a/test/functional/test_framework/wallet.py +++ b/test/functional/test_framework/wallet.py @@ -7,7 +7,6 @@ from copy import deepcopy from decimal import Decimal from enum import Enum -from random import choice from typing import ( Any, List, @@ -15,13 +14,14 @@ ) from test_framework.address import ( base58_to_byte, - ADDRESS_BCRT1_P2WSH_OP_TRUE, + create_deterministic_address_bcrt1_p2tr_op_true, key_to_p2pkh, key_to_p2sh_p2wpkh, key_to_p2wpkh, output_key_to_p2tr, ) - +from random import choice +from typing import Optional from test_framework.descriptors import descsum_create from test_framework.key import ( ECKey, @@ -39,8 +39,9 @@ from test_framework.script import ( CScript, LegacySignatureHash, - OP_TRUE, + LEAF_VERSION_TAPSCRIPT, OP_NOP, + OP_TRUE, SIGHASH_ALL, taproot_construct, ) @@ -56,7 +57,6 @@ assert_equal, assert_greater_than_or_equal, ) -from enum import Enum DEFAULT_FEE = Decimal("0.0001") @@ -64,7 +64,7 @@ class MiniWalletMode(Enum): """Determines the transaction type the MiniWallet is creating and spending. For most purposes, the default mode ADDRESS_OP_TRUE should be sufficient; - it simply uses a fixed bech32 P2WSH address whose coins are spent with a + it simply uses a fixed bech32m P2TR address whose coins are spent with a witness stack of OP_TRUE, i.e. following an anyone-can-spend policy. However, if the transactions need to be modified by the user (e.g. prepending scriptSig for testing opcodes that are activated by a soft-fork), or the txs @@ -74,7 +74,7 @@ class MiniWalletMode(Enum): | output | | tx is | can modify | needs mode | description | address | standard | scriptSig | signing ----------------+-------------------+-----------+----------+------------+---------- - ADDRESS_OP_TRUE | anyone-can-spend | bech32 | yes | no | no + ADDRESS_OP_TRUE | anyone-can-spend | bech32m | yes | no | no RAW_OP_TRUE | anyone-can-spend | - (raw) | no | yes | no RAW_P2PK | pay-to-public-key | - (raw) | yes | yes | yes """ @@ -100,7 +100,7 @@ def __init__(self, test_node, *, mode=MiniWalletMode.ADDRESS_OP_TRUE): pub_key = self._priv_key.get_pubkey() self._scriptPubKey = key_to_p2pk_script(pub_key.get_bytes()) elif mode == MiniWalletMode.ADDRESS_OP_TRUE: - self._address = ADDRESS_BCRT1_P2WSH_OP_TRUE + self._address, self._internal_key = create_deterministic_address_bcrt1_p2tr_op_true() self._scriptPubKey = bytes.fromhex(self._test_node.validateaddress(self._address)['scriptPubKey']) def _create_utxo(self, *, txid, vout, value, height): @@ -283,7 +283,7 @@ def create_self_transfer(self, *, fee_rate=Decimal("0.003"), fee=Decimal("0"), u """Create and return a tx with the specified fee. If fee is 0, use fee_rate, where the resulting fee may be exact or at most one satoshi higher than needed.""" utxo_to_spend = utxo_to_spend or self.get_utxo() if self._priv_key is None: - vsize = Decimal(96) # anyone-can-spend + vsize = Decimal(104) # anyone-can-spend else: vsize = Decimal(168) # P2PK (73 bytes scriptSig + 35 bytes scriptPubKey + 60 bytes other) send_value = utxo_to_spend["value"] - (fee or (fee_rate * vsize / 1000)) @@ -300,10 +300,10 @@ def create_self_transfer(self, *, fee_rate=Decimal("0.003"), fee=Decimal("0"), u self.sign_tx(tx) else: # anyone-can-spend - tx.vin[0].scriptSig = CScript([OP_NOP] * 35) # pad to identical size + tx.vin[0].scriptSig = CScript([OP_NOP] * 43) # pad to identical size else: tx.wit.vtxinwit = [CTxInWitness()] - tx.wit.vtxinwit[0].scriptWitness.stack = [CScript([OP_TRUE])] + tx.wit.vtxinwit[0].scriptWitness.stack = [CScript([OP_TRUE]), bytes([LEAF_VERSION_TAPSCRIPT]) + self._internal_key] tx_hex = tx.serialize().hex() assert_equal(tx.get_vsize(), vsize) From 0d8cb3a61688827751b30be7d0d3248e86806b60 Mon Sep 17 00:00:00 2001 From: Korrrba Date: Tue, 24 Jan 2023 13:56:37 +0100 Subject: [PATCH 078/144] test: feature_utxo_set_hash: Update expected hash and serialized muhash values due to P2TR default support. --- test/functional/feature_utxo_set_hash.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/functional/feature_utxo_set_hash.py b/test/functional/feature_utxo_set_hash.py index 4a97dbbe5a..86d4f7f442 100755 --- a/test/functional/feature_utxo_set_hash.py +++ b/test/functional/feature_utxo_set_hash.py @@ -69,8 +69,8 @@ def test_muhash_implementation(self): assert_equal(finalized[::-1].hex(), node_muhash) self.log.info("Test deterministic UTXO set hash results") - assert_equal(node.gettxoutsetinfo()['hash_serialized_2'], "f4edcc42a569bfef13f56306cf32821774ce36b0868cabbf698859d453b3ee0a") - assert_equal(node.gettxoutsetinfo("muhash")['muhash'], "6aebab920c5c6102e2ae8fe94122c0cf6546e48eb167a9278693c00f7b348436") + assert_equal(node.gettxoutsetinfo()['hash_serialized_2'], "4b7ea0bd09947f5d0d9f983dfce3f590a5a2e1a83aa2ab252561b849d3f23d73") + assert_equal(node.gettxoutsetinfo("muhash")['muhash'], "88f5d8f48b36504974ce92cfd1f91a7000a5bb28288126b81d4788b7250b5b00") def run_test(self): self.test_muhash_implementation() From 569528daaba1adc476ff46b2e1ded6e1575b7ffb Mon Sep 17 00:00:00 2001 From: Korrrba Date: Tue, 24 Jan 2023 14:15:51 +0100 Subject: [PATCH 079/144] test: feature_coinstatsindex: update expected values due to P2TR default support. The root cause for the update is that create_self_transfer in wallet.py uses P2TR as default. --- test/functional/feature_coinstatsindex.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/functional/feature_coinstatsindex.py b/test/functional/feature_coinstatsindex.py index 8db201e644..bbf8be877a 100755 --- a/test/functional/feature_coinstatsindex.py +++ b/test/functional/feature_coinstatsindex.py @@ -129,17 +129,17 @@ def _test_coin_stats_index(self): # Test an older block height that included a normal tx res5 = index_node.gettxoutsetinfo(hash_option, 102) - assert_equal(Decimal(res5['total_unspendable_amount']), Decimal('200.0002592')) + assert_equal(Decimal(res5['total_unspendable_amount']), Decimal('200.00028080')) assert_equal(res5['block_info'], { - 'unspendable': Decimal('0.00025920'), + 'unspendable': Decimal('0.00028080'), 'prevout_spent': 200, - 'new_outputs_ex_coinbase': Decimal('199.99971200'), - 'coinbase': Decimal('200.00002880'), + 'new_outputs_ex_coinbase': Decimal('199.99968800'), + 'coinbase': Decimal('200.00003120'), 'unspendables': { 'genesis_block': 0, 'bip30': 0, 'scripts': 0, - 'unclaimed_rewards': Decimal('0.00025920'), + 'unclaimed_rewards': Decimal('0.00028080'), } }) self.block_sanity_check(res5['block_info']) @@ -166,7 +166,7 @@ def _test_coin_stats_index(self): for hash_option in index_hash_options: # Check all amounts were registered correctly res6 = index_node.gettxoutsetinfo(hash_option, 108) - assert_equal(res6['total_unspendable_amount'], Decimal('220.99976820')) + assert_equal(res6['total_unspendable_amount'], Decimal('220.99978980')) assert_equal(res6['block_info'], { 'unspendable': Decimal('20.99950900'), 'prevout_spent': Decimal('221.00000000'), @@ -197,7 +197,7 @@ def _test_coin_stats_index(self): for hash_option in index_hash_options: res7 = index_node.gettxoutsetinfo(hash_option, 109) - assert_equal(res7['total_unspendable_amount'], Decimal('380.99976820')) + assert_equal(res7['total_unspendable_amount'], Decimal('380.99978980')) assert_equal(res7['block_info'], { 'unspendable': Decimal('160.00000000'), 'prevout_spent': 0, From 9ed0a4aa8e55ff869a2e9c3402dbe91e48eaef7f Mon Sep 17 00:00:00 2001 From: Korrrba Date: Wed, 25 Jan 2023 09:09:28 +0100 Subject: [PATCH 080/144] test: feature_maxuploadtarget: Adjust loop iterations after P2TR support enabled. The generated block size changed after P2TR default support integration, therefore number of iterations in the loop has to be increased to verify the max available upload target. --- test/functional/feature_maxuploadtarget.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/feature_maxuploadtarget.py b/test/functional/feature_maxuploadtarget.py index da8c4220a7..344dccfc7e 100755 --- a/test/functional/feature_maxuploadtarget.py +++ b/test/functional/feature_maxuploadtarget.py @@ -106,7 +106,7 @@ def run_test(self): assert_equal(len(self.nodes[0].getpeerinfo()), 3) # At most a couple more tries should succeed (depending on how long # the test has been running so far). - for _ in range(10): + for _ in range(100): p2p_conns[0].send_message(getdata_request) p2p_conns[0].wait_for_disconnect() assert_equal(len(self.nodes[0].getpeerinfo()), 2) From d79849f52d917d8cb5620ff6e40a839716dcc59e Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Mon, 18 May 2020 18:22:26 +0300 Subject: [PATCH 081/144] Replace thread_local g_lockstack with a mutex-protected map This change prevents UB in case of early g_lockstack destroying. Co-authored-by: Wladimir J. van der Laan --- src/sync.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/sync.cpp b/src/sync.cpp index 0e62201d33..09104fe04a 100644 --- a/src/sync.cpp +++ b/src/sync.cpp @@ -161,6 +161,7 @@ static void push_lock(MutexType* c, const CLockLocation& locklocation) const LockPair p1 = std::make_pair(i.first, c); if (lockdata.lockorders.count(p1)) continue; + lockdata.lockorders.emplace(p1, lock_stack); const LockPair p2 = std::make_pair(c, i.first); if (lockdata.lockorders.count(p2)) { @@ -198,15 +199,17 @@ template void EnterCritical(const char*, const char*, int, std::recursive_mutex* void CheckLastCritical(void* cs, std::string& lockname, const char* guardname, const char* file, int line) { - LockData& lockdata = GetLockData(); - std::lock_guard lock(lockdata.dd_mutex); - - const LockStack& lock_stack = lockdata.m_lock_stacks[std::this_thread::get_id()]; - if (!lock_stack.empty()) { - const auto& lastlock = lock_stack.back(); - if (lastlock.first == cs) { - lockname = lastlock.second.Name(); - return; + { + LockData& lockdata = GetLockData(); + std::lock_guard lock(lockdata.dd_mutex); + + const LockStack& lock_stack = lockdata.m_lock_stacks[std::this_thread::get_id()]; + if (!lock_stack.empty()) { + const auto& lastlock = lock_stack.back(); + if (lastlock.first == cs) { + lockname = lastlock.second.Name(); + return; + } } } From ab4f3afe58f308185897d23ffd1b7896134504ec Mon Sep 17 00:00:00 2001 From: Vasil Dimov Date: Fri, 19 Jun 2020 20:51:16 +0200 Subject: [PATCH 082/144] sync: make EnterCritical() & push_lock() type safe The functions `EnterCritical()` and `push_lock()` take a pointer to a mutex, but that pointer used to be of type `void*` because we use a few different types for mutexes. This `void*` argument was not type safe because somebody could have send a pointer to anything that is not a mutex. Furthermore it wouldn't allow to check whether the passed mutex is recursive or not. Thus, change the functions to templated ones so that we can implement stricter checks for non-recursive mutexes. This also simplifies the callers of `EnterCritical()`. --- src/sync.cpp | 27 +++++++++++++++------------ src/sync.h | 12 +++++++----- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/sync.cpp b/src/sync.cpp index 09104fe04a..3305389ca7 100644 --- a/src/sync.cpp +++ b/src/sync.cpp @@ -13,7 +13,10 @@ #include #include +#include + #include +#include #include #include #include @@ -188,7 +191,8 @@ static void pop_lock() } } -void EnterCritical(const char* pszName, const char* pszFile, int nLine, void* cs, bool fTry) +template +void EnterCritical(const char* pszName, const char* pszFile, int nLine, MutexType* cs, bool fTry) { push_lock(cs, CLockLocation(pszName, pszFile, nLine, fTry, util::ThreadGetInternalName())); } @@ -196,20 +200,19 @@ template void EnterCritical(const char*, const char*, int, Mutex*, bool); template void EnterCritical(const char*, const char*, int, RecursiveMutex*, bool); template void EnterCritical(const char*, const char*, int, std::mutex*, bool); template void EnterCritical(const char*, const char*, int, std::recursive_mutex*, bool); +template void EnterCritical(const char*, const char*, int, boost::mutex*, bool); void CheckLastCritical(void* cs, std::string& lockname, const char* guardname, const char* file, int line) { - { - LockData& lockdata = GetLockData(); - std::lock_guard lock(lockdata.dd_mutex); - - const LockStack& lock_stack = lockdata.m_lock_stacks[std::this_thread::get_id()]; - if (!lock_stack.empty()) { - const auto& lastlock = lock_stack.back(); - if (lastlock.first == cs) { - lockname = lastlock.second.Name(); - return; - } + LockData& lockdata = GetLockData(); + std::lock_guard lock(lockdata.dd_mutex); + + const LockStack& lock_stack = lockdata.m_lock_stacks[std::this_thread::get_id()]; + if (!lock_stack.empty()) { + const auto& lastlock = lock_stack.back(); + if (lastlock.first == cs) { + lockname = lastlock.second.Name(); + return; } } diff --git a/src/sync.h b/src/sync.h index 464ed8d90e..09654fc6c6 100644 --- a/src/sync.h +++ b/src/sync.h @@ -50,7 +50,8 @@ LEAVE_CRITICAL_SECTION(mutex); // no RAII /////////////////////////////// #ifdef DEBUG_LOCKORDER -void EnterCritical(const char* pszName, const char* pszFile, int nLine, void* cs, bool fTry = false); +template +void EnterCritical(const char* pszName, const char* pszFile, int nLine, MutexType* cs, bool fTry = false); void LeaveCritical(); void CheckLastCritical(void* cs, std::string& lockname, const char* guardname, const char* file, int line); std::string LocksHeld(); @@ -68,7 +69,8 @@ bool LockStackEmpty(); */ extern bool g_debug_lockorder_abort; #else -inline void EnterCritical(const char* pszName, const char* pszFile, int nLine, void* cs, bool fTry = false) {} +template +inline void EnterCritical(const char* pszName, const char* pszFile, int nLine, MutexType* cs, bool fTry = false) {} inline void LeaveCritical() {} inline void CheckLastCritical(void* cs, std::string& lockname, const char* guardname, const char* file, int line) {} template @@ -141,7 +143,7 @@ class SCOPED_LOCKABLE UniqueLock : public Base bool TryEnter(const char* pszName, const char* pszFile, int nLine) { - EnterCritical(pszName, pszFile, nLine, (void*)(Base::mutex()), true); + EnterCritical(pszName, pszFile, nLine, Base::mutex(), true); Base::try_lock(); if (!Base::owns_lock()) LeaveCritical(); @@ -198,7 +200,7 @@ class SCOPED_LOCKABLE UniqueLock : public Base ~reverse_lock() { templock.swap(lock); - EnterCritical(lockname.c_str(), file.c_str(), line, (void*)lock.mutex()); + EnterCritical(lockname.c_str(), file.c_str(), line, lock.mutex()); lock.lock(); } @@ -229,7 +231,7 @@ using DebugLock = UniqueLock Date: Mon, 18 May 2020 17:45:46 +0300 Subject: [PATCH 083/144] refactor: Refactor duplicated code into LockHeld() --- src/sync.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/sync.cpp b/src/sync.cpp index 3305389ca7..fdbad3b333 100644 --- a/src/sync.cpp +++ b/src/sync.cpp @@ -261,9 +261,7 @@ static bool LockHeld(void* mutex) template void AssertLockHeldInternal(const char* pszName, const char* pszFile, int nLine, MutexType* cs) { - for (const LockStackItem& i : g_lockstack) - if (i.first == cs) - return; + if (LockHeld(cs)) return; tfm::format(std::cerr, "Assertion failed: lock %s not held in %s:%i; locks held:\n%s", pszName, pszFile, nLine, LocksHeld()); abort(); } @@ -273,12 +271,9 @@ template void AssertLockHeldInternal(const char*, const char*, int, RecursiveMut template void AssertLockNotHeldInternal(const char* pszName, const char* pszFile, int nLine, MutexType* cs) { - for (const LockStackItem& i : g_lockstack) { - if (i.first == cs) { - tfm::format(std::cerr, "Assertion failed: lock %s held in %s:%i; locks held:\n%s", pszName, pszFile, nLine, LocksHeld()); - abort(); - } - } + if (!LockHeld(cs)) return; + tfm::format(std::cerr, "Assertion failed: lock %s held in %s:%i; locks held:\n%s", pszName, pszFile, nLine, LocksHeld()); + abort(); } template void AssertLockNotHeldInternal(const char*, const char*, int, Mutex*); template void AssertLockNotHeldInternal(const char*, const char*, int, RecursiveMutex*); From 51800e3a462d043be214f5f99f02a0715399f1dd Mon Sep 17 00:00:00 2001 From: glozow Date: Fri, 26 Feb 2021 13:44:40 -0800 Subject: [PATCH 084/144] [net_processing] ignore all transactions during ibd Co-authored-by: Amiti Uttarwar --- src/net_processing.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 2185ccc700..615db73417 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -3206,6 +3206,11 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type, return; } + // Stop processing the transaction early if we are still in IBD since we don't + // have enough information to validate it yet. Sending unsolicited transactions + // is not considered a protocol violation, so don't punish the peer. + if (m_chainman.ActiveChainstate().IsInitialBlockDownload()) return; + CTransactionRef ptx; vRecv >> ptx; const CTransaction& tx = *ptx; From 31373cc3235ede337e2cfc6ac67a6cc097fc7c78 Mon Sep 17 00:00:00 2001 From: MarcoFalke Date: Wed, 15 Sep 2021 11:10:51 +0200 Subject: [PATCH 085/144] doc: Fix incorrect C++ named args --- src/bench/rpc_mempool.cpp | 2 +- src/net.cpp | 2 +- src/net_processing.cpp | 2 +- src/qt/test/test_main.cpp | 2 +- src/rpc/mining.cpp | 2 +- src/rpc/rawtransaction.cpp | 4 ++-- src/test/denialofservice_tests.cpp | 24 ++++++++++++------------ src/test/fuzz/tx_pool.cpp | 2 +- src/test/validation_block_tests.cpp | 2 +- 9 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/bench/rpc_mempool.cpp b/src/bench/rpc_mempool.cpp index f1eeef8885..67c827d0d3 100644 --- a/src/bench/rpc_mempool.cpp +++ b/src/bench/rpc_mempool.cpp @@ -12,7 +12,7 @@ static void AddTx(const CTransactionRef& tx, const CAmount& fee, CTxMemPool& pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs) { LockPoints lp; - pool.addUnchecked(CTxMemPoolEntry(tx, fee, /* time */ 0, /* height */ 1, /* spendsCoinbase */ false, /* sigOpCost */ 4, lp)); + pool.addUnchecked(CTxMemPoolEntry(tx, fee, /*time=*/0, /*entry_height=*/1, /*spends_coinbase=*/false, /*sigops_cost=*/4, lp)); } static void RpcMempool(benchmark::Bench& bench) diff --git a/src/net.cpp b/src/net.cpp index 7dc4da590e..6ca996cb45 100755 --- a/src/net.cpp +++ b/src/net.cpp @@ -2998,7 +2998,7 @@ void CConnman::PushMessage(CNode* pnode, CSerializedNetMsg&& msg) size_t nMessageSize = msg.data.size(); LogPrint(BCLog::NET, "sending %s (%d bytes) peer=%d\n", msg.m_type, nMessageSize, pnode->GetId()); if (gArgs.GetBoolArg("-capturemessages", false)) { - CaptureMessage(pnode->addr, msg.m_type, msg.data, /* incoming */ false); + CaptureMessage(pnode->addr, msg.m_type, msg.data, /*is_incoming=*/false); } TRACE6(net, outbound_message, diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 615db73417..3f755eb178 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -4110,7 +4110,7 @@ bool PeerManagerImpl::ProcessMessages(CNode* pfrom, std::atomic& interrupt ); if (gArgs.GetBoolArg("-capturemessages", false)) { - CaptureMessage(pfrom->addr, msg.m_command, MakeUCharSpan(msg.m_recv), /* incoming */ true); + CaptureMessage(pfrom->addr, msg.m_command, MakeUCharSpan(msg.m_recv), /*is_incoming=*/true); } msg.SetVersion(pfrom->GetCommonVersion()); diff --git a/src/qt/test/test_main.cpp b/src/qt/test/test_main.cpp index 896b80c114..f0dad99159 100644 --- a/src/qt/test/test_main.cpp +++ b/src/qt/test/test_main.cpp @@ -69,7 +69,7 @@ int main(int argc, char* argv[]) #if defined(WIN32) if (getenv("QT_QPA_PLATFORM") == nullptr) _putenv_s("QT_QPA_PLATFORM", "minimal"); #else - setenv("QT_QPA_PLATFORM", "minimal", /* overwrite */ 0); + setenv("QT_QPA_PLATFORM", "minimal", 0 /* overwrite */); #endif // Don't remove this, it's needed to access diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index 518c41d12a..9e2b1ab07e 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -1010,7 +1010,7 @@ static RPCHelpMan submitblock() bool new_block; auto sc = std::make_shared(block.GetHash()); RegisterSharedValidationInterface(sc); - bool accepted = chainman.ProcessNewBlock(Params(), blockptr, /* fForceProcessing */ true, /* fNewBlock */ &new_block); + bool accepted = chainman.ProcessNewBlock(Params(), blockptr, /*force_processing=*/true, /*new_block=*/&new_block); UnregisterSharedValidationInterface(sc); if (!new_block && accepted) { return "duplicate"; diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp index 28e70c8c05..380b62730c 100644 --- a/src/rpc/rawtransaction.cpp +++ b/src/rpc/rawtransaction.cpp @@ -1619,7 +1619,7 @@ static RPCHelpMan utxoupdatepsbt() } } // We don't actually need private keys further on; hide them as a precaution. - HidingSigningProvider public_provider(&provider, /* nosign */ true, /* nobip32derivs */ false); + HidingSigningProvider public_provider(&provider, /*hide_secret=*/true, /*hide_origin=*/false); // Fetch previous transactions (inputs): CCoinsView viewDummy; @@ -1658,7 +1658,7 @@ static RPCHelpMan utxoupdatepsbt() // Update script/keypath information using descriptor data. // Note that SignPSBTInput does a lot more than just constructing ECDSA signatures // we don't actually care about those here, in fact. - SignPSBTInput(public_provider, psbtx, i, &txdata, /* sighash_type */ 1); + SignPSBTInput(public_provider, psbtx, i, &txdata, /*sighash=*/1); } // Update script/keypath information using descriptor data. diff --git a/src/test/denialofservice_tests.cpp b/src/test/denialofservice_tests.cpp index 668ff150ee..765663e0ef 100644 --- a/src/test/denialofservice_tests.cpp +++ b/src/test/denialofservice_tests.cpp @@ -59,7 +59,7 @@ BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction) // Mock an outbound peer CAddress addr1(ip(0xa0b0c001), NODE_NONE); - CNode dummyNode1(id++, ServiceFlags(NODE_NETWORK | NODE_WITNESS), INVALID_SOCKET, addr1, /* nKeyedNetGroupIn */ 0, /* nLocalHostNonceIn */ 0, CAddress(), /* pszDest */ "", ConnectionType::OUTBOUND_FULL_RELAY, /* inbound_onion */ false); + CNode dummyNode1(id++, ServiceFlags(NODE_NETWORK | NODE_WITNESS), INVALID_SOCKET, addr1, /*nKeyedNetGroupIn=*/0, /*nLocalHostNonceIn=*/0, CAddress(), /*addrNameIn=*/"", ConnectionType::OUTBOUND_FULL_RELAY, /*inbound_onion=*/false); dummyNode1.SetCommonVersion(PROTOCOL_VERSION); peerLogic->InitializeNode(&dummyNode1); @@ -108,7 +108,7 @@ BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction) static void AddRandomOutboundPeer(std::vector& vNodes, PeerManager& peerLogic, ConnmanTestMsg& connman) { CAddress addr(ip(g_insecure_rand_ctx.randbits(32)), NODE_NONE); - vNodes.emplace_back(new CNode(id++, ServiceFlags(NODE_NETWORK | NODE_WITNESS), INVALID_SOCKET, addr, /* nKeyedNetGroupIn */ 0, /* nLocalHostNonceIn */ 0, CAddress(), /* pszDest */ "", ConnectionType::OUTBOUND_FULL_RELAY, /* inbound_onion */ false)); + vNodes.emplace_back(new CNode(id++, ServiceFlags(NODE_NETWORK | NODE_WITNESS), INVALID_SOCKET, addr, /*nKeyedNetGroupIn=*/0, /*nLocalHostNonceIn=*/0, CAddress(), /*addrNameIn=*/"", ConnectionType::OUTBOUND_FULL_RELAY, /*inbound_onion=*/false)); CNode &node = *vNodes.back(); node.SetCommonVersion(PROTOCOL_VERSION); @@ -212,9 +212,9 @@ BOOST_AUTO_TEST_CASE(peer_discouragement) std::array nodes; banman->ClearBanned(); - nodes[0] = new CNode{id++, NODE_NETWORK, INVALID_SOCKET, addr[0], /* nKeyedNetGroupIn */ 0, - /* nLocalHostNonceIn */ 0, CAddress(), /* pszDest */ "", - ConnectionType::INBOUND, /* inbound_onion */ false}; + nodes[0] = new CNode{id++, NODE_NETWORK, INVALID_SOCKET, addr[0], /*nKeyedNetGroupIn=*/0, + /*nLocalHostNonceIn */ 0, CAddress(), /*addrNameIn=*/"", + ConnectionType::INBOUND, /*inbound_onion=*/false}; nodes[0]->SetCommonVersion(PROTOCOL_VERSION); peerLogic->InitializeNode(nodes[0]); nodes[0]->fSuccessfullyConnected = true; @@ -228,9 +228,9 @@ BOOST_AUTO_TEST_CASE(peer_discouragement) BOOST_CHECK(nodes[0]->fDisconnect); BOOST_CHECK(!banman->IsDiscouraged(other_addr)); // Different address, not discouraged - nodes[1] = new CNode{id++, NODE_NETWORK, INVALID_SOCKET, addr[1], /* nKeyedNetGroupIn */ 1, - /* nLocalHostNonceIn */ 1, CAddress(), /* pszDest */ "", - ConnectionType::INBOUND, /* inbound_onion */ false}; + nodes[1] = new CNode{id++, NODE_NETWORK, INVALID_SOCKET, addr[1], /*nKeyedNetGroupIn=*/1, + /*nLocalHostNonceIn */ 1, CAddress(), /*addrNameIn=*/"", + ConnectionType::INBOUND, /*inbound_onion=*/false}; nodes[1]->SetCommonVersion(PROTOCOL_VERSION); peerLogic->InitializeNode(nodes[1]); nodes[1]->fSuccessfullyConnected = true; @@ -259,9 +259,9 @@ BOOST_AUTO_TEST_CASE(peer_discouragement) // Make sure non-IP peers are discouraged and disconnected properly. - nodes[2] = new CNode{id++, NODE_NETWORK, INVALID_SOCKET, addr[2], /* nKeyedNetGroupIn */ 1, - /* nLocalHostNonceIn */ 1, CAddress(), /* pszDest */ "", - ConnectionType::OUTBOUND_FULL_RELAY, /* inbound_onion */ false}; + nodes[2] = new CNode{id++, NODE_NETWORK, INVALID_SOCKET, addr[2], /*nKeyedNetGroupIn=*/1, + /*nLocalHostNonceIn */ 1, CAddress(), /*addrNameIn=*/"", + ConnectionType::OUTBOUND_FULL_RELAY, /*inbound_onion=*/false}; nodes[2]->SetCommonVersion(PROTOCOL_VERSION); peerLogic->InitializeNode(nodes[2]); nodes[2]->fSuccessfullyConnected = true; @@ -297,7 +297,7 @@ BOOST_AUTO_TEST_CASE(DoS_bantime) SetMockTime(nStartTime); // Overrides future calls to GetTime() CAddress addr(ip(0xa0b0c001), NODE_NONE); - CNode dummyNode(id++, NODE_NETWORK, INVALID_SOCKET, addr, /* nKeyedNetGroupIn */ 4, /* nLocalHostNonceIn */ 4, CAddress(), /* pszDest */ "", ConnectionType::INBOUND, /* inbound_onion */ false); + CNode dummyNode(id++, NODE_NETWORK, INVALID_SOCKET, addr, /*nKeyedNetGroupIn=*/4, /*nLocalHostNonceIn=*/4, CAddress(), /*addrNameIn=*/"", ConnectionType::INBOUND, /*inbound_onion=*/false); dummyNode.SetCommonVersion(PROTOCOL_VERSION); peerLogic->InitializeNode(&dummyNode); dummyNode.fSuccessfullyConnected = true; diff --git a/src/test/fuzz/tx_pool.cpp b/src/test/fuzz/tx_pool.cpp index 17b5ef88b9..752e882608 100644 --- a/src/test/fuzz/tx_pool.cpp +++ b/src/test/fuzz/tx_pool.cpp @@ -93,7 +93,7 @@ void Finish(FuzzedDataProvider& fuzzed_data_provider, MockedTxPool& tx_pool, CCh const auto info_all = tx_pool.infoAll(); if (!info_all.empty()) { const auto& tx_to_remove = *PickValue(fuzzed_data_provider, info_all).tx; - WITH_LOCK(tx_pool.cs, tx_pool.removeRecursive(tx_to_remove, /* dummy */ MemPoolRemovalReason::BLOCK)); + WITH_LOCK(tx_pool.cs, tx_pool.removeRecursive(tx_to_remove, MemPoolRemovalReason::BLOCK /* dummy */)); std::vector all_txids; tx_pool.queryHashes(all_txids); assert(all_txids.size() < info_all.size()); diff --git a/src/test/validation_block_tests.cpp b/src/test/validation_block_tests.cpp index 8a48d539f8..54873ce6fa 100644 --- a/src/test/validation_block_tests.cpp +++ b/src/test/validation_block_tests.cpp @@ -222,7 +222,7 @@ BOOST_AUTO_TEST_CASE(mempool_locks_reorg) { bool ignored; auto ProcessBlock = [&](std::shared_ptr block) -> bool { - return Assert(m_node.chainman)->ProcessNewBlock(Params(), block, /* fForceProcessing */ true, /* fNewBlock */ &ignored); + return Assert(m_node.chainman)->ProcessNewBlock(Params(), block, /*force_processing=*/true, /*new_block=*/&ignored); }; // Process all mined blocks From ee440cac15cc5febc92c36788aec07485ee75966 Mon Sep 17 00:00:00 2001 From: Martin Zumsande Date: Mon, 29 Nov 2021 16:33:00 +0100 Subject: [PATCH 086/144] p2p: Don't use timestamps from inbound peers This makes it harder for others to tamper with our adjusted time. --- src/net_processing.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 3f755eb178..04fb2f3c33 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -2683,7 +2683,11 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type, int64_t nTimeOffset = nTime - GetTime(); pfrom.nTimeOffset = nTimeOffset; - AddTimeData(pfrom.addr, nTimeOffset); + if (!pfrom.IsInboundConn()) { + // Don't use timedata samples from inbound peers to make it + // harder for others to tamper with our adjusted time. + AddTimeData(pfrom.addr, nTimeOffset); + } // If the peer is old enough to have the old alert system, send it the final alert. if (greatest_common_version <= 70012) { From 5ef4b9bf25a67c615a77d240a344f9e6ded58c7d Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Mon, 1 Nov 2021 16:32:53 -0400 Subject: [PATCH 087/144] Replace MakeSpan helper with Span deduction guide --- src/base58.cpp | 2 +- src/compressor.h | 8 +-- src/net_processing.cpp | 2 +- src/netaddress.cpp | 8 +-- src/netaddress.h | 2 +- src/policy/policy.cpp | 2 +- src/psbt.h | 2 +- src/pubkey.h | 4 +- src/script/descriptor.cpp | 6 +- src/script/sign.cpp | 2 +- src/script/sign.h | 2 +- src/span.h | 20 +++--- src/test/crypto_tests.cpp | 4 +- src/test/net_tests.cpp | 140 +++++++++++++++++++------------------- src/test/script_tests.cpp | 2 +- src/wallet/rpcwallet.cpp | 2 +- 16 files changed, 105 insertions(+), 103 deletions(-) diff --git a/src/base58.cpp b/src/base58.cpp index fb04673c5c..b122e0055e 100644 --- a/src/base58.cpp +++ b/src/base58.cpp @@ -149,7 +149,7 @@ std::string EncodeBase58Check(Span input) return false; } // re-calculate the checksum, ensure it matches the included 4-byte checksum - uint256 hash = Hash(MakeSpan(vchRet).first(vchRet.size() - 4)); + uint256 hash = Hash(Span{vchRet}.first(vchRet.size() - 4)); if (memcmp(&hash, &vchRet[vchRet.size() - 4], 4) != 0) { vchRet.clear(); return false; diff --git a/src/compressor.h b/src/compressor.h index c267face0c..3711a55271 100644 --- a/src/compressor.h +++ b/src/compressor.h @@ -53,12 +53,12 @@ struct ScriptCompression void Ser(Stream &s, const CScript& script) { std::vector compr; if (CompressScript(script, compr)) { - s << MakeSpan(compr); + s << Span{compr}; return; } unsigned int nSize = script.size() + nSpecialScripts; s << VARINT(nSize); - s << MakeSpan(script); + s << Span{script}; } template @@ -67,7 +67,7 @@ struct ScriptCompression s >> VARINT(nSize); if (nSize < nSpecialScripts) { std::vector vch(GetSpecialScriptSize(nSize), 0x00); - s >> MakeSpan(vch); + s >> Span{vch}; DecompressScript(script, nSize, vch); return; } @@ -78,7 +78,7 @@ struct ScriptCompression s.ignore(nSize); } else { script.resize(nSize); - s >> MakeSpan(script); + s >> Span{script}; } } }; diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 04fb2f3c33..f352246b0d 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -1815,7 +1815,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv& if (!ReadRawBlockFromDisk(block_data, pindex, m_chainparams.MessageStart())) { assert(!"cannot load block from disk"); } - m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::BLOCK, MakeSpan(block_data))); + m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::BLOCK, Span{block_data})); // Don't set pblock as we've sent the block } else { // Send block from disk diff --git a/src/netaddress.cpp b/src/netaddress.cpp index f9fff5a6d5..a787e5672d 100644 --- a/src/netaddress.cpp +++ b/src/netaddress.cpp @@ -196,7 +196,7 @@ static void Checksum(Span addr_pubkey, uint8_t (&checksum)[CHECKS SHA3_256 hasher; - hasher.Write(MakeSpan(prefix).first(prefix_len)); + hasher.Write(Span{prefix}.first(prefix_len)); hasher.Write(addr_pubkey); hasher.Write(VERSION); @@ -693,13 +693,13 @@ uint32_t CNetAddr::GetLinkedIPv4() const return ReadBE32(m_addr.data()); } else if (IsRFC6052() || IsRFC6145()) { // mapped IPv4, SIIT translated IPv4: the IPv4 address is the last 4 bytes of the address - return ReadBE32(MakeSpan(m_addr).last(ADDR_IPV4_SIZE).data()); + return ReadBE32(Span{m_addr}.last(ADDR_IPV4_SIZE).data()); } else if (IsRFC3964()) { // 6to4 tunneled IPv4: the IPv4 address is in bytes 2-6 - return ReadBE32(MakeSpan(m_addr).subspan(2, ADDR_IPV4_SIZE).data()); + return ReadBE32(Span{m_addr}.subspan(2, ADDR_IPV4_SIZE).data()); } else if (IsRFC4380()) { // Teredo tunneled IPv4: the IPv4 address is in the last 4 bytes of the address, but bitflipped - return ~ReadBE32(MakeSpan(m_addr).last(ADDR_IPV4_SIZE).data()); + return ~ReadBE32(Span{m_addr}.last(ADDR_IPV4_SIZE).data()); } assert(false); } diff --git a/src/netaddress.h b/src/netaddress.h index 80d341cd65..75ae4157fb 100644 --- a/src/netaddress.h +++ b/src/netaddress.h @@ -427,7 +427,7 @@ class CNetAddr if (SetNetFromBIP155Network(bip155_net, address_size)) { m_addr.resize(address_size); - s >> MakeSpan(m_addr); + s >> Span{m_addr}; if (m_net != NET_IPV6) { return; diff --git a/src/policy/policy.cpp b/src/policy/policy.cpp index fced397e51..78f6892e24 100644 --- a/src/policy/policy.cpp +++ b/src/policy/policy.cpp @@ -254,7 +254,7 @@ bool IsWitnessStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs) // - No annexes if (witnessversion == 1 && witnessprogram.size() == WITNESS_V1_TAPROOT_SIZE && !p2sh) { // Taproot spend (non-P2SH-wrapped, version 1, witness program size 32; see BIP 341) - auto stack = MakeSpan(tx.vin[i].scriptWitness.stack); + Span stack{tx.vin[i].scriptWitness.stack}; if (stack.size() >= 2 && !stack.back().empty() && stack.back()[0] == ANNEX_TAG) { // Annexes are nonstandard as long as no semantics are defined for them. return false; diff --git a/src/psbt.h b/src/psbt.h index 0a42fe7626..53f2aa2686 100644 --- a/src/psbt.h +++ b/src/psbt.h @@ -81,7 +81,7 @@ struct PSBTInput if (final_script_sig.empty() && final_script_witness.IsNull()) { // Write any partial signatures for (auto sig_pair : partial_sigs) { - SerializeToVector(s, PSBT_IN_PARTIAL_SIG, MakeSpan(sig_pair.second.first)); + SerializeToVector(s, PSBT_IN_PARTIAL_SIG, Span{sig_pair.second.first}); s << sig_pair.second.second; } diff --git a/src/pubkey.h b/src/pubkey.h index 4995732def..ba8b6f2221 100644 --- a/src/pubkey.h +++ b/src/pubkey.h @@ -159,13 +159,13 @@ class CPubKey //! Get the KeyID of this public key (hash of its serialization) CKeyID GetID() const { - return CKeyID(Hash160(MakeSpan(vch).first(size()))); + return CKeyID(Hash160(Span{vch}.first(size()))); } //! Get the 256-bit hash of this public key. uint256 GetHash() const { - return Hash(MakeSpan(vch).first(size())); + return Hash(Span{vch}.first(size())); } /* diff --git a/src/script/descriptor.cpp b/src/script/descriptor.cpp index abe45dcd93..59715f43a2 100644 --- a/src/script/descriptor.cpp +++ b/src/script/descriptor.cpp @@ -631,7 +631,7 @@ class DescriptorImpl : public Descriptor out.origins.emplace(entry.first.GetID(), std::make_pair(CPubKey(entry.first), std::move(entry.second))); } - output_scripts = MakeScripts(pubkeys, MakeSpan(subscripts), out); + output_scripts = MakeScripts(pubkeys, Span{subscripts}, out); return true; } @@ -974,10 +974,10 @@ std::unique_ptr ParsePubkeyInner(uint32_t key_exp_index, const S } KeyPath path; DeriveType type = DeriveType::NO; - if (split.back() == MakeSpan("*").first(1)) { + if (split.back() == Span{"*"}.first(1)) { split.pop_back(); type = DeriveType::UNHARDENED; - } else if (split.back() == MakeSpan("*'").first(2) || split.back() == MakeSpan("*h").first(2)) { + } else if (split.back() == Span{"*'"}.first(2) || split.back() == Span{"*h"}.first(2)) { split.pop_back(); type = DeriveType::HARDENED; } diff --git a/src/script/sign.cpp b/src/script/sign.cpp index 3fbd395425..368fae04c1 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -166,7 +166,7 @@ static bool SignTaprootScript(const SigningProvider& provider, const BaseSignatu // OP_CHECKSIG if (script.size() == 34 && script[33] == OP_CHECKSIG && script[0] == 0x20) { - XOnlyPubKey pubkey(MakeSpan(script).subspan(1, 32)); + XOnlyPubKey pubkey{Span{script}.subspan(1, 32)}; std::vector sig; if (CreateTaprootScriptSig(creator, sigdata, provider, sig, pubkey, leaf_hash, sigversion)) { result = Vector(std::move(sig)); diff --git a/src/script/sign.h b/src/script/sign.h index 9d9d4cd172..8e517a552c 100644 --- a/src/script/sign.h +++ b/src/script/sign.h @@ -149,7 +149,7 @@ void SerializeHDKeypaths(Stream& s, const std::map& hd_k if (!keypath_pair.first.IsValid()) { throw std::ios_base::failure("Invalid CPubKey being serialized"); } - SerializeToVector(s, type, MakeSpan(keypath_pair.first)); + SerializeToVector(s, type, Span{keypath_pair.first}); WriteCompactSize(s, (keypath_pair.second.path.size() + 1) * sizeof(uint32_t)); s << keypath_pair.second.fingerprint; for (const auto& path : keypath_pair.second.path) { diff --git a/src/span.h b/src/span.h index 1977ea42ca..73f50dcdfb 100644 --- a/src/span.h +++ b/src/span.h @@ -188,13 +188,15 @@ class Span template friend class Span; }; -// MakeSpan helps constructing a Span of the right type automatically. -/** MakeSpan for arrays: */ -template Span
    constexpr MakeSpan(A (&a)[N]) { return Span(a, N); } -/** MakeSpan for temporaries / rvalue references, only supporting const output. */ -template constexpr auto MakeSpan(V&& v) -> typename std::enable_if::value, Span::type>>::type { return std::forward(v); } -/** MakeSpan for (lvalue) references, supporting mutable output. */ -template constexpr auto MakeSpan(V& v) -> Span::type> { return v; } +// Deduction guides for Span +// For the pointer/size based and iterator based constructor: +template Span(T*, EndOrSize) -> Span; +// For the array constructor: +template Span(T (&)[N]) -> Span; +// For the temporaries/rvalue references constructor, only supporting const output. +template Span(T&&) -> Span, const std::remove_pointer_t().data())>>>; +// For (lvalue) references, supporting mutable output. +template Span(T&) -> Span().data())>>; /** Pop the last element off a span, and return a reference to that element. */ template @@ -216,7 +218,7 @@ inline const unsigned char* UCharCast(const unsigned char* c) { return c; } // Helper function to safely convert a Span to a Span<[const] unsigned char>. template constexpr auto UCharSpanCast(Span s) -> Span::type> { return {UCharCast(s.data()), s.size()}; } -/** Like MakeSpan, but for (const) unsigned char member types only. Only works for (un)signed char containers. */ -template constexpr auto MakeUCharSpan(V&& v) -> decltype(UCharSpanCast(MakeSpan(std::forward(v)))) { return UCharSpanCast(MakeSpan(std::forward(v))); } +/** Like the Span constructor, but for (const) unsigned char member types only. Only works for (un)signed char containers. */ +template constexpr auto MakeUCharSpan(V&& v) -> decltype(UCharSpanCast(Span{std::forward(v)})) { return UCharSpanCast(Span{std::forward(v)}); } #endif diff --git a/src/test/crypto_tests.cpp b/src/test/crypto_tests.cpp index 68101b1ce2..3494ac8acf 100644 --- a/src/test/crypto_tests.cpp +++ b/src/test/crypto_tests.cpp @@ -770,8 +770,8 @@ static void TestSHA3_256(const std::string& input, const std::string& output) int s1 = InsecureRandRange(in_bytes.size() + 1); int s2 = InsecureRandRange(in_bytes.size() + 1 - s1); int s3 = in_bytes.size() - s1 - s2; - sha.Write(MakeSpan(in_bytes).first(s1)).Write(MakeSpan(in_bytes).subspan(s1, s2)); - sha.Write(MakeSpan(in_bytes).last(s3)).Finalize(out); + sha.Write(Span{in_bytes}.first(s1)).Write(Span{in_bytes}.subspan(s1, s2)); + sha.Write(Span{in_bytes}.last(s3)).Finalize(out); BOOST_CHECK(std::equal(std::begin(out_bytes), std::end(out_bytes), out)); } diff --git a/src/test/net_tests.cpp b/src/test/net_tests.cpp index 29938d4ede..f8fa26d907 100644 --- a/src/test/net_tests.cpp +++ b/src/test/net_tests.cpp @@ -386,9 +386,9 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2) s.SetVersion(s.GetVersion() | ADDRV2_FORMAT); // Valid IPv4. - s << MakeSpan(ParseHex("01" // network type (IPv4) - "04" // address length - "01020304")); // address + s << Span{ParseHex("01" // network type (IPv4) + "04" // address length + "01020304")}; // address s >> addr; BOOST_CHECK(addr.IsValid()); BOOST_CHECK(addr.IsIPv4()); @@ -397,35 +397,35 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2) BOOST_REQUIRE(s.empty()); // Invalid IPv4, valid length but address itself is shorter. - s << MakeSpan(ParseHex("01" // network type (IPv4) - "04" // address length - "0102")); // address + s << Span{ParseHex("01" // network type (IPv4) + "04" // address length + "0102")}; // address BOOST_CHECK_EXCEPTION(s >> addr, std::ios_base::failure, HasReason("end of data")); BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input. s.clear(); // Invalid IPv4, with bogus length. - s << MakeSpan(ParseHex("01" // network type (IPv4) - "05" // address length - "01020304")); // address + s << Span{ParseHex("01" // network type (IPv4) + "05" // address length + "01020304")}; // address BOOST_CHECK_EXCEPTION(s >> addr, std::ios_base::failure, HasReason("BIP155 IPv4 address with length 5 (should be 4)")); BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input. s.clear(); // Invalid IPv4, with extreme length. - s << MakeSpan(ParseHex("01" // network type (IPv4) - "fd0102" // address length (513 as CompactSize) - "01020304")); // address + s << Span{ParseHex("01" // network type (IPv4) + "fd0102" // address length (513 as CompactSize) + "01020304")}; // address BOOST_CHECK_EXCEPTION(s >> addr, std::ios_base::failure, HasReason("Address too long: 513 > 512")); BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input. s.clear(); // Valid IPv6. - s << MakeSpan(ParseHex("02" // network type (IPv6) - "10" // address length - "0102030405060708090a0b0c0d0e0f10")); // address + s << Span{ParseHex("02" // network type (IPv6) + "10" // address length + "0102030405060708090a0b0c0d0e0f10")}; // address s >> addr; BOOST_CHECK(addr.IsValid()); BOOST_CHECK(addr.IsIPv6()); @@ -434,10 +434,10 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2) BOOST_REQUIRE(s.empty()); // Valid IPv6, contains embedded "internal". - s << MakeSpan(ParseHex( + s << Span{ParseHex( "02" // network type (IPv6) "10" // address length - "fd6b88c08724ca978112ca1bbdcafac2")); // address: 0xfd + sha256("bitcoin")[0:5] + + "fd6b88c08724ca978112ca1bbdcafac2")}; // address: 0xfd + sha256("bitcoin")[0:5] + // sha256(name)[0:10] s >> addr; BOOST_CHECK(addr.IsInternal()); @@ -446,44 +446,44 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2) BOOST_REQUIRE(s.empty()); // Invalid IPv6, with bogus length. - s << MakeSpan(ParseHex("02" // network type (IPv6) - "04" // address length - "00")); // address + s << Span{ParseHex("02" // network type (IPv6) + "04" // address length + "00")}; // address BOOST_CHECK_EXCEPTION(s >> addr, std::ios_base::failure, HasReason("BIP155 IPv6 address with length 4 (should be 16)")); BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input. s.clear(); // Invalid IPv6, contains embedded IPv4. - s << MakeSpan(ParseHex("02" // network type (IPv6) - "10" // address length - "00000000000000000000ffff01020304")); // address + s << Span{ParseHex("02" // network type (IPv6) + "10" // address length + "00000000000000000000ffff01020304")}; // address s >> addr; BOOST_CHECK(!addr.IsValid()); BOOST_REQUIRE(s.empty()); // Invalid IPv6, contains embedded TORv2. - s << MakeSpan(ParseHex("02" // network type (IPv6) - "10" // address length - "fd87d87eeb430102030405060708090a")); // address + s << Span{ParseHex("02" // network type (IPv6) + "10" // address length + "fd87d87eeb430102030405060708090a")}; // address s >> addr; BOOST_CHECK(!addr.IsValid()); BOOST_REQUIRE(s.empty()); // TORv2, no longer supported. - s << MakeSpan(ParseHex("03" // network type (TORv2) - "0a" // address length - "f1f2f3f4f5f6f7f8f9fa")); // address + s << Span{ParseHex("03" // network type (TORv2) + "0a" // address length + "f1f2f3f4f5f6f7f8f9fa")}; // address s >> addr; BOOST_CHECK(!addr.IsValid()); BOOST_REQUIRE(s.empty()); // Valid TORv3. - s << MakeSpan(ParseHex("04" // network type (TORv3) - "20" // address length - "79bcc625184b05194975c28b66b66b04" // address - "69f7f6556fb1ac3189a79b40dda32f1f" - )); + s << Span{ParseHex("04" // network type (TORv3) + "20" // address length + "79bcc625184b05194975c28b66b66b04" // address + "69f7f6556fb1ac3189a79b40dda32f1f" + )}; s >> addr; BOOST_CHECK(addr.IsValid()); BOOST_CHECK(addr.IsTor()); @@ -493,20 +493,20 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2) BOOST_REQUIRE(s.empty()); // Invalid TORv3, with bogus length. - s << MakeSpan(ParseHex("04" // network type (TORv3) - "00" // address length - "00" // address - )); + s << Span{ParseHex("04" // network type (TORv3) + "00" // address length + "00" // address + )}; BOOST_CHECK_EXCEPTION(s >> addr, std::ios_base::failure, HasReason("BIP155 TORv3 address with length 0 (should be 32)")); BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input. s.clear(); // Valid I2P. - s << MakeSpan(ParseHex("05" // network type (I2P) - "20" // address length - "a2894dabaec08c0051a481a6dac88b64" // address - "f98232ae42d4b6fd2fa81952dfe36a87")); + s << Span{ParseHex("05" // network type (I2P) + "20" // address length + "a2894dabaec08c0051a481a6dac88b64" // address + "f98232ae42d4b6fd2fa81952dfe36a87")}; s >> addr; BOOST_CHECK(addr.IsValid()); BOOST_CHECK(addr.IsI2P()); @@ -516,20 +516,20 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2) BOOST_REQUIRE(s.empty()); // Invalid I2P, with bogus length. - s << MakeSpan(ParseHex("05" // network type (I2P) - "03" // address length - "00" // address - )); + s << Span{ParseHex("05" // network type (I2P) + "03" // address length + "00" // address + )}; BOOST_CHECK_EXCEPTION(s >> addr, std::ios_base::failure, HasReason("BIP155 I2P address with length 3 (should be 32)")); BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input. s.clear(); // Valid CJDNS. - s << MakeSpan(ParseHex("06" // network type (CJDNS) - "10" // address length - "fc000001000200030004000500060007" // address - )); + s << Span{ParseHex("06" // network type (CJDNS) + "10" // address length + "fc000001000200030004000500060007" // address + )}; s >> addr; BOOST_CHECK(addr.IsValid()); BOOST_CHECK(addr.IsCJDNS()); @@ -538,49 +538,49 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2) BOOST_REQUIRE(s.empty()); // Invalid CJDNS, wrong prefix. - s << MakeSpan(ParseHex("06" // network type (CJDNS) - "10" // address length - "aa000001000200030004000500060007" // address - )); + s << Span{ParseHex("06" // network type (CJDNS) + "10" // address length + "aa000001000200030004000500060007" // address + )}; s >> addr; BOOST_CHECK(addr.IsCJDNS()); BOOST_CHECK(!addr.IsValid()); BOOST_REQUIRE(s.empty()); // Invalid CJDNS, with bogus length. - s << MakeSpan(ParseHex("06" // network type (CJDNS) - "01" // address length - "00" // address - )); + s << Span{ParseHex("06" // network type (CJDNS) + "01" // address length + "00" // address + )}; BOOST_CHECK_EXCEPTION(s >> addr, std::ios_base::failure, HasReason("BIP155 CJDNS address with length 1 (should be 16)")); BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input. s.clear(); // Unknown, with extreme length. - s << MakeSpan(ParseHex("aa" // network type (unknown) - "fe00000002" // address length (CompactSize's MAX_SIZE) - "01020304050607" // address - )); + s << Span{ParseHex("aa" // network type (unknown) + "fe00000002" // address length (CompactSize's MAX_SIZE) + "01020304050607" // address + )}; BOOST_CHECK_EXCEPTION(s >> addr, std::ios_base::failure, HasReason("Address too long: 33554432 > 512")); BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input. s.clear(); // Unknown, with reasonable length. - s << MakeSpan(ParseHex("aa" // network type (unknown) - "04" // address length - "01020304" // address - )); + s << Span{ParseHex("aa" // network type (unknown) + "04" // address length + "01020304" // address + )}; s >> addr; BOOST_CHECK(!addr.IsValid()); BOOST_REQUIRE(s.empty()); // Unknown, with zero length. - s << MakeSpan(ParseHex("aa" // network type (unknown) - "00" // address length - "" // address - )); + s << Span{ParseHex("aa" // network type (unknown) + "00" // address length + "" // address + )}; s >> addr; BOOST_CHECK(!addr.IsValid()); BOOST_REQUIRE(s.empty()); diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp index 843157e2e9..a590094a58 100644 --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -283,7 +283,7 @@ class TestBuilder CScript scriptPubKey = script; if (wm == WitnessMode::PKH) { uint160 hash; - CHash160().Write(MakeSpan(script).subspan(1)).Finalize(hash); + CHash160().Write(Span{script}.subspan(1)).Finalize(hash); script = CScript() << OP_DUP << OP_HASH160 << ToByteVector(hash) << OP_EQUALVERIFY << OP_CHECKSIG; scriptPubKey = CScript() << witnessversion << ToByteVector(hash); } else if (wm == WitnessMode::SH) { diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 9707966713..dcbcbc56b0 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4940,5 +4940,5 @@ static const CRPCCommand commands[] = { "wallet", &walletprocesspsbt, }, }; // clang-format on - return MakeSpan(commands); + return Span{commands}; } From dd3616065b5bf637bab3b6c43b12730040307730 Mon Sep 17 00:00:00 2001 From: glozow Date: Fri, 26 Feb 2021 12:53:40 -0800 Subject: [PATCH 088/144] [test] tx processing before and after ibd Co-authored-by: Amiti Uttarwar --- test/functional/p2p_ibd_txrelay.py | 52 +++++++++++++++++++++++++-- test/functional/test_framework/p2p.py | 2 ++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/test/functional/p2p_ibd_txrelay.py b/test/functional/p2p_ibd_txrelay.py index d73f242e25..879c9f3564 100755 --- a/test/functional/p2p_ibd_txrelay.py +++ b/test/functional/p2p_ibd_txrelay.py @@ -2,11 +2,30 @@ # Copyright (c) 2020 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -"""Test fee filters during and after IBD.""" +"""Test transaction relay behavior during IBD: +- Set fee filters to MAX_MONEY +- Don't request transactions +- Ignore all transaction messages +""" from decimal import Decimal +import time -from test_framework.messages import COIN +from test_framework.messages import ( + CInv, + COIN, + CTransaction, + from_hex, + msg_inv, + msg_tx, + MSG_WTX, +) +from test_framework.p2p import ( + NONPREF_PEER_TX_DELAY, + P2PDataStore, + P2PInterface, + p2p_lock +) from test_framework.test_framework import BGLTestFramework MAX_FEE_FILTER = Decimal(9170997) / COIN @@ -28,6 +47,31 @@ def run_test(self): assert node.getblockchaininfo()['initialblockdownload'] self.wait_until(lambda: all(peer['minfeefilter'] == MAX_FEE_FILTER for peer in node.getpeerinfo())) + self.log.info("Check that nodes don't send getdatas for transactions while still in IBD") + peer_inver = self.nodes[0].add_p2p_connection(P2PDataStore()) + txid = 0xdeadbeef + peer_inver.send_and_ping(msg_inv([CInv(t=MSG_WTX, h=txid)])) + # The node should not send a getdata, but if it did, it would first delay 2 seconds + self.nodes[0].setmocktime(int(time.time() + NONPREF_PEER_TX_DELAY)) + peer_inver.sync_send_with_ping() + with p2p_lock: + assert txid not in peer_inver.getdata_requests + self.nodes[0].disconnect_p2ps() + + self.log.info("Check that nodes don't process unsolicited transactions while still in IBD") + # A transaction hex pulled from tx_valid.json. There are no valid transactions since no UTXOs + # exist yet, but it should be a well-formed transaction. + rawhex = "0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004a01ff473" + \ + "04402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e168" + \ + "1a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696a" + \ + "d990364e555c271ad504b88ac00000000" + assert self.nodes[1].decoderawtransaction(rawhex) # returns a dict, should not throw + tx = from_hex(CTransaction(), rawhex) + peer_txer = self.nodes[0].add_p2p_connection(P2PInterface()) + with self.nodes[0].assert_debug_log(expected_msgs=["received: tx"], unexpected_msgs=["was not accepted"]): + peer_txer.send_and_ping(msg_tx(tx)) + self.nodes[0].disconnect_p2ps() + # Come out of IBD by generating a block self.generate(self.nodes[0], 1) self.sync_all() @@ -37,6 +81,10 @@ def run_test(self): assert not node.getblockchaininfo()['initialblockdownload'] self.wait_until(lambda: all(peer['minfeefilter'] == NORMAL_FEE_FILTER for peer in node.getpeerinfo())) + self.log.info("Check that nodes process the same transaction, even when unsolicited, when no longer in IBD") + peer_txer = self.nodes[0].add_p2p_connection(P2PInterface()) + with self.nodes[0].assert_debug_log(expected_msgs=["was not accepted"]): + peer_txer.send_and_ping(msg_tx(tx)) if __name__ == '__main__': P2PIBDTxRelayTest().main() diff --git a/test/functional/test_framework/p2p.py b/test/functional/test_framework/p2p.py index f41b90a46e..74f7556fe3 100755 --- a/test/functional/test_framework/p2p.py +++ b/test/functional/test_framework/p2p.py @@ -87,6 +87,8 @@ P2P_SUBVERSION = "/python-p2p-tester:0.0.3/" # Value for relay that this test framework sends in its `version` message P2P_VERSION_RELAY = 1 +# Delay after receiving a tx inv before requesting transactions from non-preferred peers, in seconds +NONPREF_PEER_TX_DELAY = 2 MESSAGEMAP = { b"addr": msg_addr, From 4dd1f446c16daf2bf2429521e9d9d6ab674e870a Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Thu, 13 May 2021 18:51:47 +0200 Subject: [PATCH 089/144] rpc: getblockfrompeer Co-authored-by: John Newbery --- src/net_processing.cpp | 36 ++++++++++++ src/net_processing.h | 10 ++++ src/rpc/blockchain.cpp | 55 ++++++++++++++++++ src/rpc/client.cpp | 1 + src/test/fuzz/rpc.cpp | 1 + src/validation.cpp | 1 + test/functional/rpc_getblockfrompeer.py | 76 +++++++++++++++++++++++++ test/functional/test_runner.py | 1 + 8 files changed, 181 insertions(+) create mode 100755 test/functional/rpc_getblockfrompeer.py diff --git a/src/net_processing.cpp b/src/net_processing.cpp index f352246b0d..e4b8e9b6a9 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -312,6 +312,7 @@ class PeerManagerImpl final : public PeerManager /** Implement PeerManager */ void StartScheduledTasks(CScheduler& scheduler) override; void CheckForStaleTipAndEvictPeers() override; + bool FetchBlock(NodeId id, const uint256& hash, const CBlockIndex& index) override; bool GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) const override; bool IgnoresIncomingTxs() override { return m_ignore_incoming_txs; } void SendPings() override; @@ -1427,6 +1428,41 @@ bool PeerManagerImpl::BlockRequestAllowed(const CBlockIndex* pindex) (GetBlockProofEquivalentTime(*pindexBestHeader, *pindex, *pindexBestHeader, m_chainparams.GetConsensus()) < STALE_RELAY_AGE_LIMIT); } +bool PeerManagerImpl::FetchBlock(NodeId id, const uint256& hash, const CBlockIndex& index) +{ + if (fImporting || fReindex) return false; + + LOCK(cs_main); + // Ensure this peer exists and hasn't been disconnected + CNodeState* state = State(id); + if (state == nullptr) return false; + // Ignore pre-segwit peers + if (!state->fHaveWitness) return false; + + // Mark block as in-flight unless it already is + if (!BlockRequested(id, index)) return false; + + // Construct message to request the block + std::vector invs{CInv(MSG_BLOCK | MSG_WITNESS_FLAG, hash)}; + + // Send block request message to the peer + bool success = m_connman.ForNode(id, [this, &invs](CNode* node) { + const CNetMsgMaker msgMaker(node->GetCommonVersion()); + this->m_connman.PushMessage(node, msgMaker.Make(NetMsgType::GETDATA, invs)); + return true; + }); + + if (success) { + LogPrint(BCLog::NET, "Requesting block %s from peer=%d\n", + hash.ToString(), id); + } else { + RemoveBlockRequest(hash); + LogPrint(BCLog::NET, "Failed to request block %s from peer=%d\n", + hash.ToString(), id); + } + return success; +} + std::unique_ptr PeerManager::make(const CChainParams& chainparams, CConnman& connman, AddrMan& addrman, BanMan* banman, ChainstateManager& chainman, CTxMemPool& pool, bool ignore_incoming_txs) diff --git a/src/net_processing.h b/src/net_processing.h index d2b73dc158..95e63ad918 100644 --- a/src/net_processing.h +++ b/src/net_processing.h @@ -42,6 +42,16 @@ class PeerManager : public CValidationInterface, public NetEventsInterface CTxMemPool& pool, bool ignore_incoming_txs); virtual ~PeerManager() { } + /** + * Attempt to manually fetch block from a given peer. We must already have the header. + * + * @param[in] id The peer id + * @param[in] hash The block hash + * @param[in] pindex The blockindex + * @returns Whether a request was successfully made + */ + virtual bool FetchBlock(NodeId id, const uint256& hash, const CBlockIndex& pindex) = 0; + /** Begin running background tasks, should only be called once */ virtual void StartScheduledTasks(CScheduler& scheduler) = 0; diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 1b4b6b56ad..79b1d76fe5 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include #include #include @@ -810,6 +812,58 @@ static RPCHelpMan getmempoolentry() }; } +static RPCHelpMan getblockfrompeer() +{ + return RPCHelpMan{"getblockfrompeer", + "\nAttempt to fetch block from a given peer.\n" + "\nWe must have the header for this block, e.g. using submitheader.\n" + "\nReturns {} if a block-request was successfully scheduled\n", + { + {"blockhash", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The block hash"}, + {"nodeid", RPCArg::Type::NUM, RPCArg::Optional::NO, "The node ID (see getpeerinfo for node IDs)"}, + }, + RPCResult{RPCResult::Type::OBJ, "", "", + { + {RPCResult::Type::STR, "warnings", "any warnings"} + }}, + RPCExamples{ + HelpExampleCli("getblockfrompeer", "\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\" 0") + + HelpExampleRpc("getblockfrompeer", "\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\" 0") + }, + [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue +{ + const NodeContext& node = EnsureAnyNodeContext(request.context); + ChainstateManager& chainman = EnsureChainman(node); + PeerManager& peerman = EnsurePeerman(node); + CConnman& connman = EnsureConnman(node); + + uint256 hash(ParseHashV(request.params[0], "hash")); + + const NodeId nodeid = static_cast(request.params[1].get_int64()); + + // Check that the peer with nodeid exists + if (!connman.ForNode(nodeid, [](CNode* node) {return true;})) { + throw JSONRPCError(RPC_MISC_ERROR, strprintf("Peer nodeid %d does not exist", nodeid)); + } + + const CBlockIndex* const index = WITH_LOCK(cs_main, return chainman.m_blockman.LookupBlockIndex(hash);); + + if (!index) { + throw JSONRPCError(RPC_MISC_ERROR, "Block header missing"); + } + + UniValue result = UniValue::VOBJ; + + if (index->nStatus & BLOCK_HAVE_DATA) { + result.pushKV("warnings", "Block already downloaded"); + } else if (!peerman.FetchBlock(nodeid, hash, *index)) { + throw JSONRPCError(RPC_MISC_ERROR, "Failed to fetch block from peer"); + } + return result; +}, + }; +} + static RPCHelpMan getblockhash() { return RPCHelpMan{"getblockhash", @@ -2661,6 +2715,7 @@ static const CRPCCommand commands[] = { "blockchain", &getbestblockhash, }, { "blockchain", &getblockcount, }, { "blockchain", &getblock, }, + { "blockchain", &getblockfrompeer, }, { "blockchain", &getblockhash, }, { "blockchain", &getblockheader, }, { "blockchain", &getchaintips, }, diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp index 93e49cb9a8..0eb0de8b1b 100644 --- a/src/rpc/client.cpp +++ b/src/rpc/client.cpp @@ -56,6 +56,7 @@ static const CRPCConvertParam vRPCConvertParams[] = { "getbalance", 1, "minconf" }, { "getbalance", 2, "include_watchonly" }, { "getbalance", 3, "avoid_reuse" }, + { "getblockfrompeer", 1, "nodeid" }, { "getblockhash", 0, "height" }, { "waitforblockheight", 0, "height" }, { "waitforblockheight", 1, "timeout" }, diff --git a/src/test/fuzz/rpc.cpp b/src/test/fuzz/rpc.cpp index 9195cc4873..60b28911f2 100644 --- a/src/test/fuzz/rpc.cpp +++ b/src/test/fuzz/rpc.cpp @@ -110,6 +110,7 @@ const std::vector RPC_COMMANDS_SAFE_FOR_FUZZING{ "getblockfilter", "getblockhash", "getblockheader", + "getblockfrompeer", // when no peers are connected, no p2p message is sent "getblockstats", "getblocktemplate", "getchaintips", diff --git a/src/validation.cpp b/src/validation.cpp index c72d7c80da..e0707b5157 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3383,6 +3383,7 @@ bool CChainState::AcceptBlock(const std::shared_ptr& pblock, Block // This requires some new chain data structure to efficiently look up if a // block is in a chain leading to a candidate for best tip, despite not // being such a candidate itself. + // Note that this would break the getblockfrompeer RPC // TODO: deal better with return value and error conditions for duplicate // and unrequested blocks. diff --git a/test/functional/rpc_getblockfrompeer.py b/test/functional/rpc_getblockfrompeer.py new file mode 100755 index 0000000000..e841cba70e --- /dev/null +++ b/test/functional/rpc_getblockfrompeer.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +# Copyright (c) 2020 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. +"""Test the getblockfrompeer RPC.""" + +from test_framework.authproxy import JSONRPCException +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import ( + assert_equal, + assert_raises_rpc_error, +) + +class GetBlockFromPeerTest(BitcoinTestFramework): + def set_test_params(self): + self.num_nodes = 2 + + def setup_network(self): + self.setup_nodes() + + def check_for_block(self, hash): + try: + self.nodes[0].getblock(hash) + return True + except JSONRPCException: + return False + + def run_test(self): + self.log.info("Mine 4 blocks on Node 0") + self.generate(self.nodes[0], 4, sync_fun=self.no_op) + assert_equal(self.nodes[0].getblockcount(), 204) + + self.log.info("Mine competing 3 blocks on Node 1") + self.generate(self.nodes[1], 3, sync_fun=self.no_op) + assert_equal(self.nodes[1].getblockcount(), 203) + short_tip = self.nodes[1].getbestblockhash() + + self.log.info("Connect nodes to sync headers") + self.connect_nodes(0, 1) + self.sync_blocks() + + self.log.info("Node 0 should only have the header for node 1's block 3") + for x in self.nodes[0].getchaintips(): + if x['hash'] == short_tip: + assert_equal(x['status'], "headers-only") + break + else: + raise AssertionError("short tip not synced") + assert_raises_rpc_error(-1, "Block not found on disk", self.nodes[0].getblock, short_tip) + + self.log.info("Fetch block from node 1") + peers = self.nodes[0].getpeerinfo() + assert_equal(len(peers), 1) + peer_0_peer_1_id = peers[0]["id"] + + self.log.info("Arguments must be sensible") + assert_raises_rpc_error(-8, "hash must be of length 64 (not 4, for '1234')", self.nodes[0].getblockfrompeer, "1234", 0) + + self.log.info("We must already have the header") + assert_raises_rpc_error(-1, "Block header missing", self.nodes[0].getblockfrompeer, "00" * 32, 0) + + self.log.info("Non-existent peer generates error") + assert_raises_rpc_error(-1, f"Peer nodeid {peer_0_peer_1_id + 1} does not exist", self.nodes[0].getblockfrompeer, short_tip, peer_0_peer_1_id + 1) + + self.log.info("Successful fetch") + result = self.nodes[0].getblockfrompeer(short_tip, peer_0_peer_1_id) + self.wait_until(lambda: self.check_for_block(short_tip), timeout=1) + assert(not "warnings" in result) + + self.log.info("Don't fetch blocks we already have") + result = self.nodes[0].getblockfrompeer(short_tip, peer_0_peer_1_id) + assert("warnings" in result) + assert_equal(result["warnings"], "Block already downloaded") + +if __name__ == '__main__': + GetBlockFromPeerTest().main() diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py index 30fa532c9e..df8b3f81ae 100755 --- a/test/functional/test_runner.py +++ b/test/functional/test_runner.py @@ -213,6 +213,7 @@ 'wallet_txn_clone.py --mineblock', 'feature_notifications.py', 'rpc_getblockfilter.py', + 'rpc_getblockfrompeer.py', 'rpc_invalidateblock.py', 'feature_utxo_set_hash.py', 'feature_rbf.py', From ee6a7a08d64439080f3ce307de0e166e9ea29127 Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Wed, 21 Apr 2021 16:39:40 +0200 Subject: [PATCH 090/144] rpc: move Ensure* helpers to server_util.h --- src/Makefile.am | 3 +- src/rest.cpp | 1 + src/rpc/blockchain.cpp | 50 +----------------------- src/rpc/blockchain.h | 9 ----- src/rpc/mining.cpp | 2 +- src/rpc/misc.cpp | 1 + src/rpc/net.cpp | 19 +-------- src/rpc/net.h | 15 ------- src/rpc/rawtransaction.cpp | 1 + src/rpc/server_util.cpp | 80 ++++++++++++++++++++++++++++++++++++++ src/rpc/server_util.h | 27 +++++++++++++ 11 files changed, 115 insertions(+), 93 deletions(-) delete mode 100644 src/rpc/net.h create mode 100644 src/rpc/server_util.cpp create mode 100644 src/rpc/server_util.h diff --git a/src/Makefile.am b/src/Makefile.am index e7bd95a466..d6605dc61e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -203,12 +203,12 @@ BGL_CORE_H = \ rpc/blockchain.h \ rpc/client.h \ rpc/mining.h \ - rpc/net.h \ rpc/protocol.h \ rpc/rawtransaction_util.h \ rpc/register.h \ rpc/request.h \ rpc/server.h \ + rpc/server_util.h \ rpc/util.h \ scheduler.h \ script/descriptor.h \ @@ -361,6 +361,7 @@ libBGL_server_a_SOURCES = \ rpc/net.cpp \ rpc/rawtransaction.cpp \ rpc/server.cpp \ + rpc/server_util.cpp \ script/sigcache.cpp \ shutdown.cpp \ signet.cpp \ diff --git a/src/rest.cpp b/src/rest.cpp index 3746fd752a..2c0ead26c7 100644 --- a/src/rest.cpp +++ b/src/rest.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 79b1d76fe5..30786bee3c 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include