From d8dea963fa5dc26b4be699ce6d4bf699a429ca92 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Thu, 20 Apr 2017 13:40:52 -0700 Subject: [PATCH] Squashed 'src/beast/' changes from 1b9a714..6d5547a 6d5547a Set version to 1.0.0-b34 6fab138 Fix and tidy up CMake build scripts: ccefa54 Set version to 1.0.0-b33 32afe41 Set internal state correctly when writing frames: fe3e20b Add write_frames unit test 578dcd0 Add decorator unit test aaa3733 Use fwrite return value in file_body df66165 Require Visual Studio 2015 Update 3 or later b8e5a21 Set version to 1.0.0-b32 ffb1758 Update CMake scripts for finding packages: b893749 Remove http Writer suspend and resume feature (API Change): 27864fb Add io_service completion invariants tests eba05a7 Set version to 1.0.0-b31 484bcef Fix badge markdown in README.md 5663bea Add missing dynabuf_readstream member 0d7a551 Tidy up build settings 0fd4030 Move the handler, don't copy it git-subtree-dir: src/beast git-subtree-split: 6d5547a32c50ec95832c4779311502555ab0ee1f --- .gitattributes | 7 +- .gitignore | 98 +- .gitmodules | 12 - .travis.yml | 63 +- Builds/ArchLinux/PKGBUILD | 38 - Builds/CMake/CMakeFuncs.cmake | 662 - Builds/Docker/Dockerfile | 30 - Builds/Docker/Dockerfile-testnet | 23 - Builds/Docker/build-ci.sh | 13 - Builds/Docker/push-to-hub.sh | 16 - Builds/Eclipse/README.md | 31 - Builds/Eclipse/debug.png | Bin 18404 -> 0 bytes Builds/Eclipse/scons.png | Bin 17625 -> 0 bytes .../Fedora/install_rippled_depends_fedora.sh | 22 - Builds/QtCreator/.gitignore | 5 - Builds/QtCreator/rippled.pro | 112 - Builds/Test.py | 266 - Builds/Ubuntu/build_clang_libs.sh | 82 - Builds/Ubuntu/install_boost.sh | 39 - .../Ubuntu/install_rippled_depends_ubuntu.sh | 55 - Builds/VisualStudio2015/.gitattributes | 4 - Builds/VisualStudio2015/README.md | 255 - Builds/VisualStudio2015/RippleD.vcxproj | 4978 - .../VisualStudio2015/RippleD.vcxproj.filters | 5623 - .../images/NoDebugHeapPropPage.png | Bin 34285 -> 0 bytes .../images/VS2015x64IncludeDirs.png | Bin 68334 -> 0 bytes .../images/VS2015x64LibraryDirs.png | Bin 68136 -> 0 bytes .../images/VS2015x64Properties.png | Bin 15609 -> 0 bytes .../images/VSCommandArgsPropPage.png | Bin 19676 -> 0 bytes Builds/VisualStudio2015/ripple.sln | 36 - Builds/XCode/README.md | 177 - Builds/build_all.sh | 6 - Builds/travis/clang.boost.patch | 13 - Builds/travis/static_error.boost.patch | 10 - src/beast/CHANGELOG.md => CHANGELOG.md | 44 + CMakeLists.txt | 657 +- Jamroot | 117 + LICENSE | Bin 3341 -> 0 bytes src/beast/LICENSE_1_0.txt => LICENSE_1_0.txt | 0 README.md | 291 +- RELEASENOTES.md | 2401 - SConstruct | 1283 - src/beast/TODO.txt => TODO.txt | 0 appveyor.yml | 134 - bin/LT | 1 - bin/browser.js | 470 - bin/ci/ubuntu/build-and-test.sh | 92 - bin/ci/ubuntu/install-dependencies.sh | 67 - bin/ci/windows/install-dependencies.bat | 13 - bin/debug_local_sign.js | 64 - bin/email_hash.js | 18 - bin/flash_policy.js | 31 - bin/getInfoRippled.sh | 84 - bin/hexify.js | 23 - bin/jsonrpc_request.js | 42 - bin/jsonrpc_server.js | 68 - bin/manifest | 1 - bin/python/LedgerTool.py | 24 - bin/python/Manifest.py | 7 - bin/python/README.md | 15 - bin/python/decorator.py | 251 - bin/python/ecdsa/__init__.py | 14 - bin/python/ecdsa/_version.py | 183 - bin/python/ecdsa/curves.py | 53 - bin/python/ecdsa/der.py | 199 - bin/python/ecdsa/ecdsa.py | 576 - bin/python/ecdsa/ellipticcurve.py | 293 - bin/python/ecdsa/keys.py | 283 - bin/python/ecdsa/numbertheory.py | 613 - bin/python/ecdsa/rfc6979.py | 103 - bin/python/ecdsa/six.py | 394 - bin/python/ecdsa/test_pyecdsa.py | 663 - bin/python/ecdsa/util.py | 247 - bin/python/ed25519.py | 105 - bin/python/jsonpath_rw/__init__.py | 4 - bin/python/jsonpath_rw/jsonpath.py | 510 - bin/python/jsonpath_rw/lexer.py | 171 - bin/python/jsonpath_rw/parser.py | 187 - bin/python/ply/__init__.py | 4 - bin/python/ply/cpp.py | 898 - bin/python/ply/ctokens.py | 133 - bin/python/ply/lex.py | 1058 - bin/python/ply/yacc.py | 3276 - bin/python/ripple/__init__.py | 0 bin/python/ripple/ledger/Args.py | 187 - bin/python/ripple/ledger/DatabaseReader.py | 78 - bin/python/ripple/ledger/LedgerNumber.py | 18 - bin/python/ripple/ledger/RippledReader.py | 68 - bin/python/ripple/ledger/SField.py | 52 - bin/python/ripple/ledger/SearchLedgers.py | 24 - bin/python/ripple/ledger/Server.py | 55 - bin/python/ripple/ledger/ServerReader.py | 5 - bin/python/ripple/ledger/__init__.py | 0 bin/python/ripple/ledger/commands/Cache.py | 34 - bin/python/ripple/ledger/commands/Info.py | 21 - bin/python/ripple/ledger/commands/Print.py | 15 - bin/python/ripple/ledger/commands/__init__.py | 0 .../ripple/ledger/conditions/__init__.py | 4 - bin/python/ripple/ledger/displays/__init__.py | 89 - bin/python/ripple/util/Base58.py | 94 - bin/python/ripple/util/Cache.py | 40 - bin/python/ripple/util/CommandList.py | 77 - bin/python/ripple/util/ConfigFile.py | 54 - bin/python/ripple/util/Database.py | 12 - bin/python/ripple/util/Decimal.py | 46 - bin/python/ripple/util/Dict.py | 33 - bin/python/ripple/util/File.py | 7 - bin/python/ripple/util/FileCache.py | 56 - bin/python/ripple/util/Function.py | 82 - bin/python/ripple/util/Log.py | 21 - bin/python/ripple/util/PrettyPrint.py | 42 - bin/python/ripple/util/Range.py | 53 - bin/python/ripple/util/Search.py | 46 - bin/python/ripple/util/Sign.py | 233 - bin/python/ripple/util/Time.py | 21 - .../ripple/util/ValidatorManifestTest.py | 682 - bin/python/ripple/util/__init__.py | 0 bin/python/ripple/util/test_Base58.py | 47 - bin/python/ripple/util/test_Cache.py | 12 - bin/python/ripple/util/test_ConfigFile.py | 163 - bin/python/ripple/util/test_Decimal.py | 20 - bin/python/ripple/util/test_Dict.py | 56 - bin/python/ripple/util/test_Function.py | 37 - bin/python/ripple/util/test_PrettyPrint.py | 56 - bin/python/ripple/util/test_Range.py | 28 - bin/python/ripple/util/test_Search.py | 44 - bin/python/ripple/util/test_Sign.py | 149 - bin/python/six.py | 747 - bin/rlint.js | 252 - bin/sh/install-boost.sh | 24 - bin/stop-test.js | 133 - bin/update_binformat.js | 119 - circle.yml | 24 - {src/beast/doc => doc}/.gitignore | 0 doc/CHANGELOG | 29 - doc/CheatSheet.md | 18 - doc/CodingStyle.md | 86 - doc/Docker.md | 16 - {src/beast/doc => doc}/Dockerfile | 0 doc/Doxyfile | 2304 - doc/HeapProfiling.md | 63 - {src/beast/doc => doc}/Jamfile.v2 | 0 doc/LogoForDocumentation.png | Bin 11413 -> 0 bytes doc/NodeStoreRefactoringCaseStudy.pdf | Bin 393922 -> 0 bytes {src/beast/doc => doc}/README.md | 0 {docs => doc}/boostbook.dtd | 0 {src/beast/doc => doc}/design.qbk | 0 {src/beast/doc => doc}/examples.qbk | 0 {src/beast/doc => doc}/http.qbk | 0 {src/beast/doc => doc}/images/CppCon2016.pdf | Bin {src/beast/doc => doc}/images/CppCon2016.png | Bin {src/beast/doc => doc}/images/beast.png | Bin {src/beast/doc => doc}/images/beast.psd | Bin {src/beast/doc => doc}/images/body.png | Bin {src/beast/doc => doc}/images/body.psd | Bin {src/beast/doc => doc}/images/message.png | Bin {src/beast/doc => doc}/images/message.psd | Bin {src/beast/doc => doc}/images/readme.png | Bin {src/beast/doc => doc}/index.xml | 0 {src/beast/doc => doc}/makeqbk.sh | 0 doc/manifest-tool-guide.md | 112 - {src/beast/doc => doc}/master.qbk | 0 {src/beast/doc => doc}/overview.qbk | 0 {src/beast/doc => doc}/quickref.xml | 2 +- {src/beast/doc => doc}/reference.xsl | 0 doc/ripple-example.txt | 126 - doc/rippled-example.cfg | 1039 - doc/rippled-example.service | 10 - doc/rippled.init | 114 - {src/beast/doc => doc}/source.dox | 0 {src/beast/doc => doc}/types/Body.qbk | 0 .../doc => doc}/types/BufferSequence.qbk | 0 .../beast/doc => doc}/types/DynamicBuffer.qbk | 0 {src/beast/doc => doc}/types/Field.qbk | 0 .../beast/doc => doc}/types/FieldSequence.qbk | 0 {src/beast/doc => doc}/types/Parser.qbk | 0 {src/beast/doc => doc}/types/Reader.qbk | 0 {src/beast/doc => doc}/types/Streams.qbk | 0 {src/beast/doc => doc}/types/Writer.qbk | 37 +- doc/validators-example.txt | 48 - {src/beast/doc => doc}/websocket.qbk | 0 docs/.gitignore | 3 - docs/Dockerfile | 22 - docs/Jamfile.v2 | 71 - docs/README.md | 84 - docs/docca | 1 - docs/index.xml | 14 - docs/main.qbk | 37 - docs/makeqbk.sh | 11 - docs/quickref.xml | 61 - docs/reference.xsl | 14 - docs/source.dox | 341 - .../examples => examples}/CMakeLists.txt | 13 + {src/beast/examples => examples}/Jamfile.v2 | 0 .../beast/examples => examples}/file_body.hpp | 30 +- .../http_async_server.hpp | 0 .../examples => examples}/http_crawl.cpp | 0 .../examples => examples}/http_example.cpp | 0 .../examples => examples}/http_server.cpp | 0 .../http_sync_server.hpp | 0 .../beast/examples => examples}/mime_type.hpp | 0 .../examples => examples}/ssl/CMakeLists.txt | 0 .../examples => examples}/ssl/Jamfile.v2 | 0 .../ssl/http_ssl_example.cpp | 0 .../ssl/websocket_ssl_example.cpp | 0 .../examples => examples}/urls_large_data.cpp | 0 .../examples => examples}/urls_large_data.hpp | 0 .../websocket_async_echo_server.hpp | 0 .../examples => examples}/websocket_echo.cpp | 0 .../websocket_example.cpp | 0 .../websocket_sync_echo_server.hpp | 0 {src/beast/extras => extras}/README.md | 0 .../extras => extras}/beast/doc_debug.hpp | 0 .../beast/test/fail_counter.hpp | 0 .../beast/test/fail_stream.hpp | 0 .../extras => extras}/beast/test/sig_wait.hpp | 0 .../beast/test/string_istream.hpp | 0 .../beast/test/string_ostream.hpp | 0 .../extras => extras}/beast/test/yield_to.hpp | 0 .../beast/unit_test/amount.hpp | 0 .../unit_test/detail/const_container.hpp | 0 .../beast/unit_test/dstream.hpp | 0 .../beast/unit_test/global_suites.hpp | 0 .../beast/unit_test/main.cpp | 0 .../beast/unit_test/match.hpp | 0 .../beast/unit_test/recorder.hpp | 0 .../beast/unit_test/reporter.hpp | 0 .../beast/unit_test/results.hpp | 0 .../beast/unit_test/runner.hpp | 0 .../beast/unit_test/suite.hpp | 0 .../beast/unit_test/suite_info.hpp | 0 .../beast/unit_test/suite_list.hpp | 0 .../beast/unit_test/thread.hpp | 0 images/flow1.png | Bin 103978 -> 0 bytes images/flow2.png | Bin 92024 -> 0 bytes images/ripple.png | Bin 5078 -> 0 bytes include/beast/config.hpp | 27 + {src/beast/include => include}/beast/core.hpp | 2 + .../beast/core/async_completion.hpp | 1 + .../beast/core/bind_handler.hpp | 1 + .../beast/core/buffer_cat.hpp | 1 + .../beast/core/buffer_concepts.hpp | 1 + .../beast/core/buffers_adapter.hpp | 1 + .../beast/core/consuming_buffers.hpp | 1 + .../beast/core/detail/base64.hpp | 0 .../beast/core/detail/bind_handler.hpp | 0 .../beast/core/detail/buffer_cat.hpp | 0 .../beast/core/detail/buffer_concepts.hpp | 0 .../beast/core/detail/ci_char_traits.hpp | 0 .../beast/core/detail/clamp.hpp | 0 .../core/detail/empty_base_optimization.hpp | 0 .../beast/core/detail/get_lowest_layer.hpp | 0 .../beast/core/detail/integer_sequence.hpp | 0 .../beast/core/detail/is_call_possible.hpp | 0 .../beast/core/detail/prepare_buffers.hpp | 0 .../beast/core/detail/sha1.hpp | 0 .../beast/core/detail/stream_concepts.hpp | 0 .../beast/core/detail/sync_ostream.hpp | 0 .../beast/core/detail/type_traits.hpp | 0 .../beast/core/detail/write_dynabuf.hpp | 0 .../beast/core/dynabuf_readstream.hpp | 8 + .../include => include}/beast/core/error.hpp | 9 + .../beast/core/handler_alloc.hpp | 1 + .../beast/core/handler_concepts.hpp | 1 + .../beast/core/handler_helpers.hpp | 1 + .../beast/core/handler_ptr.hpp | 1 + .../beast/core/impl/buffers_adapter.ipp | 0 .../beast/core/impl/consuming_buffers.ipp | 0 .../beast/core/impl/dynabuf_readstream.ipp | 0 .../beast/core/impl/handler_ptr.ipp | 0 .../beast/core/impl/static_streambuf.ipp | 0 .../beast/core/impl/streambuf.ipp | 0 .../beast/core/placeholders.hpp | 1 + .../beast/core/prepare_buffer.hpp | 1 + .../beast/core/prepare_buffers.hpp | 1 + .../beast/core/static_streambuf.hpp | 1 + .../beast/core/static_string.hpp | 1 + .../beast/core/stream_concepts.hpp | 1 + .../beast/core/streambuf.hpp | 1 + .../beast/core/to_string.hpp | 1 + .../beast/core/write_dynabuf.hpp | 1 + {src/beast/include => include}/beast/http.hpp | 3 +- .../beast/http/basic_dynabuf_body.hpp | 8 +- .../beast/http/basic_fields.hpp | 1 + .../beast/http/basic_parser_v1.hpp | 1 + .../beast/http/chunk_encode.hpp | 1 + .../beast/http/concepts.hpp | 40 +- .../beast/http/detail/basic_fields.hpp | 0 .../beast/http/detail/basic_parser_v1.hpp | 0 .../beast/http/detail/chunk_encode.hpp | 0 .../beast/http/detail/rfc7230.hpp | 0 .../beast/http/empty_body.hpp | 8 +- .../include => include}/beast/http/fields.hpp | 1 + .../beast/http/header_parser_v1.hpp | 1 + .../beast/http/impl/basic_fields.ipp | 0 .../beast/http/impl/basic_parser_v1.ipp | 0 .../beast/http/impl/message.ipp | 0 .../beast/http/impl/parse.ipp | 0 .../beast/http/impl/parse_error.ipp | 0 .../beast/http/impl/read.ipp | 0 .../beast/http/impl/rfc7230.ipp | 0 .../beast/http/impl/write.ipp | 87 +- .../beast/http/message.hpp | 1 + .../include => include}/beast/http/parse.hpp | 1 + .../beast/http/parse_error.hpp | 1 + .../beast/http/parser_v1.hpp | 1 + .../include => include}/beast/http/read.hpp | 1 + .../include => include}/beast/http/reason.hpp | 2 + .../beast/http/rfc7230.hpp | 1 + .../beast/http/streambuf_body.hpp | 1 + .../beast/http/string_body.hpp | 8 +- .../include => include}/beast/http/write.hpp | 1 + .../include => include}/beast/version.hpp | 4 +- .../include => include}/beast/websocket.hpp | 2 + .../beast/websocket/detail/debug.hpp | 0 .../beast/websocket/detail/decorator.hpp | 0 .../beast/websocket/detail/endian.hpp | 0 .../beast/websocket/detail/frame.hpp | 0 .../beast/websocket/detail/hybi13.hpp | 0 .../beast/websocket/detail/invokable.hpp | 0 .../beast/websocket/detail/mask.hpp | 0 .../beast/websocket/detail/pmd_extension.hpp | 0 .../beast/websocket/detail/stream_base.hpp | 0 .../beast/websocket/detail/utf8_checker.hpp | 0 .../beast/websocket/error.hpp | 1 + .../beast/websocket/impl/accept.ipp | 0 .../beast/websocket/impl/close.ipp | 0 .../beast/websocket/impl/error.ipp | 0 .../beast/websocket/impl/handshake.ipp | 0 .../beast/websocket/impl/ping.ipp | 0 .../beast/websocket/impl/read.ipp | 7 - .../beast/websocket/impl/ssl.ipp | 0 .../beast/websocket/impl/stream.ipp | 0 .../beast/websocket/impl/teardown.ipp | 0 .../beast/websocket/impl/write.ipp | 1 + .../beast/websocket/option.hpp | 1 + .../beast/websocket/rfc6455.hpp | 1 + .../beast/websocket/ssl.hpp | 1 + .../beast/websocket/stream.hpp | 1 + .../beast/websocket/teardown.hpp | 1 + {src/beast/include => include}/beast/zlib.hpp | 2 + .../beast/zlib/deflate_stream.hpp | 1 + .../beast/zlib/detail/bitstream.hpp | 0 .../beast/zlib/detail/deflate_stream.hpp | 0 .../beast/zlib/detail/inflate_stream.hpp | 0 .../beast/zlib/detail/ranges.hpp | 0 .../beast/zlib/detail/window.hpp | 0 .../include => include}/beast/zlib/error.hpp | 1 + .../beast/zlib/impl/error.ipp | 0 .../beast/zlib/inflate_stream.hpp | 1 + .../include => include}/beast/zlib/zlib.hpp | 1 + src/beast/index.html => index.html | 0 {src/beast/scripts => scripts}/blacklist.supp | 0 .../scripts => scripts}/build-and-test.sh | 0 .../scripts => scripts}/fuzzingclient.json | 0 .../scripts => scripts}/install-boost.sh | 0 .../install-dependencies.sh | 0 .../scripts => scripts}/install-valgrind.sh | 0 .../scripts => scripts}/parseautobahn.py | 0 .../scripts => scripts}/run-with-debugger.sh | 0 .../beast/scripts => scripts}/run-with-gdb.sh | 0 {src/beast/scripts => scripts}/valgrind.supp | 0 src/BeastConfig.h | 165 - src/README.md | 122 - src/beast/.gitattributes | 12 - src/beast/.gitignore | 2 - src/beast/.travis.yml | 86 - src/beast/CMakeLists.txt | 144 - src/beast/Jamroot | 127 - src/beast/README.md | 227 - src/beast/doc/boostbook.dtd | 439 - .../include/beast/http/resume_context.hpp | 34 - src/ed25519-donna/README.md | 183 - src/ed25519-donna/curve25519-donna-32bit.h | 579 - src/ed25519-donna/curve25519-donna-64bit.h | 413 - src/ed25519-donna/curve25519-donna-helpers.h | 67 - src/ed25519-donna/curve25519-donna-sse2.h | 1112 - src/ed25519-donna/ed25519-donna-32bit-sse2.h | 513 - .../ed25519-donna-32bit-tables.h | 61 - src/ed25519-donna/ed25519-donna-64bit-sse2.h | 436 - .../ed25519-donna-64bit-tables.h | 53 - .../ed25519-donna-64bit-x86-32bit.h | 435 - src/ed25519-donna/ed25519-donna-64bit-x86.h | 357 - .../ed25519-donna-basepoint-table.h | 259 - src/ed25519-donna/ed25519-donna-batchverify.h | 275 - src/ed25519-donna/ed25519-donna-impl-base.h | 364 - src/ed25519-donna/ed25519-donna-impl-sse2.h | 390 - .../ed25519-donna-portable-identify.h | 103 - src/ed25519-donna/ed25519-donna-portable.h | 135 - src/ed25519-donna/ed25519-donna.h | 115 - src/ed25519-donna/ed25519-hash-custom.h | 11 - src/ed25519-donna/ed25519-hash.h | 219 - .../ed25519-randombytes-custom.h | 8 - src/ed25519-donna/ed25519-randombytes.h | 91 - src/ed25519-donna/ed25519.c | 150 - src/ed25519-donna/ed25519.h | 30 - src/ed25519-donna/fuzz/README.md | 173 - src/ed25519-donna/fuzz/build-nix.php | 134 - src/ed25519-donna/fuzz/curve25519-ref10.c | 1272 - src/ed25519-donna/fuzz/curve25519-ref10.h | 8 - src/ed25519-donna/fuzz/ed25519-donna-sse2.c | 3 - src/ed25519-donna/fuzz/ed25519-donna.c | 1 - src/ed25519-donna/fuzz/ed25519-donna.h | 34 - src/ed25519-donna/fuzz/ed25519-ref10.c | 4647 - src/ed25519-donna/fuzz/ed25519-ref10.h | 9 - src/ed25519-donna/fuzz/fuzz-curve25519.c | 172 - src/ed25519-donna/fuzz/fuzz-ed25519.c | 219 - src/ed25519-donna/modm-donna-32bit.h | 469 - src/ed25519-donna/modm-donna-64bit.h | 361 - src/ed25519-donna/regression.h | 1024 - src/ed25519-donna/test-internals.c | 176 - src/ed25519-donna/test-ticks.h | 50 - src/ed25519-donna/test.c | 260 - src/lz4/.gitattributes | 15 - src/lz4/.travis.yml | 35 - src/lz4/Makefile | 126 - src/lz4/NEWS | 173 - src/lz4/README.md | 81 - src/lz4/cmake_unofficial/CMakeLists.txt | 90 - src/lz4/examples/HCStreaming_ringBuffer.c | 239 - src/lz4/examples/Makefile | 78 - src/lz4/examples/README.md | 8 - .../examples/blockStreaming_doubleBuffer.c | 202 - .../examples/blockStreaming_doubleBuffer.md | 100 - src/lz4/examples/blockStreaming_lineByLine.c | 211 - src/lz4/examples/blockStreaming_lineByLine.md | 122 - src/lz4/examples/blockStreaming_ringBuffer.c | 200 - src/lz4/examples/printVersion.c | 13 - src/lz4/examples/streaming_api_basics.md | 87 - src/lz4/lib/LICENSE | Bin 1310 -> 0 bytes src/lz4/lib/Makefile | 117 - src/lz4/lib/README.md | 19 - src/lz4/lib/liblz4.pc.in | 14 - src/lz4/lib/lz4.c | 1516 - src/lz4/lib/lz4.h | 360 - src/lz4/lib/lz4frame.c | 1479 - src/lz4/lib/lz4frame.h | 303 - src/lz4/lib/lz4frame_static.h | 81 - src/lz4/lib/lz4hc.c | 730 - src/lz4/lib/lz4hc.h | 189 - src/lz4/lib/xxhash.c | 915 - src/lz4/lib/xxhash.h | 159 - src/lz4/lz4_Block_format.md | 127 - src/lz4/lz4_Frame_format.md | 385 - src/lz4/programs/COPYING | 339 - src/lz4/programs/Makefile | 311 - src/lz4/programs/bench.c | 437 - src/lz4/programs/bench.h | 33 - src/lz4/programs/datagen.c | 223 - src/lz4/programs/datagen.h | 40 - src/lz4/programs/datagencli.c | 193 - src/lz4/programs/frametest.c | 925 - src/lz4/programs/fullbench.c | 1006 - src/lz4/programs/fuzzer.c | 1233 - src/lz4/programs/lz4.1 | 221 - src/lz4/programs/lz4cli.c | 560 - src/lz4/programs/lz4io.c | 1044 - src/lz4/programs/lz4io.h | 87 - src/lz4/test/Makefile | 40 - src/lz4/test/test-lz4-versions.py | 147 - src/lz4/visual/2012/datagen/datagen.vcxproj | 159 - .../2012/datagen/datagen.vcxproj.filters | 30 - .../visual/2012/frametest/frametest.vcxproj | 166 - .../2012/frametest/frametest.vcxproj.filters | 51 - .../visual/2012/fullbench/fullbench.vcxproj | 166 - .../2012/fullbench/fullbench.vcxproj.filters | 51 - src/lz4/visual/2012/fuzzer/fuzzer.vcxproj | 163 - .../visual/2012/fuzzer/fuzzer.vcxproj.filters | 42 - src/lz4/visual/2012/lz4.sln | 66 - src/lz4/visual/2012/lz4/lz4.vcxproj | 170 - src/lz4/visual/2012/lz4/lz4.vcxproj.filters | 63 - src/nudb/.gitignore | 2 - src/nudb/.gitmodules | 9 - src/nudb/.travis.yml | 89 - src/nudb/CHANGELOG.md | 58 - src/nudb/CMakeLists.txt | 87 - src/nudb/Jamroot | 93 - src/nudb/LICENSE_1_0.txt | 23 - src/nudb/README.md | 466 - src/nudb/TODO.txt | 2 - src/nudb/bench/CMakeLists.txt | 363 - src/nudb/bench/Jamfile | 226 - src/nudb/bench/README.md | 102 - src/nudb/bench/bench.cpp | 535 - src/nudb/bench/plot_bench.py | 37 - src/nudb/doc/.gitignore | 5 - src/nudb/doc/Jamfile.v2 | 77 - src/nudb/doc/boostbook.dtd | 439 - src/nudb/doc/docca | 1 - src/nudb/doc/images/logo.png | Bin 153828 -> 0 bytes src/nudb/doc/images/logo.psd | Bin 737507 -> 0 bytes src/nudb/doc/images/readme2.png | Bin 106410 -> 0 bytes src/nudb/doc/index.xml | 14 - src/nudb/doc/main.qbk | 342 - src/nudb/doc/makeqbk.sh | 12 - src/nudb/doc/quickref.xml | 82 - src/nudb/doc/reference.xsl | 14 - src/nudb/doc/source.dox | 333 - src/nudb/doc/types/File.qbk | 159 - src/nudb/doc/types/Hasher.qbk | 56 - src/nudb/doc/types/Progress.qbk | 40 - src/nudb/examples/CMakeLists.txt | 17 - src/nudb/examples/Jamfile | 12 - src/nudb/examples/example.cpp | 46 - src/nudb/extras/README.md | 5 - src/nudb/extras/beast | 1 - src/nudb/extras/nudb/basic_seconds_clock.hpp | 200 - src/nudb/extras/nudb/chrono_util.hpp | 58 - src/nudb/extras/nudb/test/fail_file.hpp | 343 - src/nudb/extras/nudb/test/temp_dir.hpp | 73 - src/nudb/extras/nudb/test/test_store.hpp | 451 - .../extras/nudb/test/xor_shift_engine.hpp | 105 - src/nudb/extras/nudb/util.hpp | 288 - src/nudb/extras/rocksdb | 1 - src/nudb/include/nudb/basic_store.hpp | 436 - src/nudb/include/nudb/concepts.hpp | 205 - src/nudb/include/nudb/create.hpp | 117 - src/nudb/include/nudb/detail/arena.hpp | 296 - src/nudb/include/nudb/detail/bucket.hpp | 473 - src/nudb/include/nudb/detail/buffer.hpp | 86 - src/nudb/include/nudb/detail/bulkio.hpp | 196 - src/nudb/include/nudb/detail/cache.hpp | 236 - src/nudb/include/nudb/detail/endian.hpp | 93 - src/nudb/include/nudb/detail/field.hpp | 265 - src/nudb/include/nudb/detail/format.hpp | 629 - src/nudb/include/nudb/detail/gentex.hpp | 259 - src/nudb/include/nudb/detail/mutex.hpp | 26 - src/nudb/include/nudb/detail/pool.hpp | 243 - src/nudb/include/nudb/detail/stream.hpp | 149 - src/nudb/include/nudb/detail/xxhash.hpp | 328 - src/nudb/include/nudb/error.hpp | 263 - src/nudb/include/nudb/file.hpp | 53 - src/nudb/include/nudb/impl/basic_store.ipp | 793 - src/nudb/include/nudb/impl/create.ipp | 163 - src/nudb/include/nudb/impl/error.ipp | 180 - src/nudb/include/nudb/impl/posix_file.ipp | 259 - src/nudb/include/nudb/impl/recover.ipp | 209 - src/nudb/include/nudb/impl/rekey.ipp | 248 - src/nudb/include/nudb/impl/verify.ipp | 630 - src/nudb/include/nudb/impl/visit.ipp | 96 - src/nudb/include/nudb/impl/win32_file.ipp | 264 - src/nudb/include/nudb/native_file.hpp | 76 - src/nudb/include/nudb/nudb.hpp | 27 - src/nudb/include/nudb/posix_file.hpp | 228 - src/nudb/include/nudb/progress.hpp | 32 - src/nudb/include/nudb/recover.hpp | 73 - src/nudb/include/nudb/rekey.hpp | 110 - src/nudb/include/nudb/store.hpp | 27 - src/nudb/include/nudb/type_traits.hpp | 63 - src/nudb/include/nudb/verify.hpp | 200 - src/nudb/include/nudb/version.hpp | 21 - src/nudb/include/nudb/visit.hpp | 63 - src/nudb/include/nudb/win32_file.hpp | 246 - src/nudb/include/nudb/xxhasher.hpp | 45 - src/nudb/scripts/blacklist.supp | 38 - src/nudb/scripts/build-and-test.sh | 150 - src/nudb/scripts/install-boost.sh | 27 - src/nudb/scripts/install-dependencies.sh | 90 - src/nudb/scripts/install-valgrind.sh | 20 - src/nudb/scripts/run-with-debugger.sh | 22 - src/nudb/scripts/run-with-gdb.sh | 9 - src/nudb/test/CMakeLists.txt | 38 - src/nudb/test/Jamfile | 30 - src/nudb/test/basic_store.cpp | 250 - src/nudb/test/buffer.cpp | 77 - src/nudb/test/callgrind_test.cpp | 92 - src/nudb/test/concepts.cpp | 9 - src/nudb/test/create.cpp | 49 - src/nudb/test/error.cpp | 83 - src/nudb/test/file.cpp | 9 - src/nudb/test/native_file.cpp | 9 - src/nudb/test/posix_file.cpp | 9 - src/nudb/test/recover.cpp | 191 - src/nudb/test/rekey.cpp | 136 - src/nudb/test/store.cpp | 9 - src/nudb/test/type_traits.cpp | 9 - src/nudb/test/verify.cpp | 94 - src/nudb/test/version.cpp | 9 - src/nudb/test/visit.cpp | 114 - src/nudb/test/win32_file.cpp | 9 - src/nudb/test/xxhasher.cpp | 9 - src/nudb/tools/CMakeLists.txt | 17 - src/nudb/tools/Jamfile | 12 - src/nudb/tools/nudb.cpp | 514 - src/protobuf/CHANGES.txt | 531 - src/protobuf/CONTRIBUTORS.txt | 90 - src/protobuf/COPYING.txt | 33 - src/protobuf/INSTALL.txt | 237 - src/protobuf/Makefile.am | 225 - src/protobuf/README.txt | 152 - src/protobuf/autogen.sh | 41 - src/protobuf/benchmarks/ProtoBench.java | 203 - src/protobuf/benchmarks/google_message1.dat | Bin 228 -> 0 bytes src/protobuf/benchmarks/google_message2.dat | Bin 84570 -> 0 bytes src/protobuf/benchmarks/google_size.proto | 136 - src/protobuf/benchmarks/google_speed.proto | 136 - src/protobuf/benchmarks/readme.txt | 50 - src/protobuf/configure.ac | 150 - src/protobuf/editors/README.txt | 5 - src/protobuf/editors/proto.vim | 105 - src/protobuf/editors/protobuf-mode.el | 220 - src/protobuf/examples/AddPerson.java | 95 - src/protobuf/examples/ListPeople.java | 50 - src/protobuf/examples/Makefile | 58 - src/protobuf/examples/README.txt | 29 - src/protobuf/examples/add_person.cc | 95 - src/protobuf/examples/add_person.py | 58 - src/protobuf/examples/addressbook.proto | 30 - src/protobuf/examples/list_people.cc | 68 - src/protobuf/examples/list_people.py | 38 - src/protobuf/generate_descriptor_proto.sh | 33 - src/protobuf/java/README.txt | 96 - src/protobuf/java/pom.xml | 207 - .../com/google/protobuf/AbstractMessage.java | 930 - .../google/protobuf/AbstractMessageLite.java | 343 - .../com/google/protobuf/AbstractParser.java | 261 - .../google/protobuf/BlockingRpcChannel.java | 51 - .../com/google/protobuf/BlockingService.java | 64 - .../google/protobuf/BoundedByteString.java | 163 - .../java/com/google/protobuf/ByteString.java | 970 - .../com/google/protobuf/CodedInputStream.java | 920 - .../google/protobuf/CodedOutputStream.java | 1111 - .../java/com/google/protobuf/Descriptors.java | 1970 - .../com/google/protobuf/DynamicMessage.java | 482 - .../google/protobuf/ExtensionRegistry.java | 266 - .../protobuf/ExtensionRegistryLite.java | 185 - .../java/com/google/protobuf/FieldSet.java | 861 - .../com/google/protobuf/GeneratedMessage.java | 1939 - .../google/protobuf/GeneratedMessageLite.java | 797 - .../java/com/google/protobuf/Internal.java | 153 - .../InvalidProtocolBufferException.java | 114 - .../java/com/google/protobuf/LazyField.java | 210 - .../google/protobuf/LazyStringArrayList.java | 178 - .../com/google/protobuf/LazyStringList.java | 81 - .../google/protobuf/LiteralByteString.java | 349 - .../java/com/google/protobuf/Message.java | 237 - .../java/com/google/protobuf/MessageLite.java | 319 - .../google/protobuf/MessageLiteOrBuilder.java | 60 - .../com/google/protobuf/MessageOrBuilder.java | 129 - .../main/java/com/google/protobuf/Parser.java | 259 - .../google/protobuf/ProtocolMessageEnum.java | 58 - .../google/protobuf/RepeatedFieldBuilder.java | 696 - .../com/google/protobuf/RopeByteString.java | 943 - .../java/com/google/protobuf/RpcCallback.java | 47 - .../java/com/google/protobuf/RpcChannel.java | 71 - .../com/google/protobuf/RpcController.java | 118 - .../java/com/google/protobuf/RpcUtil.java | 135 - .../java/com/google/protobuf/Service.java | 117 - .../com/google/protobuf/ServiceException.java | 52 - .../google/protobuf/SingleFieldBuilder.java | 241 - .../com/google/protobuf/SmallSortedMap.java | 618 - .../java/com/google/protobuf/TextFormat.java | 1559 - .../UninitializedMessageException.java | 99 - .../com/google/protobuf/UnknownFieldSet.java | 978 - .../protobuf/UnmodifiableLazyStringList.java | 152 - .../main/java/com/google/protobuf/Utf8.java | 349 - .../java/com/google/protobuf/WireFormat.java | 163 - .../google/protobuf/AbstractMessageTest.java | 509 - .../protobuf/BoundedByteStringTest.java | 68 - .../com/google/protobuf/ByteStringTest.java | 692 - .../google/protobuf/CodedInputStreamTest.java | 528 - .../protobuf/CodedOutputStreamTest.java | 317 - .../google/protobuf/DeprecatedFieldTest.java | 80 - .../com/google/protobuf/DescriptorsTest.java | 648 - .../google/protobuf/DynamicMessageTest.java | 264 - .../protobuf/ForceFieldBuildersPreRun.java | 48 - .../google/protobuf/GeneratedMessageTest.java | 1146 - .../com/google/protobuf/IsValidUtf8Test.java | 180 - .../google/protobuf/IsValidUtf8TestUtil.java | 421 - .../protobuf/LazyStringArrayListTest.java | 162 - .../protobuf/LazyStringEndToEndTest.java | 143 - .../java/com/google/protobuf/LiteTest.java | 148 - .../protobuf/LiteralByteStringTest.java | 396 - .../java/com/google/protobuf/MessageTest.java | 353 - .../google/protobuf/NestedBuildersTest.java | 185 - .../java/com/google/protobuf/ParserTest.java | 375 - .../protobuf/RepeatedFieldBuilderTest.java | 190 - .../protobuf/RopeByteStringSubstringTest.java | 97 - .../google/protobuf/RopeByteStringTest.java | 115 - .../java/com/google/protobuf/ServiceTest.java | 320 - .../protobuf/SingleFieldBuilderTest.java | 155 - .../google/protobuf/SmallSortedMapTest.java | 420 - .../google/protobuf/TestBadIdentifiers.java | 63 - .../java/com/google/protobuf/TestUtil.java | 3955 - .../com/google/protobuf/TextFormatTest.java | 786 - .../google/protobuf/UnknownFieldSetTest.java | 437 - .../UnmodifiableLazyStringListTest.java | 152 - .../com/google/protobuf/WireFormatTest.java | 580 - .../google/protobuf/multiple_files_test.proto | 71 - .../protobuf/nested_builders_test.proto | 53 - .../google/protobuf/nested_extension.proto | 45 - .../protobuf/nested_extension_lite.proto | 48 - .../protobuf/non_nested_extension.proto | 48 - .../protobuf/non_nested_extension_lite.proto | 50 - .../protobuf/test_bad_identifiers.proto | 108 - src/protobuf/m4/ac_system_extensions.m4 | 37 - src/protobuf/m4/acx_check_suncc.m4 | 74 - src/protobuf/m4/acx_pthread.m4 | 397 - src/protobuf/m4/stl_hash.m4 | 72 - src/protobuf/more_tests/Makefile | 41 - src/protobuf/post_process_dist.sh | 60 - src/protobuf/protobuf-lite.pc.in | 13 - src/protobuf/protobuf.pc.in | 14 - src/protobuf/python/README.txt | 101 - src/protobuf/python/ez_setup.py | 283 - src/protobuf/python/google/__init__.py | 1 - .../python/google/protobuf/__init__.py | 0 .../python/google/protobuf/descriptor.py | 713 - .../google/protobuf/descriptor_database.py | 120 - .../python/google/protobuf/descriptor_pool.py | 527 - .../google/protobuf/internal/__init__.py | 0 .../protobuf/internal/api_implementation.py | 87 - .../google/protobuf/internal/containers.py | 269 - .../google/protobuf/internal/cpp_message.py | 663 - .../google/protobuf/internal/decoder.py | 720 - .../internal/descriptor_database_test.py | 63 - .../protobuf/internal/descriptor_pool_test.py | 220 - .../protobuf/internal/descriptor_test.py | 613 - .../google/protobuf/internal/encoder.py | 769 - .../protobuf/internal/enum_type_wrapper.py | 89 - .../protobuf/internal/factory_test1.proto | 55 - .../protobuf/internal/factory_test2.proto | 77 - .../protobuf/internal/generator_test.py | 269 - .../protobuf/internal/message_cpp_test.py | 45 - .../protobuf/internal/message_factory_test.py | 113 - .../protobuf/internal/message_listener.py | 78 - .../google/protobuf/internal/message_test.py | 494 - .../protobuf/internal/more_extensions.proto | 58 - .../internal/more_extensions_dynamic.proto | 49 - .../protobuf/internal/more_messages.proto | 51 - .../protobuf/internal/python_message.py | 1150 - .../internal/reflection_cpp_generated_test.py | 91 - .../protobuf/internal/reflection_test.py | 2671 - .../internal/service_reflection_test.py | 136 - .../internal/test_bad_identifiers.proto | 52 - .../google/protobuf/internal/test_util.py | 651 - .../protobuf/internal/text_format_test.py | 617 - .../google/protobuf/internal/type_checkers.py | 286 - .../protobuf/internal/unknown_fields_test.py | 170 - .../google/protobuf/internal/wire_format.py | 268 - .../protobuf/internal/wire_format_test.py | 253 - .../python/google/protobuf/message.py | 280 - .../python/google/protobuf/message_factory.py | 113 - .../google/protobuf/pyext/python-proto2.cc | 1717 - .../protobuf/pyext/python_descriptor.cc | 337 - .../google/protobuf/pyext/python_descriptor.h | 87 - .../google/protobuf/pyext/python_protobuf.cc | 63 - .../google/protobuf/pyext/python_protobuf.h | 57 - .../python/google/protobuf/reflection.py | 169 - .../python/google/protobuf/service.py | 226 - .../google/protobuf/service_reflection.py | 284 - .../python/google/protobuf/text_format.py | 739 - src/protobuf/python/mox.py | 1401 - src/protobuf/python/setup.py | 195 - src/protobuf/python/stubout.py | 140 - src/protobuf/src/Makefile.am | 395 - src/protobuf/src/google/protobuf/SEBS | 240 - .../protobuf/compiler/code_generator.cc | 80 - .../google/protobuf/compiler/code_generator.h | 142 - .../compiler/command_line_interface.cc | 1437 - .../compiler/command_line_interface.h | 353 - .../command_line_interface_unittest.cc | 1560 - .../compiler/cpp/cpp_bootstrap_unittest.cc | 158 - .../google/protobuf/compiler/cpp/cpp_enum.cc | 258 - .../google/protobuf/compiler/cpp/cpp_enum.h | 101 - .../protobuf/compiler/cpp/cpp_enum_field.cc | 366 - .../protobuf/compiler/cpp/cpp_enum_field.h | 105 - .../protobuf/compiler/cpp/cpp_extension.cc | 210 - .../protobuf/compiler/cpp/cpp_extension.h | 86 - .../google/protobuf/compiler/cpp/cpp_field.cc | 142 - .../google/protobuf/compiler/cpp/cpp_field.h | 177 - .../google/protobuf/compiler/cpp/cpp_file.cc | 652 - .../google/protobuf/compiler/cpp/cpp_file.h | 99 - .../protobuf/compiler/cpp/cpp_generator.cc | 124 - .../protobuf/compiler/cpp/cpp_generator.h | 72 - .../protobuf/compiler/cpp/cpp_helpers.cc | 438 - .../protobuf/compiler/cpp/cpp_helpers.h | 186 - .../protobuf/compiler/cpp/cpp_message.cc | 2020 - .../protobuf/compiler/cpp/cpp_message.h | 171 - .../compiler/cpp/cpp_message_field.cc | 298 - .../protobuf/compiler/cpp/cpp_message_field.h | 104 - .../protobuf/compiler/cpp/cpp_options.h | 58 - .../compiler/cpp/cpp_plugin_unittest.cc | 121 - .../compiler/cpp/cpp_primitive_field.cc | 387 - .../compiler/cpp/cpp_primitive_field.h | 105 - .../protobuf/compiler/cpp/cpp_service.cc | 334 - .../protobuf/compiler/cpp/cpp_service.h | 119 - .../protobuf/compiler/cpp/cpp_string_field.cc | 491 - .../protobuf/compiler/cpp/cpp_string_field.h | 108 - .../cpp/cpp_test_bad_identifiers.proto | 123 - .../protobuf/compiler/cpp/cpp_unittest.cc | 1354 - .../protobuf/compiler/cpp/cpp_unittest.h | 51 - .../src/google/protobuf/compiler/importer.cc | 459 - .../src/google/protobuf/compiler/importer.h | 304 - .../protobuf/compiler/importer_unittest.cc | 600 - .../compiler/java/java_doc_comment.cc | 236 - .../protobuf/compiler/java/java_doc_comment.h | 69 - .../java/java_doc_comment_unittest.cc | 66 - .../protobuf/compiler/java/java_enum.cc | 271 - .../google/protobuf/compiler/java/java_enum.h | 86 - .../protobuf/compiler/java/java_enum_field.cc | 603 - .../protobuf/compiler/java/java_enum_field.h | 123 - .../protobuf/compiler/java/java_extension.cc | 218 - .../protobuf/compiler/java/java_extension.h | 77 - .../protobuf/compiler/java/java_field.cc | 137 - .../protobuf/compiler/java/java_field.h | 109 - .../protobuf/compiler/java/java_file.cc | 490 - .../google/protobuf/compiler/java/java_file.h | 101 - .../protobuf/compiler/java/java_generator.cc | 128 - .../protobuf/compiler/java/java_generator.h | 72 - .../protobuf/compiler/java/java_helpers.cc | 500 - .../protobuf/compiler/java/java_helpers.h | 220 - .../protobuf/compiler/java/java_message.cc | 1435 - .../protobuf/compiler/java/java_message.h | 112 - .../compiler/java/java_message_field.cc | 974 - .../compiler/java/java_message_field.h | 136 - .../compiler/java/java_plugin_unittest.cc | 122 - .../compiler/java/java_primitive_field.cc | 787 - .../compiler/java/java_primitive_field.h | 123 - .../protobuf/compiler/java/java_service.cc | 453 - .../protobuf/compiler/java/java_service.h | 113 - .../compiler/java/java_string_field.cc | 726 - .../compiler/java/java_string_field.h | 122 - .../src/google/protobuf/compiler/main.cc | 61 - .../protobuf/compiler/mock_code_generator.cc | 241 - .../protobuf/compiler/mock_code_generator.h | 117 - .../google/protobuf/compiler/package_info.h | 64 - .../src/google/protobuf/compiler/parser.cc | 1611 - .../src/google/protobuf/compiler/parser.h | 477 - .../protobuf/compiler/parser_unittest.cc | 2374 - .../src/google/protobuf/compiler/plugin.cc | 163 - .../src/google/protobuf/compiler/plugin.h | 72 - .../src/google/protobuf/compiler/plugin.pb.cc | 1090 - .../src/google/protobuf/compiler/plugin.pb.h | 856 - .../src/google/protobuf/compiler/plugin.proto | 147 - .../compiler/python/python_generator.cc | 1157 - .../compiler/python/python_generator.h | 161 - .../compiler/python/python_plugin_unittest.cc | 116 - .../google/protobuf/compiler/subprocess.cc | 463 - .../src/google/protobuf/compiler/subprocess.h | 108 - .../google/protobuf/compiler/test_plugin.cc | 51 - .../protobuf/compiler/zip_output_unittest.sh | 91 - .../google/protobuf/compiler/zip_writer.cc | 218 - .../src/google/protobuf/compiler/zip_writer.h | 93 - .../src/google/protobuf/descriptor.cc | 4949 - src/protobuf/src/google/protobuf/descriptor.h | 1521 - .../src/google/protobuf/descriptor.pb.cc | 8146 - .../src/google/protobuf/descriptor.pb.h | 5992 - .../src/google/protobuf/descriptor.proto | 620 - .../google/protobuf/descriptor_database.cc | 541 - .../src/google/protobuf/descriptor_database.h | 367 - .../protobuf/descriptor_database_unittest.cc | 748 - .../google/protobuf/descriptor_unittest.cc | 4656 - .../src/google/protobuf/dynamic_message.cc | 571 - .../src/google/protobuf/dynamic_message.h | 136 - .../protobuf/dynamic_message_unittest.cc | 166 - .../src/google/protobuf/extension_set.cc | 1461 - .../src/google/protobuf/extension_set.h | 1007 - .../google/protobuf/extension_set_heavy.cc | 711 - .../google/protobuf/extension_set_unittest.cc | 726 - .../protobuf/generated_enum_reflection.h | 85 - .../protobuf/generated_message_reflection.cc | 1293 - .../protobuf/generated_message_reflection.h | 419 - .../generated_message_reflection_unittest.cc | 484 - .../google/protobuf/generated_message_util.cc | 54 - .../google/protobuf/generated_message_util.h | 77 - .../src/google/protobuf/io/coded_stream.cc | 857 - .../src/google/protobuf/io/coded_stream.h | 1136 - .../src/google/protobuf/io/coded_stream_inl.h | 68 - .../protobuf/io/coded_stream_unittest.cc | 1191 - .../src/google/protobuf/io/gzip_stream.cc | 326 - .../src/google/protobuf/io/gzip_stream.h | 209 - .../protobuf/io/gzip_stream_unittest.sh | 44 - .../src/google/protobuf/io/package_info.h | 54 - .../src/google/protobuf/io/printer.cc | 198 - src/protobuf/src/google/protobuf/io/printer.h | 136 - .../google/protobuf/io/printer_unittest.cc | 285 - .../src/google/protobuf/io/tokenizer.cc | 1091 - .../src/google/protobuf/io/tokenizer.h | 384 - .../google/protobuf/io/tokenizer_unittest.cc | 1001 - .../google/protobuf/io/zero_copy_stream.cc | 48 - .../src/google/protobuf/io/zero_copy_stream.h | 238 - .../protobuf/io/zero_copy_stream_impl.cc | 471 - .../protobuf/io/zero_copy_stream_impl.h | 357 - .../protobuf/io/zero_copy_stream_impl_lite.cc | 393 - .../protobuf/io/zero_copy_stream_impl_lite.h | 340 - .../protobuf/io/zero_copy_stream_unittest.cc | 944 - .../src/google/protobuf/lite_unittest.cc | 185 - src/protobuf/src/google/protobuf/message.cc | 358 - src/protobuf/src/google/protobuf/message.h | 837 - .../src/google/protobuf/message_lite.cc | 334 - .../src/google/protobuf/message_lite.h | 246 - .../src/google/protobuf/message_unittest.cc | 354 - .../src/google/protobuf/package_info.h | 64 - .../src/google/protobuf/reflection_ops.cc | 267 - .../src/google/protobuf/reflection_ops.h | 81 - .../protobuf/reflection_ops_unittest.cc | 405 - .../src/google/protobuf/repeated_field.cc | 87 - .../src/google/protobuf/repeated_field.h | 1519 - .../repeated_field_reflection_unittest.cc | 195 - .../protobuf/repeated_field_unittest.cc | 1357 - src/protobuf/src/google/protobuf/service.cc | 46 - src/protobuf/src/google/protobuf/service.h | 291 - .../src/google/protobuf/stubs/atomicops.h | 206 - .../stubs/atomicops_internals_arm_gcc.h | 151 - .../stubs/atomicops_internals_arm_qnx.h | 146 - .../atomicops_internals_atomicword_compat.h | 122 - .../stubs/atomicops_internals_macosx.h | 225 - .../stubs/atomicops_internals_mips_gcc.h | 187 - .../stubs/atomicops_internals_pnacl.h | 73 - .../stubs/atomicops_internals_x86_gcc.cc | 137 - .../stubs/atomicops_internals_x86_gcc.h | 293 - .../stubs/atomicops_internals_x86_msvc.cc | 112 - .../stubs/atomicops_internals_x86_msvc.h | 150 - .../src/google/protobuf/stubs/common.cc | 395 - .../src/google/protobuf/stubs/common.h | 1223 - .../google/protobuf/stubs/common_unittest.cc | 357 - src/protobuf/src/google/protobuf/stubs/hash.h | 232 - .../src/google/protobuf/stubs/map-util.h | 143 - .../src/google/protobuf/stubs/once.cc | 99 - src/protobuf/src/google/protobuf/stubs/once.h | 148 - .../google/protobuf/stubs/once_unittest.cc | 253 - .../google/protobuf/stubs/platform_macros.h | 70 - .../src/google/protobuf/stubs/stl_util.h | 121 - .../src/google/protobuf/stubs/stringprintf.cc | 175 - .../src/google/protobuf/stubs/stringprintf.h | 76 - .../protobuf/stubs/stringprintf_unittest.cc | 152 - .../protobuf/stubs/structurally_valid.cc | 536 - .../stubs/structurally_valid_unittest.cc | 40 - .../src/google/protobuf/stubs/strutil.cc | 1211 - .../src/google/protobuf/stubs/strutil.h | 467 - .../google/protobuf/stubs/strutil_unittest.cc | 83 - .../src/google/protobuf/stubs/substitute.cc | 134 - .../src/google/protobuf/stubs/substitute.h | 170 - .../src/google/protobuf/stubs/template_util.h | 138 - .../protobuf/stubs/template_util_unittest.cc | 130 - .../src/google/protobuf/stubs/type_traits.h | 336 - .../protobuf/stubs/type_traits_unittest.cc | 628 - src/protobuf/src/google/protobuf/test_util.cc | 3047 - src/protobuf/src/google/protobuf/test_util.h | 193 - .../src/google/protobuf/test_util_lite.cc | 1548 - .../src/google/protobuf/test_util_lite.h | 101 - .../google/protobuf/testdata/golden_message | Bin 509 -> 0 bytes .../testdata/golden_packed_fields_message | Bin 142 -> 0 bytes .../testdata/text_format_unittest_data.txt | 128 - .../text_format_unittest_extensions_data.txt | 128 - .../src/google/protobuf/testing/file.cc | 176 - .../src/google/protobuf/testing/file.h | 83 - .../src/google/protobuf/testing/googletest.cc | 255 - .../src/google/protobuf/testing/googletest.h | 102 - .../src/google/protobuf/testing/zcgunzip.cc | 73 - .../src/google/protobuf/testing/zcgzip.cc | 79 - .../src/google/protobuf/text_format.cc | 1521 - .../src/google/protobuf/text_format.h | 369 - .../google/protobuf/text_format_unittest.cc | 1248 - .../src/google/protobuf/unittest.proto | 719 - .../protobuf/unittest_custom_options.proto | 387 - .../unittest_embed_optimize_for.proto | 50 - .../src/google/protobuf/unittest_empty.proto | 37 - .../unittest_enormous_descriptor.proto | 1046 - .../src/google/protobuf/unittest_import.proto | 64 - .../protobuf/unittest_import_lite.proto | 51 - .../protobuf/unittest_import_public.proto | 40 - .../unittest_import_public_lite.proto | 42 - .../src/google/protobuf/unittest_lite.proto | 360 - .../unittest_lite_imports_nonlite.proto | 43 - .../src/google/protobuf/unittest_mset.proto | 72 - .../unittest_no_generic_services.proto | 52 - .../protobuf/unittest_optimize_for.proto | 61 - .../src/google/protobuf/unknown_field_set.cc | 266 - .../src/google/protobuf/unknown_field_set.h | 311 - .../protobuf/unknown_field_set_unittest.cc | 594 - .../src/google/protobuf/wire_format.cc | 1063 - .../src/google/protobuf/wire_format.h | 308 - .../src/google/protobuf/wire_format_lite.cc | 361 - .../src/google/protobuf/wire_format_lite.h | 622 - .../google/protobuf/wire_format_lite_inl.h | 776 - .../google/protobuf/wire_format_unittest.cc | 978 - src/protobuf/src/solaris/libstdc++.la | 51 - src/protobuf/vsprojects/config.h | 29 - src/protobuf/vsprojects/convert2008to2005.sh | 20 - src/protobuf/vsprojects/extract_includes.bat | 49 - .../vsprojects/libprotobuf-lite.vcproj | 302 - src/protobuf/vsprojects/libprotobuf.vcproj | 462 - src/protobuf/vsprojects/libprotoc.vcproj | 426 - src/protobuf/vsprojects/lite-test.vcproj | 305 - src/protobuf/vsprojects/protobuf.sln | 92 - src/protobuf/vsprojects/protoc.vcproj | 192 - src/protobuf/vsprojects/readme.txt | 114 - src/protobuf/vsprojects/test_plugin.vcproj | 209 - src/protobuf/vsprojects/tests.vcproj | 681 - src/ripple/README.md | 9 - src/ripple/app/consensus/RCLCxPos.h | 143 - src/ripple/app/consensus/RCLCxTraits.h | 55 - src/ripple/app/consensus/RCLCxTx.h | 156 - src/ripple/app/consensus/README.md | 115 - .../app/ledger/AbstractFetchPackContainer.h | 48 - src/ripple/app/ledger/AcceptedLedger.cpp | 55 - src/ripple/app/ledger/AcceptedLedger.h | 84 - src/ripple/app/ledger/AcceptedLedgerTx.cpp | 113 - src/ripple/app/ledger/AcceptedLedgerTx.h | 132 - src/ripple/app/ledger/AccountStateSF.cpp | 46 - src/ripple/app/ledger/AccountStateSF.h | 53 - src/ripple/app/ledger/BookListeners.cpp | 58 - src/ripple/app/ledger/BookListeners.h | 49 - src/ripple/app/ledger/Consensus.h | 101 - src/ripple/app/ledger/ConsensusTransSetSF.cpp | 103 - src/ripple/app/ledger/ConsensusTransSetSF.h | 58 - src/ripple/app/ledger/InboundLedger.h | 176 - src/ripple/app/ledger/InboundLedgers.h | 91 - src/ripple/app/ledger/InboundTransactions.h | 87 - src/ripple/app/ledger/Ledger.cpp | 1347 - src/ripple/app/ledger/Ledger.h | 416 - src/ripple/app/ledger/LedgerCleaner.h | 65 - src/ripple/app/ledger/LedgerConsensus.h | 87 - src/ripple/app/ledger/LedgerHistory.cpp | 509 - src/ripple/app/ledger/LedgerHistory.h | 139 - src/ripple/app/ledger/LedgerHolder.h | 72 - src/ripple/app/ledger/LedgerMaster.h | 356 - src/ripple/app/ledger/LedgerProposal.cpp | 150 - src/ripple/app/ledger/LedgerProposal.h | 174 - src/ripple/app/ledger/LedgerTiming.h | 218 - src/ripple/app/ledger/LedgerToJson.h | 74 - src/ripple/app/ledger/LocalTxs.h | 55 - src/ripple/app/ledger/OpenLedger.h | 286 - src/ripple/app/ledger/OrderBookDB.cpp | 294 - src/ripple/app/ledger/OrderBookDB.h | 90 - src/ripple/app/ledger/PendingSaves.h | 149 - src/ripple/app/ledger/README.md | 490 - src/ripple/app/ledger/TransactionMaster.h | 66 - src/ripple/app/ledger/TransactionStateSF.cpp | 49 - src/ripple/app/ledger/TransactionStateSF.h | 55 - src/ripple/app/ledger/impl/ConsensusImp.cpp | 183 - src/ripple/app/ledger/impl/ConsensusImp.h | 131 - src/ripple/app/ledger/impl/DisputedTx.h | 234 - src/ripple/app/ledger/impl/InboundLedger.cpp | 1297 - src/ripple/app/ledger/impl/InboundLedgers.cpp | 434 - .../app/ledger/impl/InboundTransactions.cpp | 308 - src/ripple/app/ledger/impl/LedgerCleaner.cpp | 515 - .../app/ledger/impl/LedgerConsensusImp.cpp | 1889 - .../app/ledger/impl/LedgerConsensusImp.h | 392 - src/ripple/app/ledger/impl/LedgerMaster.cpp | 1958 - src/ripple/app/ledger/impl/LedgerTiming.cpp | 209 - src/ripple/app/ledger/impl/LedgerToJson.cpp | 216 - src/ripple/app/ledger/impl/LocalTxs.cpp | 180 - src/ripple/app/ledger/impl/OpenLedger.cpp | 206 - .../app/ledger/impl/TransactionAcquire.cpp | 268 - .../app/ledger/impl/TransactionAcquire.h | 84 - .../app/ledger/impl/TransactionMaster.cpp | 122 - src/ripple/app/main/Amendments.cpp | 59 - src/ripple/app/main/Application.cpp | 1898 - src/ripple/app/main/Application.h | 170 - src/ripple/app/main/BasicApp.cpp | 48 - src/ripple/app/main/BasicApp.h | 48 - src/ripple/app/main/CollectorManager.cpp | 83 - src/ripple/app/main/CollectorManager.h | 43 - src/ripple/app/main/DBInit.cpp | 155 - src/ripple/app/main/DBInit.h | 37 - src/ripple/app/main/LoadManager.cpp | 215 - src/ripple/app/main/LoadManager.h | 120 - src/ripple/app/main/Main.cpp | 538 - src/ripple/app/main/NodeIdentity.cpp | 95 - src/ripple/app/main/NodeIdentity.h | 36 - src/ripple/app/main/NodeStoreScheduler.cpp | 78 - src/ripple/app/main/NodeStoreScheduler.h | 58 - src/ripple/app/main/Tuning.h | 33 - src/ripple/app/misc/AmendmentTable.h | 163 - src/ripple/app/misc/CanonicalTXSet.cpp | 135 - src/ripple/app/misc/CanonicalTXSet.h | 136 - src/ripple/app/misc/FeeEscalation.md | 322 - src/ripple/app/misc/FeeVote.h | 92 - src/ripple/app/misc/FeeVoteImpl.cpp | 266 - src/ripple/app/misc/HashRouter.cpp | 110 - src/ripple/app/misc/HashRouter.h | 182 - src/ripple/app/misc/LoadFeeTrack.h | 147 - src/ripple/app/misc/NetworkOPs.cpp | 3261 - src/ripple/app/misc/NetworkOPs.h | 249 - src/ripple/app/misc/OrderBook.h | 81 - src/ripple/app/misc/README.md | 155 - src/ripple/app/misc/SHAMapStore.h | 100 - src/ripple/app/misc/SHAMapStoreImp.cpp | 858 - src/ripple/app/misc/SHAMapStoreImp.h | 257 - src/ripple/app/misc/Transaction.h | 176 - src/ripple/app/misc/TxQ.h | 419 - src/ripple/app/misc/Validations.cpp | 481 - src/ripple/app/misc/Validations.h | 83 - src/ripple/app/misc/ValidatorList.h | 121 - src/ripple/app/misc/impl/AccountTxPaging.cpp | 265 - src/ripple/app/misc/impl/AccountTxPaging.h | 66 - src/ripple/app/misc/impl/AmendmentTable.cpp | 606 - src/ripple/app/misc/impl/LoadFeeTrack.cpp | 192 - src/ripple/app/misc/impl/Transaction.cpp | 169 - src/ripple/app/misc/impl/TxQ.cpp | 1450 - src/ripple/app/misc/impl/ValidatorList.cpp | 190 - src/ripple/app/paths/AccountCurrencies.cpp | 94 - src/ripple/app/paths/AccountCurrencies.h | 42 - src/ripple/app/paths/Credit.cpp | 86 - src/ripple/app/paths/Credit.h | 67 - src/ripple/app/paths/Flow.cpp | 154 - src/ripple/app/paths/Flow.h | 68 - src/ripple/app/paths/Node.cpp | 99 - src/ripple/app/paths/Node.h | 112 - src/ripple/app/paths/NodeDirectory.h | 116 - src/ripple/app/paths/PathRequest.cpp | 724 - src/ripple/app/paths/PathRequest.h | 163 - src/ripple/app/paths/PathRequests.cpp | 272 - src/ripple/app/paths/PathRequests.h | 110 - src/ripple/app/paths/PathState.cpp | 862 - src/ripple/app/paths/PathState.h | 177 - src/ripple/app/paths/Pathfinder.cpp | 1305 - src/ripple/app/paths/Pathfinder.h | 215 - src/ripple/app/paths/README.md | 137 - src/ripple/app/paths/RippleCalc.cpp | 588 - src/ripple/app/paths/RippleCalc.h | 179 - src/ripple/app/paths/RippleLineCache.cpp | 52 - src/ripple/app/paths/RippleLineCache.h | 100 - src/ripple/app/paths/RippleState.cpp | 87 - src/ripple/app/paths/RippleState.h | 166 - src/ripple/app/paths/Tuning.h | 36 - src/ripple/app/paths/Types.h | 39 - src/ripple/app/paths/cursor/AdvanceNode.cpp | 401 - .../app/paths/cursor/DeliverNodeForward.cpp | 371 - .../app/paths/cursor/DeliverNodeReverse.cpp | 383 - src/ripple/app/paths/cursor/EffectiveRate.cpp | 49 - src/ripple/app/paths/cursor/EffectiveRate.h | 41 - .../app/paths/cursor/ForwardLiquidity.cpp | 65 - .../cursor/ForwardLiquidityForAccount.cpp | 502 - src/ripple/app/paths/cursor/Liquidity.cpp | 88 - src/ripple/app/paths/cursor/NextIncrement.cpp | 68 - src/ripple/app/paths/cursor/PathCursor.h | 151 - .../app/paths/cursor/ReverseLiquidity.cpp | 93 - .../cursor/ReverseLiquidityForAccount.cpp | 600 - .../app/paths/cursor/RippleLiquidity.cpp | 251 - src/ripple/app/paths/cursor/RippleLiquidity.h | 59 - src/ripple/app/paths/impl/AmountSpec.h | 217 - src/ripple/app/paths/impl/BookStep.cpp | 768 - src/ripple/app/paths/impl/DirectStep.cpp | 726 - src/ripple/app/paths/impl/FlowDebugInfo.h | 372 - src/ripple/app/paths/impl/PaySteps.cpp | 514 - src/ripple/app/paths/impl/StepChecks.h | 94 - src/ripple/app/paths/impl/Steps.h | 436 - src/ripple/app/paths/impl/StrandFlow.h | 559 - src/ripple/app/paths/impl/XRPEndpointStep.cpp | 283 - src/ripple/app/tx/README.md | 213 - src/ripple/app/tx/apply.h | 119 - src/ripple/app/tx/applySteps.h | 199 - src/ripple/app/tx/impl/ApplyContext.cpp | 72 - src/ripple/app/tx/impl/ApplyContext.h | 112 - src/ripple/app/tx/impl/BookTip.cpp | 84 - src/ripple/app/tx/impl/BookTip.h | 87 - src/ripple/app/tx/impl/CancelOffer.cpp | 101 - src/ripple/app/tx/impl/CancelOffer.h | 52 - src/ripple/app/tx/impl/CancelTicket.cpp | 91 - src/ripple/app/tx/impl/CancelTicket.h | 47 - src/ripple/app/tx/impl/Change.cpp | 233 - src/ripple/app/tx/impl/Change.h | 68 - src/ripple/app/tx/impl/CreateOffer.cpp | 995 - src/ripple/app/tx/impl/CreateOffer.h | 137 - src/ripple/app/tx/impl/CreateTicket.cpp | 125 - src/ripple/app/tx/impl/CreateTicket.h | 48 - src/ripple/app/tx/impl/Offer.h | 237 - src/ripple/app/tx/impl/OfferStream.cpp | 231 - src/ripple/app/tx/impl/OfferStream.h | 185 - src/ripple/app/tx/impl/PayChan.cpp | 485 - src/ripple/app/tx/impl/PayChan.h | 91 - src/ripple/app/tx/impl/Payment.cpp | 460 - src/ripple/app/tx/impl/Payment.h | 64 - src/ripple/app/tx/impl/SetAccount.cpp | 487 - src/ripple/app/tx/impl/SetAccount.h | 60 - src/ripple/app/tx/impl/SetRegularKey.cpp | 99 - src/ripple/app/tx/impl/SetRegularKey.h | 61 - src/ripple/app/tx/impl/SetSignerList.cpp | 355 - src/ripple/app/tx/impl/SetSignerList.h | 97 - src/ripple/app/tx/impl/SetTrust.cpp | 484 - src/ripple/app/tx/impl/SetTrust.h | 54 - src/ripple/app/tx/impl/SignerEntries.cpp | 68 - src/ripple/app/tx/impl/SignerEntries.h | 70 - src/ripple/app/tx/impl/SusPay.cpp | 567 - src/ripple/app/tx/impl/SusPay.h | 95 - src/ripple/app/tx/impl/Taker.cpp | 775 - src/ripple/app/tx/impl/Taker.h | 311 - src/ripple/app/tx/impl/Transactor.cpp | 722 - src/ripple/app/tx/impl/Transactor.h | 189 - src/ripple/app/tx/impl/apply.cpp | 164 - src/ripple/app/tx/impl/applySteps.cpp | 344 - src/ripple/basics/BasicConfig.h | 377 - src/ripple/basics/Blob.h | 34 - src/ripple/basics/Buffer.h | 210 - src/ripple/basics/ByteOrder.h | 77 - src/ripple/basics/CheckLibraryVersions.h | 38 - src/ripple/basics/CountedObject.h | 144 - src/ripple/basics/DecayingSample.h | 158 - src/ripple/basics/KeyCache.h | 304 - src/ripple/basics/LocalValue.h | 126 - src/ripple/basics/Log.h | 271 - src/ripple/basics/README.md | 40 - src/ripple/basics/RangeSet.h | 91 - src/ripple/basics/Resolver.h | 66 - src/ripple/basics/ResolverAsio.h | 39 - src/ripple/basics/ScopedLock.h | 105 - src/ripple/basics/Slice.h | 200 - src/ripple/basics/StringUtilities.h | 93 - src/ripple/basics/Sustain.h | 35 - src/ripple/basics/TaggedCache.h | 575 - src/ripple/basics/ThreadName.h | 30 - src/ripple/basics/ToString.h | 64 - src/ripple/basics/UnorderedContainers.h | 92 - src/ripple/basics/UptimeTimer.h | 60 - src/ripple/basics/base_uint.h | 585 - src/ripple/basics/chrono.h | 88 - src/ripple/basics/contract.h | 79 - src/ripple/basics/hardened_hash.h | 172 - src/ripple/basics/impl/BasicConfig.cpp | 163 - .../basics/impl/CheckLibraryVersions.cpp | 122 - .../basics/impl/CheckLibraryVersionsImpl.h | 48 - src/ripple/basics/impl/CountedObject.cpp | 99 - src/ripple/basics/impl/Log.cpp | 412 - src/ripple/basics/impl/RangeSet.cpp | 270 - src/ripple/basics/impl/ResolverAsio.cpp | 381 - src/ripple/basics/impl/StringUtilities.cpp | 125 - src/ripple/basics/impl/Sustain.cpp | 158 - src/ripple/basics/impl/ThreadName.cpp | 106 - src/ripple/basics/impl/Time.cpp | 83 - src/ripple/basics/impl/UptimeTimer.cpp | 84 - src/ripple/basics/impl/contract.cpp | 58 - src/ripple/basics/impl/make_SSLContext.cpp | 432 - src/ripple/basics/impl/mulDiv.cpp | 48 - src/ripple/basics/impl/strHex.cpp | 61 - src/ripple/basics/make_SSLContext.h | 44 - src/ripple/basics/make_lock.h | 38 - src/ripple/basics/mulDiv.h | 47 - src/ripple/basics/qalloc.h | 406 - src/ripple/basics/random.h | 204 - src/ripple/basics/strHex.h | 83 - src/ripple/basics/win32_workaround.h | 45 - src/ripple/beast/asio/io_latency_probe.h | 240 - src/ripple/beast/asio/ssl_bundle.h | 71 - src/ripple/beast/asio/ssl_error.h | 77 - src/ripple/beast/clock/abstract_clock.h | 111 - src/ripple/beast/clock/basic_seconds_clock.h | 217 - src/ripple/beast/clock/chrono_util.h | 70 - src/ripple/beast/clock/manual_clock.h | 100 - src/ripple/beast/container/aged_container.h | 35 - .../beast/container/aged_container_utility.h | 51 - src/ripple/beast/container/aged_map.h | 43 - src/ripple/beast/container/aged_multimap.h | 43 - src/ripple/beast/container/aged_multiset.h | 42 - src/ripple/beast/container/aged_set.h | 42 - .../beast/container/aged_unordered_map.h | 44 - .../beast/container/aged_unordered_multimap.h | 44 - .../beast/container/aged_unordered_multiset.h | 43 - .../beast/container/aged_unordered_set.h | 43 - .../detail/aged_associative_container.h | 54 - .../detail/aged_container_iterator.h | 182 - .../container/detail/aged_ordered_container.h | 1967 - .../detail/aged_unordered_container.h | 2554 - src/ripple/beast/core/BasicNativeHeaders.h | 230 - src/ripple/beast/core/ByteOrder.h | 298 - src/ripple/beast/core/CompilerConfig.h | 143 - src/ripple/beast/core/Config.h | 32 - src/ripple/beast/core/ConfigCheck.h | 69 - src/ripple/beast/core/LexicalCast.h | 287 - src/ripple/beast/core/List.h | 559 - src/ripple/beast/core/LockFreeStack.h | 294 - src/ripple/beast/core/Memory.h | 81 - src/ripple/beast/core/PlatformConfig.h | 211 - src/ripple/beast/core/SemanticVersion.cpp | 321 - src/ripple/beast/core/SemanticVersion.h | 113 - src/ripple/beast/core/SharedObject.h | 134 - src/ripple/beast/core/SharedPtr.h | 327 - src/ripple/beast/core/StandardConfig.h | 77 - src/ripple/beast/core/StandardIncludes.h | 78 - src/ripple/beast/core/SystemStats.cpp | 123 - src/ripple/beast/core/SystemStats.h | 47 - src/ripple/beast/core/Thread.cpp | 293 - src/ripple/beast/core/Thread.h | 187 - src/ripple/beast/core/Time.cpp | 46 - src/ripple/beast/core/Time.h | 35 - src/ripple/beast/core/WaitableEvent.cpp | 168 - src/ripple/beast/core/WaitableEvent.h | 124 - src/ripple/beast/core/bsd_SystemStats.cpp | 40 - src/ripple/beast/core/core.unity.cpp | 213 - src/ripple/beast/core/core.unity.mm | 30 - src/ripple/beast/core/linux_SystemStats.cpp | 42 - src/ripple/beast/core/mac_SystemStats.mm | 76 - src/ripple/beast/core/osx_ObjCHelpers.h | 54 - src/ripple/beast/core/win32_SystemStats.cpp | 42 - src/ripple/beast/crypto/detail/mac_facade.h | 92 - .../beast/crypto/detail/ripemd_context.h | 429 - src/ripple/beast/crypto/detail/sha2_context.h | 428 - src/ripple/beast/crypto/ripemd.h | 37 - src/ripple/beast/crypto/secure_erase.h | 87 - src/ripple/beast/crypto/sha2.h | 44 - src/ripple/beast/cxx17/type_traits.h | 56 - src/ripple/beast/hash/endian.h | 54 - src/ripple/beast/hash/fnv1a.h | 70 - src/ripple/beast/hash/hash_append.h | 516 - src/ripple/beast/hash/impl/siphash.cpp | 165 - src/ripple/beast/hash/impl/spookyv2.cpp | 361 - src/ripple/beast/hash/impl/spookyv2.h | 301 - src/ripple/beast/hash/impl/xxhash.c | 934 - src/ripple/beast/hash/impl/xxhash.h | 154 - src/ripple/beast/hash/meta.h | 144 - src/ripple/beast/hash/siphash.h | 60 - src/ripple/beast/hash/spooky.h | 61 - src/ripple/beast/hash/tests/hash_metrics.h | 200 - src/ripple/beast/hash/uhash.h | 47 - src/ripple/beast/hash/xxhasher.h | 88 - src/ripple/beast/insight/Base.h | 38 - src/ripple/beast/insight/BaseImpl.h | 43 - src/ripple/beast/insight/Collector.h | 133 - src/ripple/beast/insight/Counter.h | 126 - src/ripple/beast/insight/CounterImpl.h | 44 - src/ripple/beast/insight/Event.h | 85 - src/ripple/beast/insight/EventImpl.h | 44 - src/ripple/beast/insight/Gauge.h | 143 - src/ripple/beast/insight/GaugeImpl.h | 46 - src/ripple/beast/insight/Group.h | 44 - src/ripple/beast/insight/Groups.h | 58 - src/ripple/beast/insight/Hook.h | 62 - src/ripple/beast/insight/HookImpl.h | 41 - src/ripple/beast/insight/Insight.h | 37 - src/ripple/beast/insight/Meter.h | 97 - src/ripple/beast/insight/MeterImpl.h | 44 - src/ripple/beast/insight/NullCollector.h | 38 - src/ripple/beast/insight/StatsDCollector.h | 52 - src/ripple/beast/insight/impl/Collector.cpp | 30 - src/ripple/beast/insight/impl/Group.cpp | 28 - src/ripple/beast/insight/impl/Groups.cpp | 135 - src/ripple/beast/insight/impl/Hook.cpp | 30 - src/ripple/beast/insight/impl/Metric.cpp | 55 - .../beast/insight/impl/NullCollector.cpp | 139 - .../beast/insight/impl/StatsDCollector.cpp | 719 - src/ripple/beast/net/IPAddress.h | 358 - src/ripple/beast/net/IPAddressConversion.h | 68 - src/ripple/beast/net/IPAddressV4.h | 201 - src/ripple/beast/net/IPAddressV6.h | 108 - src/ripple/beast/net/IPEndpoint.h | 175 - src/ripple/beast/net/detail/Parse.h | 103 - .../beast/net/impl/IPAddressConversion.cpp | 67 - src/ripple/beast/net/impl/IPAddressV4.cpp | 184 - src/ripple/beast/net/impl/IPAddressV6.cpp | 83 - src/ripple/beast/net/impl/IPEndpoint.cpp | 174 - src/ripple/beast/rfc2616.h | 470 - src/ripple/beast/site_scons/Beast.py | 188 - .../beast/site_scons/site_tools/Protoc.py | 97 - .../beast/site_scons/site_tools/VSProject.py | 894 - src/ripple/beast/type_name.h | 73 - src/ripple/beast/unit_test.h | 41 - src/ripple/beast/unity/beast_hash_unity.cpp | 26 - .../beast/unity/beast_insight_unity.cpp | 30 - src/ripple/beast/unity/beast_net_unity.cpp | 23 - .../beast/unity/beast_utility_unity.cpp | 26 - src/ripple/beast/utility/Debug.h | 66 - src/ripple/beast/utility/Journal.h | 440 - src/ripple/beast/utility/PropertyStream.h | 360 - src/ripple/beast/utility/WrappedSink.h | 96 - src/ripple/beast/utility/Zero.h | 163 - src/ripple/beast/utility/hash_pair.h | 70 - src/ripple/beast/utility/maybe_const.h | 42 - src/ripple/beast/utility/rngfill.h | 69 - src/ripple/beast/utility/src/beast_Debug.cpp | 113 - .../beast/utility/src/beast_Journal.cpp | 155 - .../utility/src/beast_PropertyStream.cpp | 577 - src/ripple/beast/utility/tagged_integer.h | 243 - src/ripple/beast/utility/temp_dir.h | 83 - src/ripple/beast/utility/weak_fn.h | 175 - src/ripple/beast/xor_shift_engine.h | 126 - src/ripple/conditions/Condition.h | 207 - src/ripple/conditions/Ed25519.h | 100 - src/ripple/conditions/Fulfillment.h | 176 - src/ripple/conditions/PrefixSha256.h | 218 - src/ripple/conditions/PreimageSha256.h | 123 - src/ripple/conditions/RsaSha256.h | 83 - src/ripple/conditions/impl/Condition.cpp | 188 - src/ripple/conditions/impl/Ed25519.cpp | 115 - src/ripple/conditions/impl/Fulfillment.cpp | 229 - src/ripple/conditions/impl/RsaSha256.cpp | 314 - src/ripple/conditions/impl/base64.h | 204 - src/ripple/conditions/impl/utils.h | 368 - src/ripple/core/Config.h | 208 - src/ripple/core/ConfigSections.h | 73 - src/ripple/core/Coro.ipp | 111 - src/ripple/core/DatabaseCon.h | 116 - src/ripple/core/DeadlineTimer.h | 119 - src/ripple/core/Job.h | 152 - src/ripple/core/JobQueue.h | 371 - src/ripple/core/JobTypeData.h | 102 - src/ripple/core/JobTypeInfo.h | 92 - src/ripple/core/JobTypes.h | 139 - src/ripple/core/LoadEvent.h | 90 - src/ripple/core/LoadMonitor.h | 80 - src/ripple/core/SociDB.h | 142 - src/ripple/core/Stoppable.h | 378 - src/ripple/core/ThreadEntry.h | 103 - src/ripple/core/TimeKeeper.h | 102 - src/ripple/core/impl/Config.cpp | 607 - src/ripple/core/impl/DatabaseCon.cpp | 83 - src/ripple/core/impl/DeadlineTimer.cpp | 343 - .../core/impl/DummySociDynamicBackend.cpp | 59 - src/ripple/core/impl/Job.cpp | 149 - src/ripple/core/impl/JobQueue.cpp | 503 - src/ripple/core/impl/LoadEvent.cpp | 94 - src/ripple/core/impl/LoadMonitor.cpp | 194 - src/ripple/core/impl/SNTPClock.cpp | 492 - src/ripple/core/impl/SNTPClock.h | 53 - src/ripple/core/impl/SociDB.cpp | 267 - src/ripple/core/impl/Stoppable.cpp | 215 - src/ripple/core/impl/ThreadEntry.cpp | 78 - src/ripple/core/impl/TimeKeeper.cpp | 135 - src/ripple/core/impl/Workers.cpp | 264 - src/ripple/core/impl/Workers.h | 165 - src/ripple/core/impl/semaphore.h | 84 - src/ripple/crypto/GenerateDeterministicKey.h | 53 - src/ripple/crypto/KeyType.h | 49 - src/ripple/crypto/README.md | 4 - src/ripple/crypto/RFC1751.h | 57 - src/ripple/crypto/csprng.h | 109 - .../crypto/impl/GenerateDeterministicKey.cpp | 204 - src/ripple/crypto/impl/KeyType.cpp | 40 - src/ripple/crypto/impl/RFC1751.cpp | 508 - src/ripple/crypto/impl/csprng.cpp | 138 - src/ripple/crypto/impl/ec_key.cpp | 64 - src/ripple/crypto/impl/ec_key.h | 76 - src/ripple/crypto/impl/openssl.cpp | 136 - src/ripple/crypto/impl/openssl.h | 193 - src/ripple/json/JsonPropertyStream.h | 68 - src/ripple/json/Object.h | 436 - src/ripple/json/Output.h | 54 - src/ripple/json/README.md | 3 - src/ripple/json/TODO.md | 7 - src/ripple/json/Writer.h | 242 - src/ripple/json/impl/JsonPropertyStream.cpp | 161 - src/ripple/json/impl/LICENSE | Bin 69 -> 0 bytes src/ripple/json/impl/Object.cpp | 225 - src/ripple/json/impl/Output.cpp | 111 - src/ripple/json/impl/Writer.cpp | 321 - src/ripple/json/impl/json_assert.h | 27 - src/ripple/json/impl/json_batchallocator.h | 141 - src/ripple/json/impl/json_reader.cpp | 961 - src/ripple/json/impl/json_value.cpp | 1189 - src/ripple/json/impl/json_valueiterator.cpp | 212 - src/ripple/json/impl/json_writer.cpp | 829 - src/ripple/json/impl/to_string.cpp | 37 - src/ripple/json/impl/version | 1 - src/ripple/json/json_forwards.h | 38 - src/ripple/json/json_reader.h | 214 - src/ripple/json/json_value.h | 620 - src/ripple/json/json_writer.h | 182 - src/ripple/json/to_string.h | 41 - src/ripple/ledger/ApplyView.h | 219 - src/ripple/ledger/ApplyViewImpl.h | 95 - src/ripple/ledger/BookDirs.h | 118 - src/ripple/ledger/CachedSLEs.h | 113 - src/ripple/ledger/CachedView.h | 196 - src/ripple/ledger/Directory.h | 127 - src/ripple/ledger/OpenView.h | 229 - src/ripple/ledger/PaymentSandbox.h | 207 - src/ripple/ledger/RawView.h | 116 - src/ripple/ledger/ReadView.h | 443 - src/ripple/ledger/Sandbox.h | 64 - src/ripple/ledger/TxMeta.h | 150 - src/ripple/ledger/View.h | 350 - src/ripple/ledger/detail/ApplyStateTable.h | 159 - src/ripple/ledger/detail/ApplyViewBase.h | 139 - src/ripple/ledger/detail/RawStateTable.h | 104 - src/ripple/ledger/detail/ReadViewFwdRange.h | 160 - src/ripple/ledger/detail/ReadViewFwdRange.ipp | 141 - src/ripple/ledger/impl/ApplyStateTable.cpp | 655 - src/ripple/ledger/impl/ApplyViewBase.cpp | 195 - src/ripple/ledger/impl/ApplyViewImpl.cpp | 59 - src/ripple/ledger/impl/BookDirs.cpp | 125 - src/ripple/ledger/impl/CachedSLEs.cpp | 62 - src/ripple/ledger/impl/CachedView.cpp | 70 - src/ripple/ledger/impl/Directory.cpp | 162 - src/ripple/ledger/impl/OpenView.cpp | 281 - src/ripple/ledger/impl/PaymentSandbox.cpp | 393 - src/ripple/ledger/impl/RawStateTable.cpp | 366 - src/ripple/ledger/impl/ReadView.cpp | 189 - src/ripple/ledger/impl/TxMeta.cpp | 270 - src/ripple/ledger/impl/View.cpp | 1811 - src/ripple/net/AutoSocket.h | 354 - src/ripple/net/HTTPClient.h | 78 - src/ripple/net/InfoSub.h | 172 - src/ripple/net/RPCCall.h | 70 - src/ripple/net/RPCErr.h | 34 - src/ripple/net/RPCSub.h | 50 - src/ripple/net/impl/HTTPClient.cpp | 588 - src/ripple/net/impl/InfoSub.cpp | 129 - src/ripple/net/impl/RPCCall.cpp | 1476 - src/ripple/net/impl/RPCErr.cpp | 41 - src/ripple/net/impl/RPCSub.cpp | 223 - src/ripple/nodestore/Backend.h | 116 - src/ripple/nodestore/Benchmarks.md | 34 - src/ripple/nodestore/Database.h | 158 - src/ripple/nodestore/DatabaseRotating.h | 56 - src/ripple/nodestore/DummyScheduler.h | 43 - src/ripple/nodestore/Factory.h | 58 - src/ripple/nodestore/Manager.h | 112 - src/ripple/nodestore/NodeObject.h | 110 - src/ripple/nodestore/README.md | 102 - src/ripple/nodestore/Scheduler.h | 79 - src/ripple/nodestore/Task.h | 40 - src/ripple/nodestore/Types.h | 54 - src/ripple/nodestore/VisitCallback.h | 39 - .../nodestore/backend/MemoryFactory.cpp | 219 - src/ripple/nodestore/backend/NuDBFactory.cpp | 323 - src/ripple/nodestore/backend/NullFactory.cpp | 145 - .../nodestore/backend/RocksDBFactory.cpp | 415 - .../nodestore/backend/RocksDBQuickFactory.cpp | 416 - src/ripple/nodestore/impl/BatchWriter.cpp | 119 - src/ripple/nodestore/impl/BatchWriter.h | 89 - src/ripple/nodestore/impl/DatabaseImp.h | 464 - .../nodestore/impl/DatabaseRotatingImp.cpp | 55 - .../nodestore/impl/DatabaseRotatingImp.h | 137 - src/ripple/nodestore/impl/DecodedBlob.cpp | 93 - src/ripple/nodestore/impl/DecodedBlob.h | 62 - src/ripple/nodestore/impl/DummyScheduler.cpp | 57 - src/ripple/nodestore/impl/EncodedBlob.cpp | 46 - src/ripple/nodestore/impl/EncodedBlob.h | 62 - src/ripple/nodestore/impl/ManagerImp.cpp | 177 - src/ripple/nodestore/impl/ManagerImp.h | 85 - src/ripple/nodestore/impl/NodeObject.cpp | 67 - src/ripple/nodestore/impl/Tuning.h | 41 - src/ripple/nodestore/impl/codec.h | 558 - src/ripple/nodestore/impl/varint.h | 152 - src/ripple/overlay/Cluster.h | 126 - src/ripple/overlay/ClusterNode.h | 76 - src/ripple/overlay/Message.h | 164 - src/ripple/overlay/Overlay.h | 266 - src/ripple/overlay/Peer.h | 110 - src/ripple/overlay/PeerSet.h | 178 - src/ripple/overlay/README.md | 280 - src/ripple/overlay/TODO.md | 1 - src/ripple/overlay/impl/Cluster.cpp | 146 - src/ripple/overlay/impl/ConnectAttempt.cpp | 392 - src/ripple/overlay/impl/ConnectAttempt.h | 137 - src/ripple/overlay/impl/Manifest.cpp | 477 - src/ripple/overlay/impl/Manifest.h | 227 - src/ripple/overlay/impl/Message.cpp | 95 - src/ripple/overlay/impl/OverlayImpl.cpp | 1113 - src/ripple/overlay/impl/OverlayImpl.h | 360 - src/ripple/overlay/impl/PeerImp.cpp | 2389 - src/ripple/overlay/impl/PeerImp.h | 535 - src/ripple/overlay/impl/PeerSet.cpp | 155 - src/ripple/overlay/impl/ProtocolMessage.h | 166 - src/ripple/overlay/impl/TMHello.cpp | 444 - src/ripple/overlay/impl/TMHello.h | 91 - src/ripple/overlay/impl/TrafficCount.cpp | 135 - src/ripple/overlay/impl/TrafficCount.h | 130 - src/ripple/overlay/impl/Tuning.h | 80 - src/ripple/overlay/impl/ZeroCopyStream.h | 226 - src/ripple/overlay/make_Overlay.h | 50 - src/ripple/overlay/predicates.h | 174 - src/ripple/peerfinder/PeerfinderManager.h | 252 - src/ripple/peerfinder/README.md | 361 - src/ripple/peerfinder/Slot.h | 82 - src/ripple/peerfinder/impl/Bootcache.cpp | 272 - src/ripple/peerfinder/impl/Bootcache.h | 168 - src/ripple/peerfinder/impl/Checker.h | 234 - src/ripple/peerfinder/impl/Counts.h | 347 - src/ripple/peerfinder/impl/Endpoint.cpp | 43 - src/ripple/peerfinder/impl/Fixed.h | 70 - src/ripple/peerfinder/impl/Handouts.h | 357 - src/ripple/peerfinder/impl/Livecache.h | 542 - src/ripple/peerfinder/impl/Logic.h | 1171 - .../peerfinder/impl/PeerfinderConfig.cpp | 82 - .../peerfinder/impl/PeerfinderManager.cpp | 262 - src/ripple/peerfinder/impl/PrivateTypes.h | 37 - src/ripple/peerfinder/impl/Reporting.h | 47 - src/ripple/peerfinder/impl/SlotImp.cpp | 139 - src/ripple/peerfinder/impl/SlotImp.h | 193 - src/ripple/peerfinder/impl/Source.h | 60 - src/ripple/peerfinder/impl/SourceStrings.cpp | 72 - src/ripple/peerfinder/impl/SourceStrings.h | 41 - src/ripple/peerfinder/impl/Store.h | 48 - src/ripple/peerfinder/impl/StoreSqdb.h | 350 - src/ripple/peerfinder/impl/Tuning.h | 145 - src/ripple/peerfinder/impl/iosformat.h | 214 - src/ripple/peerfinder/make_Manager.h | 38 - src/ripple/peerfinder/sim/FunctionQueue.h | 86 - src/ripple/peerfinder/sim/GraphAlgorithms.h | 76 - src/ripple/peerfinder/sim/Message.h | 43 - src/ripple/peerfinder/sim/NodeSnapshot.h | 37 - src/ripple/peerfinder/sim/Params.h | 50 - src/ripple/peerfinder/sim/Predicates.h | 78 - src/ripple/proto/README.md | 4 - src/ripple/proto/ripple.proto | 352 - src/ripple/protocol/AccountID.h | 190 - src/ripple/protocol/AmountConversions.h | 110 - src/ripple/protocol/Book.h | 172 - src/ripple/protocol/BuildInfo.h | 70 - src/ripple/protocol/ErrorCodes.h | 276 - src/ripple/protocol/Feature.h | 52 - src/ripple/protocol/HashPrefix.h | 118 - src/ripple/protocol/IOUAmount.h | 157 - src/ripple/protocol/Indexes.h | 249 - src/ripple/protocol/InnerObjectFormats.h | 47 - src/ripple/protocol/Issue.h | 112 - src/ripple/protocol/JsonFields.h | 464 - src/ripple/protocol/Keylet.h | 57 - src/ripple/protocol/KnownFormats.h | 193 - src/ripple/protocol/LedgerFormats.h | 168 - src/ripple/protocol/PayChan.h | 44 - src/ripple/protocol/Protocol.h | 62 - src/ripple/protocol/PublicKey.h | 250 - src/ripple/protocol/Quality.h | 276 - src/ripple/protocol/README.md | 14 - src/ripple/protocol/Rate.h | 114 - src/ripple/protocol/RippleLedgerHash.h | 31 - src/ripple/protocol/SField.h | 504 - src/ripple/protocol/SOTemplate.h | 112 - src/ripple/protocol/STAccount.h | 118 - src/ripple/protocol/STAmount.h | 439 - src/ripple/protocol/STArray.h | 177 - src/ripple/protocol/STBase.h | 170 - src/ripple/protocol/STBitString.h | 158 - src/ripple/protocol/STBlob.h | 178 - src/ripple/protocol/STExchange.h | 203 - src/ripple/protocol/STInteger.h | 121 - src/ripple/protocol/STLedgerEntry.h | 116 - src/ripple/protocol/STObject.h | 945 - src/ripple/protocol/STParsedJSON.h | 86 - src/ripple/protocol/STPathSet.h | 392 - src/ripple/protocol/STTx.h | 172 - src/ripple/protocol/STValidation.h | 130 - src/ripple/protocol/STVector256.h | 195 - src/ripple/protocol/SecretKey.h | 176 - src/ripple/protocol/Seed.h | 111 - src/ripple/protocol/Serializer.h | 418 - src/ripple/protocol/Sign.h | 87 - src/ripple/protocol/SystemParameters.h | 69 - src/ripple/protocol/TER.h | 257 - src/ripple/protocol/TxFlags.h | 104 - src/ripple/protocol/TxFormats.h | 78 - src/ripple/protocol/UintTypes.h | 97 - src/ripple/protocol/XRPAmount.h | 177 - src/ripple/protocol/digest.h | 296 - src/ripple/protocol/impl/AccountID.cpp | 238 - src/ripple/protocol/impl/Book.cpp | 106 - src/ripple/protocol/impl/BuildInfo.cpp | 138 - src/ripple/protocol/impl/ByteOrder.cpp | 75 - src/ripple/protocol/impl/ErrorCodes.cpp | 191 - src/ripple/protocol/impl/Feature.cpp | 61 - src/ripple/protocol/impl/HashPrefix.cpp | 41 - src/ripple/protocol/impl/IOUAmount.cpp | 384 - src/ripple/protocol/impl/Indexes.cpp | 340 - .../protocol/impl/InnerObjectFormats.cpp | 61 - src/ripple/protocol/impl/Issue.cpp | 102 - src/ripple/protocol/impl/Keylet.cpp | 42 - src/ripple/protocol/impl/LedgerFormats.cpp | 168 - src/ripple/protocol/impl/PublicKey.cpp | 323 - src/ripple/protocol/impl/Quality.cpp | 155 - src/ripple/protocol/impl/Rate2.cpp | 145 - src/ripple/protocol/impl/SField.cpp | 404 - src/ripple/protocol/impl/SOTemplate.cpp | 63 - src/ripple/protocol/impl/STAccount.cpp | 76 - src/ripple/protocol/impl/STAmount.cpp | 1318 - src/ripple/protocol/impl/STArray.cpp | 185 - src/ripple/protocol/impl/STBase.cpp | 156 - src/ripple/protocol/impl/STBlob.cpp | 45 - src/ripple/protocol/impl/STInteger.cpp | 203 - src/ripple/protocol/impl/STLedgerEntry.cpp | 154 - src/ripple/protocol/impl/STObject.cpp | 788 - src/ripple/protocol/impl/STParsedJSON.cpp | 895 - src/ripple/protocol/impl/STPathSet.cpp | 224 - src/ripple/protocol/impl/STTx.cpp | 519 - src/ripple/protocol/impl/STValidation.cpp | 172 - src/ripple/protocol/impl/STVar.cpp | 172 - src/ripple/protocol/impl/STVar.h | 136 - src/ripple/protocol/impl/STVector256.cpp | 72 - src/ripple/protocol/impl/SecretKey.cpp | 292 - src/ripple/protocol/impl/Seed.cpp | 149 - src/ripple/protocol/impl/Serializer.cpp | 586 - src/ripple/protocol/impl/Sign.cpp | 100 - src/ripple/protocol/impl/TER.cpp | 170 - src/ripple/protocol/impl/TxFormats.cpp | 165 - src/ripple/protocol/impl/UintTypes.cpp | 126 - src/ripple/protocol/impl/digest.cpp | 116 - src/ripple/protocol/impl/secp256k1.h | 52 - src/ripple/protocol/impl/tokens.cpp | 332 - src/ripple/protocol/st.h | 39 - src/ripple/protocol/tokens.h | 104 - src/ripple/protocol/types.h | 27 - src/ripple/resource/Charge.h | 64 - src/ripple/resource/Consumer.h | 89 - src/ripple/resource/Disposition.h | 42 - src/ripple/resource/Fees.h | 65 - src/ripple/resource/Gossip.h | 44 - src/ripple/resource/README.md | 77 - src/ripple/resource/ResourceManager.h | 74 - src/ripple/resource/Types.h | 32 - src/ripple/resource/impl/Charge.cpp | 67 - src/ripple/resource/impl/Consumer.cpp | 140 - src/ripple/resource/impl/Entry.h | 119 - src/ripple/resource/impl/Fees.cpp | 53 - src/ripple/resource/impl/Import.h | 53 - src/ripple/resource/impl/Key.h | 108 - src/ripple/resource/impl/Kind.h | 44 - src/ripple/resource/impl/Logic.h | 557 - src/ripple/resource/impl/ResourceManager.cpp | 156 - src/ripple/resource/impl/Tuning.h | 52 - src/ripple/rpc/Context.h | 66 - src/ripple/rpc/Output.h | 39 - src/ripple/rpc/README.md | 72 - src/ripple/rpc/RPCHandler.h | 44 - src/ripple/rpc/Request.h | 74 - src/ripple/rpc/Role.h | 79 - src/ripple/rpc/ServerHandler.h | 52 - src/ripple/rpc/Status.h | 146 - src/ripple/rpc/handlers/AccountChannels.cpp | 184 - .../rpc/handlers/AccountCurrenciesHandler.cpp | 84 - src/ripple/rpc/handlers/AccountInfo.cpp | 187 - src/ripple/rpc/handlers/AccountLines.cpp | 209 - src/ripple/rpc/handlers/AccountObjects.cpp | 145 - src/ripple/rpc/handlers/AccountOffers.cpp | 155 - src/ripple/rpc/handlers/AccountTx.cpp | 196 - src/ripple/rpc/handlers/AccountTxOld.cpp | 229 - src/ripple/rpc/handlers/AccountTxSwitch.cpp | 46 - src/ripple/rpc/handlers/BlackList.cpp | 37 - src/ripple/rpc/handlers/BookOffers.cpp | 194 - src/ripple/rpc/handlers/CanDelete.cpp | 104 - src/ripple/rpc/handlers/Connect.cpp | 69 - src/ripple/rpc/handlers/ConsensusInfo.cpp | 42 - src/ripple/rpc/handlers/Feature1.cpp | 89 - src/ripple/rpc/handlers/Fee1.cpp | 47 - src/ripple/rpc/handlers/FetchInfo.cpp | 43 - src/ripple/rpc/handlers/GatewayBalances.cpp | 236 - src/ripple/rpc/handlers/GetCounts.cpp | 131 - src/ripple/rpc/handlers/Handlers.h | 98 - src/ripple/rpc/handlers/LedgerAccept.cpp | 54 - .../rpc/handlers/LedgerCleanerHandler.cpp | 36 - src/ripple/rpc/handlers/LedgerClosed.cpp | 41 - src/ripple/rpc/handlers/LedgerCurrent.cpp | 38 - src/ripple/rpc/handlers/LedgerData.cpp | 117 - src/ripple/rpc/handlers/LedgerEntry.cpp | 215 - src/ripple/rpc/handlers/LedgerHandler.cpp | 85 - src/ripple/rpc/handlers/LedgerHandler.h | 110 - src/ripple/rpc/handlers/LedgerHeader.cpp | 53 - src/ripple/rpc/handlers/LedgerRequest.cpp | 145 - src/ripple/rpc/handlers/LogLevel.cpp | 85 - src/ripple/rpc/handlers/LogRotate.cpp | 32 - src/ripple/rpc/handlers/NoRippleCheck.cpp | 182 - src/ripple/rpc/handlers/OwnerInfo.cpp | 64 - src/ripple/rpc/handlers/PathFind.cpp | 83 - src/ripple/rpc/handlers/PayChanClaim.cpp | 130 - src/ripple/rpc/handlers/Peers.cpp | 74 - src/ripple/rpc/handlers/Ping.cpp | 59 - src/ripple/rpc/handlers/Print.cpp | 46 - src/ripple/rpc/handlers/Random.cpp | 61 - src/ripple/rpc/handlers/RipplePathFind.cpp | 88 - src/ripple/rpc/handlers/ServerInfo.cpp | 41 - src/ripple/rpc/handlers/ServerState.cpp | 41 - src/ripple/rpc/handlers/SignFor.cpp | 56 - src/ripple/rpc/handlers/SignHandler.cpp | 49 - src/ripple/rpc/handlers/Stop.cpp | 40 - src/ripple/rpc/handlers/Submit.cpp | 157 - src/ripple/rpc/handlers/SubmitMultiSigned.cpp | 56 - src/ripple/rpc/handlers/Subscribe.cpp | 326 - src/ripple/rpc/handlers/TransactionEntry.cpp | 91 - src/ripple/rpc/handlers/Tx.cpp | 147 - src/ripple/rpc/handlers/TxHistory.cpp | 94 - src/ripple/rpc/handlers/UnlAdd.cpp | 64 - src/ripple/rpc/handlers/UnlDelete.cpp | 59 - src/ripple/rpc/handlers/UnlList.cpp | 54 - src/ripple/rpc/handlers/Unsubscribe.cpp | 219 - src/ripple/rpc/handlers/ValidationCreate.cpp | 70 - src/ripple/rpc/handlers/ValidationSeed.cpp | 78 - src/ripple/rpc/handlers/Version.h | 63 - src/ripple/rpc/handlers/WalletPropose.cpp | 141 - src/ripple/rpc/handlers/WalletPropose.h | 31 - src/ripple/rpc/handlers/WalletSeed.cpp | 54 - src/ripple/rpc/impl/Handler.cpp | 173 - src/ripple/rpc/impl/Handler.h | 69 - src/ripple/rpc/impl/LegacyPathFind.cpp | 71 - src/ripple/rpc/impl/LegacyPathFind.h | 51 - src/ripple/rpc/impl/RPCHandler.cpp | 309 - src/ripple/rpc/impl/RPCHelpers.cpp | 672 - src/ripple/rpc/impl/RPCHelpers.h | 135 - src/ripple/rpc/impl/Role.cpp | 114 - src/ripple/rpc/impl/ServerHandlerImp.cpp | 980 - src/ripple/rpc/impl/ServerHandlerImp.h | 176 - src/ripple/rpc/impl/Status.cpp | 92 - src/ripple/rpc/impl/TransactionSign.cpp | 1216 - src/ripple/rpc/impl/TransactionSign.h | 124 - src/ripple/rpc/impl/Tuning.h | 86 - src/ripple/rpc/impl/WSInfoSub.h | 93 - src/ripple/rpc/json_body.h | 76 - src/ripple/server/Handoff.h | 57 - src/ripple/server/Port.h | 102 - src/ripple/server/Server.h | 43 - src/ripple/server/Session.h | 142 - src/ripple/server/SimpleWriter.h | 79 - src/ripple/server/WSSession.h | 149 - src/ripple/server/Writer.h | 65 - src/ripple/server/impl/BaseHTTPPeer.h | 520 - src/ripple/server/impl/BasePeer.h | 130 - src/ripple/server/impl/BaseWSPeer.h | 405 - src/ripple/server/impl/Door.h | 401 - src/ripple/server/impl/JSONRPCUtil.cpp | 121 - src/ripple/server/impl/JSONRPCUtil.h | 33 - src/ripple/server/impl/PlainHTTPPeer.h | 154 - src/ripple/server/impl/PlainWSPeer.h | 92 - src/ripple/server/impl/Port.cpp | 237 - src/ripple/server/impl/SSLHTTPPeer.h | 187 - src/ripple/server/impl/SSLWSPeer.h | 114 - src/ripple/server/impl/ServerImpl.h | 208 - src/ripple/server/impl/io_list.h | 272 - src/ripple/shamap/Family.h | 76 - src/ripple/shamap/FullBelowCache.h | 141 - src/ripple/shamap/README.md | 189 - src/ripple/shamap/SHAMap.h | 505 - src/ripple/shamap/SHAMapAddNode.h | 192 - src/ripple/shamap/SHAMapItem.h | 94 - src/ripple/shamap/SHAMapMissingNode.h | 66 - src/ripple/shamap/SHAMapNodeID.h | 173 - src/ripple/shamap/SHAMapSyncFilter.h | 50 - src/ripple/shamap/SHAMapTreeNode.h | 428 - src/ripple/shamap/TreeNodeCache.h | 34 - src/ripple/shamap/impl/SHAMap.cpp | 1382 - src/ripple/shamap/impl/SHAMapDelta.cpp | 268 - src/ripple/shamap/impl/SHAMapItem.cpp | 46 - src/ripple/shamap/impl/SHAMapMissingNode.cpp | 53 - src/ripple/shamap/impl/SHAMapNodeID.cpp | 171 - src/ripple/shamap/impl/SHAMapSync.cpp | 772 - src/ripple/shamap/impl/SHAMapTreeNode.cpp | 946 - src/ripple/site_scons/scons_to_ninja.py | 85 - src/ripple/unity/app_ledger.cpp | 45 - src/ripple/unity/app_main.cpp | 30 - src/ripple/unity/app_misc.cpp | 34 - src/ripple/unity/app_paths.cpp | 48 - src/ripple/unity/app_tx.cpp | 41 - src/ripple/unity/basics.cpp | 40 - src/ripple/unity/beast.cpp | 26 - src/ripple/unity/beastobjc.mm | 28 - src/ripple/unity/conditions.cpp | 25 - src/ripple/unity/core.cpp | 34 - src/ripple/unity/crypto.cpp | 31 - src/ripple/unity/ed25519_donna.c | 24 - src/ripple/unity/hyperleveldb.h | 40 - src/ripple/unity/json.cpp | 37 - src/ripple/unity/ledger.cpp | 34 - src/ripple/unity/leveldb.h | 37 - src/ripple/unity/lz4.c | 24 - src/ripple/unity/net.cpp | 28 - src/ripple/unity/nodestore.cpp | 36 - src/ripple/unity/overlay.cpp | 34 - src/ripple/unity/peerfinder.cpp | 38 - src/ripple/unity/protobuf.cpp | 57 - src/ripple/unity/protocol.cpp | 67 - src/ripple/unity/resource.cpp | 32 - src/ripple/unity/ripple.proto.cpp | 20 - src/ripple/unity/rocksdb.cpp | 165 - src/ripple/unity/rocksdb.h | 85 - src/ripple/unity/rpcx.cpp | 97 - src/ripple/unity/secp256k1.cpp | 35 - src/ripple/unity/server.cpp | 27 - src/ripple/unity/shamap.cpp | 27 - src/ripple/unity/snappy.cpp | 41 - src/ripple/unity/soci.cpp | 52 - src/ripple/unity/soci_ripple.cpp | 23 - src/ripple/validators/ValidatorManager.h | 66 - .../validators/impl/ValidatorManager.cpp | 334 - src/rocksdb2/.arcconfig | 10 - src/rocksdb2/.clang-format | 5 - src/rocksdb2/.gitignore | 35 - src/rocksdb2/.travis.yml | 20 - src/rocksdb2/CONTRIBUTING.md | 19 - src/rocksdb2/HISTORY.md | 148 - src/rocksdb2/INSTALL.md | 84 - src/rocksdb2/LICENSE | Bin 1646 -> 0 bytes src/rocksdb2/Makefile | 592 - src/rocksdb2/PATENTS | 23 - src/rocksdb2/README.md | 25 - src/rocksdb2/ROCKSDB_LITE.md | 20 - .../build_tools/build_detect_platform | 343 - src/rocksdb2/build_tools/build_detect_version | 22 - src/rocksdb2/build_tools/fbcode.clang31.sh | 74 - src/rocksdb2/build_tools/fbcode.gcc471.sh | 70 - src/rocksdb2/build_tools/fbcode.gcc481.sh | 86 - src/rocksdb2/build_tools/format-diff.sh | 107 - .../build_tools/mac-install-gflags.sh | 25 - src/rocksdb2/build_tools/make_new_version.sh | 46 - .../build_tools/regression_build_test.sh | 394 - src/rocksdb2/build_tools/unity | 78 - src/rocksdb2/build_tools/valgrind_test.sh | 15 - src/rocksdb2/coverage/coverage_test.sh | 78 - src/rocksdb2/coverage/parse_gcov_output.py | 118 - src/rocksdb2/db/builder.cc | 234 - src/rocksdb2/db/builder.h | 47 - src/rocksdb2/db/c.cc | 2086 - src/rocksdb2/db/c_test.c | 817 - src/rocksdb2/db/column_family.cc | 633 - src/rocksdb2/db/column_family.h | 460 - src/rocksdb2/db/column_family_test.cc | 978 - src/rocksdb2/db/compaction.cc | 285 - src/rocksdb2/db/compaction.h | 237 - src/rocksdb2/db/compaction_picker.cc | 1016 - src/rocksdb2/db/compaction_picker.h | 210 - src/rocksdb2/db/corruption_test.cc | 444 - src/rocksdb2/db/cuckoo_table_db_test.cc | 321 - src/rocksdb2/db/db_bench.cc | 2803 - src/rocksdb2/db/db_filesnapshot.cc | 183 - src/rocksdb2/db/db_impl.cc | 5070 - src/rocksdb2/db/db_impl.h | 687 - src/rocksdb2/db/db_impl_debug.cc | 133 - src/rocksdb2/db/db_impl_readonly.cc | 181 - src/rocksdb2/db/db_impl_readonly.h | 105 - src/rocksdb2/db/db_iter.cc | 656 - src/rocksdb2/db/db_iter.h | 73 - src/rocksdb2/db/db_iter_test.cc | 1334 - src/rocksdb2/db/db_test.cc | 7750 - src/rocksdb2/db/dbformat.cc | 149 - src/rocksdb2/db/dbformat.h | 401 - src/rocksdb2/db/dbformat_test.cc | 156 - src/rocksdb2/db/deletefile_test.cc | 295 - src/rocksdb2/db/file_indexer.cc | 210 - src/rocksdb2/db/file_indexer.h | 140 - src/rocksdb2/db/file_indexer_test.cc | 344 - src/rocksdb2/db/filename.cc | 318 - src/rocksdb2/db/filename.h | 137 - src/rocksdb2/db/filename_test.cc | 179 - src/rocksdb2/db/forward_iterator.cc | 520 - src/rocksdb2/db/forward_iterator.h | 106 - src/rocksdb2/db/internal_stats.cc | 478 - src/rocksdb2/db/internal_stats.h | 275 - src/rocksdb2/db/log_and_apply_bench.cc | 84 - src/rocksdb2/db/log_format.h | 35 - src/rocksdb2/db/log_reader.cc | 339 - src/rocksdb2/db/log_reader.h | 130 - src/rocksdb2/db/log_test.cc | 689 - src/rocksdb2/db/log_writer.cc | 108 - src/rocksdb2/db/log_writer.h | 55 - src/rocksdb2/db/memtable.cc | 634 - src/rocksdb2/db/memtable.h | 221 - src/rocksdb2/db/memtable_list.cc | 286 - src/rocksdb2/db/memtable_list.h | 154 - src/rocksdb2/db/merge_context.h | 69 - src/rocksdb2/db/merge_helper.cc | 211 - src/rocksdb2/db/merge_helper.h | 108 - src/rocksdb2/db/merge_operator.cc | 77 - src/rocksdb2/db/merge_test.cc | 507 - src/rocksdb2/db/perf_context_test.cc | 358 - src/rocksdb2/db/plain_table_db_test.cc | 1117 - src/rocksdb2/db/prefix_test.cc | 504 - src/rocksdb2/db/repair.cc | 410 - src/rocksdb2/db/simple_table_db_test.cc | 810 - src/rocksdb2/db/skiplist.h | 429 - src/rocksdb2/db/skiplist_test.cc | 383 - src/rocksdb2/db/snapshot.h | 86 - src/rocksdb2/db/table_cache.cc | 215 - src/rocksdb2/db/table_cache.h | 101 - src/rocksdb2/db/table_properties_collector.cc | 83 - src/rocksdb2/db/table_properties_collector.h | 95 - .../db/table_properties_collector_test.cc | 324 - src/rocksdb2/db/transaction_log_impl.cc | 262 - src/rocksdb2/db/transaction_log_impl.h | 120 - src/rocksdb2/db/version_edit.cc | 403 - src/rocksdb2/db/version_edit.h | 256 - src/rocksdb2/db/version_edit_test.cc | 64 - src/rocksdb2/db/version_set.cc | 2998 - src/rocksdb2/db/version_set.h | 553 - src/rocksdb2/db/version_set_test.cc | 273 - src/rocksdb2/db/write_batch.cc | 522 - src/rocksdb2/db/write_batch_internal.h | 126 - src/rocksdb2/db/write_batch_test.cc | 406 - src/rocksdb2/doc/doc.css | 89 - src/rocksdb2/doc/index.html | 827 - src/rocksdb2/doc/log_format.txt | 75 - src/rocksdb2/doc/rockslogo.jpg | Bin 137232 -> 0 bytes src/rocksdb2/doc/rockslogo.png | Bin 61703 -> 0 bytes src/rocksdb2/examples/.gitignore | 2 - src/rocksdb2/examples/Makefile | 9 - src/rocksdb2/examples/README.md | 1 - .../examples/column_families_example.cc | 72 - src/rocksdb2/examples/simple_example.cc | 41 - src/rocksdb2/hdfs/README | 23 - src/rocksdb2/hdfs/env_hdfs.h | 327 - src/rocksdb2/hdfs/setup.sh | 7 - src/rocksdb2/helpers/memenv/memenv.cc | 395 - src/rocksdb2/helpers/memenv/memenv_test.cc | 231 - src/rocksdb2/include/rocksdb/c.h | 807 - src/rocksdb2/include/rocksdb/cache.h | 140 - .../include/rocksdb/compaction_filter.h | 199 - src/rocksdb2/include/rocksdb/comparator.h | 67 - src/rocksdb2/include/rocksdb/db.h | 507 - src/rocksdb2/include/rocksdb/env.h | 804 - src/rocksdb2/include/rocksdb/filter_policy.h | 74 - .../include/rocksdb/flush_block_policy.h | 60 - .../include/rocksdb/iostats_context.h | 36 - src/rocksdb2/include/rocksdb/iterator.h | 106 - src/rocksdb2/include/rocksdb/ldb_tool.h | 37 - src/rocksdb2/include/rocksdb/memtablerep.h | 287 - src/rocksdb2/include/rocksdb/merge_operator.h | 182 - src/rocksdb2/include/rocksdb/options.h | 1010 - src/rocksdb2/include/rocksdb/perf_context.h | 78 - src/rocksdb2/include/rocksdb/rate_limiter.h | 60 - src/rocksdb2/include/rocksdb/slice.h | 137 - .../include/rocksdb/slice_transform.h | 47 - src/rocksdb2/include/rocksdb/statistics.h | 286 - src/rocksdb2/include/rocksdb/status.h | 154 - src/rocksdb2/include/rocksdb/table.h | 357 - .../include/rocksdb/table_properties.h | 127 - .../include/rocksdb/transaction_log.h | 104 - src/rocksdb2/include/rocksdb/types.h | 20 - .../include/rocksdb/universal_compaction.h | 84 - .../include/rocksdb/utilities/backupable_db.h | 252 - .../include/rocksdb/utilities/db_ttl.h | 68 - .../include/rocksdb/utilities/document_db.h | 149 - .../include/rocksdb/utilities/geo_db.h | 105 - .../include/rocksdb/utilities/json_document.h | 174 - .../include/rocksdb/utilities/spatial_db.h | 236 - .../include/rocksdb/utilities/stackable_db.h | 226 - .../include/rocksdb/utilities/utility_db.h | 30 - .../utilities/write_batch_with_index.h | 102 - src/rocksdb2/include/rocksdb/version.h | 17 - src/rocksdb2/include/rocksdb/write_batch.h | 163 - .../include/utilities/backupable_db.h | 12 - src/rocksdb2/include/utilities/db_ttl.h | 8 - src/rocksdb2/include/utilities/document_db.h | 8 - src/rocksdb2/include/utilities/geo_db.h | 8 - .../include/utilities/json_document.h | 7 - src/rocksdb2/include/utilities/stackable_db.h | 7 - src/rocksdb2/include/utilities/utility_db.h | 7 - src/rocksdb2/java/HISTORY-JAVA.md | 54 - src/rocksdb2/java/Makefile | 34 - src/rocksdb2/java/RocksDBSample.java | 259 - src/rocksdb2/java/jdb_bench.sh | 1 - .../java/org/rocksdb/BackupableDB.java | 90 - .../java/org/rocksdb/BackupableDBOptions.java | 73 - .../org/rocksdb/BlockBasedTableConfig.java | 210 - .../java/org/rocksdb/BloomFilter.java | 37 - .../java/org/rocksdb/CompactionStyle.java | 22 - .../java/org/rocksdb/CompressionType.java | 25 - src/rocksdb2/java/org/rocksdb/Filter.java | 31 - .../rocksdb/HashLinkedListMemTableConfig.java | 52 - .../rocksdb/HashSkipListMemTableConfig.java | 97 - .../java/org/rocksdb/HistogramData.java | 43 - .../java/org/rocksdb/HistogramType.java | 39 - .../java/org/rocksdb/MemTableConfig.java | 27 - src/rocksdb2/java/org/rocksdb/Options.java | 2240 - .../java/org/rocksdb/PlainTableConfig.java | 123 - .../java/org/rocksdb/ReadOptions.java | 125 - .../java/org/rocksdb/RestoreBackupableDB.java | 84 - .../java/org/rocksdb/RestoreOptions.java | 37 - src/rocksdb2/java/org/rocksdb/RocksDB.java | 370 - .../java/org/rocksdb/RocksDBException.java | 23 - src/rocksdb2/java/org/rocksdb/RocksEnv.java | 102 - .../java/org/rocksdb/RocksIterator.java | 136 - .../java/org/rocksdb/RocksObject.java | 117 - .../org/rocksdb/SkipListMemTableConfig.java | 15 - src/rocksdb2/java/org/rocksdb/Statistics.java | 38 - .../java/org/rocksdb/StatisticsCollector.java | 107 - .../rocksdb/StatisticsCollectorCallback.java | 34 - .../java/org/rocksdb/StatsCollectorInput.java | 35 - .../java/org/rocksdb/TableFormatConfig.java | 20 - src/rocksdb2/java/org/rocksdb/TickerType.java | 123 - .../org/rocksdb/VectorMemTableConfig.java | 40 - src/rocksdb2/java/org/rocksdb/WriteBatch.java | 112 - .../java/org/rocksdb/WriteBatchTest.java | 124 - .../java/org/rocksdb/WriteOptions.java | 99 - .../org/rocksdb/benchmark/DbBenchmark.java | 1608 - .../org/rocksdb/test/BackupableDBTest.java | 63 - .../java/org/rocksdb/test/OptionsTest.java | 388 - .../org/rocksdb/test/ReadOptionsTest.java | 40 - .../rocksdb/test/StatisticsCollectorTest.java | 43 - .../org/rocksdb/test/StatsCallbackMock.java | 22 - .../java/org/rocksdb/util/Environment.java | 37 - .../java/org/rocksdb/util/SizeUnit.java | 16 - src/rocksdb2/java/rocksjni/backupablejni.cc | 114 - src/rocksdb2/java/rocksjni/env.cc | 66 - src/rocksdb2/java/rocksjni/filter.cc | 38 - src/rocksdb2/java/rocksjni/iterator.cc | 145 - src/rocksdb2/java/rocksjni/memtablejni.cc | 58 - src/rocksdb2/java/rocksjni/options.cc | 1686 - src/rocksdb2/java/rocksjni/portal.h | 383 - src/rocksdb2/java/rocksjni/restorejni.cc | 145 - src/rocksdb2/java/rocksjni/rocksjni.cc | 427 - src/rocksdb2/java/rocksjni/statistics.cc | 50 - src/rocksdb2/java/rocksjni/table.cc | 60 - src/rocksdb2/java/rocksjni/write_batch.cc | 261 - .../linters/__phutil_library_init__.php | 3 - .../linters/__phutil_library_map__.php | 27 - .../cpp_linter/ArcanistCpplintLinter.php | 88 - .../linters/cpp_linter/FbcodeCppLinter.php | 99 - .../linters/cpp_linter/PfffCppLinter.php | 68 - src/rocksdb2/linters/cpp_linter/cpplint.py | 4767 - .../lint_engine/FacebookFbcodeLintEngine.php | 147 - src/rocksdb2/port/README | 10 - src/rocksdb2/port/atomic_pointer.h | 157 - src/rocksdb2/port/likely.h | 21 - src/rocksdb2/port/port.h | 22 - src/rocksdb2/port/port_example.h | 133 - src/rocksdb2/port/port_posix.cc | 137 - src/rocksdb2/port/port_posix.h | 493 - src/rocksdb2/port/stack_trace.cc | 132 - src/rocksdb2/port/stack_trace.h | 19 - src/rocksdb2/port/win/stdint.h | 24 - src/rocksdb2/table/adaptive_table_factory.cc | 116 - src/rocksdb2/table/adaptive_table_factory.h | 64 - src/rocksdb2/table/block.cc | 379 - src/rocksdb2/table/block.h | 195 - .../table/block_based_table_builder.cc | 809 - .../table/block_based_table_builder.h | 97 - .../table/block_based_table_factory.cc | 134 - .../table/block_based_table_factory.h | 61 - .../table/block_based_table_reader.cc | 1302 - src/rocksdb2/table/block_based_table_reader.h | 208 - src/rocksdb2/table/block_builder.cc | 127 - src/rocksdb2/table/block_builder.h | 61 - src/rocksdb2/table/block_hash_index.cc | 157 - src/rocksdb2/table/block_hash_index.h | 85 - src/rocksdb2/table/block_hash_index_test.cc | 117 - src/rocksdb2/table/block_prefix_index.cc | 236 - src/rocksdb2/table/block_prefix_index.h | 67 - src/rocksdb2/table/block_test.cc | 241 - src/rocksdb2/table/bloom_block.cc | 23 - src/rocksdb2/table/bloom_block.h | 37 - src/rocksdb2/table/cuckoo_table_builder.cc | 424 - src/rocksdb2/table/cuckoo_table_builder.h | 104 - .../table/cuckoo_table_builder_test.cc | 491 - src/rocksdb2/table/cuckoo_table_factory.cc | 59 - src/rocksdb2/table/cuckoo_table_factory.h | 71 - src/rocksdb2/table/cuckoo_table_reader.cc | 335 - src/rocksdb2/table/cuckoo_table_reader.h | 82 - .../table/cuckoo_table_reader_test.cc | 537 - src/rocksdb2/table/filter_block.cc | 186 - src/rocksdb2/table/filter_block.h | 96 - src/rocksdb2/table/filter_block_test.cc | 139 - src/rocksdb2/table/flush_block_policy.cc | 72 - src/rocksdb2/table/format.cc | 446 - src/rocksdb2/table/format.h | 198 - src/rocksdb2/table/iter_heap.h | 44 - src/rocksdb2/table/iterator.cc | 92 - src/rocksdb2/table/iterator_wrapper.h | 81 - src/rocksdb2/table/merger.cc | 353 - src/rocksdb2/table/merger.h | 60 - src/rocksdb2/table/meta_blocks.cc | 339 - src/rocksdb2/table/meta_blocks.h | 146 - src/rocksdb2/table/plain_table_builder.cc | 283 - src/rocksdb2/table/plain_table_builder.h | 130 - src/rocksdb2/table/plain_table_factory.cc | 88 - src/rocksdb2/table/plain_table_factory.h | 192 - src/rocksdb2/table/plain_table_index.cc | 201 - src/rocksdb2/table/plain_table_index.h | 221 - src/rocksdb2/table/plain_table_key_coding.cc | 325 - src/rocksdb2/table/plain_table_key_coding.h | 97 - src/rocksdb2/table/plain_table_reader.cc | 714 - src/rocksdb2/table/plain_table_reader.h | 215 - src/rocksdb2/table/table_builder.h | 55 - src/rocksdb2/table/table_properties.cc | 115 - src/rocksdb2/table/table_reader.h | 77 - src/rocksdb2/table/table_reader_bench.cc | 297 - src/rocksdb2/table/table_test.cc | 1947 - src/rocksdb2/table/two_level_iterator.cc | 200 - src/rocksdb2/table/two_level_iterator.h | 50 - src/rocksdb2/third-party/rapidjson/document.h | 821 - .../third-party/rapidjson/filestream.h | 46 - .../third-party/rapidjson/internal/pow10.h | 54 - .../third-party/rapidjson/internal/stack.h | 82 - .../third-party/rapidjson/internal/strfunc.h | 24 - .../third-party/rapidjson/license.txt | 19 - .../third-party/rapidjson/prettywriter.h | 156 - .../third-party/rapidjson/rapidjson.h | 525 - src/rocksdb2/third-party/rapidjson/reader.h | 683 - .../third-party/rapidjson/stringbuffer.h | 49 - src/rocksdb2/third-party/rapidjson/writer.h | 241 - src/rocksdb2/tools/auto_sanity_test.sh | 71 - src/rocksdb2/tools/blob_store_bench.cc | 280 - src/rocksdb2/tools/db_crashtest.py | 148 - src/rocksdb2/tools/db_crashtest2.py | 172 - src/rocksdb2/tools/db_repl_stress.cc | 147 - src/rocksdb2/tools/db_sanity_test.cc | 204 - src/rocksdb2/tools/db_stress.cc | 1819 - src/rocksdb2/tools/ldb.cc | 13 - src/rocksdb2/tools/ldb_test.py | 383 - src/rocksdb2/tools/reduce_levels_test.cc | 198 - src/rocksdb2/tools/sst_dump.cc | 420 - src/rocksdb2/util/arena.cc | 130 - src/rocksdb2/util/arena.h | 128 - src/rocksdb2/util/arena_test.cc | 142 - src/rocksdb2/util/auto_roll_logger.cc | 116 - src/rocksdb2/util/auto_roll_logger.h | 91 - src/rocksdb2/util/auto_roll_logger_test.cc | 304 - src/rocksdb2/util/autovector.h | 319 - src/rocksdb2/util/autovector_test.cc | 316 - src/rocksdb2/util/benchharness.cc | 398 - src/rocksdb2/util/benchharness.h | 357 - src/rocksdb2/util/benchharness_test.cc | 67 - src/rocksdb2/util/blob_store.cc | 270 - src/rocksdb2/util/blob_store.h | 163 - src/rocksdb2/util/blob_store_test.cc | 200 - src/rocksdb2/util/bloom.cc | 108 - src/rocksdb2/util/bloom_test.cc | 182 - src/rocksdb2/util/build_version.h | 16 - src/rocksdb2/util/cache.cc | 481 - src/rocksdb2/util/cache_test.cc | 449 - src/rocksdb2/util/coding.cc | 81 - src/rocksdb2/util/coding.h | 268 - src/rocksdb2/util/coding_test.cc | 203 - src/rocksdb2/util/comparator.cc | 86 - src/rocksdb2/util/crc32c.cc | 393 - src/rocksdb2/util/crc32c.h | 46 - src/rocksdb2/util/crc32c_test.cc | 77 - src/rocksdb2/util/db_info_dummper.cc | 121 - src/rocksdb2/util/dynamic_bloom.cc | 82 - src/rocksdb2/util/dynamic_bloom.h | 153 - src/rocksdb2/util/dynamic_bloom_test.cc | 219 - src/rocksdb2/util/env.cc | 252 - src/rocksdb2/util/env_hdfs.cc | 591 - src/rocksdb2/util/env_posix.cc | 1811 - src/rocksdb2/util/env_test.cc | 741 - src/rocksdb2/util/filelock_test.cc | 58 - src/rocksdb2/util/filter_policy.cc | 16 - src/rocksdb2/util/hash.cc | 49 - src/rocksdb2/util/hash.h | 27 - src/rocksdb2/util/hash_cuckoo_rep.cc | 633 - src/rocksdb2/util/hash_cuckoo_rep.h | 42 - src/rocksdb2/util/hash_linklist_rep.cc | 799 - src/rocksdb2/util/hash_linklist_rep.h | 48 - src/rocksdb2/util/hash_skiplist_rep.cc | 338 - src/rocksdb2/util/hash_skiplist_rep.h | 43 - src/rocksdb2/util/histogram.cc | 198 - src/rocksdb2/util/histogram.h | 79 - src/rocksdb2/util/histogram_test.cc | 62 - src/rocksdb2/util/iostats_context.cc | 32 - src/rocksdb2/util/iostats_context_imp.h | 46 - src/rocksdb2/util/ldb_cmd.cc | 1853 - src/rocksdb2/util/ldb_cmd.h | 730 - src/rocksdb2/util/ldb_cmd_execute_result.h | 76 - src/rocksdb2/util/ldb_tool.cc | 121 - src/rocksdb2/util/log_buffer.cc | 73 - src/rocksdb2/util/log_buffer.h | 49 - src/rocksdb2/util/log_write_bench.cc | 82 - src/rocksdb2/util/logging.cc | 99 - src/rocksdb2/util/logging.h | 47 - src/rocksdb2/util/manual_compaction_test.cc | 156 - src/rocksdb2/util/murmurhash.cc | 183 - src/rocksdb2/util/murmurhash.h | 42 - src/rocksdb2/util/mutexlock.h | 78 - src/rocksdb2/util/options.cc | 530 - src/rocksdb2/util/options_builder.cc | 196 - src/rocksdb2/util/options_test.cc | 80 - src/rocksdb2/util/perf_context.cc | 90 - src/rocksdb2/util/perf_context_imp.h | 88 - src/rocksdb2/util/posix_logger.h | 161 - src/rocksdb2/util/random.h | 90 - src/rocksdb2/util/rate_limiter.cc | 203 - src/rocksdb2/util/rate_limiter.h | 84 - src/rocksdb2/util/rate_limiter_test.cc | 82 - src/rocksdb2/util/signal_test.cc | 34 - src/rocksdb2/util/skiplistrep.cc | 126 - src/rocksdb2/util/slice.cc | 74 - src/rocksdb2/util/statistics.cc | 134 - src/rocksdb2/util/statistics.h | 90 - src/rocksdb2/util/status.cc | 89 - src/rocksdb2/util/stl_wrappers.h | 32 - src/rocksdb2/util/stop_watch.h | 75 - src/rocksdb2/util/string_util.cc | 23 - src/rocksdb2/util/string_util.h | 15 - src/rocksdb2/util/sync_point.cc | 64 - src/rocksdb2/util/sync_point.h | 80 - src/rocksdb2/util/testharness.cc | 84 - src/rocksdb2/util/testharness.h | 142 - src/rocksdb2/util/testutil.cc | 102 - src/rocksdb2/util/testutil.h | 87 - src/rocksdb2/util/thread_local.cc | 243 - src/rocksdb2/util/thread_local.h | 166 - src/rocksdb2/util/thread_local_test.cc | 472 - src/rocksdb2/util/vectorrep.cc | 290 - src/rocksdb2/util/xxhash.cc | 475 - src/rocksdb2/util/xxhash.h | 164 - .../utilities/backupable/backupable_db.cc | 1308 - .../backupable/backupable_db_test.cc | 973 - .../utilities/document/document_db.cc | 1151 - .../utilities/document/document_db_test.cc | 263 - .../utilities/document/json_document.cc | 617 - .../utilities/document/json_document_test.cc | 170 - src/rocksdb2/utilities/geodb/geodb_impl.cc | 431 - src/rocksdb2/utilities/geodb/geodb_impl.h | 191 - src/rocksdb2/utilities/geodb/geodb_test.cc | 123 - src/rocksdb2/utilities/merge_operators.h | 45 - src/rocksdb2/utilities/merge_operators/put.cc | 68 - .../string_append/stringappend.cc | 60 - .../string_append/stringappend.h | 31 - .../string_append/stringappend2.cc | 113 - .../string_append/stringappend2.h | 51 - .../string_append/stringappend_test.cc | 595 - .../utilities/merge_operators/uint64add.cc | 65 - src/rocksdb2/utilities/redis/README | 14 - .../utilities/redis/redis_list_exception.h | 22 - .../utilities/redis/redis_list_iterator.h | 310 - src/rocksdb2/utilities/redis/redis_lists.cc | 552 - src/rocksdb2/utilities/redis/redis_lists.h | 108 - .../utilities/redis/redis_lists_test.cc | 884 - .../utilities/spatialdb/spatial_db.cc | 847 - .../utilities/spatialdb/spatial_db_test.cc | 268 - src/rocksdb2/utilities/spatialdb/utils.h | 95 - src/rocksdb2/utilities/ttl/db_ttl_impl.cc | 284 - src/rocksdb2/utilities/ttl/db_ttl_impl.h | 314 - src/rocksdb2/utilities/ttl/ttl_test.cc | 595 - .../write_batch_with_index.cc | 301 - .../write_batch_with_index_test.cc | 235 - src/secp256k1/.gitignore | 49 - src/secp256k1/.travis.yml | 69 - src/secp256k1/COPYING | 19 - src/secp256k1/Makefile.am | 177 - src/secp256k1/README.md | 61 - src/secp256k1/TODO | 3 - src/secp256k1/autogen.sh | 3 - .../build-aux/m4/ax_jni_include_dir.m4 | 140 - .../build-aux/m4/ax_prog_cc_for_build.m4 | 125 - src/secp256k1/build-aux/m4/bitcoin_secp.m4 | 69 - src/secp256k1/configure.ac | 493 - src/secp256k1/contrib/lax_der_parsing.c | 150 - src/secp256k1/contrib/lax_der_parsing.h | 91 - .../contrib/lax_der_privatekey_parsing.c | 113 - .../contrib/lax_der_privatekey_parsing.h | 90 - src/secp256k1/include/secp256k1.h | 577 - src/secp256k1/include/secp256k1_ecdh.h | 31 - src/secp256k1/include/secp256k1_recovery.h | 110 - src/secp256k1/libsecp256k1.pc.in | 13 - src/secp256k1/obj/.gitignore | 0 src/secp256k1/sage/group_prover.sage | 322 - src/secp256k1/sage/secp256k1.sage | 306 - src/secp256k1/sage/weierstrass_prover.sage | 264 - src/secp256k1/src/asm/field_10x26_arm.s | 919 - src/secp256k1/src/basic-config.h | 32 - src/secp256k1/src/bench.h | 66 - src/secp256k1/src/bench_ecdh.c | 54 - src/secp256k1/src/bench_internal.c | 382 - src/secp256k1/src/bench_recover.c | 60 - src/secp256k1/src/bench_schnorr_verify.c | 73 - src/secp256k1/src/bench_sign.c | 56 - src/secp256k1/src/bench_verify.c | 112 - src/secp256k1/src/ecdsa.h | 21 - src/secp256k1/src/ecdsa_impl.h | 315 - src/secp256k1/src/eckey.h | 25 - src/secp256k1/src/eckey_impl.h | 99 - src/secp256k1/src/ecmult.h | 31 - src/secp256k1/src/ecmult_const.h | 15 - src/secp256k1/src/ecmult_const_impl.h | 239 - src/secp256k1/src/ecmult_gen.h | 43 - src/secp256k1/src/ecmult_gen_impl.h | 210 - src/secp256k1/src/ecmult_impl.h | 406 - src/secp256k1/src/field.h | 132 - src/secp256k1/src/field_10x26.h | 47 - src/secp256k1/src/field_10x26_impl.h | 1140 - src/secp256k1/src/field_5x52.h | 47 - src/secp256k1/src/field_5x52_asm_impl.h | 502 - src/secp256k1/src/field_5x52_impl.h | 451 - src/secp256k1/src/field_5x52_int128_impl.h | 277 - src/secp256k1/src/field_impl.h | 315 - src/secp256k1/src/gen_context.c | 74 - src/secp256k1/src/group.h | 144 - src/secp256k1/src/group_impl.h | 700 - src/secp256k1/src/hash.h | 41 - src/secp256k1/src/hash_impl.h | 281 - .../src/java/org/bitcoin/NativeSecp256k1.java | 446 - .../java/org/bitcoin/NativeSecp256k1Test.java | 226 - .../java/org/bitcoin/NativeSecp256k1Util.java | 45 - .../java/org/bitcoin/Secp256k1Context.java | 51 - .../src/java/org_bitcoin_NativeSecp256k1.c | 377 - .../src/java/org_bitcoin_NativeSecp256k1.h | 119 - .../src/java/org_bitcoin_Secp256k1Context.c | 15 - .../src/java/org_bitcoin_Secp256k1Context.h | 22 - .../src/modules/ecdh/Makefile.am.include | 8 - src/secp256k1/src/modules/ecdh/main_impl.h | 54 - src/secp256k1/src/modules/ecdh/tests_impl.h | 105 - .../src/modules/recovery/Makefile.am.include | 8 - .../src/modules/recovery/main_impl.h | 193 - .../src/modules/recovery/tests_impl.h | 393 - src/secp256k1/src/num.h | 74 - src/secp256k1/src/num_gmp.h | 20 - src/secp256k1/src/num_gmp_impl.h | 288 - src/secp256k1/src/num_impl.h | 24 - src/secp256k1/src/scalar.h | 106 - src/secp256k1/src/scalar_4x64.h | 19 - src/secp256k1/src/scalar_4x64_impl.h | 949 - src/secp256k1/src/scalar_8x32.h | 19 - src/secp256k1/src/scalar_8x32_impl.h | 721 - src/secp256k1/src/scalar_impl.h | 370 - src/secp256k1/src/scalar_low.h | 15 - src/secp256k1/src/scalar_low_impl.h | 114 - src/secp256k1/src/secp256k1.c | 561 - src/secp256k1/src/testrand.h | 38 - src/secp256k1/src/testrand_impl.h | 110 - src/secp256k1/src/tests.c | 4525 - src/secp256k1/src/tests_exhaustive.c | 470 - src/secp256k1/src/util.h | 113 - src/snappy/config/snappy-stubs-public.h | 82 - src/snappy/snappy/AUTHORS | 1 - src/snappy/snappy/COPYING | 54 - src/snappy/snappy/ChangeLog | 1916 - src/snappy/snappy/Makefile.am | 23 - src/snappy/snappy/NEWS | 128 - src/snappy/snappy/README | 135 - src/snappy/snappy/autogen.sh | 7 - src/snappy/snappy/configure.ac | 133 - src/snappy/snappy/format_description.txt | 110 - src/snappy/snappy/framing_format.txt | 135 - src/snappy/snappy/m4/gtest.m4 | 74 - src/snappy/snappy/snappy-c.cc | 90 - src/snappy/snappy/snappy-c.h | 138 - src/snappy/snappy/snappy-internal.h | 150 - src/snappy/snappy/snappy-sinksource.cc | 71 - src/snappy/snappy/snappy-sinksource.h | 137 - src/snappy/snappy/snappy-stubs-internal.cc | 42 - src/snappy/snappy/snappy-stubs-internal.h | 491 - src/snappy/snappy/snappy-stubs-public.h.in | 98 - src/snappy/snappy/snappy-test.cc | 606 - src/snappy/snappy/snappy-test.h | 582 - src/snappy/snappy/snappy.cc | 1306 - src/snappy/snappy/snappy.h | 184 - src/snappy/snappy/snappy_unittest.cc | 1355 - src/snappy/snappy/testdata/alice29.txt | 3609 - src/snappy/snappy/testdata/asyoulik.txt | 4122 - src/snappy/snappy/testdata/baddata1.snappy | Bin 27512 -> 0 bytes src/snappy/snappy/testdata/baddata2.snappy | Bin 27483 -> 0 bytes src/snappy/snappy/testdata/baddata3.snappy | Bin 28384 -> 0 bytes src/snappy/snappy/testdata/fireworks.jpeg | Bin 123093 -> 0 bytes src/snappy/snappy/testdata/geo.protodata | Bin 118588 -> 0 bytes src/snappy/snappy/testdata/html | 1 - src/snappy/snappy/testdata/html_x_4 | 1 - src/snappy/snappy/testdata/kppkn.gtb | Bin 184320 -> 0 bytes src/snappy/snappy/testdata/lcet10.txt | 7519 - src/snappy/snappy/testdata/paper-100k.pdf | 598 - src/snappy/snappy/testdata/plrabn12.txt | 10699 - src/snappy/snappy/testdata/urls.10K | 10000 - src/soci/.gitattributes | 22 - src/soci/.gitignore | 39 - src/soci/.travis.yml | 45 - src/soci/AUTHORS | 78 - src/soci/CHANGES | 383 - src/soci/CMakeLists.txt | 159 - src/soci/CTestConfig.cmake | 13 - src/soci/LICENSE_1_0.txt | 23 - src/soci/README.md | 52 - src/soci/TODO | 134 - src/soci/bin/ci/before_install.sh | 19 - src/soci/bin/ci/before_install_db2.sh | 39 - src/soci/bin/ci/before_install_firebird.sh | 16 - src/soci/bin/ci/before_install_odbc.sh | 13 - src/soci/bin/ci/before_install_oracle.sh | 123 - src/soci/bin/ci/before_script.sh | 12 - src/soci/bin/ci/before_script_db2.sh | 10 - src/soci/bin/ci/before_script_firebird.sh | 11 - src/soci/bin/ci/before_script_mysql.sh | 9 - src/soci/bin/ci/before_script_odbc.sh | 11 - src/soci/bin/ci/before_script_oracle.sh | 45 - src/soci/bin/ci/before_script_postgresql.sh | 9 - src/soci/bin/ci/common.sh | 34 - src/soci/bin/ci/oracle.sh | 14 - src/soci/bin/ci/script.sh | 16 - src/soci/bin/ci/script_db2.sh | 25 - src/soci/bin/ci/script_empty.sh | 23 - src/soci/bin/ci/script_firebird.sh | 24 - src/soci/bin/ci/script_mysql.sh | 24 - src/soci/bin/ci/script_odbc.sh | 33 - src/soci/bin/ci/script_oracle.sh | 26 - src/soci/bin/ci/script_postgresql.sh | 24 - src/soci/bin/ci/script_postgression.sh | 47 - src/soci/bin/ci/script_sqlite3.sh | 24 - src/soci/bin/vm/debian-oracle10g-install.sh | 89 - src/soci/cmake/.gitignore | 21 - src/soci/cmake/CMakeLists.txt | 13 - src/soci/cmake/SociBackend.cmake | 385 - src/soci/cmake/SociConfig.cmake | 83 - src/soci/cmake/SociDependencies.cmake | 86 - src/soci/cmake/SociUtilities.cmake | 418 - src/soci/cmake/SociVersion.cmake | 57 - src/soci/cmake/dependencies/Boost.cmake | 13 - src/soci/cmake/dependencies/DB2.cmake | 5 - src/soci/cmake/dependencies/Firebird.cmake | 9 - src/soci/cmake/dependencies/MySQL.cmake | 5 - src/soci/cmake/dependencies/ODBC.cmake | 5 - src/soci/cmake/dependencies/Oracle.cmake | 5 - src/soci/cmake/dependencies/PostgreSQL.cmake | 5 - src/soci/cmake/dependencies/SQLite3.cmake | 5 - src/soci/cmake/dependencies/Threads.cmake | 4 - src/soci/cmake/modules/FindDB2.cmake | 99 - src/soci/cmake/modules/FindDL.cmake | 21 - src/soci/cmake/modules/FindFirebird.cmake | 38 - src/soci/cmake/modules/FindMySQL.cmake | 129 - src/soci/cmake/modules/FindODBC.cmake | 65 - src/soci/cmake/modules/FindOracle.cmake | 76 - src/soci/cmake/modules/FindPostgreSQL.cmake | 83 - src/soci/cmake/modules/FindSQLite3.cmake | 62 - src/soci/cmake/modules/FindSoci.cmake | 98 - .../vs2010-test-cmd-args.vcxproj.user.in | 7 - src/soci/docs/backends.md | 273 - src/soci/docs/backends/db2.md | 90 - src/soci/docs/backends/firebird.md | 200 - src/soci/docs/backends/index.md | 101 - src/soci/docs/backends/mysql.md | 204 - src/soci/docs/backends/odbc.md | 252 - src/soci/docs/backends/oracle.md | 219 - src/soci/docs/backends/postgresql.md | 204 - src/soci/docs/backends/sqlite3.md | 200 - src/soci/docs/beyond.md | 75 - src/soci/docs/boost.md | 78 - src/soci/docs/connections.md | 90 - src/soci/docs/errors.md | 82 - src/soci/docs/exchange.md | 536 - src/soci/docs/index.md | 71 - src/soci/docs/installation.md | 213 - src/soci/docs/interfaces.md | 74 - src/soci/docs/languages/ada/concepts.md | 32 - src/soci/docs/languages/ada/idioms.md | 268 - src/soci/docs/languages/ada/index.md | 39 - src/soci/docs/languages/ada/reference.md | 523 - src/soci/docs/multithreading.md | 38 - src/soci/docs/queries.md | 84 - src/soci/docs/rationale.md | 125 - src/soci/docs/reference.md | 704 - src/soci/docs/statements.md | 311 - src/soci/docs/structure.md | 27 - src/soci/include/private/README.md | 5 - src/soci/include/private/firebird/common.h | 271 - .../include/private/firebird/error-firebird.h | 35 - src/soci/include/private/soci-compiler.h | 39 - src/soci/include/private/soci-cpp.h | 30 - src/soci/include/private/soci-cstrtod.h | 80 - src/soci/include/private/soci-dtocstr.h | 58 - src/soci/include/private/soci-exchange-cast.h | 84 - src/soci/include/private/soci-mktime.h | 46 - src/soci/include/private/soci-static-assert.h | 19 - src/soci/include/soci/backend-loader.h | 37 - src/soci/include/soci/bind-values.h | 196 - src/soci/include/soci/blob-exchange.h | 59 - src/soci/include/soci/blob.h | 47 - src/soci/include/soci/boost-fusion.h | 28 - src/soci/include/soci/boost-gregorian-date.h | 47 - src/soci/include/soci/boost-optional.h | 65 - src/soci/include/soci/boost-tuple.h | 18 - src/soci/include/soci/connection-parameters.h | 68 - src/soci/include/soci/connection-pool.h | 39 - src/soci/include/soci/db2/soci-db2.h | 294 - src/soci/include/soci/empty/soci-empty.h | 194 - src/soci/include/soci/error.h | 50 - src/soci/include/soci/exchange-traits.h | 138 - .../include/soci/firebird/soci-firebird.h | 348 - src/soci/include/soci/into-type.h | 164 - src/soci/include/soci/into.h | 72 - src/soci/include/soci/mysql/soci-mysql.h | 276 - src/soci/include/soci/noreturn.h | 22 - src/soci/include/soci/odbc/soci-odbc.h | 455 - src/soci/include/soci/once-temp-type.h | 119 - src/soci/include/soci/oracle/soci-oracle.h | 301 - .../include/soci/postgresql/soci-postgresql.h | 352 - src/soci/include/soci/prepare-temp-type.h | 65 - src/soci/include/soci/procedure.h | 89 - src/soci/include/soci/query_transformation.h | 59 - .../include/soci/ref-counted-prepare-info.h | 66 - src/soci/include/soci/ref-counted-statement.h | 89 - src/soci/include/soci/row-exchange.h | 79 - src/soci/include/soci/row.h | 140 - src/soci/include/soci/rowid-exchange.h | 59 - src/soci/include/soci/rowid.h | 41 - src/soci/include/soci/rowset.h | 224 - src/soci/include/soci/session.h | 158 - src/soci/include/soci/soci-backend.h | 265 - src/soci/include/soci/soci-config.h | 13 - src/soci/include/soci/soci-platform.h | 99 - src/soci/include/soci/soci-simple.h | 159 - src/soci/include/soci/soci.h | 56 - src/soci/include/soci/sqlite3/soci-sqlite3.h | 317 - src/soci/include/soci/statement.h | 322 - src/soci/include/soci/transaction.h | 36 - .../include/soci/type-conversion-traits.h | 41 - src/soci/include/soci/type-conversion.h | 364 - src/soci/include/soci/type-holder.h | 68 - src/soci/include/soci/type-ptr.h | 30 - src/soci/include/soci/unsigned-types.h | 114 - src/soci/include/soci/use-type.h | 246 - src/soci/include/soci/use.h | 78 - src/soci/include/soci/values-exchange.h | 148 - src/soci/include/soci/values.h | 354 - src/soci/include/soci/version.h | 34 - src/soci/languages/ada/postgresql_client.gpr | 8 - src/soci/languages/ada/soci-mysql.ads | 16 - src/soci/languages/ada/soci-oracle.ads | 16 - src/soci/languages/ada/soci-postgresql.ads | 16 - src/soci/languages/ada/soci.adb | 1465 - src/soci/languages/ada/soci.ads | 486 - src/soci/languages/ada/soci_ada.gpr | 14 - src/soci/languages/ada/soci_core.gpr | 7 - src/soci/languages/ada/soci_postgresql.gpr | 8 - src/soci/languages/ada/std_cpp.gpr | 7 - .../languages/ada/test/postgresql_test.adb | 609 - .../languages/ada/test/postgresql_test.gpr | 12 - src/soci/src/.gitignore | 20 - src/soci/src/CMakeLists.txt | 14 - src/soci/src/backends/.gitignore | 5 - src/soci/src/backends/CMakeLists.txt | 48 - src/soci/src/backends/db2/CMakeLists.txt | 14 - src/soci/src/backends/db2/blob.cpp | 62 - src/soci/src/backends/db2/common.h | 21 - src/soci/src/backends/db2/factory.cpp | 40 - src/soci/src/backends/db2/row-id.cpp | 28 - src/soci/src/backends/db2/session.cpp | 217 - .../src/backends/db2/standard-into-type.cpp | 163 - .../src/backends/db2/standard-use-type.cpp | 202 - src/soci/src/backends/db2/statement.cpp | 322 - .../src/backends/db2/vector-into-type.cpp | 402 - src/soci/src/backends/db2/vector-use-type.cpp | 396 - src/soci/src/backends/empty/CMakeLists.txt | 14 - src/soci/src/backends/empty/Makefile.basic | 88 - src/soci/src/backends/empty/blob.cpp | 61 - src/soci/src/backends/empty/factory.cpp | 42 - src/soci/src/backends/empty/row-id.cpp | 27 - src/soci/src/backends/empty/session.cpp | 63 - .../src/backends/empty/standard-into-type.cpp | 39 - .../src/backends/empty/standard-use-type.cpp | 47 - src/soci/src/backends/empty/statement.cpp | 109 - .../src/backends/empty/vector-into-type.cpp | 46 - .../src/backends/empty/vector-use-type.cpp | 46 - src/soci/src/backends/firebird/CMakeLists.txt | 16 - src/soci/src/backends/firebird/Makefile.basic | 101 - src/soci/src/backends/firebird/blob.cpp | 301 - src/soci/src/backends/firebird/common.cpp | 221 - .../src/backends/firebird/error-firebird.cpp | 87 - src/soci/src/backends/firebird/factory.cpp | 36 - src/soci/src/backends/firebird/session.cpp | 369 - .../backends/firebird/standard-into-type.cpp | 138 - .../backends/firebird/standard-use-type.cpp | 182 - src/soci/src/backends/firebird/statement.cpp | 738 - .../backends/firebird/vector-into-type.cpp | 208 - .../src/backends/firebird/vector-use-type.cpp | 207 - src/soci/src/backends/mysql/CMakeLists.txt | 15 - src/soci/src/backends/mysql/Makefile.basic | 97 - src/soci/src/backends/mysql/blob.cpp | 62 - src/soci/src/backends/mysql/common.cpp | 80 - src/soci/src/backends/mysql/common.h | 93 - src/soci/src/backends/mysql/factory.cpp | 45 - src/soci/src/backends/mysql/row-id.cpp | 32 - src/soci/src/backends/mysql/session.cpp | 423 - .../src/backends/mysql/standard-into-type.cpp | 119 - .../src/backends/mysql/standard-use-type.cpp | 170 - src/soci/src/backends/mysql/statement.cpp | 480 - .../src/backends/mysql/vector-into-type.cpp | 226 - .../src/backends/mysql/vector-use-type.cpp | 217 - src/soci/src/backends/odbc/CMakeLists.txt | 15 - src/soci/src/backends/odbc/Makefile.basic | 89 - src/soci/src/backends/odbc/blob.cpp | 57 - src/soci/src/backends/odbc/factory.cpp | 39 - src/soci/src/backends/odbc/makefile.msvc | 48 - src/soci/src/backends/odbc/row-id.cpp | 23 - src/soci/src/backends/odbc/session.cpp | 335 - .../src/backends/odbc/standard-into-type.cpp | 198 - .../src/backends/odbc/standard-use-type.cpp | 267 - src/soci/src/backends/odbc/statement.cpp | 362 - src/soci/src/backends/odbc/utility.h | 62 - .../src/backends/odbc/vector-into-type.cpp | 464 - .../src/backends/odbc/vector-use-type.cpp | 456 - src/soci/src/backends/oracle/CMakeLists.txt | 15 - src/soci/src/backends/oracle/Makefile.basic | 95 - src/soci/src/backends/oracle/blob.cpp | 112 - src/soci/src/backends/oracle/error.cpp | 60 - src/soci/src/backends/oracle/error.h | 33 - src/soci/src/backends/oracle/factory.cpp | 158 - src/soci/src/backends/oracle/row-id.cpp | 32 - src/soci/src/backends/oracle/session.cpp | 231 - .../backends/oracle/standard-into-type.cpp | 271 - .../src/backends/oracle/standard-use-type.cpp | 485 - src/soci/src/backends/oracle/statement.cpp | 342 - .../src/backends/oracle/vector-into-type.cpp | 461 - .../src/backends/oracle/vector-use-type.cpp | 397 - .../src/backends/postgresql/CMakeLists.txt | 46 - .../src/backends/postgresql/Makefile.basic | 114 - src/soci/src/backends/postgresql/blob.cpp | 116 - src/soci/src/backends/postgresql/common.cpp | 86 - src/soci/src/backends/postgresql/common.h | 132 - src/soci/src/backends/postgresql/error.cpp | 70 - src/soci/src/backends/postgresql/factory.cpp | 49 - src/soci/src/backends/postgresql/row-id.cpp | 40 - src/soci/src/backends/postgresql/session.cpp | 137 - .../postgresql/standard-into-type.cpp | 163 - .../backends/postgresql/standard-use-type.cpp | 200 - .../src/backends/postgresql/statement.cpp | 595 - .../backends/postgresql/vector-into-type.cpp | 245 - .../backends/postgresql/vector-use-type.cpp | 227 - src/soci/src/backends/sqlite3/CMakeLists.txt | 16 - src/soci/src/backends/sqlite3/Makefile.basic | 102 - src/soci/src/backends/sqlite3/blob.cpp | 117 - src/soci/src/backends/sqlite3/common.cpp | 59 - src/soci/src/backends/sqlite3/common.h | 87 - src/soci/src/backends/sqlite3/error.cpp | 23 - src/soci/src/backends/sqlite3/factory.cpp | 42 - src/soci/src/backends/sqlite3/row-id.cpp | 26 - src/soci/src/backends/sqlite3/session.cpp | 170 - .../backends/sqlite3/standard-into-type.cpp | 175 - .../backends/sqlite3/standard-use-type.cpp | 212 - src/soci/src/backends/sqlite3/statement.cpp | 541 - .../src/backends/sqlite3/vector-into-type.cpp | 337 - .../src/backends/sqlite3/vector-use-type.cpp | 214 - src/soci/src/core/.gitignore | 5 - src/soci/src/core/CMakeLists.txt | 122 - src/soci/src/core/Makefile.basic | 89 - src/soci/src/core/backend-loader.cpp | 349 - src/soci/src/core/blob.cpp | 50 - src/soci/src/core/connection-parameters.cpp | 62 - src/soci/src/core/connection-pool.cpp | 343 - src/soci/src/core/error.cpp | 147 - src/soci/src/core/into-type.cpp | 104 - src/soci/src/core/once-temp-type.cpp | 47 - src/soci/src/core/prepare-temp-type.cpp | 47 - src/soci/src/core/procedure.cpp | 33 - .../src/core/ref-counted-prepare-info.cpp | 34 - src/soci/src/core/ref-counted-statement.cpp | 44 - src/soci/src/core/row.cpp | 111 - src/soci/src/core/rowid.cpp | 23 - src/soci/src/core/session.cpp | 394 - src/soci/src/core/soci-simple.cpp | 2130 - src/soci/src/core/soci_backends_config.h.in | 12 - src/soci/src/core/statement.cpp | 783 - src/soci/src/core/transaction.cpp | 53 - src/soci/src/core/use-type.cpp | 185 - src/soci/src/core/values.cpp | 69 - src/soci/tests/CMakeLists.txt | 27 - src/soci/tests/README.md | 10 - src/soci/tests/catch.hpp | 8997 - src/soci/tests/common-tests.h | 4137 - src/soci/tests/db2/CMakeLists.txt | 16 - src/soci/tests/db2/test-db2.cpp | 419 - src/soci/tests/empty/CMakeLists.txt | 15 - src/soci/tests/empty/test-empty.cpp | 161 - src/soci/tests/firebird/CMakeLists.txt | 16 - src/soci/tests/firebird/test-firebird.cpp | 1333 - src/soci/tests/mysql/CMakeLists.txt | 16 - src/soci/tests/mysql/test-mysql.cpp | 865 - src/soci/tests/mysql/test-mysql.h | 132 - src/soci/tests/odbc/CMakeLists.txt | 53 - src/soci/tests/odbc/test-access.dsn | 13 - src/soci/tests/odbc/test-mssql.dsn | 8 - src/soci/tests/odbc/test-mysql.dsn | 4 - src/soci/tests/odbc/test-odbc-access.cpp | 160 - src/soci/tests/odbc/test-odbc-db2.cpp | 282 - src/soci/tests/odbc/test-odbc-mssql.cpp | 195 - src/soci/tests/odbc/test-odbc-mysql.cpp | 49 - src/soci/tests/odbc/test-odbc-postgresql.cpp | 249 - src/soci/tests/odbc/test-postgresql.dsn | 8 - src/soci/tests/oracle/CMakeLists.txt | 16 - src/soci/tests/oracle/Makefile.basic | 13 - src/soci/tests/oracle/test-oracle.cpp | 1177 - src/soci/tests/postgresql/CMakeLists.txt | 16 - src/soci/tests/postgresql/Makefile.basic | 12 - src/soci/tests/postgresql/test-postgresql.cpp | 786 - src/soci/tests/sqlite3/CMakeLists.txt | 16 - src/soci/tests/sqlite3/test-sqlite3.cpp | 403 - src/soci/www/articles.html | 47 - src/soci/www/doc.html | 45 - src/soci/www/doc/README.md | 11 - src/soci/www/doc/index.html | 45 - src/soci/www/events.html | 101 - src/soci/www/forkus_github.png | Bin 5735 -> 0 bytes src/soci/www/index.html | 134 - src/soci/www/links.html | 78 - src/soci/www/people.html | 122 - src/soci/www/style.css | 87 - src/sqlite/sqlite.h | 34 - src/sqlite/sqlite/sqlite3.c | 200726 --------------- src/sqlite/sqlite/sqlite3.h | 10442 - src/sqlite/sqlite/sqlite3ext.h | 560 - src/sqlite/sqlite3.h | 1 - src/sqlite/sqlite_unity.c | 60 - src/test/app/AccountTxPaging_test.cpp | 272 - src/test/app/AmendmentTable_test.cpp | 763 - src/test/app/CrossingLimits_test.cpp | 162 - src/test/app/DeliverMin_test.cpp | 120 - src/test/app/Discrepancy_test.cpp | 152 - src/test/app/Flow_test.cpp | 1403 - src/test/app/Freeze_test.cpp | 535 - src/test/app/HashRouter_test.cpp | 248 - src/test/app/LedgerLoad_test.cpp | 229 - src/test/app/LoadFeeTrack_test.cpp | 52 - src/test/app/MultiSign_test.cpp | 1095 - src/test/app/OfferStream_test.cpp | 44 - src/test/app/Offer_test.cpp | 1929 - src/test/app/OversizeMeta_test.cpp | 188 - src/test/app/Path_test.cpp | 1394 - src/test/app/PayChan_test.cpp | 840 - src/test/app/Regression_test.cpp | 235 - src/test/app/SHAMapStore_test.cpp | 640 - src/test/app/SetAuth_test.cpp | 85 - src/test/app/SetRegularKey_test.cpp | 107 - src/test/app/SetTrust_test.cpp | 224 - src/test/app/SusPay_test.cpp | 818 - src/test/app/Taker_test.cpp | 371 - src/test/app/Ticket_test.cpp | 403 - src/test/app/Transaction_ordering_test.cpp | 144 - src/test/app/TrustAndBalance_test.cpp | 512 - src/test/app/TxQ_test.cpp | 2655 - src/test/app/ValidatorList_test.cpp | 300 - src/test/basics/Buffer_test.cpp | 274 - src/test/basics/CheckLibraryVersions_test.cpp | 56 - src/test/basics/KeyCache_test.cpp | 97 - src/test/basics/RangeSet_test.cpp | 94 - src/test/basics/Slice_test.cpp | 118 - src/test/basics/StringUtilities_test.cpp | 103 - src/test/basics/TaggedCache_test.cpp | 152 - src/test/basics/base_uint_test.cpp | 201 - src/test/basics/contract_test.cpp | 62 - src/test/basics/hardened_hash_test.cpp | 267 - src/test/basics/mulDiv_test.cpp | 62 - src/test/beast/IPEndpoint_test.cpp | 354 - src/test/beast/LexicalCast_test.cpp | 282 - src/test/beast/SemanticVersion_test.cpp | 260 - .../beast/aged_associative_container_test.cpp | 1985 - src/test/beast/beast_Debug_test.cpp | 68 - src/test/beast/beast_Journal_test.cpp | 103 - src/test/beast/beast_PropertyStream_test.cpp | 218 - src/test/beast/beast_Zero_test.cpp | 142 - src/test/beast/beast_abstract_clock_test.cpp | 89 - src/test/beast/beast_asio_error_test.cpp | 43 - .../beast/beast_basic_seconds_clock_test.cpp | 40 - src/test/beast/beast_tagged_integer_test.cpp | 154 - src/test/beast/beast_weak_fn_test.cpp | 147 - src/test/beast/define_print.cpp | 53 - src/test/beast/hash_append_test.cpp | 491 - src/test/beast/hash_speed_test.cpp | 120 - src/test/conditions/Ed25519_test.cpp | 199 - src/test/conditions/PrefixSha256_test.cpp | 562 - src/test/conditions/PreimageSha256_test.cpp | 340 - src/test/conditions/RsaSha256_test.cpp | 362 - src/test/core/Config_test.cpp | 818 - src/test/core/Coroutine_test.cpp | 185 - src/test/core/DeadlineTimer_test.cpp | 123 - src/test/core/SociDB_test.cpp | 379 - src/test/core/Stoppable_test.cpp | 455 - src/test/core/Workers_test.cpp | 102 - src/test/json/Object_test.cpp | 240 - src/test/json/Output_test.cpp | 64 - src/test/json/TestOutputSuite.h | 57 - src/test/json/Writer_test.cpp | 205 - src/test/json/json_value_test.cpp | 233 - src/test/jtx.h | 60 - src/test/jtx/AbstractClient.h | 64 - src/test/jtx/Account.h | 167 - src/test/jtx/BasicNetwork.h | 928 - src/test/jtx/BasicNetwork_test.cpp | 133 - src/test/jtx/Env.h | 676 - src/test/jtx/Env_ss.h | 86 - src/test/jtx/Env_test.cpp | 657 - src/test/jtx/JSONRPCClient.h | 37 - src/test/jtx/JTx.h | 175 - src/test/jtx/ManualTimeKeeper.h | 69 - src/test/jtx/PathSet.h | 141 - src/test/jtx/TestSuite.h | 133 - src/test/jtx/WSClient.h | 55 - src/test/jtx/WSClient_test.cpp | 52 - src/test/jtx/amount.h | 408 - src/test/jtx/balance.h | 78 - src/test/jtx/basic_prop.h | 67 - src/test/jtx/delivermin.h | 50 - src/test/jtx/fee.h | 69 - src/test/jtx/flags.h | 143 - src/test/jtx/impl/Account.cpp | 76 - src/test/jtx/impl/Env.cpp | 561 - src/test/jtx/impl/JSONRPCClient.cpp | 163 - src/test/jtx/impl/ManualTimeKeeper.cpp | 104 - src/test/jtx/impl/WSClient.cpp | 301 - src/test/jtx/impl/amount.cpp | 141 - src/test/jtx/impl/balance.cpp | 67 - src/test/jtx/impl/delivermin.cpp | 36 - src/test/jtx/impl/fee.cpp | 41 - src/test/jtx/impl/flags.cpp | 66 - src/test/jtx/impl/jtx_json.cpp | 56 - src/test/jtx/impl/memo.cpp | 107 - src/test/jtx/impl/multisign.cpp | 114 - src/test/jtx/impl/offer.cpp | 42 - src/test/jtx/impl/owners.cpp | 66 - src/test/jtx/impl/paths.cpp | 96 - src/test/jtx/impl/pay.cpp | 46 - src/test/jtx/impl/quality2.cpp | 73 - src/test/jtx/impl/rate.cpp | 46 - src/test/jtx/impl/regkey.cpp | 51 - src/test/jtx/impl/sendmax.cpp | 36 - src/test/jtx/impl/seq.cpp | 40 - src/test/jtx/impl/sig.cpp | 47 - src/test/jtx/impl/tag.cpp | 42 - src/test/jtx/impl/ticket.cpp | 63 - src/test/jtx/impl/trust.cpp | 69 - src/test/jtx/impl/txflags.cpp | 37 - src/test/jtx/impl/utility.cpp | 93 - src/test/jtx/jtx_json.h | 66 - src/test/jtx/memo.h | 159 - src/test/jtx/multisign.h | 152 - src/test/jtx/noop.h | 41 - src/test/jtx/offer.h | 40 - src/test/jtx/owners.h | 100 - src/test/jtx/paths.h | 124 - src/test/jtx/pay.h | 40 - src/test/jtx/prop.h | 56 - src/test/jtx/quality.h | 91 - src/test/jtx/rate.h | 39 - src/test/jtx/regkey.h | 45 - src/test/jtx/require.h | 94 - src/test/jtx/requires.h | 39 - src/test/jtx/sendmax.h | 50 - src/test/jtx/seq.h | 64 - src/test/jtx/sig.h | 65 - src/test/jtx/tag.h | 69 - src/test/jtx/tags.h | 42 - src/test/jtx/ter.h | 61 - src/test/jtx/ticket.h | 113 - src/test/jtx/trust.h | 48 - src/test/jtx/txflags.h | 50 - src/test/jtx/utility.h | 73 - src/test/ledger/BookDirs_test.cpp | 103 - src/test/ledger/Directory_test.cpp | 83 - src/test/ledger/PaymentSandbox_test.cpp | 348 - src/test/ledger/PendingSaves_test.cpp | 61 - src/test/ledger/SHAMapV2_test.cpp | 81 - src/test/ledger/SkipList_test.cpp | 114 - src/test/ledger/View_test.cpp | 976 - src/test/nodestore/Backend_test.cpp | 121 - src/test/nodestore/Basics_test.cpp | 93 - src/test/nodestore/Database_test.cpp | 203 - src/test/nodestore/TestBase.h | 220 - src/test/nodestore/Timing_test.cpp | 747 - src/test/nodestore/import_test.cpp | 597 - src/test/nodestore/varint_test.cpp | 74 - src/test/overlay/TMHello_test.cpp | 71 - src/test/overlay/cluster_test.cpp | 272 - src/test/overlay/manifest_test.cpp | 430 - src/test/overlay/short_read_test.cpp | 579 - src/test/peerfinder/Livecache_test.cpp | 74 - src/test/peerfinder/PeerFinder_test.cpp | 163 - src/test/protocol/BuildInfo_test.cpp | 107 - src/test/protocol/IOUAmount_test.cpp | 263 - src/test/protocol/InnerObjectFormats_test.cpp | 209 - src/test/protocol/Issue_test.cpp | 494 - src/test/protocol/PublicKey_test.cpp | 395 - src/test/protocol/Quality_test.cpp | 351 - src/test/protocol/STAccount_test.cpp | 134 - src/test/protocol/STAmount_test.cpp | 625 - src/test/protocol/STObject_test.cpp | 518 - src/test/protocol/STTx_test.cpp | 196 - src/test/protocol/SecretKey_test.cpp | 473 - src/test/protocol/Seed_test.cpp | 353 - src/test/protocol/XRPAmount_test.cpp | 206 - src/test/protocol/digest_test.cpp | 162 - src/test/protocol/types_test.cpp | 47 - src/test/resource/Logic_test.cpp | 260 - src/test/rpc/AccountInfo_test.cpp | 306 - src/test/rpc/AccountLinesRPC_test.cpp | 873 - src/test/rpc/AccountObjects_test.cpp | 337 - src/test/rpc/AccountOffers_test.cpp | 300 - src/test/rpc/AccountSet_test.cpp | 317 - src/test/rpc/Book_test.cpp | 1489 - src/test/rpc/GatewayBalances_test.cpp | 162 - src/test/rpc/JSONRPC_test.cpp | 2289 - src/test/rpc/KeyGeneration_test.cpp | 697 - src/test/rpc/LedgerClosed_test.cpp | 64 - src/test/rpc/LedgerData_test.cpp | 297 - src/test/rpc/LedgerRPC_test.cpp | 301 - src/test/rpc/LedgerRequestRPC_test.cpp | 319 - src/test/rpc/NoRipple_test.cpp | 226 - src/test/rpc/RPCOverload_test.cpp | 90 - src/test/rpc/RobustTransaction_test.cpp | 489 - src/test/rpc/ServerInfo_test.cpp | 110 - src/test/rpc/Status_test.cpp | 215 - src/test/rpc/Subscribe_test.cpp | 414 - src/test/server/ServerStatus_test.cpp | 552 - src/test/server/Server_test.cpp | 381 - src/test/shamap/FetchPack_test.cpp | 169 - src/test/shamap/SHAMapSync_test.cpp | 205 - src/test/shamap/SHAMap_test.cpp | 328 - src/test/shamap/common.h | 126 - src/test/unity/app_test_unity.cpp | 48 - src/test/unity/basics_test_unity.cpp | 31 - src/test/unity/beast_test_unity.cpp | 36 - src/test/unity/conditions_test_unity.cpp | 23 - src/test/unity/core_test_unity.cpp | 26 - src/test/unity/json_test_unity.cpp | 24 - src/test/unity/ledger_test_unity.cpp | 27 - src/test/unity/nodestore_test_unity.cpp | 26 - src/test/unity/overlay_test_unity.cpp | 24 - src/test/unity/peerfinder_test_unity.cpp | 22 - src/test/unity/protocol_test_unity.cpp | 35 - src/test/unity/resource_test_unity.cpp | 21 - src/test/unity/rpc_test_unity.cpp | 39 - src/test/unity/server_test_unity.cpp | 22 - src/test/unity/shamap_test_unity.cpp | 23 - src/test/unity/support_unity.cpp | 54 - {src/beast/test => test}/CMakeLists.txt | 3 + {src/beast/test => test}/Jamfile | 2 +- .../resume_context.cpp => test/config.cpp | 2 +- {src/beast/test => test}/core.cpp | 0 {src/beast/test => test}/core/CMakeLists.txt | 2 + .../test => test}/core/async_completion.cpp | 0 {src/beast/test => test}/core/base64.cpp | 0 .../beast/test => test}/core/bind_handler.cpp | 0 {src/beast/test => test}/core/buffer_cat.cpp | 0 .../test => test}/core/buffer_concepts.cpp | 0 {src/beast/test => test}/core/buffer_test.hpp | 0 .../test => test}/core/buffers_adapter.cpp | 0 {src/beast/test => test}/core/clamp.cpp | 0 .../test => test}/core/consuming_buffers.cpp | 0 .../test => test}/core/dynabuf_readstream.cpp | 0 .../core/empty_base_optimization.cpp | 0 {src/beast/test => test}/core/error.cpp | 0 .../test => test}/core/get_lowest_layer.cpp | 0 .../test => test}/core/handler_alloc.cpp | 0 .../test => test}/core/handler_concepts.cpp | 0 {src/beast/test => test}/core/handler_ptr.cpp | 0 .../test => test}/core/is_call_possible.cpp | 0 .../beast/test => test}/core/placeholders.cpp | 0 .../test => test}/core/prepare_buffer.cpp | 0 .../test => test}/core/prepare_buffers.cpp | 0 {src/beast/test => test}/core/sha1.cpp | 0 .../test => test}/core/static_streambuf.cpp | 0 .../test => test}/core/static_string.cpp | 0 .../test => test}/core/stream_concepts.cpp | 0 {src/beast/test => test}/core/streambuf.cpp | 0 {src/beast/test => test}/core/to_string.cpp | 0 .../test => test}/core/write_dynabuf.cpp | 0 {src/beast/test => test}/core/zlib.cpp | 0 {src/beast/test => test}/http.cpp | 0 {src/beast/test => test}/http/CMakeLists.txt | 5 +- .../test => test}/http/basic_dynabuf_body.cpp | 0 .../beast/test => test}/http/basic_fields.cpp | 0 .../test => test}/http/basic_parser_v1.cpp | 0 .../beast/test => test}/http/chunk_encode.cpp | 0 {src/beast/test => test}/http/concepts.cpp | 0 {src/beast/test => test}/http/empty_body.cpp | 0 {src/beast/test => test}/http/fail_parser.hpp | 0 {src/beast/test => test}/http/fields.cpp | 0 .../test => test}/http/header_parser_v1.cpp | 0 {src/beast/test => test}/http/message.cpp | 0 .../beast/test => test}/http/message_fuzz.hpp | 0 .../test => test}/http/nodejs-parser/AUTHORS | 0 .../http/nodejs-parser/LICENSE-MIT | 0 .../http/nodejs-parser/README.md | 0 .../http/nodejs-parser/http_parser.c | 0 .../http/nodejs-parser/http_parser.h | 0 .../test => test}/http/nodejs_parser.cpp | 0 .../test => test}/http/nodejs_parser.hpp | 0 {src/beast/test => test}/http/parse.cpp | 0 {src/beast/test => test}/http/parse_error.cpp | 0 .../beast/test => test}/http/parser_bench.cpp | 0 {src/beast/test => test}/http/parser_v1.cpp | 0 {src/beast/test => test}/http/read.cpp | 53 +- {src/beast/test => test}/http/reason.cpp | 0 {src/beast/test => test}/http/rfc7230.cpp | 0 .../test => test}/http/streambuf_body.cpp | 0 {src/beast/test => test}/http/string_body.cpp | 0 {src/beast/test => test}/http/write.cpp | 92 +- {src/beast/test => test}/version.cpp | 0 {src/beast/test => test}/websocket.cpp | 0 .../test => test}/websocket/CMakeLists.txt | 2 + {src/beast/test => test}/websocket/error.cpp | 0 {src/beast/test => test}/websocket/frame.cpp | 0 {src/beast/test => test}/websocket/mask.cpp | 0 {src/beast/test => test}/websocket/option.cpp | 0 .../beast/test => test}/websocket/rfc6455.cpp | 0 {src/beast/test => test}/websocket/stream.cpp | 81 +- .../test => test}/websocket/teardown.cpp | 0 .../test => test}/websocket/utf8_checker.cpp | 0 .../websocket/websocket_async_echo_server.hpp | 0 .../websocket/websocket_sync_echo_server.hpp | 0 {src/beast/test => test}/zlib.cpp | 0 {src/beast/test => test}/zlib/CMakeLists.txt | 2 + .../test => test}/zlib/deflate_stream.cpp | 0 {src/beast/test => test}/zlib/error.cpp | 0 .../test => test}/zlib/inflate_stream.cpp | 0 .../zlib/zlib-1.2.8/CMakeLists.txt | 0 .../test => test}/zlib/zlib-1.2.8/ChangeLog | 0 {src/beast/test => test}/zlib/zlib-1.2.8/FAQ | 0 .../beast/test => test}/zlib/zlib-1.2.8/INDEX | 0 .../test => test}/zlib/zlib-1.2.8/Makefile | 0 .../test => test}/zlib/zlib-1.2.8/Makefile.in | 0 .../test => test}/zlib/zlib-1.2.8/README | 0 .../test => test}/zlib/zlib-1.2.8/adler32.c | 0 .../zlib/zlib-1.2.8/amiga/Makefile.pup | 0 .../zlib/zlib-1.2.8/amiga/Makefile.sas | 0 .../zlib/zlib-1.2.8/as400/bndsrc | 0 .../zlib/zlib-1.2.8/as400/compile.clp | 0 .../zlib/zlib-1.2.8/as400/readme.txt | 0 .../zlib/zlib-1.2.8/as400/zlib.inc | 0 .../test => test}/zlib/zlib-1.2.8/compress.c | 0 .../test => test}/zlib/zlib-1.2.8/configure | 0 .../zlib/zlib-1.2.8/contrib/README.contrib | 0 .../zlib-1.2.8/contrib/ada/buffer_demo.adb | 0 .../zlib/zlib-1.2.8/contrib/ada/mtest.adb | 0 .../zlib/zlib-1.2.8/contrib/ada/read.adb | 0 .../zlib/zlib-1.2.8/contrib/ada/readme.txt | 0 .../zlib/zlib-1.2.8/contrib/ada/test.adb | 0 .../zlib-1.2.8/contrib/ada/zlib-streams.adb | 0 .../zlib-1.2.8/contrib/ada/zlib-streams.ads | 0 .../zlib/zlib-1.2.8/contrib/ada/zlib-thin.adb | 0 .../zlib/zlib-1.2.8/contrib/ada/zlib-thin.ads | 0 .../zlib/zlib-1.2.8/contrib/ada/zlib.adb | 0 .../zlib/zlib-1.2.8/contrib/ada/zlib.ads | 0 .../zlib/zlib-1.2.8/contrib/ada/zlib.gpr | 0 .../zlib-1.2.8/contrib/amd64/amd64-match.S | 0 .../zlib/zlib-1.2.8/contrib/asm686/README.686 | 0 .../zlib/zlib-1.2.8/contrib/asm686/match.S | 0 .../zlib/zlib-1.2.8/contrib/blast/Makefile | 0 .../zlib/zlib-1.2.8/contrib/blast/README | 0 .../zlib/zlib-1.2.8/contrib/blast/blast.c | 0 .../zlib/zlib-1.2.8/contrib/blast/blast.h | 0 .../zlib/zlib-1.2.8/contrib/blast/test.pk | Bin .../zlib/zlib-1.2.8/contrib/blast/test.txt | 0 .../zlib/zlib-1.2.8/contrib/delphi/ZLib.pas | 0 .../zlib-1.2.8/contrib/delphi/ZLibConst.pas | 0 .../zlib/zlib-1.2.8/contrib/delphi/readme.txt | 0 .../zlib-1.2.8/contrib/delphi/zlibd32.mak | 0 .../zlib-1.2.8/contrib/dotzlib/DotZLib.build | 0 .../zlib-1.2.8/contrib/dotzlib/DotZLib.chm | Bin .../zlib-1.2.8/contrib/dotzlib/DotZLib.sln | 0 .../contrib/dotzlib/DotZLib/AssemblyInfo.cs | 0 .../contrib/dotzlib/DotZLib/ChecksumImpl.cs | 0 .../contrib/dotzlib/DotZLib/CircularBuffer.cs | 0 .../contrib/dotzlib/DotZLib/CodecBase.cs | 0 .../contrib/dotzlib/DotZLib/Deflater.cs | 0 .../contrib/dotzlib/DotZLib/DotZLib.cs | 0 .../contrib/dotzlib/DotZLib/DotZLib.csproj | 0 .../contrib/dotzlib/DotZLib/GZipStream.cs | 0 .../contrib/dotzlib/DotZLib/Inflater.cs | 0 .../contrib/dotzlib/DotZLib/UnitTests.cs | 0 .../contrib/dotzlib/LICENSE_1_0.txt | 0 .../zlib-1.2.8/contrib/dotzlib/readme.txt | 0 .../zlib-1.2.8/contrib/gcc_gvmat64/gvmat64.S | 0 .../zlib/zlib-1.2.8/contrib/infback9/README | 0 .../zlib-1.2.8/contrib/infback9/infback9.c | 0 .../zlib-1.2.8/contrib/infback9/infback9.h | 0 .../zlib-1.2.8/contrib/infback9/inffix9.h | 0 .../zlib-1.2.8/contrib/infback9/inflate9.h | 0 .../zlib-1.2.8/contrib/infback9/inftree9.c | 0 .../zlib-1.2.8/contrib/infback9/inftree9.h | 0 .../zlib-1.2.8/contrib/inflate86/inffas86.c | 0 .../zlib-1.2.8/contrib/inflate86/inffast.S | 0 .../zlib/zlib-1.2.8/contrib/iostream/test.cpp | 0 .../zlib-1.2.8/contrib/iostream/zfstream.cpp | 0 .../zlib-1.2.8/contrib/iostream/zfstream.h | 0 .../zlib-1.2.8/contrib/iostream2/zstream.h | 0 .../contrib/iostream2/zstream_test.cpp | 0 .../zlib/zlib-1.2.8/contrib/iostream3/README | 0 .../zlib/zlib-1.2.8/contrib/iostream3/TODO | 0 .../zlib/zlib-1.2.8/contrib/iostream3/test.cc | 0 .../zlib-1.2.8/contrib/iostream3/zfstream.cc | 0 .../zlib-1.2.8/contrib/iostream3/zfstream.h | 0 .../zlib-1.2.8/contrib/masmx64/bld_ml64.bat | 0 .../zlib-1.2.8/contrib/masmx64/gvmat64.asm | 0 .../zlib-1.2.8/contrib/masmx64/inffas8664.c | 0 .../zlib-1.2.8/contrib/masmx64/inffasx64.asm | 0 .../zlib-1.2.8/contrib/masmx64/readme.txt | 0 .../zlib-1.2.8/contrib/masmx86/bld_ml32.bat | 0 .../zlib-1.2.8/contrib/masmx86/inffas32.asm | 0 .../zlib-1.2.8/contrib/masmx86/match686.asm | 0 .../zlib-1.2.8/contrib/masmx86/readme.txt | 0 .../zlib/zlib-1.2.8/contrib/minizip/Makefile | 0 .../zlib-1.2.8/contrib/minizip/Makefile.am | 0 .../contrib/minizip/MiniZip64_Changes.txt | 0 .../contrib/minizip/MiniZip64_info.txt | 0 .../zlib-1.2.8/contrib/minizip/configure.ac | 0 .../zlib/zlib-1.2.8/contrib/minizip/crypt.h | 0 .../zlib/zlib-1.2.8/contrib/minizip/ioapi.c | 0 .../zlib/zlib-1.2.8/contrib/minizip/ioapi.h | 0 .../zlib/zlib-1.2.8/contrib/minizip/iowin32.c | 0 .../zlib/zlib-1.2.8/contrib/minizip/iowin32.h | 0 .../zlib-1.2.8/contrib/minizip/make_vms.com | 0 .../zlib/zlib-1.2.8/contrib/minizip/miniunz.c | 0 .../zlib-1.2.8/contrib/minizip/miniunzip.1 | 0 .../zlib/zlib-1.2.8/contrib/minizip/minizip.1 | 0 .../zlib/zlib-1.2.8/contrib/minizip/minizip.c | 0 .../zlib-1.2.8/contrib/minizip/minizip.pc.in | 0 .../zlib/zlib-1.2.8/contrib/minizip/mztools.c | 0 .../zlib/zlib-1.2.8/contrib/minizip/mztools.h | 0 .../zlib/zlib-1.2.8/contrib/minizip/unzip.c | 0 .../zlib/zlib-1.2.8/contrib/minizip/unzip.h | 0 .../zlib/zlib-1.2.8/contrib/minizip/zip.c | 0 .../zlib/zlib-1.2.8/contrib/minizip/zip.h | 0 .../zlib-1.2.8/contrib/pascal/example.pas | 0 .../zlib/zlib-1.2.8/contrib/pascal/readme.txt | 0 .../zlib-1.2.8/contrib/pascal/zlibd32.mak | 0 .../zlib-1.2.8/contrib/pascal/zlibpas.pas | 0 .../zlib/zlib-1.2.8/contrib/puff/Makefile | 0 .../zlib/zlib-1.2.8/contrib/puff/README | 0 .../zlib/zlib-1.2.8/contrib/puff/puff.c | 0 .../zlib/zlib-1.2.8/contrib/puff/puff.h | 0 .../zlib/zlib-1.2.8/contrib/puff/pufftest.c | 0 .../zlib/zlib-1.2.8/contrib/puff/zeros.raw | Bin .../zlib-1.2.8/contrib/testzlib/testzlib.c | 0 .../zlib-1.2.8/contrib/testzlib/testzlib.txt | 0 .../zlib/zlib-1.2.8/contrib/untgz/Makefile | 0 .../zlib-1.2.8/contrib/untgz/Makefile.msc | 0 .../zlib/zlib-1.2.8/contrib/untgz/untgz.c | 0 .../zlib-1.2.8/contrib/vstudio/readme.txt | 0 .../contrib/vstudio/vc10/miniunz.vcxproj | 0 .../vstudio/vc10/miniunz.vcxproj.filters | 0 .../contrib/vstudio/vc10/minizip.vcxproj | 0 .../vstudio/vc10/minizip.vcxproj.filters | 0 .../contrib/vstudio/vc10/testzlib.vcxproj | 0 .../vstudio/vc10/testzlib.vcxproj.filters | 0 .../contrib/vstudio/vc10/testzlibdll.vcxproj | 0 .../vstudio/vc10/testzlibdll.vcxproj.filters | 0 .../zlib-1.2.8/contrib/vstudio/vc10/zlib.rc | 0 .../contrib/vstudio/vc10/zlibstat.vcxproj | 0 .../vstudio/vc10/zlibstat.vcxproj.filters | 0 .../contrib/vstudio/vc10/zlibvc.def | 0 .../contrib/vstudio/vc10/zlibvc.sln | 0 .../contrib/vstudio/vc10/zlibvc.vcxproj | 0 .../vstudio/vc10/zlibvc.vcxproj.filters | 0 .../contrib/vstudio/vc11/miniunz.vcxproj | 0 .../contrib/vstudio/vc11/minizip.vcxproj | 0 .../contrib/vstudio/vc11/testzlib.vcxproj | 0 .../contrib/vstudio/vc11/testzlibdll.vcxproj | 0 .../zlib-1.2.8/contrib/vstudio/vc11/zlib.rc | 0 .../contrib/vstudio/vc11/zlibstat.vcxproj | 0 .../contrib/vstudio/vc11/zlibvc.def | 0 .../contrib/vstudio/vc11/zlibvc.sln | 0 .../contrib/vstudio/vc11/zlibvc.vcxproj | 0 .../contrib/vstudio/vc9/miniunz.vcproj | 0 .../contrib/vstudio/vc9/minizip.vcproj | 0 .../contrib/vstudio/vc9/testzlib.vcproj | 0 .../contrib/vstudio/vc9/testzlibdll.vcproj | 0 .../zlib-1.2.8/contrib/vstudio/vc9/zlib.rc | 0 .../contrib/vstudio/vc9/zlibstat.vcproj | 0 .../zlib-1.2.8/contrib/vstudio/vc9/zlibvc.def | 0 .../zlib-1.2.8/contrib/vstudio/vc9/zlibvc.sln | 0 .../contrib/vstudio/vc9/zlibvc.vcproj | 0 .../test => test}/zlib/zlib-1.2.8/crc32.c | 0 .../test => test}/zlib/zlib-1.2.8/crc32.h | 0 .../test => test}/zlib/zlib-1.2.8/deflate.c | 0 .../test => test}/zlib/zlib-1.2.8/deflate.h | 0 .../zlib/zlib-1.2.8/doc/algorithm.txt | 0 .../zlib/zlib-1.2.8/doc/rfc1950.txt | 0 .../zlib/zlib-1.2.8/doc/rfc1951.txt | 0 .../zlib/zlib-1.2.8/doc/rfc1952.txt | 0 .../zlib/zlib-1.2.8/doc/txtvsbin.txt | 0 .../zlib/zlib-1.2.8/examples/README.examples | 0 .../zlib/zlib-1.2.8/examples/enough.c | 0 .../zlib/zlib-1.2.8/examples/fitblk.c | 0 .../zlib/zlib-1.2.8/examples/gun.c | 0 .../zlib/zlib-1.2.8/examples/gzappend.c | 0 .../zlib/zlib-1.2.8/examples/gzjoin.c | 0 .../zlib/zlib-1.2.8/examples/gzlog.c | 0 .../zlib/zlib-1.2.8/examples/gzlog.h | 0 .../zlib/zlib-1.2.8/examples/zlib_how.html | 0 .../zlib/zlib-1.2.8/examples/zpipe.c | 0 .../zlib/zlib-1.2.8/examples/zran.c | 0 .../test => test}/zlib/zlib-1.2.8/gzclose.c | 0 .../test => test}/zlib/zlib-1.2.8/gzguts.h | 0 .../test => test}/zlib/zlib-1.2.8/gzlib.c | 0 .../test => test}/zlib/zlib-1.2.8/gzread.c | 0 .../test => test}/zlib/zlib-1.2.8/gzwrite.c | 0 .../test => test}/zlib/zlib-1.2.8/infback.c | 0 .../test => test}/zlib/zlib-1.2.8/inffast.c | 0 .../test => test}/zlib/zlib-1.2.8/inffast.h | 0 .../test => test}/zlib/zlib-1.2.8/inffixed.h | 0 .../test => test}/zlib/zlib-1.2.8/inflate.c | 0 .../test => test}/zlib/zlib-1.2.8/inflate.h | 0 .../test => test}/zlib/zlib-1.2.8/inftrees.c | 0 .../test => test}/zlib/zlib-1.2.8/inftrees.h | 0 .../zlib/zlib-1.2.8/make_vms.com | 0 .../zlib/zlib-1.2.8/msdos/Makefile.bor | 0 .../zlib/zlib-1.2.8/msdos/Makefile.dj2 | 0 .../zlib/zlib-1.2.8/msdos/Makefile.emx | 0 .../zlib/zlib-1.2.8/msdos/Makefile.msc | 0 .../zlib/zlib-1.2.8/msdos/Makefile.tc | 0 .../zlib/zlib-1.2.8/nintendods/Makefile | 0 .../zlib/zlib-1.2.8/nintendods/README | 0 .../zlib/zlib-1.2.8/old/Makefile.emx | 0 .../zlib/zlib-1.2.8/old/Makefile.riscos | 0 .../test => test}/zlib/zlib-1.2.8/old/README | 0 .../zlib/zlib-1.2.8/old/descrip.mms | 0 .../zlib/zlib-1.2.8/old/os2/Makefile.os2 | 0 .../zlib/zlib-1.2.8/old/os2/zlib.def | 0 .../zlib/zlib-1.2.8/old/visual-basic.txt | 0 .../zlib/zlib-1.2.8/qnx/package.qpg | 0 .../zlib/zlib-1.2.8/test/example.c | 0 .../zlib/zlib-1.2.8/test/infcover.c | 0 .../zlib/zlib-1.2.8/test/minigzip.c | 0 .../zlib/zlib-1.2.8/treebuild.xml | 0 .../test => test}/zlib/zlib-1.2.8/trees.c | 0 .../test => test}/zlib/zlib-1.2.8/trees.h | 0 .../test => test}/zlib/zlib-1.2.8/uncompr.c | 0 .../zlib/zlib-1.2.8/watcom/watcom_f.mak | 0 .../zlib/zlib-1.2.8/watcom/watcom_l.mak | 0 .../zlib/zlib-1.2.8/win32/DLL_FAQ.txt | 0 .../zlib/zlib-1.2.8/win32/Makefile.bor | 0 .../zlib/zlib-1.2.8/win32/Makefile.gcc | 0 .../zlib/zlib-1.2.8/win32/Makefile.msc | 0 .../zlib/zlib-1.2.8/win32/README-WIN32.txt | 0 .../zlib/zlib-1.2.8/win32/VisualC.txt | 0 .../zlib/zlib-1.2.8/win32/zlib.def | 0 .../zlib/zlib-1.2.8/win32/zlib1.rc | 0 .../test => test}/zlib/zlib-1.2.8/zconf.h | 0 .../zlib/zlib-1.2.8/zconf.h.cmakein | 0 .../test => test}/zlib/zlib-1.2.8/zconf.h.in | 0 .../test => test}/zlib/zlib-1.2.8/zlib.3 | 0 .../test => test}/zlib/zlib-1.2.8/zlib.3.pdf | Bin .../test => test}/zlib/zlib-1.2.8/zlib.h | 0 .../test => test}/zlib/zlib-1.2.8/zlib.map | 0 .../zlib/zlib-1.2.8/zlib.pc.cmakein | 0 .../test => test}/zlib/zlib-1.2.8/zlib.pc.in | 0 .../test => test}/zlib/zlib-1.2.8/zlib2ansi | 0 .../test => test}/zlib/zlib-1.2.8/zutil.c | 0 .../test => test}/zlib/zlib-1.2.8/zutil.h | 0 {src/beast/test => test}/zlib/ztest.hpp | 0 3303 files changed, 940 insertions(+), 952468 deletions(-) delete mode 100644 .gitmodules delete mode 100644 Builds/ArchLinux/PKGBUILD delete mode 100644 Builds/CMake/CMakeFuncs.cmake delete mode 100644 Builds/Docker/Dockerfile delete mode 100644 Builds/Docker/Dockerfile-testnet delete mode 100755 Builds/Docker/build-ci.sh delete mode 100755 Builds/Docker/push-to-hub.sh delete mode 100644 Builds/Eclipse/README.md delete mode 100644 Builds/Eclipse/debug.png delete mode 100644 Builds/Eclipse/scons.png delete mode 100755 Builds/Fedora/install_rippled_depends_fedora.sh delete mode 100644 Builds/QtCreator/.gitignore delete mode 100644 Builds/QtCreator/rippled.pro delete mode 100755 Builds/Test.py delete mode 100755 Builds/Ubuntu/build_clang_libs.sh delete mode 100755 Builds/Ubuntu/install_boost.sh delete mode 100755 Builds/Ubuntu/install_rippled_depends_ubuntu.sh delete mode 100644 Builds/VisualStudio2015/.gitattributes delete mode 100644 Builds/VisualStudio2015/README.md delete mode 100644 Builds/VisualStudio2015/RippleD.vcxproj delete mode 100644 Builds/VisualStudio2015/RippleD.vcxproj.filters delete mode 100644 Builds/VisualStudio2015/images/NoDebugHeapPropPage.png delete mode 100644 Builds/VisualStudio2015/images/VS2015x64IncludeDirs.png delete mode 100644 Builds/VisualStudio2015/images/VS2015x64LibraryDirs.png delete mode 100644 Builds/VisualStudio2015/images/VS2015x64Properties.png delete mode 100644 Builds/VisualStudio2015/images/VSCommandArgsPropPage.png delete mode 100644 Builds/VisualStudio2015/ripple.sln delete mode 100644 Builds/XCode/README.md delete mode 100644 Builds/build_all.sh delete mode 100644 Builds/travis/clang.boost.patch delete mode 100644 Builds/travis/static_error.boost.patch rename src/beast/CHANGELOG.md => CHANGELOG.md (91%) delete mode 100644 LICENSE rename src/beast/LICENSE_1_0.txt => LICENSE_1_0.txt (100%) delete mode 100644 RELEASENOTES.md delete mode 100644 SConstruct rename src/beast/TODO.txt => TODO.txt (100%) delete mode 100644 appveyor.yml delete mode 120000 bin/LT delete mode 100755 bin/browser.js delete mode 100755 bin/ci/ubuntu/build-and-test.sh delete mode 100755 bin/ci/ubuntu/install-dependencies.sh delete mode 100644 bin/ci/windows/install-dependencies.bat delete mode 100644 bin/debug_local_sign.js delete mode 100755 bin/email_hash.js delete mode 100755 bin/flash_policy.js delete mode 100644 bin/getInfoRippled.sh delete mode 100755 bin/hexify.js delete mode 100755 bin/jsonrpc_request.js delete mode 100755 bin/jsonrpc_server.js delete mode 120000 bin/manifest delete mode 100755 bin/python/LedgerTool.py delete mode 100755 bin/python/Manifest.py delete mode 100644 bin/python/README.md delete mode 100644 bin/python/decorator.py delete mode 100644 bin/python/ecdsa/__init__.py delete mode 100644 bin/python/ecdsa/_version.py delete mode 100644 bin/python/ecdsa/curves.py delete mode 100644 bin/python/ecdsa/der.py delete mode 100644 bin/python/ecdsa/ecdsa.py delete mode 100644 bin/python/ecdsa/ellipticcurve.py delete mode 100644 bin/python/ecdsa/keys.py delete mode 100644 bin/python/ecdsa/numbertheory.py delete mode 100644 bin/python/ecdsa/rfc6979.py delete mode 100644 bin/python/ecdsa/six.py delete mode 100644 bin/python/ecdsa/test_pyecdsa.py delete mode 100644 bin/python/ecdsa/util.py delete mode 100644 bin/python/ed25519.py delete mode 100644 bin/python/jsonpath_rw/__init__.py delete mode 100644 bin/python/jsonpath_rw/jsonpath.py delete mode 100644 bin/python/jsonpath_rw/lexer.py delete mode 100644 bin/python/jsonpath_rw/parser.py delete mode 100644 bin/python/ply/__init__.py delete mode 100644 bin/python/ply/cpp.py delete mode 100644 bin/python/ply/ctokens.py delete mode 100644 bin/python/ply/lex.py delete mode 100644 bin/python/ply/yacc.py delete mode 100644 bin/python/ripple/__init__.py delete mode 100644 bin/python/ripple/ledger/Args.py delete mode 100644 bin/python/ripple/ledger/DatabaseReader.py delete mode 100644 bin/python/ripple/ledger/LedgerNumber.py delete mode 100644 bin/python/ripple/ledger/RippledReader.py delete mode 100644 bin/python/ripple/ledger/SField.py delete mode 100644 bin/python/ripple/ledger/SearchLedgers.py delete mode 100644 bin/python/ripple/ledger/Server.py delete mode 100644 bin/python/ripple/ledger/ServerReader.py delete mode 100644 bin/python/ripple/ledger/__init__.py delete mode 100644 bin/python/ripple/ledger/commands/Cache.py delete mode 100644 bin/python/ripple/ledger/commands/Info.py delete mode 100644 bin/python/ripple/ledger/commands/Print.py delete mode 100644 bin/python/ripple/ledger/commands/__init__.py delete mode 100644 bin/python/ripple/ledger/conditions/__init__.py delete mode 100644 bin/python/ripple/ledger/displays/__init__.py delete mode 100644 bin/python/ripple/util/Base58.py delete mode 100644 bin/python/ripple/util/Cache.py delete mode 100644 bin/python/ripple/util/CommandList.py delete mode 100644 bin/python/ripple/util/ConfigFile.py delete mode 100644 bin/python/ripple/util/Database.py delete mode 100644 bin/python/ripple/util/Decimal.py delete mode 100644 bin/python/ripple/util/Dict.py delete mode 100644 bin/python/ripple/util/File.py delete mode 100644 bin/python/ripple/util/FileCache.py delete mode 100644 bin/python/ripple/util/Function.py delete mode 100644 bin/python/ripple/util/Log.py delete mode 100644 bin/python/ripple/util/PrettyPrint.py delete mode 100644 bin/python/ripple/util/Range.py delete mode 100644 bin/python/ripple/util/Search.py delete mode 100644 bin/python/ripple/util/Sign.py delete mode 100644 bin/python/ripple/util/Time.py delete mode 100755 bin/python/ripple/util/ValidatorManifestTest.py delete mode 100644 bin/python/ripple/util/__init__.py delete mode 100644 bin/python/ripple/util/test_Base58.py delete mode 100644 bin/python/ripple/util/test_Cache.py delete mode 100644 bin/python/ripple/util/test_ConfigFile.py delete mode 100644 bin/python/ripple/util/test_Decimal.py delete mode 100644 bin/python/ripple/util/test_Dict.py delete mode 100644 bin/python/ripple/util/test_Function.py delete mode 100644 bin/python/ripple/util/test_PrettyPrint.py delete mode 100644 bin/python/ripple/util/test_Range.py delete mode 100644 bin/python/ripple/util/test_Search.py delete mode 100644 bin/python/ripple/util/test_Sign.py delete mode 100644 bin/python/six.py delete mode 100755 bin/rlint.js delete mode 100644 bin/sh/install-boost.sh delete mode 100644 bin/stop-test.js delete mode 100644 bin/update_binformat.js delete mode 100644 circle.yml rename {src/beast/doc => doc}/.gitignore (100%) delete mode 100644 doc/CHANGELOG delete mode 100644 doc/CheatSheet.md delete mode 100644 doc/CodingStyle.md delete mode 100644 doc/Docker.md rename {src/beast/doc => doc}/Dockerfile (100%) delete mode 100644 doc/Doxyfile delete mode 100644 doc/HeapProfiling.md rename {src/beast/doc => doc}/Jamfile.v2 (100%) delete mode 100644 doc/LogoForDocumentation.png delete mode 100644 doc/NodeStoreRefactoringCaseStudy.pdf rename {src/beast/doc => doc}/README.md (100%) rename {docs => doc}/boostbook.dtd (100%) rename {src/beast/doc => doc}/design.qbk (100%) rename {src/beast/doc => doc}/examples.qbk (100%) rename {src/beast/doc => doc}/http.qbk (100%) rename {src/beast/doc => doc}/images/CppCon2016.pdf (100%) rename {src/beast/doc => doc}/images/CppCon2016.png (100%) rename {src/beast/doc => doc}/images/beast.png (100%) rename {src/beast/doc => doc}/images/beast.psd (100%) rename {src/beast/doc => doc}/images/body.png (100%) rename {src/beast/doc => doc}/images/body.psd (100%) rename {src/beast/doc => doc}/images/message.png (100%) rename {src/beast/doc => doc}/images/message.psd (100%) rename {src/beast/doc => doc}/images/readme.png (100%) rename {src/beast/doc => doc}/index.xml (100%) rename {src/beast/doc => doc}/makeqbk.sh (100%) delete mode 100644 doc/manifest-tool-guide.md rename {src/beast/doc => doc}/master.qbk (100%) rename {src/beast/doc => doc}/overview.qbk (100%) rename {src/beast/doc => doc}/quickref.xml (99%) rename {src/beast/doc => doc}/reference.xsl (100%) delete mode 100644 doc/ripple-example.txt delete mode 100644 doc/rippled-example.cfg delete mode 100644 doc/rippled-example.service delete mode 100644 doc/rippled.init rename {src/beast/doc => doc}/source.dox (100%) rename {src/beast/doc => doc}/types/Body.qbk (100%) rename {src/beast/doc => doc}/types/BufferSequence.qbk (100%) rename {src/beast/doc => doc}/types/DynamicBuffer.qbk (100%) rename {src/beast/doc => doc}/types/Field.qbk (100%) rename {src/beast/doc => doc}/types/FieldSequence.qbk (100%) rename {src/beast/doc => doc}/types/Parser.qbk (100%) rename {src/beast/doc => doc}/types/Reader.qbk (100%) rename {src/beast/doc => doc}/types/Streams.qbk (100%) rename {src/beast/doc => doc}/types/Writer.qbk (78%) delete mode 100644 doc/validators-example.txt rename {src/beast/doc => doc}/websocket.qbk (100%) delete mode 100644 docs/.gitignore delete mode 100644 docs/Dockerfile delete mode 100644 docs/Jamfile.v2 delete mode 100644 docs/README.md delete mode 160000 docs/docca delete mode 100644 docs/index.xml delete mode 100644 docs/main.qbk delete mode 100755 docs/makeqbk.sh delete mode 100644 docs/quickref.xml delete mode 100644 docs/reference.xsl delete mode 100644 docs/source.dox rename {src/beast/examples => examples}/CMakeLists.txt (79%) rename {src/beast/examples => examples}/Jamfile.v2 (100%) rename {src/beast/examples => examples}/file_body.hpp (73%) rename {src/beast/examples => examples}/http_async_server.hpp (100%) rename {src/beast/examples => examples}/http_crawl.cpp (100%) rename {src/beast/examples => examples}/http_example.cpp (100%) rename {src/beast/examples => examples}/http_server.cpp (100%) rename {src/beast/examples => examples}/http_sync_server.hpp (100%) rename {src/beast/examples => examples}/mime_type.hpp (100%) rename {src/beast/examples => examples}/ssl/CMakeLists.txt (100%) rename {src/beast/examples => examples}/ssl/Jamfile.v2 (100%) rename {src/beast/examples => examples}/ssl/http_ssl_example.cpp (100%) rename {src/beast/examples => examples}/ssl/websocket_ssl_example.cpp (100%) rename {src/beast/examples => examples}/urls_large_data.cpp (100%) rename {src/beast/examples => examples}/urls_large_data.hpp (100%) rename {src/beast/examples => examples}/websocket_async_echo_server.hpp (100%) rename {src/beast/examples => examples}/websocket_echo.cpp (100%) rename {src/beast/examples => examples}/websocket_example.cpp (100%) rename {src/beast/examples => examples}/websocket_sync_echo_server.hpp (100%) rename {src/beast/extras => extras}/README.md (100%) rename {src/beast/extras => extras}/beast/doc_debug.hpp (100%) rename {src/beast/extras => extras}/beast/test/fail_counter.hpp (100%) rename {src/beast/extras => extras}/beast/test/fail_stream.hpp (100%) rename {src/beast/extras => extras}/beast/test/sig_wait.hpp (100%) rename {src/beast/extras => extras}/beast/test/string_istream.hpp (100%) rename {src/beast/extras => extras}/beast/test/string_ostream.hpp (100%) rename {src/beast/extras => extras}/beast/test/yield_to.hpp (100%) rename {src/beast/extras => extras}/beast/unit_test/amount.hpp (100%) rename {src/beast/extras => extras}/beast/unit_test/detail/const_container.hpp (100%) rename {src/beast/extras => extras}/beast/unit_test/dstream.hpp (100%) rename {src/beast/extras => extras}/beast/unit_test/global_suites.hpp (100%) rename {src/beast/extras => extras}/beast/unit_test/main.cpp (100%) rename {src/beast/extras => extras}/beast/unit_test/match.hpp (100%) rename {src/beast/extras => extras}/beast/unit_test/recorder.hpp (100%) rename {src/beast/extras => extras}/beast/unit_test/reporter.hpp (100%) rename {src/beast/extras => extras}/beast/unit_test/results.hpp (100%) rename {src/beast/extras => extras}/beast/unit_test/runner.hpp (100%) rename {src/beast/extras => extras}/beast/unit_test/suite.hpp (100%) rename {src/beast/extras => extras}/beast/unit_test/suite_info.hpp (100%) rename {src/beast/extras => extras}/beast/unit_test/suite_list.hpp (100%) rename {src/beast/extras => extras}/beast/unit_test/thread.hpp (100%) delete mode 100644 images/flow1.png delete mode 100644 images/flow2.png delete mode 100644 images/ripple.png create mode 100644 include/beast/config.hpp rename {src/beast/include => include}/beast/core.hpp (97%) rename {src/beast/include => include}/beast/core/async_completion.hpp (99%) rename {src/beast/include => include}/beast/core/bind_handler.hpp (98%) rename {src/beast/include => include}/beast/core/buffer_cat.hpp (98%) rename {src/beast/include => include}/beast/core/buffer_concepts.hpp (98%) rename {src/beast/include => include}/beast/core/buffers_adapter.hpp (99%) rename {src/beast/include => include}/beast/core/consuming_buffers.hpp (99%) rename {src/beast/include => include}/beast/core/detail/base64.hpp (100%) rename {src/beast/include => include}/beast/core/detail/bind_handler.hpp (100%) rename {src/beast/include => include}/beast/core/detail/buffer_cat.hpp (100%) rename {src/beast/include => include}/beast/core/detail/buffer_concepts.hpp (100%) rename {src/beast/include => include}/beast/core/detail/ci_char_traits.hpp (100%) rename {src/beast/include => include}/beast/core/detail/clamp.hpp (100%) rename {src/beast/include => include}/beast/core/detail/empty_base_optimization.hpp (100%) rename {src/beast/include => include}/beast/core/detail/get_lowest_layer.hpp (100%) rename {src/beast/include => include}/beast/core/detail/integer_sequence.hpp (100%) rename {src/beast/include => include}/beast/core/detail/is_call_possible.hpp (100%) rename {src/beast/include => include}/beast/core/detail/prepare_buffers.hpp (100%) rename {src/beast/include => include}/beast/core/detail/sha1.hpp (100%) rename {src/beast/include => include}/beast/core/detail/stream_concepts.hpp (100%) rename {src/beast/include => include}/beast/core/detail/sync_ostream.hpp (100%) rename {src/beast/include => include}/beast/core/detail/type_traits.hpp (100%) rename {src/beast/include => include}/beast/core/detail/write_dynabuf.hpp (100%) rename {src/beast/include => include}/beast/core/dynabuf_readstream.hpp (98%) rename {src/beast/include => include}/beast/core/error.hpp (81%) rename {src/beast/include => include}/beast/core/handler_alloc.hpp (99%) rename {src/beast/include => include}/beast/core/handler_concepts.hpp (96%) rename {src/beast/include => include}/beast/core/handler_helpers.hpp (98%) rename {src/beast/include => include}/beast/core/handler_ptr.hpp (99%) rename {src/beast/include => include}/beast/core/impl/buffers_adapter.ipp (100%) rename {src/beast/include => include}/beast/core/impl/consuming_buffers.ipp (100%) rename {src/beast/include => include}/beast/core/impl/dynabuf_readstream.ipp (100%) rename {src/beast/include => include}/beast/core/impl/handler_ptr.ipp (100%) rename {src/beast/include => include}/beast/core/impl/static_streambuf.ipp (100%) rename {src/beast/include => include}/beast/core/impl/streambuf.ipp (100%) rename {src/beast/include => include}/beast/core/placeholders.hpp (96%) rename {src/beast/include => include}/beast/core/prepare_buffer.hpp (98%) rename {src/beast/include => include}/beast/core/prepare_buffers.hpp (98%) rename {src/beast/include => include}/beast/core/static_streambuf.hpp (99%) rename {src/beast/include => include}/beast/core/static_string.hpp (99%) rename {src/beast/include => include}/beast/core/stream_concepts.hpp (98%) rename {src/beast/include => include}/beast/core/streambuf.hpp (99%) rename {src/beast/include => include}/beast/core/to_string.hpp (98%) rename {src/beast/include => include}/beast/core/write_dynabuf.hpp (98%) rename {src/beast/include => include}/beast/http.hpp (95%) rename {src/beast/include => include}/beast/http/basic_dynabuf_body.hpp (91%) rename {src/beast/include => include}/beast/http/basic_fields.hpp (99%) rename {src/beast/include => include}/beast/http/basic_parser_v1.hpp (99%) rename {src/beast/include => include}/beast/http/chunk_encode.hpp (98%) rename {src/beast/include => include}/beast/http/concepts.hpp (82%) rename {src/beast/include => include}/beast/http/detail/basic_fields.hpp (100%) rename {src/beast/include => include}/beast/http/detail/basic_parser_v1.hpp (100%) rename {src/beast/include => include}/beast/http/detail/chunk_encode.hpp (100%) rename {src/beast/include => include}/beast/http/detail/rfc7230.hpp (100%) rename {src/beast/include => include}/beast/http/empty_body.hpp (88%) rename {src/beast/include => include}/beast/http/fields.hpp (94%) rename {src/beast/include => include}/beast/http/header_parser_v1.hpp (99%) rename {src/beast/include => include}/beast/http/impl/basic_fields.ipp (100%) rename {src/beast/include => include}/beast/http/impl/basic_parser_v1.ipp (100%) rename {src/beast/include => include}/beast/http/impl/message.ipp (100%) rename {src/beast/include => include}/beast/http/impl/parse.ipp (100%) rename {src/beast/include => include}/beast/http/impl/parse_error.ipp (100%) rename {src/beast/include => include}/beast/http/impl/read.ipp (100%) rename {src/beast/include => include}/beast/http/impl/rfc7230.ipp (100%) rename {src/beast/include => include}/beast/http/impl/write.ipp (88%) rename {src/beast/include => include}/beast/http/message.hpp (99%) rename {src/beast/include => include}/beast/http/parse.hpp (99%) rename {src/beast/include => include}/beast/http/parse_error.hpp (96%) rename {src/beast/include => include}/beast/http/parser_v1.hpp (99%) rename {src/beast/include => include}/beast/http/read.hpp (99%) rename {src/beast/include => include}/beast/http/reason.hpp (98%) rename {src/beast/include => include}/beast/http/rfc7230.hpp (99%) rename {src/beast/include => include}/beast/http/streambuf_body.hpp (95%) rename {src/beast/include => include}/beast/http/string_body.hpp (91%) rename {src/beast/include => include}/beast/http/write.hpp (99%) rename {src/beast/include => include}/beast/version.hpp (87%) rename {src/beast/include => include}/beast/websocket.hpp (94%) rename {src/beast/include => include}/beast/websocket/detail/debug.hpp (100%) rename {src/beast/include => include}/beast/websocket/detail/decorator.hpp (100%) rename {src/beast/include => include}/beast/websocket/detail/endian.hpp (100%) rename {src/beast/include => include}/beast/websocket/detail/frame.hpp (100%) rename {src/beast/include => include}/beast/websocket/detail/hybi13.hpp (100%) rename {src/beast/include => include}/beast/websocket/detail/invokable.hpp (100%) rename {src/beast/include => include}/beast/websocket/detail/mask.hpp (100%) rename {src/beast/include => include}/beast/websocket/detail/pmd_extension.hpp (100%) rename {src/beast/include => include}/beast/websocket/detail/stream_base.hpp (100%) rename {src/beast/include => include}/beast/websocket/detail/utf8_checker.hpp (100%) rename {src/beast/include => include}/beast/websocket/error.hpp (97%) rename {src/beast/include => include}/beast/websocket/impl/accept.ipp (100%) rename {src/beast/include => include}/beast/websocket/impl/close.ipp (100%) rename {src/beast/include => include}/beast/websocket/impl/error.ipp (100%) rename {src/beast/include => include}/beast/websocket/impl/handshake.ipp (100%) rename {src/beast/include => include}/beast/websocket/impl/ping.ipp (100%) rename {src/beast/include => include}/beast/websocket/impl/read.ipp (99%) rename {src/beast/include => include}/beast/websocket/impl/ssl.ipp (100%) rename {src/beast/include => include}/beast/websocket/impl/stream.ipp (100%) rename {src/beast/include => include}/beast/websocket/impl/teardown.ipp (100%) rename {src/beast/include => include}/beast/websocket/impl/write.ipp (99%) rename {src/beast/include => include}/beast/websocket/option.hpp (99%) rename {src/beast/include => include}/beast/websocket/rfc6455.hpp (99%) rename {src/beast/include => include}/beast/websocket/ssl.hpp (98%) rename {src/beast/include => include}/beast/websocket/stream.hpp (99%) rename {src/beast/include => include}/beast/websocket/teardown.hpp (99%) rename {src/beast/include => include}/beast/zlib.hpp (92%) rename {src/beast/include => include}/beast/zlib/deflate_stream.hpp (99%) rename {src/beast/include => include}/beast/zlib/detail/bitstream.hpp (100%) rename {src/beast/include => include}/beast/zlib/detail/deflate_stream.hpp (100%) rename {src/beast/include => include}/beast/zlib/detail/inflate_stream.hpp (100%) rename {src/beast/include => include}/beast/zlib/detail/ranges.hpp (100%) rename {src/beast/include => include}/beast/zlib/detail/window.hpp (100%) rename {src/beast/include => include}/beast/zlib/error.hpp (99%) rename {src/beast/include => include}/beast/zlib/impl/error.ipp (100%) rename {src/beast/include => include}/beast/zlib/inflate_stream.hpp (99%) rename {src/beast/include => include}/beast/zlib/zlib.hpp (99%) rename src/beast/index.html => index.html (100%) rename {src/beast/scripts => scripts}/blacklist.supp (100%) rename {src/beast/scripts => scripts}/build-and-test.sh (100%) rename {src/beast/scripts => scripts}/fuzzingclient.json (100%) rename {src/beast/scripts => scripts}/install-boost.sh (100%) rename {src/beast/scripts => scripts}/install-dependencies.sh (100%) rename {src/beast/scripts => scripts}/install-valgrind.sh (100%) rename {src/beast/scripts => scripts}/parseautobahn.py (100%) rename {src/beast/scripts => scripts}/run-with-debugger.sh (100%) rename {src/beast/scripts => scripts}/run-with-gdb.sh (100%) rename {src/beast/scripts => scripts}/valgrind.supp (100%) delete mode 100644 src/BeastConfig.h delete mode 100644 src/README.md delete mode 100644 src/beast/.gitattributes delete mode 100644 src/beast/.gitignore delete mode 100644 src/beast/.travis.yml delete mode 100644 src/beast/CMakeLists.txt delete mode 100644 src/beast/Jamroot delete mode 100644 src/beast/README.md delete mode 100644 src/beast/doc/boostbook.dtd delete mode 100644 src/beast/include/beast/http/resume_context.hpp delete mode 100644 src/ed25519-donna/README.md delete mode 100644 src/ed25519-donna/curve25519-donna-32bit.h delete mode 100644 src/ed25519-donna/curve25519-donna-64bit.h delete mode 100644 src/ed25519-donna/curve25519-donna-helpers.h delete mode 100644 src/ed25519-donna/curve25519-donna-sse2.h delete mode 100644 src/ed25519-donna/ed25519-donna-32bit-sse2.h delete mode 100644 src/ed25519-donna/ed25519-donna-32bit-tables.h delete mode 100644 src/ed25519-donna/ed25519-donna-64bit-sse2.h delete mode 100644 src/ed25519-donna/ed25519-donna-64bit-tables.h delete mode 100644 src/ed25519-donna/ed25519-donna-64bit-x86-32bit.h delete mode 100644 src/ed25519-donna/ed25519-donna-64bit-x86.h delete mode 100644 src/ed25519-donna/ed25519-donna-basepoint-table.h delete mode 100644 src/ed25519-donna/ed25519-donna-batchverify.h delete mode 100644 src/ed25519-donna/ed25519-donna-impl-base.h delete mode 100644 src/ed25519-donna/ed25519-donna-impl-sse2.h delete mode 100644 src/ed25519-donna/ed25519-donna-portable-identify.h delete mode 100644 src/ed25519-donna/ed25519-donna-portable.h delete mode 100644 src/ed25519-donna/ed25519-donna.h delete mode 100644 src/ed25519-donna/ed25519-hash-custom.h delete mode 100644 src/ed25519-donna/ed25519-hash.h delete mode 100644 src/ed25519-donna/ed25519-randombytes-custom.h delete mode 100644 src/ed25519-donna/ed25519-randombytes.h delete mode 100644 src/ed25519-donna/ed25519.c delete mode 100644 src/ed25519-donna/ed25519.h delete mode 100644 src/ed25519-donna/fuzz/README.md delete mode 100644 src/ed25519-donna/fuzz/build-nix.php delete mode 100644 src/ed25519-donna/fuzz/curve25519-ref10.c delete mode 100644 src/ed25519-donna/fuzz/curve25519-ref10.h delete mode 100644 src/ed25519-donna/fuzz/ed25519-donna-sse2.c delete mode 100644 src/ed25519-donna/fuzz/ed25519-donna.c delete mode 100644 src/ed25519-donna/fuzz/ed25519-donna.h delete mode 100644 src/ed25519-donna/fuzz/ed25519-ref10.c delete mode 100644 src/ed25519-donna/fuzz/ed25519-ref10.h delete mode 100644 src/ed25519-donna/fuzz/fuzz-curve25519.c delete mode 100644 src/ed25519-donna/fuzz/fuzz-ed25519.c delete mode 100644 src/ed25519-donna/modm-donna-32bit.h delete mode 100644 src/ed25519-donna/modm-donna-64bit.h delete mode 100644 src/ed25519-donna/regression.h delete mode 100644 src/ed25519-donna/test-internals.c delete mode 100644 src/ed25519-donna/test-ticks.h delete mode 100644 src/ed25519-donna/test.c delete mode 100644 src/lz4/.gitattributes delete mode 100644 src/lz4/.travis.yml delete mode 100644 src/lz4/Makefile delete mode 100644 src/lz4/NEWS delete mode 100644 src/lz4/README.md delete mode 100644 src/lz4/cmake_unofficial/CMakeLists.txt delete mode 100755 src/lz4/examples/HCStreaming_ringBuffer.c delete mode 100644 src/lz4/examples/Makefile delete mode 100644 src/lz4/examples/README.md delete mode 100644 src/lz4/examples/blockStreaming_doubleBuffer.c delete mode 100644 src/lz4/examples/blockStreaming_doubleBuffer.md delete mode 100644 src/lz4/examples/blockStreaming_lineByLine.c delete mode 100644 src/lz4/examples/blockStreaming_lineByLine.md delete mode 100644 src/lz4/examples/blockStreaming_ringBuffer.c delete mode 100644 src/lz4/examples/printVersion.c delete mode 100644 src/lz4/examples/streaming_api_basics.md delete mode 100644 src/lz4/lib/LICENSE delete mode 100644 src/lz4/lib/Makefile delete mode 100644 src/lz4/lib/README.md delete mode 100644 src/lz4/lib/liblz4.pc.in delete mode 100644 src/lz4/lib/lz4.c delete mode 100644 src/lz4/lib/lz4.h delete mode 100644 src/lz4/lib/lz4frame.c delete mode 100644 src/lz4/lib/lz4frame.h delete mode 100644 src/lz4/lib/lz4frame_static.h delete mode 100644 src/lz4/lib/lz4hc.c delete mode 100644 src/lz4/lib/lz4hc.h delete mode 100644 src/lz4/lib/xxhash.c delete mode 100644 src/lz4/lib/xxhash.h delete mode 100644 src/lz4/lz4_Block_format.md delete mode 100644 src/lz4/lz4_Frame_format.md delete mode 100644 src/lz4/programs/COPYING delete mode 100644 src/lz4/programs/Makefile delete mode 100644 src/lz4/programs/bench.c delete mode 100644 src/lz4/programs/bench.h delete mode 100644 src/lz4/programs/datagen.c delete mode 100644 src/lz4/programs/datagen.h delete mode 100644 src/lz4/programs/datagencli.c delete mode 100644 src/lz4/programs/frametest.c delete mode 100644 src/lz4/programs/fullbench.c delete mode 100644 src/lz4/programs/fuzzer.c delete mode 100644 src/lz4/programs/lz4.1 delete mode 100644 src/lz4/programs/lz4cli.c delete mode 100644 src/lz4/programs/lz4io.c delete mode 100644 src/lz4/programs/lz4io.h delete mode 100644 src/lz4/test/Makefile delete mode 100644 src/lz4/test/test-lz4-versions.py delete mode 100644 src/lz4/visual/2012/datagen/datagen.vcxproj delete mode 100644 src/lz4/visual/2012/datagen/datagen.vcxproj.filters delete mode 100644 src/lz4/visual/2012/frametest/frametest.vcxproj delete mode 100644 src/lz4/visual/2012/frametest/frametest.vcxproj.filters delete mode 100644 src/lz4/visual/2012/fullbench/fullbench.vcxproj delete mode 100644 src/lz4/visual/2012/fullbench/fullbench.vcxproj.filters delete mode 100644 src/lz4/visual/2012/fuzzer/fuzzer.vcxproj delete mode 100644 src/lz4/visual/2012/fuzzer/fuzzer.vcxproj.filters delete mode 100644 src/lz4/visual/2012/lz4.sln delete mode 100644 src/lz4/visual/2012/lz4/lz4.vcxproj delete mode 100644 src/lz4/visual/2012/lz4/lz4.vcxproj.filters delete mode 100644 src/nudb/.gitignore delete mode 100644 src/nudb/.gitmodules delete mode 100644 src/nudb/.travis.yml delete mode 100644 src/nudb/CHANGELOG.md delete mode 100644 src/nudb/CMakeLists.txt delete mode 100644 src/nudb/Jamroot delete mode 100644 src/nudb/LICENSE_1_0.txt delete mode 100644 src/nudb/README.md delete mode 100644 src/nudb/TODO.txt delete mode 100644 src/nudb/bench/CMakeLists.txt delete mode 100644 src/nudb/bench/Jamfile delete mode 100644 src/nudb/bench/README.md delete mode 100644 src/nudb/bench/bench.cpp delete mode 100644 src/nudb/bench/plot_bench.py delete mode 100644 src/nudb/doc/.gitignore delete mode 100644 src/nudb/doc/Jamfile.v2 delete mode 100644 src/nudb/doc/boostbook.dtd delete mode 160000 src/nudb/doc/docca delete mode 100644 src/nudb/doc/images/logo.png delete mode 100644 src/nudb/doc/images/logo.psd delete mode 100644 src/nudb/doc/images/readme2.png delete mode 100644 src/nudb/doc/index.xml delete mode 100644 src/nudb/doc/main.qbk delete mode 100644 src/nudb/doc/makeqbk.sh delete mode 100644 src/nudb/doc/quickref.xml delete mode 100644 src/nudb/doc/reference.xsl delete mode 100644 src/nudb/doc/source.dox delete mode 100644 src/nudb/doc/types/File.qbk delete mode 100644 src/nudb/doc/types/Hasher.qbk delete mode 100644 src/nudb/doc/types/Progress.qbk delete mode 100644 src/nudb/examples/CMakeLists.txt delete mode 100644 src/nudb/examples/Jamfile delete mode 100644 src/nudb/examples/example.cpp delete mode 100644 src/nudb/extras/README.md delete mode 160000 src/nudb/extras/beast delete mode 100644 src/nudb/extras/nudb/basic_seconds_clock.hpp delete mode 100644 src/nudb/extras/nudb/chrono_util.hpp delete mode 100644 src/nudb/extras/nudb/test/fail_file.hpp delete mode 100644 src/nudb/extras/nudb/test/temp_dir.hpp delete mode 100644 src/nudb/extras/nudb/test/test_store.hpp delete mode 100644 src/nudb/extras/nudb/test/xor_shift_engine.hpp delete mode 100644 src/nudb/extras/nudb/util.hpp delete mode 160000 src/nudb/extras/rocksdb delete mode 100644 src/nudb/include/nudb/basic_store.hpp delete mode 100644 src/nudb/include/nudb/concepts.hpp delete mode 100644 src/nudb/include/nudb/create.hpp delete mode 100644 src/nudb/include/nudb/detail/arena.hpp delete mode 100644 src/nudb/include/nudb/detail/bucket.hpp delete mode 100644 src/nudb/include/nudb/detail/buffer.hpp delete mode 100644 src/nudb/include/nudb/detail/bulkio.hpp delete mode 100644 src/nudb/include/nudb/detail/cache.hpp delete mode 100644 src/nudb/include/nudb/detail/endian.hpp delete mode 100644 src/nudb/include/nudb/detail/field.hpp delete mode 100644 src/nudb/include/nudb/detail/format.hpp delete mode 100644 src/nudb/include/nudb/detail/gentex.hpp delete mode 100644 src/nudb/include/nudb/detail/mutex.hpp delete mode 100644 src/nudb/include/nudb/detail/pool.hpp delete mode 100644 src/nudb/include/nudb/detail/stream.hpp delete mode 100644 src/nudb/include/nudb/detail/xxhash.hpp delete mode 100644 src/nudb/include/nudb/error.hpp delete mode 100644 src/nudb/include/nudb/file.hpp delete mode 100644 src/nudb/include/nudb/impl/basic_store.ipp delete mode 100644 src/nudb/include/nudb/impl/create.ipp delete mode 100644 src/nudb/include/nudb/impl/error.ipp delete mode 100644 src/nudb/include/nudb/impl/posix_file.ipp delete mode 100644 src/nudb/include/nudb/impl/recover.ipp delete mode 100644 src/nudb/include/nudb/impl/rekey.ipp delete mode 100644 src/nudb/include/nudb/impl/verify.ipp delete mode 100644 src/nudb/include/nudb/impl/visit.ipp delete mode 100644 src/nudb/include/nudb/impl/win32_file.ipp delete mode 100644 src/nudb/include/nudb/native_file.hpp delete mode 100644 src/nudb/include/nudb/nudb.hpp delete mode 100644 src/nudb/include/nudb/posix_file.hpp delete mode 100644 src/nudb/include/nudb/progress.hpp delete mode 100644 src/nudb/include/nudb/recover.hpp delete mode 100644 src/nudb/include/nudb/rekey.hpp delete mode 100644 src/nudb/include/nudb/store.hpp delete mode 100644 src/nudb/include/nudb/type_traits.hpp delete mode 100644 src/nudb/include/nudb/verify.hpp delete mode 100644 src/nudb/include/nudb/version.hpp delete mode 100644 src/nudb/include/nudb/visit.hpp delete mode 100644 src/nudb/include/nudb/win32_file.hpp delete mode 100644 src/nudb/include/nudb/xxhasher.hpp delete mode 100644 src/nudb/scripts/blacklist.supp delete mode 100755 src/nudb/scripts/build-and-test.sh delete mode 100755 src/nudb/scripts/install-boost.sh delete mode 100755 src/nudb/scripts/install-dependencies.sh delete mode 100755 src/nudb/scripts/install-valgrind.sh delete mode 100755 src/nudb/scripts/run-with-debugger.sh delete mode 100755 src/nudb/scripts/run-with-gdb.sh delete mode 100644 src/nudb/test/CMakeLists.txt delete mode 100644 src/nudb/test/Jamfile delete mode 100644 src/nudb/test/basic_store.cpp delete mode 100644 src/nudb/test/buffer.cpp delete mode 100644 src/nudb/test/callgrind_test.cpp delete mode 100644 src/nudb/test/concepts.cpp delete mode 100644 src/nudb/test/create.cpp delete mode 100644 src/nudb/test/error.cpp delete mode 100644 src/nudb/test/file.cpp delete mode 100644 src/nudb/test/native_file.cpp delete mode 100644 src/nudb/test/posix_file.cpp delete mode 100644 src/nudb/test/recover.cpp delete mode 100644 src/nudb/test/rekey.cpp delete mode 100644 src/nudb/test/store.cpp delete mode 100644 src/nudb/test/type_traits.cpp delete mode 100644 src/nudb/test/verify.cpp delete mode 100644 src/nudb/test/version.cpp delete mode 100644 src/nudb/test/visit.cpp delete mode 100644 src/nudb/test/win32_file.cpp delete mode 100644 src/nudb/test/xxhasher.cpp delete mode 100644 src/nudb/tools/CMakeLists.txt delete mode 100644 src/nudb/tools/Jamfile delete mode 100644 src/nudb/tools/nudb.cpp delete mode 100644 src/protobuf/CHANGES.txt delete mode 100644 src/protobuf/CONTRIBUTORS.txt delete mode 100644 src/protobuf/COPYING.txt delete mode 100644 src/protobuf/INSTALL.txt delete mode 100644 src/protobuf/Makefile.am delete mode 100644 src/protobuf/README.txt delete mode 100755 src/protobuf/autogen.sh delete mode 100644 src/protobuf/benchmarks/ProtoBench.java delete mode 100644 src/protobuf/benchmarks/google_message1.dat delete mode 100644 src/protobuf/benchmarks/google_message2.dat delete mode 100644 src/protobuf/benchmarks/google_size.proto delete mode 100644 src/protobuf/benchmarks/google_speed.proto delete mode 100644 src/protobuf/benchmarks/readme.txt delete mode 100644 src/protobuf/configure.ac delete mode 100644 src/protobuf/editors/README.txt delete mode 100644 src/protobuf/editors/proto.vim delete mode 100644 src/protobuf/editors/protobuf-mode.el delete mode 100644 src/protobuf/examples/AddPerson.java delete mode 100644 src/protobuf/examples/ListPeople.java delete mode 100644 src/protobuf/examples/Makefile delete mode 100644 src/protobuf/examples/README.txt delete mode 100644 src/protobuf/examples/add_person.cc delete mode 100755 src/protobuf/examples/add_person.py delete mode 100644 src/protobuf/examples/addressbook.proto delete mode 100644 src/protobuf/examples/list_people.cc delete mode 100755 src/protobuf/examples/list_people.py delete mode 100755 src/protobuf/generate_descriptor_proto.sh delete mode 100644 src/protobuf/java/README.txt delete mode 100644 src/protobuf/java/pom.xml delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/AbstractParser.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/BoundedByteString.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/ByteString.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/Internal.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/LazyField.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/LiteralByteString.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/Message.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/Parser.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/RopeByteString.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/RpcController.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/Service.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/Utf8.java delete mode 100644 src/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/BoundedByteStringTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/ByteStringTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8Test.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8TestUtil.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/LiteralByteStringTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/ParserTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringSubstringTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto delete mode 100644 src/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto delete mode 100644 src/protobuf/m4/ac_system_extensions.m4 delete mode 100644 src/protobuf/m4/acx_check_suncc.m4 delete mode 100644 src/protobuf/m4/acx_pthread.m4 delete mode 100644 src/protobuf/m4/stl_hash.m4 delete mode 100755 src/protobuf/more_tests/Makefile delete mode 100755 src/protobuf/post_process_dist.sh delete mode 100644 src/protobuf/protobuf-lite.pc.in delete mode 100644 src/protobuf/protobuf.pc.in delete mode 100644 src/protobuf/python/README.txt delete mode 100755 src/protobuf/python/ez_setup.py delete mode 100755 src/protobuf/python/google/__init__.py delete mode 100755 src/protobuf/python/google/protobuf/__init__.py delete mode 100755 src/protobuf/python/google/protobuf/descriptor.py delete mode 100644 src/protobuf/python/google/protobuf/descriptor_database.py delete mode 100644 src/protobuf/python/google/protobuf/descriptor_pool.py delete mode 100755 src/protobuf/python/google/protobuf/internal/__init__.py delete mode 100755 src/protobuf/python/google/protobuf/internal/api_implementation.py delete mode 100755 src/protobuf/python/google/protobuf/internal/containers.py delete mode 100755 src/protobuf/python/google/protobuf/internal/cpp_message.py delete mode 100755 src/protobuf/python/google/protobuf/internal/decoder.py delete mode 100644 src/protobuf/python/google/protobuf/internal/descriptor_database_test.py delete mode 100644 src/protobuf/python/google/protobuf/internal/descriptor_pool_test.py delete mode 100755 src/protobuf/python/google/protobuf/internal/descriptor_test.py delete mode 100755 src/protobuf/python/google/protobuf/internal/encoder.py delete mode 100644 src/protobuf/python/google/protobuf/internal/enum_type_wrapper.py delete mode 100644 src/protobuf/python/google/protobuf/internal/factory_test1.proto delete mode 100644 src/protobuf/python/google/protobuf/internal/factory_test2.proto delete mode 100755 src/protobuf/python/google/protobuf/internal/generator_test.py delete mode 100644 src/protobuf/python/google/protobuf/internal/message_cpp_test.py delete mode 100644 src/protobuf/python/google/protobuf/internal/message_factory_test.py delete mode 100755 src/protobuf/python/google/protobuf/internal/message_listener.py delete mode 100755 src/protobuf/python/google/protobuf/internal/message_test.py delete mode 100644 src/protobuf/python/google/protobuf/internal/more_extensions.proto delete mode 100644 src/protobuf/python/google/protobuf/internal/more_extensions_dynamic.proto delete mode 100644 src/protobuf/python/google/protobuf/internal/more_messages.proto delete mode 100755 src/protobuf/python/google/protobuf/internal/python_message.py delete mode 100755 src/protobuf/python/google/protobuf/internal/reflection_cpp_generated_test.py delete mode 100755 src/protobuf/python/google/protobuf/internal/reflection_test.py delete mode 100755 src/protobuf/python/google/protobuf/internal/service_reflection_test.py delete mode 100644 src/protobuf/python/google/protobuf/internal/test_bad_identifiers.proto delete mode 100755 src/protobuf/python/google/protobuf/internal/test_util.py delete mode 100755 src/protobuf/python/google/protobuf/internal/text_format_test.py delete mode 100755 src/protobuf/python/google/protobuf/internal/type_checkers.py delete mode 100755 src/protobuf/python/google/protobuf/internal/unknown_fields_test.py delete mode 100755 src/protobuf/python/google/protobuf/internal/wire_format.py delete mode 100755 src/protobuf/python/google/protobuf/internal/wire_format_test.py delete mode 100755 src/protobuf/python/google/protobuf/message.py delete mode 100644 src/protobuf/python/google/protobuf/message_factory.py delete mode 100644 src/protobuf/python/google/protobuf/pyext/python-proto2.cc delete mode 100644 src/protobuf/python/google/protobuf/pyext/python_descriptor.cc delete mode 100644 src/protobuf/python/google/protobuf/pyext/python_descriptor.h delete mode 100644 src/protobuf/python/google/protobuf/pyext/python_protobuf.cc delete mode 100644 src/protobuf/python/google/protobuf/pyext/python_protobuf.h delete mode 100755 src/protobuf/python/google/protobuf/reflection.py delete mode 100755 src/protobuf/python/google/protobuf/service.py delete mode 100755 src/protobuf/python/google/protobuf/service_reflection.py delete mode 100755 src/protobuf/python/google/protobuf/text_format.py delete mode 100755 src/protobuf/python/mox.py delete mode 100755 src/protobuf/python/setup.py delete mode 100755 src/protobuf/python/stubout.py delete mode 100644 src/protobuf/src/Makefile.am delete mode 100644 src/protobuf/src/google/protobuf/SEBS delete mode 100644 src/protobuf/src/google/protobuf/compiler/code_generator.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/code_generator.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/command_line_interface.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/command_line_interface.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_options.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/importer.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/importer.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/importer_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_doc_comment.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_doc_comment.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_doc_comment_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_enum.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_enum.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_enum_field.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_extension.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_extension.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_field.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_field.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_file.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_file.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_generator.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_generator.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_helpers.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_helpers.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_message.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_message.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_message_field.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_message_field.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_service.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_service.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_string_field.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/java/java_string_field.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/main.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/mock_code_generator.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/mock_code_generator.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/package_info.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/parser.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/parser.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/parser_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/plugin.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/plugin.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/plugin.pb.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/plugin.pb.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/plugin.proto delete mode 100644 src/protobuf/src/google/protobuf/compiler/python/python_generator.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/python/python_generator.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/subprocess.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/subprocess.h delete mode 100644 src/protobuf/src/google/protobuf/compiler/test_plugin.cc delete mode 100755 src/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh delete mode 100644 src/protobuf/src/google/protobuf/compiler/zip_writer.cc delete mode 100644 src/protobuf/src/google/protobuf/compiler/zip_writer.h delete mode 100644 src/protobuf/src/google/protobuf/descriptor.cc delete mode 100644 src/protobuf/src/google/protobuf/descriptor.h delete mode 100644 src/protobuf/src/google/protobuf/descriptor.pb.cc delete mode 100644 src/protobuf/src/google/protobuf/descriptor.pb.h delete mode 100644 src/protobuf/src/google/protobuf/descriptor.proto delete mode 100644 src/protobuf/src/google/protobuf/descriptor_database.cc delete mode 100644 src/protobuf/src/google/protobuf/descriptor_database.h delete mode 100644 src/protobuf/src/google/protobuf/descriptor_database_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/descriptor_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/dynamic_message.cc delete mode 100644 src/protobuf/src/google/protobuf/dynamic_message.h delete mode 100644 src/protobuf/src/google/protobuf/dynamic_message_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/extension_set.cc delete mode 100644 src/protobuf/src/google/protobuf/extension_set.h delete mode 100644 src/protobuf/src/google/protobuf/extension_set_heavy.cc delete mode 100644 src/protobuf/src/google/protobuf/extension_set_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/generated_enum_reflection.h delete mode 100644 src/protobuf/src/google/protobuf/generated_message_reflection.cc delete mode 100644 src/protobuf/src/google/protobuf/generated_message_reflection.h delete mode 100644 src/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/generated_message_util.cc delete mode 100644 src/protobuf/src/google/protobuf/generated_message_util.h delete mode 100644 src/protobuf/src/google/protobuf/io/coded_stream.cc delete mode 100644 src/protobuf/src/google/protobuf/io/coded_stream.h delete mode 100644 src/protobuf/src/google/protobuf/io/coded_stream_inl.h delete mode 100644 src/protobuf/src/google/protobuf/io/coded_stream_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/io/gzip_stream.cc delete mode 100644 src/protobuf/src/google/protobuf/io/gzip_stream.h delete mode 100755 src/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh delete mode 100644 src/protobuf/src/google/protobuf/io/package_info.h delete mode 100644 src/protobuf/src/google/protobuf/io/printer.cc delete mode 100644 src/protobuf/src/google/protobuf/io/printer.h delete mode 100644 src/protobuf/src/google/protobuf/io/printer_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/io/tokenizer.cc delete mode 100644 src/protobuf/src/google/protobuf/io/tokenizer.h delete mode 100644 src/protobuf/src/google/protobuf/io/tokenizer_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/io/zero_copy_stream.cc delete mode 100644 src/protobuf/src/google/protobuf/io/zero_copy_stream.h delete mode 100644 src/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc delete mode 100644 src/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h delete mode 100644 src/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc delete mode 100644 src/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h delete mode 100644 src/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/lite_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/message.cc delete mode 100644 src/protobuf/src/google/protobuf/message.h delete mode 100644 src/protobuf/src/google/protobuf/message_lite.cc delete mode 100644 src/protobuf/src/google/protobuf/message_lite.h delete mode 100644 src/protobuf/src/google/protobuf/message_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/package_info.h delete mode 100644 src/protobuf/src/google/protobuf/reflection_ops.cc delete mode 100644 src/protobuf/src/google/protobuf/reflection_ops.h delete mode 100644 src/protobuf/src/google/protobuf/reflection_ops_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/repeated_field.cc delete mode 100644 src/protobuf/src/google/protobuf/repeated_field.h delete mode 100644 src/protobuf/src/google/protobuf/repeated_field_reflection_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/repeated_field_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/service.cc delete mode 100644 src/protobuf/src/google/protobuf/service.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/atomicops.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc delete mode 100644 src/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc delete mode 100644 src/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/common.cc delete mode 100644 src/protobuf/src/google/protobuf/stubs/common.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/common_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/stubs/hash.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/map-util.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/once.cc delete mode 100644 src/protobuf/src/google/protobuf/stubs/once.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/once_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/stubs/platform_macros.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/stl_util.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/stringprintf.cc delete mode 100644 src/protobuf/src/google/protobuf/stubs/stringprintf.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/stringprintf_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/stubs/structurally_valid.cc delete mode 100644 src/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/stubs/strutil.cc delete mode 100644 src/protobuf/src/google/protobuf/stubs/strutil.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/strutil_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/stubs/substitute.cc delete mode 100644 src/protobuf/src/google/protobuf/stubs/substitute.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/template_util.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/template_util_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/stubs/type_traits.h delete mode 100644 src/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/test_util.cc delete mode 100644 src/protobuf/src/google/protobuf/test_util.h delete mode 100644 src/protobuf/src/google/protobuf/test_util_lite.cc delete mode 100644 src/protobuf/src/google/protobuf/test_util_lite.h delete mode 100644 src/protobuf/src/google/protobuf/testdata/golden_message delete mode 100644 src/protobuf/src/google/protobuf/testdata/golden_packed_fields_message delete mode 100644 src/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt delete mode 100644 src/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt delete mode 100644 src/protobuf/src/google/protobuf/testing/file.cc delete mode 100644 src/protobuf/src/google/protobuf/testing/file.h delete mode 100644 src/protobuf/src/google/protobuf/testing/googletest.cc delete mode 100644 src/protobuf/src/google/protobuf/testing/googletest.h delete mode 100644 src/protobuf/src/google/protobuf/testing/zcgunzip.cc delete mode 100644 src/protobuf/src/google/protobuf/testing/zcgzip.cc delete mode 100644 src/protobuf/src/google/protobuf/text_format.cc delete mode 100644 src/protobuf/src/google/protobuf/text_format.h delete mode 100644 src/protobuf/src/google/protobuf/text_format_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/unittest.proto delete mode 100644 src/protobuf/src/google/protobuf/unittest_custom_options.proto delete mode 100644 src/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto delete mode 100644 src/protobuf/src/google/protobuf/unittest_empty.proto delete mode 100644 src/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto delete mode 100644 src/protobuf/src/google/protobuf/unittest_import.proto delete mode 100644 src/protobuf/src/google/protobuf/unittest_import_lite.proto delete mode 100644 src/protobuf/src/google/protobuf/unittest_import_public.proto delete mode 100644 src/protobuf/src/google/protobuf/unittest_import_public_lite.proto delete mode 100644 src/protobuf/src/google/protobuf/unittest_lite.proto delete mode 100644 src/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto delete mode 100644 src/protobuf/src/google/protobuf/unittest_mset.proto delete mode 100644 src/protobuf/src/google/protobuf/unittest_no_generic_services.proto delete mode 100644 src/protobuf/src/google/protobuf/unittest_optimize_for.proto delete mode 100644 src/protobuf/src/google/protobuf/unknown_field_set.cc delete mode 100644 src/protobuf/src/google/protobuf/unknown_field_set.h delete mode 100644 src/protobuf/src/google/protobuf/unknown_field_set_unittest.cc delete mode 100644 src/protobuf/src/google/protobuf/wire_format.cc delete mode 100644 src/protobuf/src/google/protobuf/wire_format.h delete mode 100644 src/protobuf/src/google/protobuf/wire_format_lite.cc delete mode 100644 src/protobuf/src/google/protobuf/wire_format_lite.h delete mode 100644 src/protobuf/src/google/protobuf/wire_format_lite_inl.h delete mode 100644 src/protobuf/src/google/protobuf/wire_format_unittest.cc delete mode 100644 src/protobuf/src/solaris/libstdc++.la delete mode 100644 src/protobuf/vsprojects/config.h delete mode 100755 src/protobuf/vsprojects/convert2008to2005.sh delete mode 100755 src/protobuf/vsprojects/extract_includes.bat delete mode 100644 src/protobuf/vsprojects/libprotobuf-lite.vcproj delete mode 100644 src/protobuf/vsprojects/libprotobuf.vcproj delete mode 100644 src/protobuf/vsprojects/libprotoc.vcproj delete mode 100644 src/protobuf/vsprojects/lite-test.vcproj delete mode 100644 src/protobuf/vsprojects/protobuf.sln delete mode 100644 src/protobuf/vsprojects/protoc.vcproj delete mode 100644 src/protobuf/vsprojects/readme.txt delete mode 100755 src/protobuf/vsprojects/test_plugin.vcproj delete mode 100644 src/protobuf/vsprojects/tests.vcproj delete mode 100644 src/ripple/README.md delete mode 100644 src/ripple/app/consensus/RCLCxPos.h delete mode 100644 src/ripple/app/consensus/RCLCxTraits.h delete mode 100644 src/ripple/app/consensus/RCLCxTx.h delete mode 100644 src/ripple/app/consensus/README.md delete mode 100644 src/ripple/app/ledger/AbstractFetchPackContainer.h delete mode 100644 src/ripple/app/ledger/AcceptedLedger.cpp delete mode 100644 src/ripple/app/ledger/AcceptedLedger.h delete mode 100644 src/ripple/app/ledger/AcceptedLedgerTx.cpp delete mode 100644 src/ripple/app/ledger/AcceptedLedgerTx.h delete mode 100644 src/ripple/app/ledger/AccountStateSF.cpp delete mode 100644 src/ripple/app/ledger/AccountStateSF.h delete mode 100644 src/ripple/app/ledger/BookListeners.cpp delete mode 100644 src/ripple/app/ledger/BookListeners.h delete mode 100644 src/ripple/app/ledger/Consensus.h delete mode 100644 src/ripple/app/ledger/ConsensusTransSetSF.cpp delete mode 100644 src/ripple/app/ledger/ConsensusTransSetSF.h delete mode 100644 src/ripple/app/ledger/InboundLedger.h delete mode 100644 src/ripple/app/ledger/InboundLedgers.h delete mode 100644 src/ripple/app/ledger/InboundTransactions.h delete mode 100644 src/ripple/app/ledger/Ledger.cpp delete mode 100644 src/ripple/app/ledger/Ledger.h delete mode 100644 src/ripple/app/ledger/LedgerCleaner.h delete mode 100644 src/ripple/app/ledger/LedgerConsensus.h delete mode 100644 src/ripple/app/ledger/LedgerHistory.cpp delete mode 100644 src/ripple/app/ledger/LedgerHistory.h delete mode 100644 src/ripple/app/ledger/LedgerHolder.h delete mode 100644 src/ripple/app/ledger/LedgerMaster.h delete mode 100644 src/ripple/app/ledger/LedgerProposal.cpp delete mode 100644 src/ripple/app/ledger/LedgerProposal.h delete mode 100644 src/ripple/app/ledger/LedgerTiming.h delete mode 100644 src/ripple/app/ledger/LedgerToJson.h delete mode 100644 src/ripple/app/ledger/LocalTxs.h delete mode 100644 src/ripple/app/ledger/OpenLedger.h delete mode 100644 src/ripple/app/ledger/OrderBookDB.cpp delete mode 100644 src/ripple/app/ledger/OrderBookDB.h delete mode 100644 src/ripple/app/ledger/PendingSaves.h delete mode 100644 src/ripple/app/ledger/README.md delete mode 100644 src/ripple/app/ledger/TransactionMaster.h delete mode 100644 src/ripple/app/ledger/TransactionStateSF.cpp delete mode 100644 src/ripple/app/ledger/TransactionStateSF.h delete mode 100644 src/ripple/app/ledger/impl/ConsensusImp.cpp delete mode 100644 src/ripple/app/ledger/impl/ConsensusImp.h delete mode 100644 src/ripple/app/ledger/impl/DisputedTx.h delete mode 100644 src/ripple/app/ledger/impl/InboundLedger.cpp delete mode 100644 src/ripple/app/ledger/impl/InboundLedgers.cpp delete mode 100644 src/ripple/app/ledger/impl/InboundTransactions.cpp delete mode 100644 src/ripple/app/ledger/impl/LedgerCleaner.cpp delete mode 100644 src/ripple/app/ledger/impl/LedgerConsensusImp.cpp delete mode 100644 src/ripple/app/ledger/impl/LedgerConsensusImp.h delete mode 100644 src/ripple/app/ledger/impl/LedgerMaster.cpp delete mode 100644 src/ripple/app/ledger/impl/LedgerTiming.cpp delete mode 100644 src/ripple/app/ledger/impl/LedgerToJson.cpp delete mode 100644 src/ripple/app/ledger/impl/LocalTxs.cpp delete mode 100644 src/ripple/app/ledger/impl/OpenLedger.cpp delete mode 100644 src/ripple/app/ledger/impl/TransactionAcquire.cpp delete mode 100644 src/ripple/app/ledger/impl/TransactionAcquire.h delete mode 100644 src/ripple/app/ledger/impl/TransactionMaster.cpp delete mode 100644 src/ripple/app/main/Amendments.cpp delete mode 100644 src/ripple/app/main/Application.cpp delete mode 100644 src/ripple/app/main/Application.h delete mode 100644 src/ripple/app/main/BasicApp.cpp delete mode 100644 src/ripple/app/main/BasicApp.h delete mode 100644 src/ripple/app/main/CollectorManager.cpp delete mode 100644 src/ripple/app/main/CollectorManager.h delete mode 100644 src/ripple/app/main/DBInit.cpp delete mode 100644 src/ripple/app/main/DBInit.h delete mode 100644 src/ripple/app/main/LoadManager.cpp delete mode 100644 src/ripple/app/main/LoadManager.h delete mode 100644 src/ripple/app/main/Main.cpp delete mode 100644 src/ripple/app/main/NodeIdentity.cpp delete mode 100644 src/ripple/app/main/NodeIdentity.h delete mode 100644 src/ripple/app/main/NodeStoreScheduler.cpp delete mode 100644 src/ripple/app/main/NodeStoreScheduler.h delete mode 100644 src/ripple/app/main/Tuning.h delete mode 100644 src/ripple/app/misc/AmendmentTable.h delete mode 100644 src/ripple/app/misc/CanonicalTXSet.cpp delete mode 100644 src/ripple/app/misc/CanonicalTXSet.h delete mode 100644 src/ripple/app/misc/FeeEscalation.md delete mode 100644 src/ripple/app/misc/FeeVote.h delete mode 100644 src/ripple/app/misc/FeeVoteImpl.cpp delete mode 100644 src/ripple/app/misc/HashRouter.cpp delete mode 100644 src/ripple/app/misc/HashRouter.h delete mode 100644 src/ripple/app/misc/LoadFeeTrack.h delete mode 100644 src/ripple/app/misc/NetworkOPs.cpp delete mode 100644 src/ripple/app/misc/NetworkOPs.h delete mode 100644 src/ripple/app/misc/OrderBook.h delete mode 100644 src/ripple/app/misc/README.md delete mode 100644 src/ripple/app/misc/SHAMapStore.h delete mode 100644 src/ripple/app/misc/SHAMapStoreImp.cpp delete mode 100644 src/ripple/app/misc/SHAMapStoreImp.h delete mode 100644 src/ripple/app/misc/Transaction.h delete mode 100644 src/ripple/app/misc/TxQ.h delete mode 100644 src/ripple/app/misc/Validations.cpp delete mode 100644 src/ripple/app/misc/Validations.h delete mode 100644 src/ripple/app/misc/ValidatorList.h delete mode 100644 src/ripple/app/misc/impl/AccountTxPaging.cpp delete mode 100644 src/ripple/app/misc/impl/AccountTxPaging.h delete mode 100644 src/ripple/app/misc/impl/AmendmentTable.cpp delete mode 100644 src/ripple/app/misc/impl/LoadFeeTrack.cpp delete mode 100644 src/ripple/app/misc/impl/Transaction.cpp delete mode 100644 src/ripple/app/misc/impl/TxQ.cpp delete mode 100644 src/ripple/app/misc/impl/ValidatorList.cpp delete mode 100644 src/ripple/app/paths/AccountCurrencies.cpp delete mode 100644 src/ripple/app/paths/AccountCurrencies.h delete mode 100644 src/ripple/app/paths/Credit.cpp delete mode 100644 src/ripple/app/paths/Credit.h delete mode 100644 src/ripple/app/paths/Flow.cpp delete mode 100644 src/ripple/app/paths/Flow.h delete mode 100644 src/ripple/app/paths/Node.cpp delete mode 100644 src/ripple/app/paths/Node.h delete mode 100644 src/ripple/app/paths/NodeDirectory.h delete mode 100644 src/ripple/app/paths/PathRequest.cpp delete mode 100644 src/ripple/app/paths/PathRequest.h delete mode 100644 src/ripple/app/paths/PathRequests.cpp delete mode 100644 src/ripple/app/paths/PathRequests.h delete mode 100644 src/ripple/app/paths/PathState.cpp delete mode 100644 src/ripple/app/paths/PathState.h delete mode 100644 src/ripple/app/paths/Pathfinder.cpp delete mode 100644 src/ripple/app/paths/Pathfinder.h delete mode 100644 src/ripple/app/paths/README.md delete mode 100644 src/ripple/app/paths/RippleCalc.cpp delete mode 100644 src/ripple/app/paths/RippleCalc.h delete mode 100644 src/ripple/app/paths/RippleLineCache.cpp delete mode 100644 src/ripple/app/paths/RippleLineCache.h delete mode 100644 src/ripple/app/paths/RippleState.cpp delete mode 100644 src/ripple/app/paths/RippleState.h delete mode 100644 src/ripple/app/paths/Tuning.h delete mode 100644 src/ripple/app/paths/Types.h delete mode 100644 src/ripple/app/paths/cursor/AdvanceNode.cpp delete mode 100644 src/ripple/app/paths/cursor/DeliverNodeForward.cpp delete mode 100644 src/ripple/app/paths/cursor/DeliverNodeReverse.cpp delete mode 100644 src/ripple/app/paths/cursor/EffectiveRate.cpp delete mode 100644 src/ripple/app/paths/cursor/EffectiveRate.h delete mode 100644 src/ripple/app/paths/cursor/ForwardLiquidity.cpp delete mode 100644 src/ripple/app/paths/cursor/ForwardLiquidityForAccount.cpp delete mode 100644 src/ripple/app/paths/cursor/Liquidity.cpp delete mode 100644 src/ripple/app/paths/cursor/NextIncrement.cpp delete mode 100644 src/ripple/app/paths/cursor/PathCursor.h delete mode 100644 src/ripple/app/paths/cursor/ReverseLiquidity.cpp delete mode 100644 src/ripple/app/paths/cursor/ReverseLiquidityForAccount.cpp delete mode 100644 src/ripple/app/paths/cursor/RippleLiquidity.cpp delete mode 100644 src/ripple/app/paths/cursor/RippleLiquidity.h delete mode 100644 src/ripple/app/paths/impl/AmountSpec.h delete mode 100644 src/ripple/app/paths/impl/BookStep.cpp delete mode 100644 src/ripple/app/paths/impl/DirectStep.cpp delete mode 100644 src/ripple/app/paths/impl/FlowDebugInfo.h delete mode 100644 src/ripple/app/paths/impl/PaySteps.cpp delete mode 100644 src/ripple/app/paths/impl/StepChecks.h delete mode 100644 src/ripple/app/paths/impl/Steps.h delete mode 100644 src/ripple/app/paths/impl/StrandFlow.h delete mode 100644 src/ripple/app/paths/impl/XRPEndpointStep.cpp delete mode 100644 src/ripple/app/tx/README.md delete mode 100644 src/ripple/app/tx/apply.h delete mode 100644 src/ripple/app/tx/applySteps.h delete mode 100644 src/ripple/app/tx/impl/ApplyContext.cpp delete mode 100644 src/ripple/app/tx/impl/ApplyContext.h delete mode 100644 src/ripple/app/tx/impl/BookTip.cpp delete mode 100644 src/ripple/app/tx/impl/BookTip.h delete mode 100644 src/ripple/app/tx/impl/CancelOffer.cpp delete mode 100644 src/ripple/app/tx/impl/CancelOffer.h delete mode 100644 src/ripple/app/tx/impl/CancelTicket.cpp delete mode 100644 src/ripple/app/tx/impl/CancelTicket.h delete mode 100644 src/ripple/app/tx/impl/Change.cpp delete mode 100644 src/ripple/app/tx/impl/Change.h delete mode 100644 src/ripple/app/tx/impl/CreateOffer.cpp delete mode 100644 src/ripple/app/tx/impl/CreateOffer.h delete mode 100644 src/ripple/app/tx/impl/CreateTicket.cpp delete mode 100644 src/ripple/app/tx/impl/CreateTicket.h delete mode 100644 src/ripple/app/tx/impl/Offer.h delete mode 100644 src/ripple/app/tx/impl/OfferStream.cpp delete mode 100644 src/ripple/app/tx/impl/OfferStream.h delete mode 100644 src/ripple/app/tx/impl/PayChan.cpp delete mode 100644 src/ripple/app/tx/impl/PayChan.h delete mode 100644 src/ripple/app/tx/impl/Payment.cpp delete mode 100644 src/ripple/app/tx/impl/Payment.h delete mode 100644 src/ripple/app/tx/impl/SetAccount.cpp delete mode 100644 src/ripple/app/tx/impl/SetAccount.h delete mode 100644 src/ripple/app/tx/impl/SetRegularKey.cpp delete mode 100644 src/ripple/app/tx/impl/SetRegularKey.h delete mode 100644 src/ripple/app/tx/impl/SetSignerList.cpp delete mode 100644 src/ripple/app/tx/impl/SetSignerList.h delete mode 100644 src/ripple/app/tx/impl/SetTrust.cpp delete mode 100644 src/ripple/app/tx/impl/SetTrust.h delete mode 100644 src/ripple/app/tx/impl/SignerEntries.cpp delete mode 100644 src/ripple/app/tx/impl/SignerEntries.h delete mode 100644 src/ripple/app/tx/impl/SusPay.cpp delete mode 100644 src/ripple/app/tx/impl/SusPay.h delete mode 100644 src/ripple/app/tx/impl/Taker.cpp delete mode 100644 src/ripple/app/tx/impl/Taker.h delete mode 100644 src/ripple/app/tx/impl/Transactor.cpp delete mode 100644 src/ripple/app/tx/impl/Transactor.h delete mode 100644 src/ripple/app/tx/impl/apply.cpp delete mode 100644 src/ripple/app/tx/impl/applySteps.cpp delete mode 100644 src/ripple/basics/BasicConfig.h delete mode 100644 src/ripple/basics/Blob.h delete mode 100644 src/ripple/basics/Buffer.h delete mode 100644 src/ripple/basics/ByteOrder.h delete mode 100644 src/ripple/basics/CheckLibraryVersions.h delete mode 100644 src/ripple/basics/CountedObject.h delete mode 100644 src/ripple/basics/DecayingSample.h delete mode 100644 src/ripple/basics/KeyCache.h delete mode 100644 src/ripple/basics/LocalValue.h delete mode 100644 src/ripple/basics/Log.h delete mode 100644 src/ripple/basics/README.md delete mode 100644 src/ripple/basics/RangeSet.h delete mode 100644 src/ripple/basics/Resolver.h delete mode 100644 src/ripple/basics/ResolverAsio.h delete mode 100644 src/ripple/basics/ScopedLock.h delete mode 100644 src/ripple/basics/Slice.h delete mode 100644 src/ripple/basics/StringUtilities.h delete mode 100644 src/ripple/basics/Sustain.h delete mode 100644 src/ripple/basics/TaggedCache.h delete mode 100644 src/ripple/basics/ThreadName.h delete mode 100644 src/ripple/basics/ToString.h delete mode 100644 src/ripple/basics/UnorderedContainers.h delete mode 100644 src/ripple/basics/UptimeTimer.h delete mode 100644 src/ripple/basics/base_uint.h delete mode 100644 src/ripple/basics/chrono.h delete mode 100644 src/ripple/basics/contract.h delete mode 100644 src/ripple/basics/hardened_hash.h delete mode 100644 src/ripple/basics/impl/BasicConfig.cpp delete mode 100644 src/ripple/basics/impl/CheckLibraryVersions.cpp delete mode 100644 src/ripple/basics/impl/CheckLibraryVersionsImpl.h delete mode 100644 src/ripple/basics/impl/CountedObject.cpp delete mode 100644 src/ripple/basics/impl/Log.cpp delete mode 100644 src/ripple/basics/impl/RangeSet.cpp delete mode 100644 src/ripple/basics/impl/ResolverAsio.cpp delete mode 100644 src/ripple/basics/impl/StringUtilities.cpp delete mode 100644 src/ripple/basics/impl/Sustain.cpp delete mode 100644 src/ripple/basics/impl/ThreadName.cpp delete mode 100644 src/ripple/basics/impl/Time.cpp delete mode 100644 src/ripple/basics/impl/UptimeTimer.cpp delete mode 100644 src/ripple/basics/impl/contract.cpp delete mode 100644 src/ripple/basics/impl/make_SSLContext.cpp delete mode 100644 src/ripple/basics/impl/mulDiv.cpp delete mode 100644 src/ripple/basics/impl/strHex.cpp delete mode 100644 src/ripple/basics/make_SSLContext.h delete mode 100644 src/ripple/basics/make_lock.h delete mode 100644 src/ripple/basics/mulDiv.h delete mode 100644 src/ripple/basics/qalloc.h delete mode 100644 src/ripple/basics/random.h delete mode 100644 src/ripple/basics/strHex.h delete mode 100644 src/ripple/basics/win32_workaround.h delete mode 100644 src/ripple/beast/asio/io_latency_probe.h delete mode 100644 src/ripple/beast/asio/ssl_bundle.h delete mode 100644 src/ripple/beast/asio/ssl_error.h delete mode 100644 src/ripple/beast/clock/abstract_clock.h delete mode 100644 src/ripple/beast/clock/basic_seconds_clock.h delete mode 100644 src/ripple/beast/clock/chrono_util.h delete mode 100644 src/ripple/beast/clock/manual_clock.h delete mode 100644 src/ripple/beast/container/aged_container.h delete mode 100644 src/ripple/beast/container/aged_container_utility.h delete mode 100644 src/ripple/beast/container/aged_map.h delete mode 100644 src/ripple/beast/container/aged_multimap.h delete mode 100644 src/ripple/beast/container/aged_multiset.h delete mode 100644 src/ripple/beast/container/aged_set.h delete mode 100644 src/ripple/beast/container/aged_unordered_map.h delete mode 100644 src/ripple/beast/container/aged_unordered_multimap.h delete mode 100644 src/ripple/beast/container/aged_unordered_multiset.h delete mode 100644 src/ripple/beast/container/aged_unordered_set.h delete mode 100644 src/ripple/beast/container/detail/aged_associative_container.h delete mode 100644 src/ripple/beast/container/detail/aged_container_iterator.h delete mode 100644 src/ripple/beast/container/detail/aged_ordered_container.h delete mode 100644 src/ripple/beast/container/detail/aged_unordered_container.h delete mode 100644 src/ripple/beast/core/BasicNativeHeaders.h delete mode 100644 src/ripple/beast/core/ByteOrder.h delete mode 100644 src/ripple/beast/core/CompilerConfig.h delete mode 100644 src/ripple/beast/core/Config.h delete mode 100644 src/ripple/beast/core/ConfigCheck.h delete mode 100644 src/ripple/beast/core/LexicalCast.h delete mode 100644 src/ripple/beast/core/List.h delete mode 100644 src/ripple/beast/core/LockFreeStack.h delete mode 100644 src/ripple/beast/core/Memory.h delete mode 100644 src/ripple/beast/core/PlatformConfig.h delete mode 100644 src/ripple/beast/core/SemanticVersion.cpp delete mode 100644 src/ripple/beast/core/SemanticVersion.h delete mode 100644 src/ripple/beast/core/SharedObject.h delete mode 100644 src/ripple/beast/core/SharedPtr.h delete mode 100644 src/ripple/beast/core/StandardConfig.h delete mode 100644 src/ripple/beast/core/StandardIncludes.h delete mode 100644 src/ripple/beast/core/SystemStats.cpp delete mode 100644 src/ripple/beast/core/SystemStats.h delete mode 100644 src/ripple/beast/core/Thread.cpp delete mode 100644 src/ripple/beast/core/Thread.h delete mode 100644 src/ripple/beast/core/Time.cpp delete mode 100644 src/ripple/beast/core/Time.h delete mode 100644 src/ripple/beast/core/WaitableEvent.cpp delete mode 100644 src/ripple/beast/core/WaitableEvent.h delete mode 100644 src/ripple/beast/core/bsd_SystemStats.cpp delete mode 100644 src/ripple/beast/core/core.unity.cpp delete mode 100644 src/ripple/beast/core/core.unity.mm delete mode 100644 src/ripple/beast/core/linux_SystemStats.cpp delete mode 100644 src/ripple/beast/core/mac_SystemStats.mm delete mode 100644 src/ripple/beast/core/osx_ObjCHelpers.h delete mode 100644 src/ripple/beast/core/win32_SystemStats.cpp delete mode 100644 src/ripple/beast/crypto/detail/mac_facade.h delete mode 100644 src/ripple/beast/crypto/detail/ripemd_context.h delete mode 100644 src/ripple/beast/crypto/detail/sha2_context.h delete mode 100644 src/ripple/beast/crypto/ripemd.h delete mode 100644 src/ripple/beast/crypto/secure_erase.h delete mode 100644 src/ripple/beast/crypto/sha2.h delete mode 100644 src/ripple/beast/cxx17/type_traits.h delete mode 100644 src/ripple/beast/hash/endian.h delete mode 100644 src/ripple/beast/hash/fnv1a.h delete mode 100644 src/ripple/beast/hash/hash_append.h delete mode 100644 src/ripple/beast/hash/impl/siphash.cpp delete mode 100644 src/ripple/beast/hash/impl/spookyv2.cpp delete mode 100644 src/ripple/beast/hash/impl/spookyv2.h delete mode 100644 src/ripple/beast/hash/impl/xxhash.c delete mode 100644 src/ripple/beast/hash/impl/xxhash.h delete mode 100644 src/ripple/beast/hash/meta.h delete mode 100644 src/ripple/beast/hash/siphash.h delete mode 100644 src/ripple/beast/hash/spooky.h delete mode 100644 src/ripple/beast/hash/tests/hash_metrics.h delete mode 100644 src/ripple/beast/hash/uhash.h delete mode 100644 src/ripple/beast/hash/xxhasher.h delete mode 100644 src/ripple/beast/insight/Base.h delete mode 100644 src/ripple/beast/insight/BaseImpl.h delete mode 100644 src/ripple/beast/insight/Collector.h delete mode 100644 src/ripple/beast/insight/Counter.h delete mode 100644 src/ripple/beast/insight/CounterImpl.h delete mode 100644 src/ripple/beast/insight/Event.h delete mode 100644 src/ripple/beast/insight/EventImpl.h delete mode 100644 src/ripple/beast/insight/Gauge.h delete mode 100644 src/ripple/beast/insight/GaugeImpl.h delete mode 100644 src/ripple/beast/insight/Group.h delete mode 100644 src/ripple/beast/insight/Groups.h delete mode 100644 src/ripple/beast/insight/Hook.h delete mode 100644 src/ripple/beast/insight/HookImpl.h delete mode 100644 src/ripple/beast/insight/Insight.h delete mode 100644 src/ripple/beast/insight/Meter.h delete mode 100644 src/ripple/beast/insight/MeterImpl.h delete mode 100644 src/ripple/beast/insight/NullCollector.h delete mode 100644 src/ripple/beast/insight/StatsDCollector.h delete mode 100644 src/ripple/beast/insight/impl/Collector.cpp delete mode 100644 src/ripple/beast/insight/impl/Group.cpp delete mode 100644 src/ripple/beast/insight/impl/Groups.cpp delete mode 100644 src/ripple/beast/insight/impl/Hook.cpp delete mode 100644 src/ripple/beast/insight/impl/Metric.cpp delete mode 100644 src/ripple/beast/insight/impl/NullCollector.cpp delete mode 100644 src/ripple/beast/insight/impl/StatsDCollector.cpp delete mode 100644 src/ripple/beast/net/IPAddress.h delete mode 100644 src/ripple/beast/net/IPAddressConversion.h delete mode 100644 src/ripple/beast/net/IPAddressV4.h delete mode 100644 src/ripple/beast/net/IPAddressV6.h delete mode 100644 src/ripple/beast/net/IPEndpoint.h delete mode 100644 src/ripple/beast/net/detail/Parse.h delete mode 100644 src/ripple/beast/net/impl/IPAddressConversion.cpp delete mode 100644 src/ripple/beast/net/impl/IPAddressV4.cpp delete mode 100644 src/ripple/beast/net/impl/IPAddressV6.cpp delete mode 100644 src/ripple/beast/net/impl/IPEndpoint.cpp delete mode 100644 src/ripple/beast/rfc2616.h delete mode 100644 src/ripple/beast/site_scons/Beast.py delete mode 100644 src/ripple/beast/site_scons/site_tools/Protoc.py delete mode 100644 src/ripple/beast/site_scons/site_tools/VSProject.py delete mode 100644 src/ripple/beast/type_name.h delete mode 100644 src/ripple/beast/unit_test.h delete mode 100644 src/ripple/beast/unity/beast_hash_unity.cpp delete mode 100644 src/ripple/beast/unity/beast_insight_unity.cpp delete mode 100644 src/ripple/beast/unity/beast_net_unity.cpp delete mode 100644 src/ripple/beast/unity/beast_utility_unity.cpp delete mode 100644 src/ripple/beast/utility/Debug.h delete mode 100644 src/ripple/beast/utility/Journal.h delete mode 100644 src/ripple/beast/utility/PropertyStream.h delete mode 100644 src/ripple/beast/utility/WrappedSink.h delete mode 100644 src/ripple/beast/utility/Zero.h delete mode 100644 src/ripple/beast/utility/hash_pair.h delete mode 100644 src/ripple/beast/utility/maybe_const.h delete mode 100644 src/ripple/beast/utility/rngfill.h delete mode 100644 src/ripple/beast/utility/src/beast_Debug.cpp delete mode 100644 src/ripple/beast/utility/src/beast_Journal.cpp delete mode 100644 src/ripple/beast/utility/src/beast_PropertyStream.cpp delete mode 100644 src/ripple/beast/utility/tagged_integer.h delete mode 100644 src/ripple/beast/utility/temp_dir.h delete mode 100644 src/ripple/beast/utility/weak_fn.h delete mode 100644 src/ripple/beast/xor_shift_engine.h delete mode 100644 src/ripple/conditions/Condition.h delete mode 100644 src/ripple/conditions/Ed25519.h delete mode 100644 src/ripple/conditions/Fulfillment.h delete mode 100644 src/ripple/conditions/PrefixSha256.h delete mode 100644 src/ripple/conditions/PreimageSha256.h delete mode 100644 src/ripple/conditions/RsaSha256.h delete mode 100644 src/ripple/conditions/impl/Condition.cpp delete mode 100644 src/ripple/conditions/impl/Ed25519.cpp delete mode 100644 src/ripple/conditions/impl/Fulfillment.cpp delete mode 100644 src/ripple/conditions/impl/RsaSha256.cpp delete mode 100644 src/ripple/conditions/impl/base64.h delete mode 100644 src/ripple/conditions/impl/utils.h delete mode 100644 src/ripple/core/Config.h delete mode 100644 src/ripple/core/ConfigSections.h delete mode 100644 src/ripple/core/Coro.ipp delete mode 100644 src/ripple/core/DatabaseCon.h delete mode 100644 src/ripple/core/DeadlineTimer.h delete mode 100644 src/ripple/core/Job.h delete mode 100644 src/ripple/core/JobQueue.h delete mode 100644 src/ripple/core/JobTypeData.h delete mode 100644 src/ripple/core/JobTypeInfo.h delete mode 100644 src/ripple/core/JobTypes.h delete mode 100644 src/ripple/core/LoadEvent.h delete mode 100644 src/ripple/core/LoadMonitor.h delete mode 100644 src/ripple/core/SociDB.h delete mode 100644 src/ripple/core/Stoppable.h delete mode 100644 src/ripple/core/ThreadEntry.h delete mode 100644 src/ripple/core/TimeKeeper.h delete mode 100644 src/ripple/core/impl/Config.cpp delete mode 100644 src/ripple/core/impl/DatabaseCon.cpp delete mode 100644 src/ripple/core/impl/DeadlineTimer.cpp delete mode 100644 src/ripple/core/impl/DummySociDynamicBackend.cpp delete mode 100644 src/ripple/core/impl/Job.cpp delete mode 100644 src/ripple/core/impl/JobQueue.cpp delete mode 100644 src/ripple/core/impl/LoadEvent.cpp delete mode 100644 src/ripple/core/impl/LoadMonitor.cpp delete mode 100644 src/ripple/core/impl/SNTPClock.cpp delete mode 100644 src/ripple/core/impl/SNTPClock.h delete mode 100644 src/ripple/core/impl/SociDB.cpp delete mode 100644 src/ripple/core/impl/Stoppable.cpp delete mode 100644 src/ripple/core/impl/ThreadEntry.cpp delete mode 100644 src/ripple/core/impl/TimeKeeper.cpp delete mode 100644 src/ripple/core/impl/Workers.cpp delete mode 100644 src/ripple/core/impl/Workers.h delete mode 100644 src/ripple/core/impl/semaphore.h delete mode 100644 src/ripple/crypto/GenerateDeterministicKey.h delete mode 100644 src/ripple/crypto/KeyType.h delete mode 100644 src/ripple/crypto/README.md delete mode 100644 src/ripple/crypto/RFC1751.h delete mode 100644 src/ripple/crypto/csprng.h delete mode 100644 src/ripple/crypto/impl/GenerateDeterministicKey.cpp delete mode 100644 src/ripple/crypto/impl/KeyType.cpp delete mode 100644 src/ripple/crypto/impl/RFC1751.cpp delete mode 100644 src/ripple/crypto/impl/csprng.cpp delete mode 100644 src/ripple/crypto/impl/ec_key.cpp delete mode 100644 src/ripple/crypto/impl/ec_key.h delete mode 100644 src/ripple/crypto/impl/openssl.cpp delete mode 100644 src/ripple/crypto/impl/openssl.h delete mode 100644 src/ripple/json/JsonPropertyStream.h delete mode 100644 src/ripple/json/Object.h delete mode 100644 src/ripple/json/Output.h delete mode 100644 src/ripple/json/README.md delete mode 100644 src/ripple/json/TODO.md delete mode 100644 src/ripple/json/Writer.h delete mode 100644 src/ripple/json/impl/JsonPropertyStream.cpp delete mode 100644 src/ripple/json/impl/LICENSE delete mode 100644 src/ripple/json/impl/Object.cpp delete mode 100644 src/ripple/json/impl/Output.cpp delete mode 100644 src/ripple/json/impl/Writer.cpp delete mode 100644 src/ripple/json/impl/json_assert.h delete mode 100644 src/ripple/json/impl/json_batchallocator.h delete mode 100644 src/ripple/json/impl/json_reader.cpp delete mode 100644 src/ripple/json/impl/json_value.cpp delete mode 100644 src/ripple/json/impl/json_valueiterator.cpp delete mode 100644 src/ripple/json/impl/json_writer.cpp delete mode 100644 src/ripple/json/impl/to_string.cpp delete mode 100644 src/ripple/json/impl/version delete mode 100644 src/ripple/json/json_forwards.h delete mode 100644 src/ripple/json/json_reader.h delete mode 100644 src/ripple/json/json_value.h delete mode 100644 src/ripple/json/json_writer.h delete mode 100644 src/ripple/json/to_string.h delete mode 100644 src/ripple/ledger/ApplyView.h delete mode 100644 src/ripple/ledger/ApplyViewImpl.h delete mode 100644 src/ripple/ledger/BookDirs.h delete mode 100644 src/ripple/ledger/CachedSLEs.h delete mode 100644 src/ripple/ledger/CachedView.h delete mode 100644 src/ripple/ledger/Directory.h delete mode 100644 src/ripple/ledger/OpenView.h delete mode 100644 src/ripple/ledger/PaymentSandbox.h delete mode 100644 src/ripple/ledger/RawView.h delete mode 100644 src/ripple/ledger/ReadView.h delete mode 100644 src/ripple/ledger/Sandbox.h delete mode 100644 src/ripple/ledger/TxMeta.h delete mode 100644 src/ripple/ledger/View.h delete mode 100644 src/ripple/ledger/detail/ApplyStateTable.h delete mode 100644 src/ripple/ledger/detail/ApplyViewBase.h delete mode 100644 src/ripple/ledger/detail/RawStateTable.h delete mode 100644 src/ripple/ledger/detail/ReadViewFwdRange.h delete mode 100644 src/ripple/ledger/detail/ReadViewFwdRange.ipp delete mode 100644 src/ripple/ledger/impl/ApplyStateTable.cpp delete mode 100644 src/ripple/ledger/impl/ApplyViewBase.cpp delete mode 100644 src/ripple/ledger/impl/ApplyViewImpl.cpp delete mode 100644 src/ripple/ledger/impl/BookDirs.cpp delete mode 100644 src/ripple/ledger/impl/CachedSLEs.cpp delete mode 100644 src/ripple/ledger/impl/CachedView.cpp delete mode 100644 src/ripple/ledger/impl/Directory.cpp delete mode 100644 src/ripple/ledger/impl/OpenView.cpp delete mode 100644 src/ripple/ledger/impl/PaymentSandbox.cpp delete mode 100644 src/ripple/ledger/impl/RawStateTable.cpp delete mode 100644 src/ripple/ledger/impl/ReadView.cpp delete mode 100644 src/ripple/ledger/impl/TxMeta.cpp delete mode 100644 src/ripple/ledger/impl/View.cpp delete mode 100644 src/ripple/net/AutoSocket.h delete mode 100644 src/ripple/net/HTTPClient.h delete mode 100644 src/ripple/net/InfoSub.h delete mode 100644 src/ripple/net/RPCCall.h delete mode 100644 src/ripple/net/RPCErr.h delete mode 100644 src/ripple/net/RPCSub.h delete mode 100644 src/ripple/net/impl/HTTPClient.cpp delete mode 100644 src/ripple/net/impl/InfoSub.cpp delete mode 100644 src/ripple/net/impl/RPCCall.cpp delete mode 100644 src/ripple/net/impl/RPCErr.cpp delete mode 100644 src/ripple/net/impl/RPCSub.cpp delete mode 100644 src/ripple/nodestore/Backend.h delete mode 100644 src/ripple/nodestore/Benchmarks.md delete mode 100644 src/ripple/nodestore/Database.h delete mode 100644 src/ripple/nodestore/DatabaseRotating.h delete mode 100644 src/ripple/nodestore/DummyScheduler.h delete mode 100644 src/ripple/nodestore/Factory.h delete mode 100644 src/ripple/nodestore/Manager.h delete mode 100644 src/ripple/nodestore/NodeObject.h delete mode 100644 src/ripple/nodestore/README.md delete mode 100644 src/ripple/nodestore/Scheduler.h delete mode 100644 src/ripple/nodestore/Task.h delete mode 100644 src/ripple/nodestore/Types.h delete mode 100644 src/ripple/nodestore/VisitCallback.h delete mode 100644 src/ripple/nodestore/backend/MemoryFactory.cpp delete mode 100644 src/ripple/nodestore/backend/NuDBFactory.cpp delete mode 100644 src/ripple/nodestore/backend/NullFactory.cpp delete mode 100644 src/ripple/nodestore/backend/RocksDBFactory.cpp delete mode 100644 src/ripple/nodestore/backend/RocksDBQuickFactory.cpp delete mode 100644 src/ripple/nodestore/impl/BatchWriter.cpp delete mode 100644 src/ripple/nodestore/impl/BatchWriter.h delete mode 100644 src/ripple/nodestore/impl/DatabaseImp.h delete mode 100644 src/ripple/nodestore/impl/DatabaseRotatingImp.cpp delete mode 100644 src/ripple/nodestore/impl/DatabaseRotatingImp.h delete mode 100644 src/ripple/nodestore/impl/DecodedBlob.cpp delete mode 100644 src/ripple/nodestore/impl/DecodedBlob.h delete mode 100644 src/ripple/nodestore/impl/DummyScheduler.cpp delete mode 100644 src/ripple/nodestore/impl/EncodedBlob.cpp delete mode 100644 src/ripple/nodestore/impl/EncodedBlob.h delete mode 100644 src/ripple/nodestore/impl/ManagerImp.cpp delete mode 100644 src/ripple/nodestore/impl/ManagerImp.h delete mode 100644 src/ripple/nodestore/impl/NodeObject.cpp delete mode 100644 src/ripple/nodestore/impl/Tuning.h delete mode 100644 src/ripple/nodestore/impl/codec.h delete mode 100644 src/ripple/nodestore/impl/varint.h delete mode 100644 src/ripple/overlay/Cluster.h delete mode 100644 src/ripple/overlay/ClusterNode.h delete mode 100644 src/ripple/overlay/Message.h delete mode 100644 src/ripple/overlay/Overlay.h delete mode 100644 src/ripple/overlay/Peer.h delete mode 100644 src/ripple/overlay/PeerSet.h delete mode 100644 src/ripple/overlay/README.md delete mode 100644 src/ripple/overlay/TODO.md delete mode 100644 src/ripple/overlay/impl/Cluster.cpp delete mode 100644 src/ripple/overlay/impl/ConnectAttempt.cpp delete mode 100644 src/ripple/overlay/impl/ConnectAttempt.h delete mode 100644 src/ripple/overlay/impl/Manifest.cpp delete mode 100644 src/ripple/overlay/impl/Manifest.h delete mode 100644 src/ripple/overlay/impl/Message.cpp delete mode 100644 src/ripple/overlay/impl/OverlayImpl.cpp delete mode 100644 src/ripple/overlay/impl/OverlayImpl.h delete mode 100644 src/ripple/overlay/impl/PeerImp.cpp delete mode 100644 src/ripple/overlay/impl/PeerImp.h delete mode 100644 src/ripple/overlay/impl/PeerSet.cpp delete mode 100644 src/ripple/overlay/impl/ProtocolMessage.h delete mode 100644 src/ripple/overlay/impl/TMHello.cpp delete mode 100644 src/ripple/overlay/impl/TMHello.h delete mode 100644 src/ripple/overlay/impl/TrafficCount.cpp delete mode 100644 src/ripple/overlay/impl/TrafficCount.h delete mode 100644 src/ripple/overlay/impl/Tuning.h delete mode 100644 src/ripple/overlay/impl/ZeroCopyStream.h delete mode 100644 src/ripple/overlay/make_Overlay.h delete mode 100644 src/ripple/overlay/predicates.h delete mode 100644 src/ripple/peerfinder/PeerfinderManager.h delete mode 100644 src/ripple/peerfinder/README.md delete mode 100644 src/ripple/peerfinder/Slot.h delete mode 100644 src/ripple/peerfinder/impl/Bootcache.cpp delete mode 100644 src/ripple/peerfinder/impl/Bootcache.h delete mode 100644 src/ripple/peerfinder/impl/Checker.h delete mode 100644 src/ripple/peerfinder/impl/Counts.h delete mode 100644 src/ripple/peerfinder/impl/Endpoint.cpp delete mode 100644 src/ripple/peerfinder/impl/Fixed.h delete mode 100644 src/ripple/peerfinder/impl/Handouts.h delete mode 100644 src/ripple/peerfinder/impl/Livecache.h delete mode 100644 src/ripple/peerfinder/impl/Logic.h delete mode 100644 src/ripple/peerfinder/impl/PeerfinderConfig.cpp delete mode 100644 src/ripple/peerfinder/impl/PeerfinderManager.cpp delete mode 100644 src/ripple/peerfinder/impl/PrivateTypes.h delete mode 100644 src/ripple/peerfinder/impl/Reporting.h delete mode 100644 src/ripple/peerfinder/impl/SlotImp.cpp delete mode 100644 src/ripple/peerfinder/impl/SlotImp.h delete mode 100644 src/ripple/peerfinder/impl/Source.h delete mode 100644 src/ripple/peerfinder/impl/SourceStrings.cpp delete mode 100644 src/ripple/peerfinder/impl/SourceStrings.h delete mode 100644 src/ripple/peerfinder/impl/Store.h delete mode 100644 src/ripple/peerfinder/impl/StoreSqdb.h delete mode 100644 src/ripple/peerfinder/impl/Tuning.h delete mode 100644 src/ripple/peerfinder/impl/iosformat.h delete mode 100644 src/ripple/peerfinder/make_Manager.h delete mode 100644 src/ripple/peerfinder/sim/FunctionQueue.h delete mode 100644 src/ripple/peerfinder/sim/GraphAlgorithms.h delete mode 100644 src/ripple/peerfinder/sim/Message.h delete mode 100644 src/ripple/peerfinder/sim/NodeSnapshot.h delete mode 100644 src/ripple/peerfinder/sim/Params.h delete mode 100644 src/ripple/peerfinder/sim/Predicates.h delete mode 100644 src/ripple/proto/README.md delete mode 100644 src/ripple/proto/ripple.proto delete mode 100644 src/ripple/protocol/AccountID.h delete mode 100644 src/ripple/protocol/AmountConversions.h delete mode 100644 src/ripple/protocol/Book.h delete mode 100644 src/ripple/protocol/BuildInfo.h delete mode 100644 src/ripple/protocol/ErrorCodes.h delete mode 100644 src/ripple/protocol/Feature.h delete mode 100644 src/ripple/protocol/HashPrefix.h delete mode 100644 src/ripple/protocol/IOUAmount.h delete mode 100644 src/ripple/protocol/Indexes.h delete mode 100755 src/ripple/protocol/InnerObjectFormats.h delete mode 100644 src/ripple/protocol/Issue.h delete mode 100644 src/ripple/protocol/JsonFields.h delete mode 100644 src/ripple/protocol/Keylet.h delete mode 100644 src/ripple/protocol/KnownFormats.h delete mode 100644 src/ripple/protocol/LedgerFormats.h delete mode 100644 src/ripple/protocol/PayChan.h delete mode 100644 src/ripple/protocol/Protocol.h delete mode 100644 src/ripple/protocol/PublicKey.h delete mode 100644 src/ripple/protocol/Quality.h delete mode 100644 src/ripple/protocol/README.md delete mode 100644 src/ripple/protocol/Rate.h delete mode 100644 src/ripple/protocol/RippleLedgerHash.h delete mode 100644 src/ripple/protocol/SField.h delete mode 100644 src/ripple/protocol/SOTemplate.h delete mode 100644 src/ripple/protocol/STAccount.h delete mode 100644 src/ripple/protocol/STAmount.h delete mode 100644 src/ripple/protocol/STArray.h delete mode 100644 src/ripple/protocol/STBase.h delete mode 100644 src/ripple/protocol/STBitString.h delete mode 100644 src/ripple/protocol/STBlob.h delete mode 100644 src/ripple/protocol/STExchange.h delete mode 100644 src/ripple/protocol/STInteger.h delete mode 100644 src/ripple/protocol/STLedgerEntry.h delete mode 100644 src/ripple/protocol/STObject.h delete mode 100644 src/ripple/protocol/STParsedJSON.h delete mode 100644 src/ripple/protocol/STPathSet.h delete mode 100644 src/ripple/protocol/STTx.h delete mode 100644 src/ripple/protocol/STValidation.h delete mode 100644 src/ripple/protocol/STVector256.h delete mode 100644 src/ripple/protocol/SecretKey.h delete mode 100644 src/ripple/protocol/Seed.h delete mode 100644 src/ripple/protocol/Serializer.h delete mode 100644 src/ripple/protocol/Sign.h delete mode 100644 src/ripple/protocol/SystemParameters.h delete mode 100644 src/ripple/protocol/TER.h delete mode 100644 src/ripple/protocol/TxFlags.h delete mode 100644 src/ripple/protocol/TxFormats.h delete mode 100644 src/ripple/protocol/UintTypes.h delete mode 100644 src/ripple/protocol/XRPAmount.h delete mode 100644 src/ripple/protocol/digest.h delete mode 100644 src/ripple/protocol/impl/AccountID.cpp delete mode 100644 src/ripple/protocol/impl/Book.cpp delete mode 100644 src/ripple/protocol/impl/BuildInfo.cpp delete mode 100644 src/ripple/protocol/impl/ByteOrder.cpp delete mode 100644 src/ripple/protocol/impl/ErrorCodes.cpp delete mode 100644 src/ripple/protocol/impl/Feature.cpp delete mode 100644 src/ripple/protocol/impl/HashPrefix.cpp delete mode 100644 src/ripple/protocol/impl/IOUAmount.cpp delete mode 100644 src/ripple/protocol/impl/Indexes.cpp delete mode 100755 src/ripple/protocol/impl/InnerObjectFormats.cpp delete mode 100644 src/ripple/protocol/impl/Issue.cpp delete mode 100644 src/ripple/protocol/impl/Keylet.cpp delete mode 100644 src/ripple/protocol/impl/LedgerFormats.cpp delete mode 100644 src/ripple/protocol/impl/PublicKey.cpp delete mode 100644 src/ripple/protocol/impl/Quality.cpp delete mode 100644 src/ripple/protocol/impl/Rate2.cpp delete mode 100644 src/ripple/protocol/impl/SField.cpp delete mode 100644 src/ripple/protocol/impl/SOTemplate.cpp delete mode 100644 src/ripple/protocol/impl/STAccount.cpp delete mode 100644 src/ripple/protocol/impl/STAmount.cpp delete mode 100644 src/ripple/protocol/impl/STArray.cpp delete mode 100644 src/ripple/protocol/impl/STBase.cpp delete mode 100644 src/ripple/protocol/impl/STBlob.cpp delete mode 100644 src/ripple/protocol/impl/STInteger.cpp delete mode 100644 src/ripple/protocol/impl/STLedgerEntry.cpp delete mode 100644 src/ripple/protocol/impl/STObject.cpp delete mode 100644 src/ripple/protocol/impl/STParsedJSON.cpp delete mode 100644 src/ripple/protocol/impl/STPathSet.cpp delete mode 100644 src/ripple/protocol/impl/STTx.cpp delete mode 100644 src/ripple/protocol/impl/STValidation.cpp delete mode 100644 src/ripple/protocol/impl/STVar.cpp delete mode 100644 src/ripple/protocol/impl/STVar.h delete mode 100644 src/ripple/protocol/impl/STVector256.cpp delete mode 100644 src/ripple/protocol/impl/SecretKey.cpp delete mode 100644 src/ripple/protocol/impl/Seed.cpp delete mode 100644 src/ripple/protocol/impl/Serializer.cpp delete mode 100644 src/ripple/protocol/impl/Sign.cpp delete mode 100644 src/ripple/protocol/impl/TER.cpp delete mode 100644 src/ripple/protocol/impl/TxFormats.cpp delete mode 100644 src/ripple/protocol/impl/UintTypes.cpp delete mode 100644 src/ripple/protocol/impl/digest.cpp delete mode 100644 src/ripple/protocol/impl/secp256k1.h delete mode 100644 src/ripple/protocol/impl/tokens.cpp delete mode 100644 src/ripple/protocol/st.h delete mode 100644 src/ripple/protocol/tokens.h delete mode 100644 src/ripple/protocol/types.h delete mode 100644 src/ripple/resource/Charge.h delete mode 100644 src/ripple/resource/Consumer.h delete mode 100644 src/ripple/resource/Disposition.h delete mode 100644 src/ripple/resource/Fees.h delete mode 100644 src/ripple/resource/Gossip.h delete mode 100644 src/ripple/resource/README.md delete mode 100644 src/ripple/resource/ResourceManager.h delete mode 100644 src/ripple/resource/Types.h delete mode 100644 src/ripple/resource/impl/Charge.cpp delete mode 100644 src/ripple/resource/impl/Consumer.cpp delete mode 100644 src/ripple/resource/impl/Entry.h delete mode 100644 src/ripple/resource/impl/Fees.cpp delete mode 100644 src/ripple/resource/impl/Import.h delete mode 100644 src/ripple/resource/impl/Key.h delete mode 100644 src/ripple/resource/impl/Kind.h delete mode 100644 src/ripple/resource/impl/Logic.h delete mode 100644 src/ripple/resource/impl/ResourceManager.cpp delete mode 100644 src/ripple/resource/impl/Tuning.h delete mode 100644 src/ripple/rpc/Context.h delete mode 100644 src/ripple/rpc/Output.h delete mode 100644 src/ripple/rpc/README.md delete mode 100644 src/ripple/rpc/RPCHandler.h delete mode 100644 src/ripple/rpc/Request.h delete mode 100644 src/ripple/rpc/Role.h delete mode 100644 src/ripple/rpc/ServerHandler.h delete mode 100644 src/ripple/rpc/Status.h delete mode 100644 src/ripple/rpc/handlers/AccountChannels.cpp delete mode 100644 src/ripple/rpc/handlers/AccountCurrenciesHandler.cpp delete mode 100644 src/ripple/rpc/handlers/AccountInfo.cpp delete mode 100644 src/ripple/rpc/handlers/AccountLines.cpp delete mode 100644 src/ripple/rpc/handlers/AccountObjects.cpp delete mode 100644 src/ripple/rpc/handlers/AccountOffers.cpp delete mode 100644 src/ripple/rpc/handlers/AccountTx.cpp delete mode 100644 src/ripple/rpc/handlers/AccountTxOld.cpp delete mode 100644 src/ripple/rpc/handlers/AccountTxSwitch.cpp delete mode 100644 src/ripple/rpc/handlers/BlackList.cpp delete mode 100644 src/ripple/rpc/handlers/BookOffers.cpp delete mode 100644 src/ripple/rpc/handlers/CanDelete.cpp delete mode 100644 src/ripple/rpc/handlers/Connect.cpp delete mode 100644 src/ripple/rpc/handlers/ConsensusInfo.cpp delete mode 100644 src/ripple/rpc/handlers/Feature1.cpp delete mode 100644 src/ripple/rpc/handlers/Fee1.cpp delete mode 100644 src/ripple/rpc/handlers/FetchInfo.cpp delete mode 100644 src/ripple/rpc/handlers/GatewayBalances.cpp delete mode 100644 src/ripple/rpc/handlers/GetCounts.cpp delete mode 100644 src/ripple/rpc/handlers/Handlers.h delete mode 100644 src/ripple/rpc/handlers/LedgerAccept.cpp delete mode 100644 src/ripple/rpc/handlers/LedgerCleanerHandler.cpp delete mode 100644 src/ripple/rpc/handlers/LedgerClosed.cpp delete mode 100644 src/ripple/rpc/handlers/LedgerCurrent.cpp delete mode 100644 src/ripple/rpc/handlers/LedgerData.cpp delete mode 100644 src/ripple/rpc/handlers/LedgerEntry.cpp delete mode 100644 src/ripple/rpc/handlers/LedgerHandler.cpp delete mode 100644 src/ripple/rpc/handlers/LedgerHandler.h delete mode 100644 src/ripple/rpc/handlers/LedgerHeader.cpp delete mode 100644 src/ripple/rpc/handlers/LedgerRequest.cpp delete mode 100644 src/ripple/rpc/handlers/LogLevel.cpp delete mode 100644 src/ripple/rpc/handlers/LogRotate.cpp delete mode 100644 src/ripple/rpc/handlers/NoRippleCheck.cpp delete mode 100644 src/ripple/rpc/handlers/OwnerInfo.cpp delete mode 100644 src/ripple/rpc/handlers/PathFind.cpp delete mode 100644 src/ripple/rpc/handlers/PayChanClaim.cpp delete mode 100644 src/ripple/rpc/handlers/Peers.cpp delete mode 100644 src/ripple/rpc/handlers/Ping.cpp delete mode 100644 src/ripple/rpc/handlers/Print.cpp delete mode 100644 src/ripple/rpc/handlers/Random.cpp delete mode 100644 src/ripple/rpc/handlers/RipplePathFind.cpp delete mode 100644 src/ripple/rpc/handlers/ServerInfo.cpp delete mode 100644 src/ripple/rpc/handlers/ServerState.cpp delete mode 100755 src/ripple/rpc/handlers/SignFor.cpp delete mode 100644 src/ripple/rpc/handlers/SignHandler.cpp delete mode 100644 src/ripple/rpc/handlers/Stop.cpp delete mode 100644 src/ripple/rpc/handlers/Submit.cpp delete mode 100644 src/ripple/rpc/handlers/SubmitMultiSigned.cpp delete mode 100644 src/ripple/rpc/handlers/Subscribe.cpp delete mode 100644 src/ripple/rpc/handlers/TransactionEntry.cpp delete mode 100644 src/ripple/rpc/handlers/Tx.cpp delete mode 100644 src/ripple/rpc/handlers/TxHistory.cpp delete mode 100644 src/ripple/rpc/handlers/UnlAdd.cpp delete mode 100644 src/ripple/rpc/handlers/UnlDelete.cpp delete mode 100644 src/ripple/rpc/handlers/UnlList.cpp delete mode 100644 src/ripple/rpc/handlers/Unsubscribe.cpp delete mode 100644 src/ripple/rpc/handlers/ValidationCreate.cpp delete mode 100644 src/ripple/rpc/handlers/ValidationSeed.cpp delete mode 100644 src/ripple/rpc/handlers/Version.h delete mode 100644 src/ripple/rpc/handlers/WalletPropose.cpp delete mode 100644 src/ripple/rpc/handlers/WalletPropose.h delete mode 100644 src/ripple/rpc/handlers/WalletSeed.cpp delete mode 100644 src/ripple/rpc/impl/Handler.cpp delete mode 100644 src/ripple/rpc/impl/Handler.h delete mode 100644 src/ripple/rpc/impl/LegacyPathFind.cpp delete mode 100644 src/ripple/rpc/impl/LegacyPathFind.h delete mode 100644 src/ripple/rpc/impl/RPCHandler.cpp delete mode 100644 src/ripple/rpc/impl/RPCHelpers.cpp delete mode 100644 src/ripple/rpc/impl/RPCHelpers.h delete mode 100644 src/ripple/rpc/impl/Role.cpp delete mode 100644 src/ripple/rpc/impl/ServerHandlerImp.cpp delete mode 100644 src/ripple/rpc/impl/ServerHandlerImp.h delete mode 100644 src/ripple/rpc/impl/Status.cpp delete mode 100644 src/ripple/rpc/impl/TransactionSign.cpp delete mode 100644 src/ripple/rpc/impl/TransactionSign.h delete mode 100644 src/ripple/rpc/impl/Tuning.h delete mode 100644 src/ripple/rpc/impl/WSInfoSub.h delete mode 100644 src/ripple/rpc/json_body.h delete mode 100644 src/ripple/server/Handoff.h delete mode 100644 src/ripple/server/Port.h delete mode 100644 src/ripple/server/Server.h delete mode 100644 src/ripple/server/Session.h delete mode 100644 src/ripple/server/SimpleWriter.h delete mode 100644 src/ripple/server/WSSession.h delete mode 100644 src/ripple/server/Writer.h delete mode 100644 src/ripple/server/impl/BaseHTTPPeer.h delete mode 100644 src/ripple/server/impl/BasePeer.h delete mode 100644 src/ripple/server/impl/BaseWSPeer.h delete mode 100644 src/ripple/server/impl/Door.h delete mode 100644 src/ripple/server/impl/JSONRPCUtil.cpp delete mode 100644 src/ripple/server/impl/JSONRPCUtil.h delete mode 100644 src/ripple/server/impl/PlainHTTPPeer.h delete mode 100644 src/ripple/server/impl/PlainWSPeer.h delete mode 100644 src/ripple/server/impl/Port.cpp delete mode 100644 src/ripple/server/impl/SSLHTTPPeer.h delete mode 100644 src/ripple/server/impl/SSLWSPeer.h delete mode 100644 src/ripple/server/impl/ServerImpl.h delete mode 100644 src/ripple/server/impl/io_list.h delete mode 100644 src/ripple/shamap/Family.h delete mode 100644 src/ripple/shamap/FullBelowCache.h delete mode 100644 src/ripple/shamap/README.md delete mode 100644 src/ripple/shamap/SHAMap.h delete mode 100644 src/ripple/shamap/SHAMapAddNode.h delete mode 100644 src/ripple/shamap/SHAMapItem.h delete mode 100644 src/ripple/shamap/SHAMapMissingNode.h delete mode 100644 src/ripple/shamap/SHAMapNodeID.h delete mode 100644 src/ripple/shamap/SHAMapSyncFilter.h delete mode 100644 src/ripple/shamap/SHAMapTreeNode.h delete mode 100644 src/ripple/shamap/TreeNodeCache.h delete mode 100644 src/ripple/shamap/impl/SHAMap.cpp delete mode 100644 src/ripple/shamap/impl/SHAMapDelta.cpp delete mode 100644 src/ripple/shamap/impl/SHAMapItem.cpp delete mode 100644 src/ripple/shamap/impl/SHAMapMissingNode.cpp delete mode 100644 src/ripple/shamap/impl/SHAMapNodeID.cpp delete mode 100644 src/ripple/shamap/impl/SHAMapSync.cpp delete mode 100644 src/ripple/shamap/impl/SHAMapTreeNode.cpp delete mode 100644 src/ripple/site_scons/scons_to_ninja.py delete mode 100644 src/ripple/unity/app_ledger.cpp delete mode 100644 src/ripple/unity/app_main.cpp delete mode 100644 src/ripple/unity/app_misc.cpp delete mode 100644 src/ripple/unity/app_paths.cpp delete mode 100644 src/ripple/unity/app_tx.cpp delete mode 100644 src/ripple/unity/basics.cpp delete mode 100644 src/ripple/unity/beast.cpp delete mode 100644 src/ripple/unity/beastobjc.mm delete mode 100644 src/ripple/unity/conditions.cpp delete mode 100644 src/ripple/unity/core.cpp delete mode 100644 src/ripple/unity/crypto.cpp delete mode 100644 src/ripple/unity/ed25519_donna.c delete mode 100644 src/ripple/unity/hyperleveldb.h delete mode 100644 src/ripple/unity/json.cpp delete mode 100644 src/ripple/unity/ledger.cpp delete mode 100644 src/ripple/unity/leveldb.h delete mode 100644 src/ripple/unity/lz4.c delete mode 100644 src/ripple/unity/net.cpp delete mode 100644 src/ripple/unity/nodestore.cpp delete mode 100644 src/ripple/unity/overlay.cpp delete mode 100644 src/ripple/unity/peerfinder.cpp delete mode 100644 src/ripple/unity/protobuf.cpp delete mode 100644 src/ripple/unity/protocol.cpp delete mode 100644 src/ripple/unity/resource.cpp delete mode 100644 src/ripple/unity/ripple.proto.cpp delete mode 100644 src/ripple/unity/rocksdb.cpp delete mode 100644 src/ripple/unity/rocksdb.h delete mode 100644 src/ripple/unity/rpcx.cpp delete mode 100644 src/ripple/unity/secp256k1.cpp delete mode 100644 src/ripple/unity/server.cpp delete mode 100644 src/ripple/unity/shamap.cpp delete mode 100644 src/ripple/unity/snappy.cpp delete mode 100644 src/ripple/unity/soci.cpp delete mode 100644 src/ripple/unity/soci_ripple.cpp delete mode 100644 src/ripple/validators/ValidatorManager.h delete mode 100644 src/ripple/validators/impl/ValidatorManager.cpp delete mode 100644 src/rocksdb2/.arcconfig delete mode 100644 src/rocksdb2/.clang-format delete mode 100644 src/rocksdb2/.gitignore delete mode 100644 src/rocksdb2/.travis.yml delete mode 100644 src/rocksdb2/CONTRIBUTING.md delete mode 100644 src/rocksdb2/HISTORY.md delete mode 100644 src/rocksdb2/INSTALL.md delete mode 100644 src/rocksdb2/LICENSE delete mode 100644 src/rocksdb2/Makefile delete mode 100644 src/rocksdb2/PATENTS delete mode 100644 src/rocksdb2/README.md delete mode 100644 src/rocksdb2/ROCKSDB_LITE.md delete mode 100755 src/rocksdb2/build_tools/build_detect_platform delete mode 100755 src/rocksdb2/build_tools/build_detect_version delete mode 100644 src/rocksdb2/build_tools/fbcode.clang31.sh delete mode 100644 src/rocksdb2/build_tools/fbcode.gcc471.sh delete mode 100644 src/rocksdb2/build_tools/fbcode.gcc481.sh delete mode 100755 src/rocksdb2/build_tools/format-diff.sh delete mode 100755 src/rocksdb2/build_tools/mac-install-gflags.sh delete mode 100755 src/rocksdb2/build_tools/make_new_version.sh delete mode 100755 src/rocksdb2/build_tools/regression_build_test.sh delete mode 100755 src/rocksdb2/build_tools/unity delete mode 100755 src/rocksdb2/build_tools/valgrind_test.sh delete mode 100755 src/rocksdb2/coverage/coverage_test.sh delete mode 100644 src/rocksdb2/coverage/parse_gcov_output.py delete mode 100644 src/rocksdb2/db/builder.cc delete mode 100644 src/rocksdb2/db/builder.h delete mode 100644 src/rocksdb2/db/c.cc delete mode 100644 src/rocksdb2/db/c_test.c delete mode 100644 src/rocksdb2/db/column_family.cc delete mode 100644 src/rocksdb2/db/column_family.h delete mode 100644 src/rocksdb2/db/column_family_test.cc delete mode 100644 src/rocksdb2/db/compaction.cc delete mode 100644 src/rocksdb2/db/compaction.h delete mode 100644 src/rocksdb2/db/compaction_picker.cc delete mode 100644 src/rocksdb2/db/compaction_picker.h delete mode 100644 src/rocksdb2/db/corruption_test.cc delete mode 100644 src/rocksdb2/db/cuckoo_table_db_test.cc delete mode 100644 src/rocksdb2/db/db_bench.cc delete mode 100644 src/rocksdb2/db/db_filesnapshot.cc delete mode 100644 src/rocksdb2/db/db_impl.cc delete mode 100644 src/rocksdb2/db/db_impl.h delete mode 100644 src/rocksdb2/db/db_impl_debug.cc delete mode 100644 src/rocksdb2/db/db_impl_readonly.cc delete mode 100644 src/rocksdb2/db/db_impl_readonly.h delete mode 100644 src/rocksdb2/db/db_iter.cc delete mode 100644 src/rocksdb2/db/db_iter.h delete mode 100644 src/rocksdb2/db/db_iter_test.cc delete mode 100644 src/rocksdb2/db/db_test.cc delete mode 100644 src/rocksdb2/db/dbformat.cc delete mode 100644 src/rocksdb2/db/dbformat.h delete mode 100644 src/rocksdb2/db/dbformat_test.cc delete mode 100644 src/rocksdb2/db/deletefile_test.cc delete mode 100644 src/rocksdb2/db/file_indexer.cc delete mode 100644 src/rocksdb2/db/file_indexer.h delete mode 100644 src/rocksdb2/db/file_indexer_test.cc delete mode 100644 src/rocksdb2/db/filename.cc delete mode 100644 src/rocksdb2/db/filename.h delete mode 100644 src/rocksdb2/db/filename_test.cc delete mode 100644 src/rocksdb2/db/forward_iterator.cc delete mode 100644 src/rocksdb2/db/forward_iterator.h delete mode 100644 src/rocksdb2/db/internal_stats.cc delete mode 100644 src/rocksdb2/db/internal_stats.h delete mode 100644 src/rocksdb2/db/log_and_apply_bench.cc delete mode 100644 src/rocksdb2/db/log_format.h delete mode 100644 src/rocksdb2/db/log_reader.cc delete mode 100644 src/rocksdb2/db/log_reader.h delete mode 100644 src/rocksdb2/db/log_test.cc delete mode 100644 src/rocksdb2/db/log_writer.cc delete mode 100644 src/rocksdb2/db/log_writer.h delete mode 100644 src/rocksdb2/db/memtable.cc delete mode 100644 src/rocksdb2/db/memtable.h delete mode 100644 src/rocksdb2/db/memtable_list.cc delete mode 100644 src/rocksdb2/db/memtable_list.h delete mode 100644 src/rocksdb2/db/merge_context.h delete mode 100644 src/rocksdb2/db/merge_helper.cc delete mode 100644 src/rocksdb2/db/merge_helper.h delete mode 100644 src/rocksdb2/db/merge_operator.cc delete mode 100644 src/rocksdb2/db/merge_test.cc delete mode 100644 src/rocksdb2/db/perf_context_test.cc delete mode 100644 src/rocksdb2/db/plain_table_db_test.cc delete mode 100644 src/rocksdb2/db/prefix_test.cc delete mode 100644 src/rocksdb2/db/repair.cc delete mode 100644 src/rocksdb2/db/simple_table_db_test.cc delete mode 100644 src/rocksdb2/db/skiplist.h delete mode 100644 src/rocksdb2/db/skiplist_test.cc delete mode 100644 src/rocksdb2/db/snapshot.h delete mode 100644 src/rocksdb2/db/table_cache.cc delete mode 100644 src/rocksdb2/db/table_cache.h delete mode 100644 src/rocksdb2/db/table_properties_collector.cc delete mode 100644 src/rocksdb2/db/table_properties_collector.h delete mode 100644 src/rocksdb2/db/table_properties_collector_test.cc delete mode 100644 src/rocksdb2/db/transaction_log_impl.cc delete mode 100644 src/rocksdb2/db/transaction_log_impl.h delete mode 100644 src/rocksdb2/db/version_edit.cc delete mode 100644 src/rocksdb2/db/version_edit.h delete mode 100644 src/rocksdb2/db/version_edit_test.cc delete mode 100644 src/rocksdb2/db/version_set.cc delete mode 100644 src/rocksdb2/db/version_set.h delete mode 100644 src/rocksdb2/db/version_set_test.cc delete mode 100644 src/rocksdb2/db/write_batch.cc delete mode 100644 src/rocksdb2/db/write_batch_internal.h delete mode 100644 src/rocksdb2/db/write_batch_test.cc delete mode 100644 src/rocksdb2/doc/doc.css delete mode 100644 src/rocksdb2/doc/index.html delete mode 100644 src/rocksdb2/doc/log_format.txt delete mode 100644 src/rocksdb2/doc/rockslogo.jpg delete mode 100644 src/rocksdb2/doc/rockslogo.png delete mode 100644 src/rocksdb2/examples/.gitignore delete mode 100644 src/rocksdb2/examples/Makefile delete mode 100644 src/rocksdb2/examples/README.md delete mode 100644 src/rocksdb2/examples/column_families_example.cc delete mode 100644 src/rocksdb2/examples/simple_example.cc delete mode 100644 src/rocksdb2/hdfs/README delete mode 100644 src/rocksdb2/hdfs/env_hdfs.h delete mode 100644 src/rocksdb2/hdfs/setup.sh delete mode 100644 src/rocksdb2/helpers/memenv/memenv.cc delete mode 100644 src/rocksdb2/helpers/memenv/memenv_test.cc delete mode 100644 src/rocksdb2/include/rocksdb/c.h delete mode 100644 src/rocksdb2/include/rocksdb/cache.h delete mode 100644 src/rocksdb2/include/rocksdb/compaction_filter.h delete mode 100644 src/rocksdb2/include/rocksdb/comparator.h delete mode 100644 src/rocksdb2/include/rocksdb/db.h delete mode 100644 src/rocksdb2/include/rocksdb/env.h delete mode 100644 src/rocksdb2/include/rocksdb/filter_policy.h delete mode 100644 src/rocksdb2/include/rocksdb/flush_block_policy.h delete mode 100644 src/rocksdb2/include/rocksdb/iostats_context.h delete mode 100644 src/rocksdb2/include/rocksdb/iterator.h delete mode 100644 src/rocksdb2/include/rocksdb/ldb_tool.h delete mode 100644 src/rocksdb2/include/rocksdb/memtablerep.h delete mode 100644 src/rocksdb2/include/rocksdb/merge_operator.h delete mode 100644 src/rocksdb2/include/rocksdb/options.h delete mode 100644 src/rocksdb2/include/rocksdb/perf_context.h delete mode 100644 src/rocksdb2/include/rocksdb/rate_limiter.h delete mode 100644 src/rocksdb2/include/rocksdb/slice.h delete mode 100644 src/rocksdb2/include/rocksdb/slice_transform.h delete mode 100644 src/rocksdb2/include/rocksdb/statistics.h delete mode 100644 src/rocksdb2/include/rocksdb/status.h delete mode 100644 src/rocksdb2/include/rocksdb/table.h delete mode 100644 src/rocksdb2/include/rocksdb/table_properties.h delete mode 100644 src/rocksdb2/include/rocksdb/transaction_log.h delete mode 100644 src/rocksdb2/include/rocksdb/types.h delete mode 100644 src/rocksdb2/include/rocksdb/universal_compaction.h delete mode 100644 src/rocksdb2/include/rocksdb/utilities/backupable_db.h delete mode 100644 src/rocksdb2/include/rocksdb/utilities/db_ttl.h delete mode 100644 src/rocksdb2/include/rocksdb/utilities/document_db.h delete mode 100644 src/rocksdb2/include/rocksdb/utilities/geo_db.h delete mode 100644 src/rocksdb2/include/rocksdb/utilities/json_document.h delete mode 100644 src/rocksdb2/include/rocksdb/utilities/spatial_db.h delete mode 100644 src/rocksdb2/include/rocksdb/utilities/stackable_db.h delete mode 100644 src/rocksdb2/include/rocksdb/utilities/utility_db.h delete mode 100644 src/rocksdb2/include/rocksdb/utilities/write_batch_with_index.h delete mode 100644 src/rocksdb2/include/rocksdb/version.h delete mode 100644 src/rocksdb2/include/rocksdb/write_batch.h delete mode 100644 src/rocksdb2/include/utilities/backupable_db.h delete mode 100644 src/rocksdb2/include/utilities/db_ttl.h delete mode 100644 src/rocksdb2/include/utilities/document_db.h delete mode 100644 src/rocksdb2/include/utilities/geo_db.h delete mode 100644 src/rocksdb2/include/utilities/json_document.h delete mode 100644 src/rocksdb2/include/utilities/stackable_db.h delete mode 100644 src/rocksdb2/include/utilities/utility_db.h delete mode 100644 src/rocksdb2/java/HISTORY-JAVA.md delete mode 100644 src/rocksdb2/java/Makefile delete mode 100644 src/rocksdb2/java/RocksDBSample.java delete mode 100755 src/rocksdb2/java/jdb_bench.sh delete mode 100644 src/rocksdb2/java/org/rocksdb/BackupableDB.java delete mode 100644 src/rocksdb2/java/org/rocksdb/BackupableDBOptions.java delete mode 100644 src/rocksdb2/java/org/rocksdb/BlockBasedTableConfig.java delete mode 100644 src/rocksdb2/java/org/rocksdb/BloomFilter.java delete mode 100644 src/rocksdb2/java/org/rocksdb/CompactionStyle.java delete mode 100644 src/rocksdb2/java/org/rocksdb/CompressionType.java delete mode 100644 src/rocksdb2/java/org/rocksdb/Filter.java delete mode 100644 src/rocksdb2/java/org/rocksdb/HashLinkedListMemTableConfig.java delete mode 100644 src/rocksdb2/java/org/rocksdb/HashSkipListMemTableConfig.java delete mode 100644 src/rocksdb2/java/org/rocksdb/HistogramData.java delete mode 100644 src/rocksdb2/java/org/rocksdb/HistogramType.java delete mode 100644 src/rocksdb2/java/org/rocksdb/MemTableConfig.java delete mode 100644 src/rocksdb2/java/org/rocksdb/Options.java delete mode 100644 src/rocksdb2/java/org/rocksdb/PlainTableConfig.java delete mode 100644 src/rocksdb2/java/org/rocksdb/ReadOptions.java delete mode 100644 src/rocksdb2/java/org/rocksdb/RestoreBackupableDB.java delete mode 100644 src/rocksdb2/java/org/rocksdb/RestoreOptions.java delete mode 100644 src/rocksdb2/java/org/rocksdb/RocksDB.java delete mode 100644 src/rocksdb2/java/org/rocksdb/RocksDBException.java delete mode 100644 src/rocksdb2/java/org/rocksdb/RocksEnv.java delete mode 100644 src/rocksdb2/java/org/rocksdb/RocksIterator.java delete mode 100644 src/rocksdb2/java/org/rocksdb/RocksObject.java delete mode 100644 src/rocksdb2/java/org/rocksdb/SkipListMemTableConfig.java delete mode 100644 src/rocksdb2/java/org/rocksdb/Statistics.java delete mode 100644 src/rocksdb2/java/org/rocksdb/StatisticsCollector.java delete mode 100644 src/rocksdb2/java/org/rocksdb/StatisticsCollectorCallback.java delete mode 100644 src/rocksdb2/java/org/rocksdb/StatsCollectorInput.java delete mode 100644 src/rocksdb2/java/org/rocksdb/TableFormatConfig.java delete mode 100644 src/rocksdb2/java/org/rocksdb/TickerType.java delete mode 100644 src/rocksdb2/java/org/rocksdb/VectorMemTableConfig.java delete mode 100644 src/rocksdb2/java/org/rocksdb/WriteBatch.java delete mode 100644 src/rocksdb2/java/org/rocksdb/WriteBatchTest.java delete mode 100644 src/rocksdb2/java/org/rocksdb/WriteOptions.java delete mode 100644 src/rocksdb2/java/org/rocksdb/benchmark/DbBenchmark.java delete mode 100644 src/rocksdb2/java/org/rocksdb/test/BackupableDBTest.java delete mode 100644 src/rocksdb2/java/org/rocksdb/test/OptionsTest.java delete mode 100644 src/rocksdb2/java/org/rocksdb/test/ReadOptionsTest.java delete mode 100644 src/rocksdb2/java/org/rocksdb/test/StatisticsCollectorTest.java delete mode 100644 src/rocksdb2/java/org/rocksdb/test/StatsCallbackMock.java delete mode 100644 src/rocksdb2/java/org/rocksdb/util/Environment.java delete mode 100644 src/rocksdb2/java/org/rocksdb/util/SizeUnit.java delete mode 100644 src/rocksdb2/java/rocksjni/backupablejni.cc delete mode 100644 src/rocksdb2/java/rocksjni/env.cc delete mode 100644 src/rocksdb2/java/rocksjni/filter.cc delete mode 100644 src/rocksdb2/java/rocksjni/iterator.cc delete mode 100644 src/rocksdb2/java/rocksjni/memtablejni.cc delete mode 100644 src/rocksdb2/java/rocksjni/options.cc delete mode 100644 src/rocksdb2/java/rocksjni/portal.h delete mode 100644 src/rocksdb2/java/rocksjni/restorejni.cc delete mode 100644 src/rocksdb2/java/rocksjni/rocksjni.cc delete mode 100644 src/rocksdb2/java/rocksjni/statistics.cc delete mode 100644 src/rocksdb2/java/rocksjni/table.cc delete mode 100644 src/rocksdb2/java/rocksjni/write_batch.cc delete mode 100644 src/rocksdb2/linters/__phutil_library_init__.php delete mode 100644 src/rocksdb2/linters/__phutil_library_map__.php delete mode 100644 src/rocksdb2/linters/cpp_linter/ArcanistCpplintLinter.php delete mode 100644 src/rocksdb2/linters/cpp_linter/FbcodeCppLinter.php delete mode 100644 src/rocksdb2/linters/cpp_linter/PfffCppLinter.php delete mode 100755 src/rocksdb2/linters/cpp_linter/cpplint.py delete mode 100644 src/rocksdb2/linters/lint_engine/FacebookFbcodeLintEngine.php delete mode 100644 src/rocksdb2/port/README delete mode 100644 src/rocksdb2/port/atomic_pointer.h delete mode 100644 src/rocksdb2/port/likely.h delete mode 100644 src/rocksdb2/port/port.h delete mode 100644 src/rocksdb2/port/port_example.h delete mode 100644 src/rocksdb2/port/port_posix.cc delete mode 100644 src/rocksdb2/port/port_posix.h delete mode 100644 src/rocksdb2/port/stack_trace.cc delete mode 100644 src/rocksdb2/port/stack_trace.h delete mode 100644 src/rocksdb2/port/win/stdint.h delete mode 100644 src/rocksdb2/table/adaptive_table_factory.cc delete mode 100644 src/rocksdb2/table/adaptive_table_factory.h delete mode 100644 src/rocksdb2/table/block.cc delete mode 100644 src/rocksdb2/table/block.h delete mode 100644 src/rocksdb2/table/block_based_table_builder.cc delete mode 100644 src/rocksdb2/table/block_based_table_builder.h delete mode 100644 src/rocksdb2/table/block_based_table_factory.cc delete mode 100644 src/rocksdb2/table/block_based_table_factory.h delete mode 100644 src/rocksdb2/table/block_based_table_reader.cc delete mode 100644 src/rocksdb2/table/block_based_table_reader.h delete mode 100644 src/rocksdb2/table/block_builder.cc delete mode 100644 src/rocksdb2/table/block_builder.h delete mode 100644 src/rocksdb2/table/block_hash_index.cc delete mode 100644 src/rocksdb2/table/block_hash_index.h delete mode 100644 src/rocksdb2/table/block_hash_index_test.cc delete mode 100644 src/rocksdb2/table/block_prefix_index.cc delete mode 100644 src/rocksdb2/table/block_prefix_index.h delete mode 100644 src/rocksdb2/table/block_test.cc delete mode 100644 src/rocksdb2/table/bloom_block.cc delete mode 100644 src/rocksdb2/table/bloom_block.h delete mode 100644 src/rocksdb2/table/cuckoo_table_builder.cc delete mode 100644 src/rocksdb2/table/cuckoo_table_builder.h delete mode 100644 src/rocksdb2/table/cuckoo_table_builder_test.cc delete mode 100644 src/rocksdb2/table/cuckoo_table_factory.cc delete mode 100644 src/rocksdb2/table/cuckoo_table_factory.h delete mode 100644 src/rocksdb2/table/cuckoo_table_reader.cc delete mode 100644 src/rocksdb2/table/cuckoo_table_reader.h delete mode 100644 src/rocksdb2/table/cuckoo_table_reader_test.cc delete mode 100644 src/rocksdb2/table/filter_block.cc delete mode 100644 src/rocksdb2/table/filter_block.h delete mode 100644 src/rocksdb2/table/filter_block_test.cc delete mode 100644 src/rocksdb2/table/flush_block_policy.cc delete mode 100644 src/rocksdb2/table/format.cc delete mode 100644 src/rocksdb2/table/format.h delete mode 100644 src/rocksdb2/table/iter_heap.h delete mode 100644 src/rocksdb2/table/iterator.cc delete mode 100644 src/rocksdb2/table/iterator_wrapper.h delete mode 100644 src/rocksdb2/table/merger.cc delete mode 100644 src/rocksdb2/table/merger.h delete mode 100644 src/rocksdb2/table/meta_blocks.cc delete mode 100644 src/rocksdb2/table/meta_blocks.h delete mode 100644 src/rocksdb2/table/plain_table_builder.cc delete mode 100644 src/rocksdb2/table/plain_table_builder.h delete mode 100644 src/rocksdb2/table/plain_table_factory.cc delete mode 100644 src/rocksdb2/table/plain_table_factory.h delete mode 100644 src/rocksdb2/table/plain_table_index.cc delete mode 100644 src/rocksdb2/table/plain_table_index.h delete mode 100644 src/rocksdb2/table/plain_table_key_coding.cc delete mode 100644 src/rocksdb2/table/plain_table_key_coding.h delete mode 100644 src/rocksdb2/table/plain_table_reader.cc delete mode 100644 src/rocksdb2/table/plain_table_reader.h delete mode 100644 src/rocksdb2/table/table_builder.h delete mode 100644 src/rocksdb2/table/table_properties.cc delete mode 100644 src/rocksdb2/table/table_reader.h delete mode 100644 src/rocksdb2/table/table_reader_bench.cc delete mode 100644 src/rocksdb2/table/table_test.cc delete mode 100644 src/rocksdb2/table/two_level_iterator.cc delete mode 100644 src/rocksdb2/table/two_level_iterator.h delete mode 100644 src/rocksdb2/third-party/rapidjson/document.h delete mode 100644 src/rocksdb2/third-party/rapidjson/filestream.h delete mode 100644 src/rocksdb2/third-party/rapidjson/internal/pow10.h delete mode 100644 src/rocksdb2/third-party/rapidjson/internal/stack.h delete mode 100644 src/rocksdb2/third-party/rapidjson/internal/strfunc.h delete mode 100644 src/rocksdb2/third-party/rapidjson/license.txt delete mode 100644 src/rocksdb2/third-party/rapidjson/prettywriter.h delete mode 100644 src/rocksdb2/third-party/rapidjson/rapidjson.h delete mode 100644 src/rocksdb2/third-party/rapidjson/reader.h delete mode 100644 src/rocksdb2/third-party/rapidjson/stringbuffer.h delete mode 100644 src/rocksdb2/third-party/rapidjson/writer.h delete mode 100755 src/rocksdb2/tools/auto_sanity_test.sh delete mode 100644 src/rocksdb2/tools/blob_store_bench.cc delete mode 100644 src/rocksdb2/tools/db_crashtest.py delete mode 100644 src/rocksdb2/tools/db_crashtest2.py delete mode 100644 src/rocksdb2/tools/db_repl_stress.cc delete mode 100644 src/rocksdb2/tools/db_sanity_test.cc delete mode 100644 src/rocksdb2/tools/db_stress.cc delete mode 100644 src/rocksdb2/tools/ldb.cc delete mode 100644 src/rocksdb2/tools/ldb_test.py delete mode 100644 src/rocksdb2/tools/reduce_levels_test.cc delete mode 100644 src/rocksdb2/tools/sst_dump.cc delete mode 100644 src/rocksdb2/util/arena.cc delete mode 100644 src/rocksdb2/util/arena.h delete mode 100644 src/rocksdb2/util/arena_test.cc delete mode 100644 src/rocksdb2/util/auto_roll_logger.cc delete mode 100644 src/rocksdb2/util/auto_roll_logger.h delete mode 100755 src/rocksdb2/util/auto_roll_logger_test.cc delete mode 100644 src/rocksdb2/util/autovector.h delete mode 100644 src/rocksdb2/util/autovector_test.cc delete mode 100644 src/rocksdb2/util/benchharness.cc delete mode 100644 src/rocksdb2/util/benchharness.h delete mode 100644 src/rocksdb2/util/benchharness_test.cc delete mode 100644 src/rocksdb2/util/blob_store.cc delete mode 100644 src/rocksdb2/util/blob_store.h delete mode 100644 src/rocksdb2/util/blob_store_test.cc delete mode 100644 src/rocksdb2/util/bloom.cc delete mode 100644 src/rocksdb2/util/bloom_test.cc delete mode 100644 src/rocksdb2/util/build_version.h delete mode 100644 src/rocksdb2/util/cache.cc delete mode 100644 src/rocksdb2/util/cache_test.cc delete mode 100644 src/rocksdb2/util/coding.cc delete mode 100644 src/rocksdb2/util/coding.h delete mode 100644 src/rocksdb2/util/coding_test.cc delete mode 100644 src/rocksdb2/util/comparator.cc delete mode 100644 src/rocksdb2/util/crc32c.cc delete mode 100644 src/rocksdb2/util/crc32c.h delete mode 100644 src/rocksdb2/util/crc32c_test.cc delete mode 100644 src/rocksdb2/util/db_info_dummper.cc delete mode 100644 src/rocksdb2/util/dynamic_bloom.cc delete mode 100644 src/rocksdb2/util/dynamic_bloom.h delete mode 100644 src/rocksdb2/util/dynamic_bloom_test.cc delete mode 100644 src/rocksdb2/util/env.cc delete mode 100644 src/rocksdb2/util/env_hdfs.cc delete mode 100644 src/rocksdb2/util/env_posix.cc delete mode 100644 src/rocksdb2/util/env_test.cc delete mode 100644 src/rocksdb2/util/filelock_test.cc delete mode 100644 src/rocksdb2/util/filter_policy.cc delete mode 100644 src/rocksdb2/util/hash.cc delete mode 100644 src/rocksdb2/util/hash.h delete mode 100644 src/rocksdb2/util/hash_cuckoo_rep.cc delete mode 100644 src/rocksdb2/util/hash_cuckoo_rep.h delete mode 100644 src/rocksdb2/util/hash_linklist_rep.cc delete mode 100644 src/rocksdb2/util/hash_linklist_rep.h delete mode 100644 src/rocksdb2/util/hash_skiplist_rep.cc delete mode 100644 src/rocksdb2/util/hash_skiplist_rep.h delete mode 100644 src/rocksdb2/util/histogram.cc delete mode 100644 src/rocksdb2/util/histogram.h delete mode 100644 src/rocksdb2/util/histogram_test.cc delete mode 100644 src/rocksdb2/util/iostats_context.cc delete mode 100644 src/rocksdb2/util/iostats_context_imp.h delete mode 100644 src/rocksdb2/util/ldb_cmd.cc delete mode 100644 src/rocksdb2/util/ldb_cmd.h delete mode 100644 src/rocksdb2/util/ldb_cmd_execute_result.h delete mode 100644 src/rocksdb2/util/ldb_tool.cc delete mode 100644 src/rocksdb2/util/log_buffer.cc delete mode 100644 src/rocksdb2/util/log_buffer.h delete mode 100644 src/rocksdb2/util/log_write_bench.cc delete mode 100644 src/rocksdb2/util/logging.cc delete mode 100644 src/rocksdb2/util/logging.h delete mode 100644 src/rocksdb2/util/manual_compaction_test.cc delete mode 100644 src/rocksdb2/util/murmurhash.cc delete mode 100644 src/rocksdb2/util/murmurhash.h delete mode 100644 src/rocksdb2/util/mutexlock.h delete mode 100644 src/rocksdb2/util/options.cc delete mode 100644 src/rocksdb2/util/options_builder.cc delete mode 100644 src/rocksdb2/util/options_test.cc delete mode 100644 src/rocksdb2/util/perf_context.cc delete mode 100644 src/rocksdb2/util/perf_context_imp.h delete mode 100644 src/rocksdb2/util/posix_logger.h delete mode 100644 src/rocksdb2/util/random.h delete mode 100644 src/rocksdb2/util/rate_limiter.cc delete mode 100644 src/rocksdb2/util/rate_limiter.h delete mode 100644 src/rocksdb2/util/rate_limiter_test.cc delete mode 100644 src/rocksdb2/util/signal_test.cc delete mode 100644 src/rocksdb2/util/skiplistrep.cc delete mode 100644 src/rocksdb2/util/slice.cc delete mode 100644 src/rocksdb2/util/statistics.cc delete mode 100644 src/rocksdb2/util/statistics.h delete mode 100644 src/rocksdb2/util/status.cc delete mode 100644 src/rocksdb2/util/stl_wrappers.h delete mode 100644 src/rocksdb2/util/stop_watch.h delete mode 100644 src/rocksdb2/util/string_util.cc delete mode 100644 src/rocksdb2/util/string_util.h delete mode 100644 src/rocksdb2/util/sync_point.cc delete mode 100644 src/rocksdb2/util/sync_point.h delete mode 100644 src/rocksdb2/util/testharness.cc delete mode 100644 src/rocksdb2/util/testharness.h delete mode 100644 src/rocksdb2/util/testutil.cc delete mode 100644 src/rocksdb2/util/testutil.h delete mode 100644 src/rocksdb2/util/thread_local.cc delete mode 100644 src/rocksdb2/util/thread_local.h delete mode 100644 src/rocksdb2/util/thread_local_test.cc delete mode 100644 src/rocksdb2/util/vectorrep.cc delete mode 100644 src/rocksdb2/util/xxhash.cc delete mode 100644 src/rocksdb2/util/xxhash.h delete mode 100644 src/rocksdb2/utilities/backupable/backupable_db.cc delete mode 100644 src/rocksdb2/utilities/backupable/backupable_db_test.cc delete mode 100644 src/rocksdb2/utilities/document/document_db.cc delete mode 100644 src/rocksdb2/utilities/document/document_db_test.cc delete mode 100644 src/rocksdb2/utilities/document/json_document.cc delete mode 100644 src/rocksdb2/utilities/document/json_document_test.cc delete mode 100644 src/rocksdb2/utilities/geodb/geodb_impl.cc delete mode 100644 src/rocksdb2/utilities/geodb/geodb_impl.h delete mode 100644 src/rocksdb2/utilities/geodb/geodb_test.cc delete mode 100644 src/rocksdb2/utilities/merge_operators.h delete mode 100644 src/rocksdb2/utilities/merge_operators/put.cc delete mode 100644 src/rocksdb2/utilities/merge_operators/string_append/stringappend.cc delete mode 100644 src/rocksdb2/utilities/merge_operators/string_append/stringappend.h delete mode 100644 src/rocksdb2/utilities/merge_operators/string_append/stringappend2.cc delete mode 100644 src/rocksdb2/utilities/merge_operators/string_append/stringappend2.h delete mode 100644 src/rocksdb2/utilities/merge_operators/string_append/stringappend_test.cc delete mode 100644 src/rocksdb2/utilities/merge_operators/uint64add.cc delete mode 100644 src/rocksdb2/utilities/redis/README delete mode 100644 src/rocksdb2/utilities/redis/redis_list_exception.h delete mode 100644 src/rocksdb2/utilities/redis/redis_list_iterator.h delete mode 100644 src/rocksdb2/utilities/redis/redis_lists.cc delete mode 100644 src/rocksdb2/utilities/redis/redis_lists.h delete mode 100644 src/rocksdb2/utilities/redis/redis_lists_test.cc delete mode 100644 src/rocksdb2/utilities/spatialdb/spatial_db.cc delete mode 100644 src/rocksdb2/utilities/spatialdb/spatial_db_test.cc delete mode 100644 src/rocksdb2/utilities/spatialdb/utils.h delete mode 100644 src/rocksdb2/utilities/ttl/db_ttl_impl.cc delete mode 100644 src/rocksdb2/utilities/ttl/db_ttl_impl.h delete mode 100644 src/rocksdb2/utilities/ttl/ttl_test.cc delete mode 100644 src/rocksdb2/utilities/write_batch_with_index/write_batch_with_index.cc delete mode 100644 src/rocksdb2/utilities/write_batch_with_index/write_batch_with_index_test.cc delete mode 100644 src/secp256k1/.gitignore delete mode 100644 src/secp256k1/.travis.yml delete mode 100644 src/secp256k1/COPYING delete mode 100644 src/secp256k1/Makefile.am delete mode 100644 src/secp256k1/README.md delete mode 100644 src/secp256k1/TODO delete mode 100755 src/secp256k1/autogen.sh delete mode 100644 src/secp256k1/build-aux/m4/ax_jni_include_dir.m4 delete mode 100644 src/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 delete mode 100644 src/secp256k1/build-aux/m4/bitcoin_secp.m4 delete mode 100644 src/secp256k1/configure.ac delete mode 100644 src/secp256k1/contrib/lax_der_parsing.c delete mode 100644 src/secp256k1/contrib/lax_der_parsing.h delete mode 100644 src/secp256k1/contrib/lax_der_privatekey_parsing.c delete mode 100644 src/secp256k1/contrib/lax_der_privatekey_parsing.h delete mode 100644 src/secp256k1/include/secp256k1.h delete mode 100644 src/secp256k1/include/secp256k1_ecdh.h delete mode 100644 src/secp256k1/include/secp256k1_recovery.h delete mode 100644 src/secp256k1/libsecp256k1.pc.in delete mode 100644 src/secp256k1/obj/.gitignore delete mode 100644 src/secp256k1/sage/group_prover.sage delete mode 100644 src/secp256k1/sage/secp256k1.sage delete mode 100644 src/secp256k1/sage/weierstrass_prover.sage delete mode 100644 src/secp256k1/src/asm/field_10x26_arm.s delete mode 100644 src/secp256k1/src/basic-config.h delete mode 100644 src/secp256k1/src/bench.h delete mode 100644 src/secp256k1/src/bench_ecdh.c delete mode 100644 src/secp256k1/src/bench_internal.c delete mode 100644 src/secp256k1/src/bench_recover.c delete mode 100644 src/secp256k1/src/bench_schnorr_verify.c delete mode 100644 src/secp256k1/src/bench_sign.c delete mode 100644 src/secp256k1/src/bench_verify.c delete mode 100644 src/secp256k1/src/ecdsa.h delete mode 100644 src/secp256k1/src/ecdsa_impl.h delete mode 100644 src/secp256k1/src/eckey.h delete mode 100644 src/secp256k1/src/eckey_impl.h delete mode 100644 src/secp256k1/src/ecmult.h delete mode 100644 src/secp256k1/src/ecmult_const.h delete mode 100644 src/secp256k1/src/ecmult_const_impl.h delete mode 100644 src/secp256k1/src/ecmult_gen.h delete mode 100644 src/secp256k1/src/ecmult_gen_impl.h delete mode 100644 src/secp256k1/src/ecmult_impl.h delete mode 100644 src/secp256k1/src/field.h delete mode 100644 src/secp256k1/src/field_10x26.h delete mode 100644 src/secp256k1/src/field_10x26_impl.h delete mode 100644 src/secp256k1/src/field_5x52.h delete mode 100644 src/secp256k1/src/field_5x52_asm_impl.h delete mode 100644 src/secp256k1/src/field_5x52_impl.h delete mode 100644 src/secp256k1/src/field_5x52_int128_impl.h delete mode 100644 src/secp256k1/src/field_impl.h delete mode 100644 src/secp256k1/src/gen_context.c delete mode 100644 src/secp256k1/src/group.h delete mode 100644 src/secp256k1/src/group_impl.h delete mode 100644 src/secp256k1/src/hash.h delete mode 100644 src/secp256k1/src/hash_impl.h delete mode 100644 src/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java delete mode 100644 src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java delete mode 100644 src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java delete mode 100644 src/secp256k1/src/java/org/bitcoin/Secp256k1Context.java delete mode 100644 src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c delete mode 100644 src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h delete mode 100644 src/secp256k1/src/java/org_bitcoin_Secp256k1Context.c delete mode 100644 src/secp256k1/src/java/org_bitcoin_Secp256k1Context.h delete mode 100644 src/secp256k1/src/modules/ecdh/Makefile.am.include delete mode 100644 src/secp256k1/src/modules/ecdh/main_impl.h delete mode 100644 src/secp256k1/src/modules/ecdh/tests_impl.h delete mode 100644 src/secp256k1/src/modules/recovery/Makefile.am.include delete mode 100755 src/secp256k1/src/modules/recovery/main_impl.h delete mode 100644 src/secp256k1/src/modules/recovery/tests_impl.h delete mode 100644 src/secp256k1/src/num.h delete mode 100644 src/secp256k1/src/num_gmp.h delete mode 100644 src/secp256k1/src/num_gmp_impl.h delete mode 100644 src/secp256k1/src/num_impl.h delete mode 100644 src/secp256k1/src/scalar.h delete mode 100644 src/secp256k1/src/scalar_4x64.h delete mode 100644 src/secp256k1/src/scalar_4x64_impl.h delete mode 100644 src/secp256k1/src/scalar_8x32.h delete mode 100644 src/secp256k1/src/scalar_8x32_impl.h delete mode 100644 src/secp256k1/src/scalar_impl.h delete mode 100644 src/secp256k1/src/scalar_low.h delete mode 100644 src/secp256k1/src/scalar_low_impl.h delete mode 100755 src/secp256k1/src/secp256k1.c delete mode 100644 src/secp256k1/src/testrand.h delete mode 100644 src/secp256k1/src/testrand_impl.h delete mode 100644 src/secp256k1/src/tests.c delete mode 100644 src/secp256k1/src/tests_exhaustive.c delete mode 100644 src/secp256k1/src/util.h delete mode 100644 src/snappy/config/snappy-stubs-public.h delete mode 100644 src/snappy/snappy/AUTHORS delete mode 100644 src/snappy/snappy/COPYING delete mode 100644 src/snappy/snappy/ChangeLog delete mode 100644 src/snappy/snappy/Makefile.am delete mode 100644 src/snappy/snappy/NEWS delete mode 100644 src/snappy/snappy/README delete mode 100755 src/snappy/snappy/autogen.sh delete mode 100644 src/snappy/snappy/configure.ac delete mode 100644 src/snappy/snappy/format_description.txt delete mode 100644 src/snappy/snappy/framing_format.txt delete mode 100644 src/snappy/snappy/m4/gtest.m4 delete mode 100644 src/snappy/snappy/snappy-c.cc delete mode 100644 src/snappy/snappy/snappy-c.h delete mode 100644 src/snappy/snappy/snappy-internal.h delete mode 100644 src/snappy/snappy/snappy-sinksource.cc delete mode 100644 src/snappy/snappy/snappy-sinksource.h delete mode 100644 src/snappy/snappy/snappy-stubs-internal.cc delete mode 100644 src/snappy/snappy/snappy-stubs-internal.h delete mode 100644 src/snappy/snappy/snappy-stubs-public.h.in delete mode 100644 src/snappy/snappy/snappy-test.cc delete mode 100644 src/snappy/snappy/snappy-test.h delete mode 100644 src/snappy/snappy/snappy.cc delete mode 100644 src/snappy/snappy/snappy.h delete mode 100644 src/snappy/snappy/snappy_unittest.cc delete mode 100644 src/snappy/snappy/testdata/alice29.txt delete mode 100644 src/snappy/snappy/testdata/asyoulik.txt delete mode 100644 src/snappy/snappy/testdata/baddata1.snappy delete mode 100644 src/snappy/snappy/testdata/baddata2.snappy delete mode 100644 src/snappy/snappy/testdata/baddata3.snappy delete mode 100644 src/snappy/snappy/testdata/fireworks.jpeg delete mode 100644 src/snappy/snappy/testdata/geo.protodata delete mode 100644 src/snappy/snappy/testdata/html delete mode 100644 src/snappy/snappy/testdata/html_x_4 delete mode 100644 src/snappy/snappy/testdata/kppkn.gtb delete mode 100644 src/snappy/snappy/testdata/lcet10.txt delete mode 100644 src/snappy/snappy/testdata/paper-100k.pdf delete mode 100644 src/snappy/snappy/testdata/plrabn12.txt delete mode 100644 src/snappy/snappy/testdata/urls.10K delete mode 100644 src/soci/.gitattributes delete mode 100644 src/soci/.gitignore delete mode 100644 src/soci/.travis.yml delete mode 100644 src/soci/AUTHORS delete mode 100644 src/soci/CHANGES delete mode 100644 src/soci/CMakeLists.txt delete mode 100644 src/soci/CTestConfig.cmake delete mode 100644 src/soci/LICENSE_1_0.txt delete mode 100644 src/soci/README.md delete mode 100644 src/soci/TODO delete mode 100755 src/soci/bin/ci/before_install.sh delete mode 100755 src/soci/bin/ci/before_install_db2.sh delete mode 100755 src/soci/bin/ci/before_install_firebird.sh delete mode 100755 src/soci/bin/ci/before_install_odbc.sh delete mode 100755 src/soci/bin/ci/before_install_oracle.sh delete mode 100755 src/soci/bin/ci/before_script.sh delete mode 100755 src/soci/bin/ci/before_script_db2.sh delete mode 100755 src/soci/bin/ci/before_script_firebird.sh delete mode 100755 src/soci/bin/ci/before_script_mysql.sh delete mode 100755 src/soci/bin/ci/before_script_odbc.sh delete mode 100755 src/soci/bin/ci/before_script_oracle.sh delete mode 100755 src/soci/bin/ci/before_script_postgresql.sh delete mode 100644 src/soci/bin/ci/common.sh delete mode 100644 src/soci/bin/ci/oracle.sh delete mode 100755 src/soci/bin/ci/script.sh delete mode 100755 src/soci/bin/ci/script_db2.sh delete mode 100755 src/soci/bin/ci/script_empty.sh delete mode 100755 src/soci/bin/ci/script_firebird.sh delete mode 100755 src/soci/bin/ci/script_mysql.sh delete mode 100755 src/soci/bin/ci/script_odbc.sh delete mode 100755 src/soci/bin/ci/script_oracle.sh delete mode 100755 src/soci/bin/ci/script_postgresql.sh delete mode 100755 src/soci/bin/ci/script_postgression.sh delete mode 100755 src/soci/bin/ci/script_sqlite3.sh delete mode 100644 src/soci/bin/vm/debian-oracle10g-install.sh delete mode 100644 src/soci/cmake/.gitignore delete mode 100644 src/soci/cmake/CMakeLists.txt delete mode 100644 src/soci/cmake/SociBackend.cmake delete mode 100644 src/soci/cmake/SociConfig.cmake delete mode 100644 src/soci/cmake/SociDependencies.cmake delete mode 100644 src/soci/cmake/SociUtilities.cmake delete mode 100644 src/soci/cmake/SociVersion.cmake delete mode 100644 src/soci/cmake/dependencies/Boost.cmake delete mode 100644 src/soci/cmake/dependencies/DB2.cmake delete mode 100644 src/soci/cmake/dependencies/Firebird.cmake delete mode 100644 src/soci/cmake/dependencies/MySQL.cmake delete mode 100644 src/soci/cmake/dependencies/ODBC.cmake delete mode 100644 src/soci/cmake/dependencies/Oracle.cmake delete mode 100644 src/soci/cmake/dependencies/PostgreSQL.cmake delete mode 100644 src/soci/cmake/dependencies/SQLite3.cmake delete mode 100644 src/soci/cmake/dependencies/Threads.cmake delete mode 100644 src/soci/cmake/modules/FindDB2.cmake delete mode 100644 src/soci/cmake/modules/FindDL.cmake delete mode 100644 src/soci/cmake/modules/FindFirebird.cmake delete mode 100644 src/soci/cmake/modules/FindMySQL.cmake delete mode 100644 src/soci/cmake/modules/FindODBC.cmake delete mode 100644 src/soci/cmake/modules/FindOracle.cmake delete mode 100644 src/soci/cmake/modules/FindPostgreSQL.cmake delete mode 100644 src/soci/cmake/modules/FindSQLite3.cmake delete mode 100644 src/soci/cmake/modules/FindSoci.cmake delete mode 100644 src/soci/cmake/resources/vs2010-test-cmd-args.vcxproj.user.in delete mode 100644 src/soci/docs/backends.md delete mode 100644 src/soci/docs/backends/db2.md delete mode 100644 src/soci/docs/backends/firebird.md delete mode 100644 src/soci/docs/backends/index.md delete mode 100644 src/soci/docs/backends/mysql.md delete mode 100644 src/soci/docs/backends/odbc.md delete mode 100644 src/soci/docs/backends/oracle.md delete mode 100644 src/soci/docs/backends/postgresql.md delete mode 100644 src/soci/docs/backends/sqlite3.md delete mode 100644 src/soci/docs/beyond.md delete mode 100644 src/soci/docs/boost.md delete mode 100644 src/soci/docs/connections.md delete mode 100644 src/soci/docs/errors.md delete mode 100644 src/soci/docs/exchange.md delete mode 100644 src/soci/docs/index.md delete mode 100644 src/soci/docs/installation.md delete mode 100644 src/soci/docs/interfaces.md delete mode 100644 src/soci/docs/languages/ada/concepts.md delete mode 100644 src/soci/docs/languages/ada/idioms.md delete mode 100644 src/soci/docs/languages/ada/index.md delete mode 100644 src/soci/docs/languages/ada/reference.md delete mode 100644 src/soci/docs/multithreading.md delete mode 100644 src/soci/docs/queries.md delete mode 100644 src/soci/docs/rationale.md delete mode 100644 src/soci/docs/reference.md delete mode 100644 src/soci/docs/statements.md delete mode 100644 src/soci/docs/structure.md delete mode 100644 src/soci/include/private/README.md delete mode 100644 src/soci/include/private/firebird/common.h delete mode 100644 src/soci/include/private/firebird/error-firebird.h delete mode 100644 src/soci/include/private/soci-compiler.h delete mode 100644 src/soci/include/private/soci-cpp.h delete mode 100644 src/soci/include/private/soci-cstrtod.h delete mode 100644 src/soci/include/private/soci-dtocstr.h delete mode 100644 src/soci/include/private/soci-exchange-cast.h delete mode 100644 src/soci/include/private/soci-mktime.h delete mode 100644 src/soci/include/private/soci-static-assert.h delete mode 100644 src/soci/include/soci/backend-loader.h delete mode 100644 src/soci/include/soci/bind-values.h delete mode 100644 src/soci/include/soci/blob-exchange.h delete mode 100644 src/soci/include/soci/blob.h delete mode 100644 src/soci/include/soci/boost-fusion.h delete mode 100644 src/soci/include/soci/boost-gregorian-date.h delete mode 100644 src/soci/include/soci/boost-optional.h delete mode 100644 src/soci/include/soci/boost-tuple.h delete mode 100644 src/soci/include/soci/connection-parameters.h delete mode 100644 src/soci/include/soci/connection-pool.h delete mode 100644 src/soci/include/soci/db2/soci-db2.h delete mode 100644 src/soci/include/soci/empty/soci-empty.h delete mode 100644 src/soci/include/soci/error.h delete mode 100644 src/soci/include/soci/exchange-traits.h delete mode 100644 src/soci/include/soci/firebird/soci-firebird.h delete mode 100644 src/soci/include/soci/into-type.h delete mode 100644 src/soci/include/soci/into.h delete mode 100644 src/soci/include/soci/mysql/soci-mysql.h delete mode 100644 src/soci/include/soci/noreturn.h delete mode 100644 src/soci/include/soci/odbc/soci-odbc.h delete mode 100644 src/soci/include/soci/once-temp-type.h delete mode 100644 src/soci/include/soci/oracle/soci-oracle.h delete mode 100644 src/soci/include/soci/postgresql/soci-postgresql.h delete mode 100644 src/soci/include/soci/prepare-temp-type.h delete mode 100644 src/soci/include/soci/procedure.h delete mode 100644 src/soci/include/soci/query_transformation.h delete mode 100644 src/soci/include/soci/ref-counted-prepare-info.h delete mode 100644 src/soci/include/soci/ref-counted-statement.h delete mode 100644 src/soci/include/soci/row-exchange.h delete mode 100644 src/soci/include/soci/row.h delete mode 100644 src/soci/include/soci/rowid-exchange.h delete mode 100644 src/soci/include/soci/rowid.h delete mode 100644 src/soci/include/soci/rowset.h delete mode 100644 src/soci/include/soci/session.h delete mode 100644 src/soci/include/soci/soci-backend.h delete mode 100644 src/soci/include/soci/soci-config.h delete mode 100644 src/soci/include/soci/soci-platform.h delete mode 100644 src/soci/include/soci/soci-simple.h delete mode 100644 src/soci/include/soci/soci.h delete mode 100644 src/soci/include/soci/sqlite3/soci-sqlite3.h delete mode 100644 src/soci/include/soci/statement.h delete mode 100644 src/soci/include/soci/transaction.h delete mode 100644 src/soci/include/soci/type-conversion-traits.h delete mode 100644 src/soci/include/soci/type-conversion.h delete mode 100644 src/soci/include/soci/type-holder.h delete mode 100644 src/soci/include/soci/type-ptr.h delete mode 100644 src/soci/include/soci/unsigned-types.h delete mode 100644 src/soci/include/soci/use-type.h delete mode 100644 src/soci/include/soci/use.h delete mode 100644 src/soci/include/soci/values-exchange.h delete mode 100644 src/soci/include/soci/values.h delete mode 100644 src/soci/include/soci/version.h delete mode 100644 src/soci/languages/ada/postgresql_client.gpr delete mode 100644 src/soci/languages/ada/soci-mysql.ads delete mode 100644 src/soci/languages/ada/soci-oracle.ads delete mode 100644 src/soci/languages/ada/soci-postgresql.ads delete mode 100644 src/soci/languages/ada/soci.adb delete mode 100644 src/soci/languages/ada/soci.ads delete mode 100644 src/soci/languages/ada/soci_ada.gpr delete mode 100644 src/soci/languages/ada/soci_core.gpr delete mode 100644 src/soci/languages/ada/soci_postgresql.gpr delete mode 100644 src/soci/languages/ada/std_cpp.gpr delete mode 100644 src/soci/languages/ada/test/postgresql_test.adb delete mode 100644 src/soci/languages/ada/test/postgresql_test.gpr delete mode 100644 src/soci/src/.gitignore delete mode 100644 src/soci/src/CMakeLists.txt delete mode 100644 src/soci/src/backends/.gitignore delete mode 100644 src/soci/src/backends/CMakeLists.txt delete mode 100644 src/soci/src/backends/db2/CMakeLists.txt delete mode 100644 src/soci/src/backends/db2/blob.cpp delete mode 100644 src/soci/src/backends/db2/common.h delete mode 100644 src/soci/src/backends/db2/factory.cpp delete mode 100644 src/soci/src/backends/db2/row-id.cpp delete mode 100644 src/soci/src/backends/db2/session.cpp delete mode 100644 src/soci/src/backends/db2/standard-into-type.cpp delete mode 100644 src/soci/src/backends/db2/standard-use-type.cpp delete mode 100644 src/soci/src/backends/db2/statement.cpp delete mode 100644 src/soci/src/backends/db2/vector-into-type.cpp delete mode 100644 src/soci/src/backends/db2/vector-use-type.cpp delete mode 100644 src/soci/src/backends/empty/CMakeLists.txt delete mode 100644 src/soci/src/backends/empty/Makefile.basic delete mode 100644 src/soci/src/backends/empty/blob.cpp delete mode 100644 src/soci/src/backends/empty/factory.cpp delete mode 100644 src/soci/src/backends/empty/row-id.cpp delete mode 100644 src/soci/src/backends/empty/session.cpp delete mode 100644 src/soci/src/backends/empty/standard-into-type.cpp delete mode 100644 src/soci/src/backends/empty/standard-use-type.cpp delete mode 100644 src/soci/src/backends/empty/statement.cpp delete mode 100644 src/soci/src/backends/empty/vector-into-type.cpp delete mode 100644 src/soci/src/backends/empty/vector-use-type.cpp delete mode 100644 src/soci/src/backends/firebird/CMakeLists.txt delete mode 100644 src/soci/src/backends/firebird/Makefile.basic delete mode 100644 src/soci/src/backends/firebird/blob.cpp delete mode 100644 src/soci/src/backends/firebird/common.cpp delete mode 100644 src/soci/src/backends/firebird/error-firebird.cpp delete mode 100644 src/soci/src/backends/firebird/factory.cpp delete mode 100644 src/soci/src/backends/firebird/session.cpp delete mode 100644 src/soci/src/backends/firebird/standard-into-type.cpp delete mode 100644 src/soci/src/backends/firebird/standard-use-type.cpp delete mode 100644 src/soci/src/backends/firebird/statement.cpp delete mode 100644 src/soci/src/backends/firebird/vector-into-type.cpp delete mode 100644 src/soci/src/backends/firebird/vector-use-type.cpp delete mode 100644 src/soci/src/backends/mysql/CMakeLists.txt delete mode 100644 src/soci/src/backends/mysql/Makefile.basic delete mode 100644 src/soci/src/backends/mysql/blob.cpp delete mode 100644 src/soci/src/backends/mysql/common.cpp delete mode 100644 src/soci/src/backends/mysql/common.h delete mode 100644 src/soci/src/backends/mysql/factory.cpp delete mode 100644 src/soci/src/backends/mysql/row-id.cpp delete mode 100644 src/soci/src/backends/mysql/session.cpp delete mode 100644 src/soci/src/backends/mysql/standard-into-type.cpp delete mode 100644 src/soci/src/backends/mysql/standard-use-type.cpp delete mode 100644 src/soci/src/backends/mysql/statement.cpp delete mode 100644 src/soci/src/backends/mysql/vector-into-type.cpp delete mode 100644 src/soci/src/backends/mysql/vector-use-type.cpp delete mode 100644 src/soci/src/backends/odbc/CMakeLists.txt delete mode 100644 src/soci/src/backends/odbc/Makefile.basic delete mode 100644 src/soci/src/backends/odbc/blob.cpp delete mode 100644 src/soci/src/backends/odbc/factory.cpp delete mode 100644 src/soci/src/backends/odbc/makefile.msvc delete mode 100644 src/soci/src/backends/odbc/row-id.cpp delete mode 100644 src/soci/src/backends/odbc/session.cpp delete mode 100644 src/soci/src/backends/odbc/standard-into-type.cpp delete mode 100644 src/soci/src/backends/odbc/standard-use-type.cpp delete mode 100644 src/soci/src/backends/odbc/statement.cpp delete mode 100644 src/soci/src/backends/odbc/utility.h delete mode 100644 src/soci/src/backends/odbc/vector-into-type.cpp delete mode 100644 src/soci/src/backends/odbc/vector-use-type.cpp delete mode 100644 src/soci/src/backends/oracle/CMakeLists.txt delete mode 100644 src/soci/src/backends/oracle/Makefile.basic delete mode 100644 src/soci/src/backends/oracle/blob.cpp delete mode 100644 src/soci/src/backends/oracle/error.cpp delete mode 100644 src/soci/src/backends/oracle/error.h delete mode 100644 src/soci/src/backends/oracle/factory.cpp delete mode 100644 src/soci/src/backends/oracle/row-id.cpp delete mode 100644 src/soci/src/backends/oracle/session.cpp delete mode 100644 src/soci/src/backends/oracle/standard-into-type.cpp delete mode 100644 src/soci/src/backends/oracle/standard-use-type.cpp delete mode 100644 src/soci/src/backends/oracle/statement.cpp delete mode 100644 src/soci/src/backends/oracle/vector-into-type.cpp delete mode 100644 src/soci/src/backends/oracle/vector-use-type.cpp delete mode 100644 src/soci/src/backends/postgresql/CMakeLists.txt delete mode 100644 src/soci/src/backends/postgresql/Makefile.basic delete mode 100644 src/soci/src/backends/postgresql/blob.cpp delete mode 100644 src/soci/src/backends/postgresql/common.cpp delete mode 100644 src/soci/src/backends/postgresql/common.h delete mode 100644 src/soci/src/backends/postgresql/error.cpp delete mode 100644 src/soci/src/backends/postgresql/factory.cpp delete mode 100644 src/soci/src/backends/postgresql/row-id.cpp delete mode 100644 src/soci/src/backends/postgresql/session.cpp delete mode 100644 src/soci/src/backends/postgresql/standard-into-type.cpp delete mode 100644 src/soci/src/backends/postgresql/standard-use-type.cpp delete mode 100644 src/soci/src/backends/postgresql/statement.cpp delete mode 100644 src/soci/src/backends/postgresql/vector-into-type.cpp delete mode 100644 src/soci/src/backends/postgresql/vector-use-type.cpp delete mode 100644 src/soci/src/backends/sqlite3/CMakeLists.txt delete mode 100644 src/soci/src/backends/sqlite3/Makefile.basic delete mode 100644 src/soci/src/backends/sqlite3/blob.cpp delete mode 100644 src/soci/src/backends/sqlite3/common.cpp delete mode 100644 src/soci/src/backends/sqlite3/common.h delete mode 100644 src/soci/src/backends/sqlite3/error.cpp delete mode 100644 src/soci/src/backends/sqlite3/factory.cpp delete mode 100644 src/soci/src/backends/sqlite3/row-id.cpp delete mode 100644 src/soci/src/backends/sqlite3/session.cpp delete mode 100644 src/soci/src/backends/sqlite3/standard-into-type.cpp delete mode 100644 src/soci/src/backends/sqlite3/standard-use-type.cpp delete mode 100644 src/soci/src/backends/sqlite3/statement.cpp delete mode 100644 src/soci/src/backends/sqlite3/vector-into-type.cpp delete mode 100644 src/soci/src/backends/sqlite3/vector-use-type.cpp delete mode 100644 src/soci/src/core/.gitignore delete mode 100644 src/soci/src/core/CMakeLists.txt delete mode 100644 src/soci/src/core/Makefile.basic delete mode 100644 src/soci/src/core/backend-loader.cpp delete mode 100644 src/soci/src/core/blob.cpp delete mode 100644 src/soci/src/core/connection-parameters.cpp delete mode 100644 src/soci/src/core/connection-pool.cpp delete mode 100644 src/soci/src/core/error.cpp delete mode 100644 src/soci/src/core/into-type.cpp delete mode 100644 src/soci/src/core/once-temp-type.cpp delete mode 100644 src/soci/src/core/prepare-temp-type.cpp delete mode 100644 src/soci/src/core/procedure.cpp delete mode 100644 src/soci/src/core/ref-counted-prepare-info.cpp delete mode 100644 src/soci/src/core/ref-counted-statement.cpp delete mode 100644 src/soci/src/core/row.cpp delete mode 100644 src/soci/src/core/rowid.cpp delete mode 100644 src/soci/src/core/session.cpp delete mode 100644 src/soci/src/core/soci-simple.cpp delete mode 100644 src/soci/src/core/soci_backends_config.h.in delete mode 100644 src/soci/src/core/statement.cpp delete mode 100644 src/soci/src/core/transaction.cpp delete mode 100644 src/soci/src/core/use-type.cpp delete mode 100644 src/soci/src/core/values.cpp delete mode 100644 src/soci/tests/CMakeLists.txt delete mode 100644 src/soci/tests/README.md delete mode 100644 src/soci/tests/catch.hpp delete mode 100644 src/soci/tests/common-tests.h delete mode 100644 src/soci/tests/db2/CMakeLists.txt delete mode 100644 src/soci/tests/db2/test-db2.cpp delete mode 100644 src/soci/tests/empty/CMakeLists.txt delete mode 100644 src/soci/tests/empty/test-empty.cpp delete mode 100644 src/soci/tests/firebird/CMakeLists.txt delete mode 100644 src/soci/tests/firebird/test-firebird.cpp delete mode 100644 src/soci/tests/mysql/CMakeLists.txt delete mode 100644 src/soci/tests/mysql/test-mysql.cpp delete mode 100644 src/soci/tests/mysql/test-mysql.h delete mode 100644 src/soci/tests/odbc/CMakeLists.txt delete mode 100644 src/soci/tests/odbc/test-access.dsn delete mode 100644 src/soci/tests/odbc/test-mssql.dsn delete mode 100644 src/soci/tests/odbc/test-mysql.dsn delete mode 100644 src/soci/tests/odbc/test-odbc-access.cpp delete mode 100644 src/soci/tests/odbc/test-odbc-db2.cpp delete mode 100644 src/soci/tests/odbc/test-odbc-mssql.cpp delete mode 100644 src/soci/tests/odbc/test-odbc-mysql.cpp delete mode 100644 src/soci/tests/odbc/test-odbc-postgresql.cpp delete mode 100644 src/soci/tests/odbc/test-postgresql.dsn delete mode 100644 src/soci/tests/oracle/CMakeLists.txt delete mode 100644 src/soci/tests/oracle/Makefile.basic delete mode 100644 src/soci/tests/oracle/test-oracle.cpp delete mode 100644 src/soci/tests/postgresql/CMakeLists.txt delete mode 100644 src/soci/tests/postgresql/Makefile.basic delete mode 100644 src/soci/tests/postgresql/test-postgresql.cpp delete mode 100644 src/soci/tests/sqlite3/CMakeLists.txt delete mode 100644 src/soci/tests/sqlite3/test-sqlite3.cpp delete mode 100644 src/soci/www/articles.html delete mode 100644 src/soci/www/doc.html delete mode 100644 src/soci/www/doc/README.md delete mode 100644 src/soci/www/doc/index.html delete mode 100644 src/soci/www/events.html delete mode 100644 src/soci/www/forkus_github.png delete mode 100644 src/soci/www/index.html delete mode 100644 src/soci/www/links.html delete mode 100644 src/soci/www/people.html delete mode 100644 src/soci/www/style.css delete mode 100644 src/sqlite/sqlite.h delete mode 100644 src/sqlite/sqlite/sqlite3.c delete mode 100644 src/sqlite/sqlite/sqlite3.h delete mode 100644 src/sqlite/sqlite/sqlite3ext.h delete mode 100644 src/sqlite/sqlite3.h delete mode 100644 src/sqlite/sqlite_unity.c delete mode 100644 src/test/app/AccountTxPaging_test.cpp delete mode 100644 src/test/app/AmendmentTable_test.cpp delete mode 100644 src/test/app/CrossingLimits_test.cpp delete mode 100644 src/test/app/DeliverMin_test.cpp delete mode 100644 src/test/app/Discrepancy_test.cpp delete mode 100644 src/test/app/Flow_test.cpp delete mode 100644 src/test/app/Freeze_test.cpp delete mode 100644 src/test/app/HashRouter_test.cpp delete mode 100644 src/test/app/LedgerLoad_test.cpp delete mode 100644 src/test/app/LoadFeeTrack_test.cpp delete mode 100644 src/test/app/MultiSign_test.cpp delete mode 100644 src/test/app/OfferStream_test.cpp delete mode 100644 src/test/app/Offer_test.cpp delete mode 100644 src/test/app/OversizeMeta_test.cpp delete mode 100644 src/test/app/Path_test.cpp delete mode 100644 src/test/app/PayChan_test.cpp delete mode 100644 src/test/app/Regression_test.cpp delete mode 100644 src/test/app/SHAMapStore_test.cpp delete mode 100644 src/test/app/SetAuth_test.cpp delete mode 100644 src/test/app/SetRegularKey_test.cpp delete mode 100644 src/test/app/SetTrust_test.cpp delete mode 100644 src/test/app/SusPay_test.cpp delete mode 100644 src/test/app/Taker_test.cpp delete mode 100644 src/test/app/Ticket_test.cpp delete mode 100644 src/test/app/Transaction_ordering_test.cpp delete mode 100644 src/test/app/TrustAndBalance_test.cpp delete mode 100644 src/test/app/TxQ_test.cpp delete mode 100644 src/test/app/ValidatorList_test.cpp delete mode 100644 src/test/basics/Buffer_test.cpp delete mode 100644 src/test/basics/CheckLibraryVersions_test.cpp delete mode 100644 src/test/basics/KeyCache_test.cpp delete mode 100644 src/test/basics/RangeSet_test.cpp delete mode 100644 src/test/basics/Slice_test.cpp delete mode 100644 src/test/basics/StringUtilities_test.cpp delete mode 100644 src/test/basics/TaggedCache_test.cpp delete mode 100644 src/test/basics/base_uint_test.cpp delete mode 100644 src/test/basics/contract_test.cpp delete mode 100644 src/test/basics/hardened_hash_test.cpp delete mode 100644 src/test/basics/mulDiv_test.cpp delete mode 100644 src/test/beast/IPEndpoint_test.cpp delete mode 100644 src/test/beast/LexicalCast_test.cpp delete mode 100644 src/test/beast/SemanticVersion_test.cpp delete mode 100644 src/test/beast/aged_associative_container_test.cpp delete mode 100644 src/test/beast/beast_Debug_test.cpp delete mode 100644 src/test/beast/beast_Journal_test.cpp delete mode 100644 src/test/beast/beast_PropertyStream_test.cpp delete mode 100644 src/test/beast/beast_Zero_test.cpp delete mode 100644 src/test/beast/beast_abstract_clock_test.cpp delete mode 100644 src/test/beast/beast_asio_error_test.cpp delete mode 100644 src/test/beast/beast_basic_seconds_clock_test.cpp delete mode 100644 src/test/beast/beast_tagged_integer_test.cpp delete mode 100644 src/test/beast/beast_weak_fn_test.cpp delete mode 100644 src/test/beast/define_print.cpp delete mode 100644 src/test/beast/hash_append_test.cpp delete mode 100644 src/test/beast/hash_speed_test.cpp delete mode 100644 src/test/conditions/Ed25519_test.cpp delete mode 100644 src/test/conditions/PrefixSha256_test.cpp delete mode 100644 src/test/conditions/PreimageSha256_test.cpp delete mode 100644 src/test/conditions/RsaSha256_test.cpp delete mode 100644 src/test/core/Config_test.cpp delete mode 100644 src/test/core/Coroutine_test.cpp delete mode 100644 src/test/core/DeadlineTimer_test.cpp delete mode 100644 src/test/core/SociDB_test.cpp delete mode 100644 src/test/core/Stoppable_test.cpp delete mode 100644 src/test/core/Workers_test.cpp delete mode 100644 src/test/json/Object_test.cpp delete mode 100644 src/test/json/Output_test.cpp delete mode 100644 src/test/json/TestOutputSuite.h delete mode 100644 src/test/json/Writer_test.cpp delete mode 100644 src/test/json/json_value_test.cpp delete mode 100644 src/test/jtx.h delete mode 100644 src/test/jtx/AbstractClient.h delete mode 100644 src/test/jtx/Account.h delete mode 100644 src/test/jtx/BasicNetwork.h delete mode 100644 src/test/jtx/BasicNetwork_test.cpp delete mode 100644 src/test/jtx/Env.h delete mode 100644 src/test/jtx/Env_ss.h delete mode 100644 src/test/jtx/Env_test.cpp delete mode 100644 src/test/jtx/JSONRPCClient.h delete mode 100644 src/test/jtx/JTx.h delete mode 100644 src/test/jtx/ManualTimeKeeper.h delete mode 100644 src/test/jtx/PathSet.h delete mode 100644 src/test/jtx/TestSuite.h delete mode 100644 src/test/jtx/WSClient.h delete mode 100644 src/test/jtx/WSClient_test.cpp delete mode 100644 src/test/jtx/amount.h delete mode 100644 src/test/jtx/balance.h delete mode 100644 src/test/jtx/basic_prop.h delete mode 100644 src/test/jtx/delivermin.h delete mode 100644 src/test/jtx/fee.h delete mode 100644 src/test/jtx/flags.h delete mode 100644 src/test/jtx/impl/Account.cpp delete mode 100644 src/test/jtx/impl/Env.cpp delete mode 100644 src/test/jtx/impl/JSONRPCClient.cpp delete mode 100644 src/test/jtx/impl/ManualTimeKeeper.cpp delete mode 100644 src/test/jtx/impl/WSClient.cpp delete mode 100644 src/test/jtx/impl/amount.cpp delete mode 100644 src/test/jtx/impl/balance.cpp delete mode 100644 src/test/jtx/impl/delivermin.cpp delete mode 100644 src/test/jtx/impl/fee.cpp delete mode 100644 src/test/jtx/impl/flags.cpp delete mode 100644 src/test/jtx/impl/jtx_json.cpp delete mode 100644 src/test/jtx/impl/memo.cpp delete mode 100644 src/test/jtx/impl/multisign.cpp delete mode 100644 src/test/jtx/impl/offer.cpp delete mode 100644 src/test/jtx/impl/owners.cpp delete mode 100644 src/test/jtx/impl/paths.cpp delete mode 100644 src/test/jtx/impl/pay.cpp delete mode 100644 src/test/jtx/impl/quality2.cpp delete mode 100644 src/test/jtx/impl/rate.cpp delete mode 100644 src/test/jtx/impl/regkey.cpp delete mode 100644 src/test/jtx/impl/sendmax.cpp delete mode 100644 src/test/jtx/impl/seq.cpp delete mode 100644 src/test/jtx/impl/sig.cpp delete mode 100644 src/test/jtx/impl/tag.cpp delete mode 100644 src/test/jtx/impl/ticket.cpp delete mode 100644 src/test/jtx/impl/trust.cpp delete mode 100644 src/test/jtx/impl/txflags.cpp delete mode 100644 src/test/jtx/impl/utility.cpp delete mode 100644 src/test/jtx/jtx_json.h delete mode 100644 src/test/jtx/memo.h delete mode 100644 src/test/jtx/multisign.h delete mode 100644 src/test/jtx/noop.h delete mode 100644 src/test/jtx/offer.h delete mode 100644 src/test/jtx/owners.h delete mode 100644 src/test/jtx/paths.h delete mode 100644 src/test/jtx/pay.h delete mode 100644 src/test/jtx/prop.h delete mode 100644 src/test/jtx/quality.h delete mode 100644 src/test/jtx/rate.h delete mode 100644 src/test/jtx/regkey.h delete mode 100644 src/test/jtx/require.h delete mode 100644 src/test/jtx/requires.h delete mode 100644 src/test/jtx/sendmax.h delete mode 100644 src/test/jtx/seq.h delete mode 100644 src/test/jtx/sig.h delete mode 100644 src/test/jtx/tag.h delete mode 100644 src/test/jtx/tags.h delete mode 100644 src/test/jtx/ter.h delete mode 100644 src/test/jtx/ticket.h delete mode 100644 src/test/jtx/trust.h delete mode 100644 src/test/jtx/txflags.h delete mode 100644 src/test/jtx/utility.h delete mode 100644 src/test/ledger/BookDirs_test.cpp delete mode 100644 src/test/ledger/Directory_test.cpp delete mode 100644 src/test/ledger/PaymentSandbox_test.cpp delete mode 100644 src/test/ledger/PendingSaves_test.cpp delete mode 100644 src/test/ledger/SHAMapV2_test.cpp delete mode 100644 src/test/ledger/SkipList_test.cpp delete mode 100644 src/test/ledger/View_test.cpp delete mode 100644 src/test/nodestore/Backend_test.cpp delete mode 100644 src/test/nodestore/Basics_test.cpp delete mode 100644 src/test/nodestore/Database_test.cpp delete mode 100644 src/test/nodestore/TestBase.h delete mode 100644 src/test/nodestore/Timing_test.cpp delete mode 100644 src/test/nodestore/import_test.cpp delete mode 100644 src/test/nodestore/varint_test.cpp delete mode 100644 src/test/overlay/TMHello_test.cpp delete mode 100644 src/test/overlay/cluster_test.cpp delete mode 100644 src/test/overlay/manifest_test.cpp delete mode 100644 src/test/overlay/short_read_test.cpp delete mode 100644 src/test/peerfinder/Livecache_test.cpp delete mode 100644 src/test/peerfinder/PeerFinder_test.cpp delete mode 100644 src/test/protocol/BuildInfo_test.cpp delete mode 100644 src/test/protocol/IOUAmount_test.cpp delete mode 100644 src/test/protocol/InnerObjectFormats_test.cpp delete mode 100644 src/test/protocol/Issue_test.cpp delete mode 100644 src/test/protocol/PublicKey_test.cpp delete mode 100644 src/test/protocol/Quality_test.cpp delete mode 100644 src/test/protocol/STAccount_test.cpp delete mode 100644 src/test/protocol/STAmount_test.cpp delete mode 100644 src/test/protocol/STObject_test.cpp delete mode 100644 src/test/protocol/STTx_test.cpp delete mode 100644 src/test/protocol/SecretKey_test.cpp delete mode 100644 src/test/protocol/Seed_test.cpp delete mode 100644 src/test/protocol/XRPAmount_test.cpp delete mode 100644 src/test/protocol/digest_test.cpp delete mode 100644 src/test/protocol/types_test.cpp delete mode 100644 src/test/resource/Logic_test.cpp delete mode 100644 src/test/rpc/AccountInfo_test.cpp delete mode 100644 src/test/rpc/AccountLinesRPC_test.cpp delete mode 100644 src/test/rpc/AccountObjects_test.cpp delete mode 100644 src/test/rpc/AccountOffers_test.cpp delete mode 100644 src/test/rpc/AccountSet_test.cpp delete mode 100644 src/test/rpc/Book_test.cpp delete mode 100644 src/test/rpc/GatewayBalances_test.cpp delete mode 100644 src/test/rpc/JSONRPC_test.cpp delete mode 100644 src/test/rpc/KeyGeneration_test.cpp delete mode 100644 src/test/rpc/LedgerClosed_test.cpp delete mode 100644 src/test/rpc/LedgerData_test.cpp delete mode 100644 src/test/rpc/LedgerRPC_test.cpp delete mode 100644 src/test/rpc/LedgerRequestRPC_test.cpp delete mode 100644 src/test/rpc/NoRipple_test.cpp delete mode 100644 src/test/rpc/RPCOverload_test.cpp delete mode 100644 src/test/rpc/RobustTransaction_test.cpp delete mode 100644 src/test/rpc/ServerInfo_test.cpp delete mode 100644 src/test/rpc/Status_test.cpp delete mode 100644 src/test/rpc/Subscribe_test.cpp delete mode 100644 src/test/server/ServerStatus_test.cpp delete mode 100644 src/test/server/Server_test.cpp delete mode 100644 src/test/shamap/FetchPack_test.cpp delete mode 100644 src/test/shamap/SHAMapSync_test.cpp delete mode 100644 src/test/shamap/SHAMap_test.cpp delete mode 100644 src/test/shamap/common.h delete mode 100644 src/test/unity/app_test_unity.cpp delete mode 100644 src/test/unity/basics_test_unity.cpp delete mode 100644 src/test/unity/beast_test_unity.cpp delete mode 100644 src/test/unity/conditions_test_unity.cpp delete mode 100644 src/test/unity/core_test_unity.cpp delete mode 100644 src/test/unity/json_test_unity.cpp delete mode 100644 src/test/unity/ledger_test_unity.cpp delete mode 100644 src/test/unity/nodestore_test_unity.cpp delete mode 100644 src/test/unity/overlay_test_unity.cpp delete mode 100644 src/test/unity/peerfinder_test_unity.cpp delete mode 100644 src/test/unity/protocol_test_unity.cpp delete mode 100644 src/test/unity/resource_test_unity.cpp delete mode 100644 src/test/unity/rpc_test_unity.cpp delete mode 100644 src/test/unity/server_test_unity.cpp delete mode 100644 src/test/unity/shamap_test_unity.cpp delete mode 100644 src/test/unity/support_unity.cpp rename {src/beast/test => test}/CMakeLists.txt (83%) rename {src/beast/test => test}/Jamfile (98%) rename src/beast/test/http/resume_context.cpp => test/config.cpp (87%) rename {src/beast/test => test}/core.cpp (100%) rename {src/beast/test => test}/core/CMakeLists.txt (93%) rename {src/beast/test => test}/core/async_completion.cpp (100%) rename {src/beast/test => test}/core/base64.cpp (100%) rename {src/beast/test => test}/core/bind_handler.cpp (100%) rename {src/beast/test => test}/core/buffer_cat.cpp (100%) rename {src/beast/test => test}/core/buffer_concepts.cpp (100%) rename {src/beast/test => test}/core/buffer_test.hpp (100%) rename {src/beast/test => test}/core/buffers_adapter.cpp (100%) rename {src/beast/test => test}/core/clamp.cpp (100%) rename {src/beast/test => test}/core/consuming_buffers.cpp (100%) rename {src/beast/test => test}/core/dynabuf_readstream.cpp (100%) rename {src/beast/test => test}/core/empty_base_optimization.cpp (100%) rename {src/beast/test => test}/core/error.cpp (100%) rename {src/beast/test => test}/core/get_lowest_layer.cpp (100%) rename {src/beast/test => test}/core/handler_alloc.cpp (100%) rename {src/beast/test => test}/core/handler_concepts.cpp (100%) rename {src/beast/test => test}/core/handler_ptr.cpp (100%) rename {src/beast/test => test}/core/is_call_possible.cpp (100%) rename {src/beast/test => test}/core/placeholders.cpp (100%) rename {src/beast/test => test}/core/prepare_buffer.cpp (100%) rename {src/beast/test => test}/core/prepare_buffers.cpp (100%) rename {src/beast/test => test}/core/sha1.cpp (100%) rename {src/beast/test => test}/core/static_streambuf.cpp (100%) rename {src/beast/test => test}/core/static_string.cpp (100%) rename {src/beast/test => test}/core/stream_concepts.cpp (100%) rename {src/beast/test => test}/core/streambuf.cpp (100%) rename {src/beast/test => test}/core/to_string.cpp (100%) rename {src/beast/test => test}/core/write_dynabuf.cpp (100%) rename {src/beast/test => test}/core/zlib.cpp (100%) rename {src/beast/test => test}/http.cpp (100%) rename {src/beast/test => test}/http/CMakeLists.txt (86%) rename {src/beast/test => test}/http/basic_dynabuf_body.cpp (100%) rename {src/beast/test => test}/http/basic_fields.cpp (100%) rename {src/beast/test => test}/http/basic_parser_v1.cpp (100%) rename {src/beast/test => test}/http/chunk_encode.cpp (100%) rename {src/beast/test => test}/http/concepts.cpp (100%) rename {src/beast/test => test}/http/empty_body.cpp (100%) rename {src/beast/test => test}/http/fail_parser.hpp (100%) rename {src/beast/test => test}/http/fields.cpp (100%) rename {src/beast/test => test}/http/header_parser_v1.cpp (100%) rename {src/beast/test => test}/http/message.cpp (100%) rename {src/beast/test => test}/http/message_fuzz.hpp (100%) rename {src/beast/test => test}/http/nodejs-parser/AUTHORS (100%) rename {src/beast/test => test}/http/nodejs-parser/LICENSE-MIT (100%) rename {src/beast/test => test}/http/nodejs-parser/README.md (100%) rename {src/beast/test => test}/http/nodejs-parser/http_parser.c (100%) rename {src/beast/test => test}/http/nodejs-parser/http_parser.h (100%) rename {src/beast/test => test}/http/nodejs_parser.cpp (100%) rename {src/beast/test => test}/http/nodejs_parser.hpp (100%) rename {src/beast/test => test}/http/parse.cpp (100%) rename {src/beast/test => test}/http/parse_error.cpp (100%) rename {src/beast/test => test}/http/parser_bench.cpp (100%) rename {src/beast/test => test}/http/parser_v1.cpp (100%) rename {src/beast/test => test}/http/read.cpp (86%) rename {src/beast/test => test}/http/reason.cpp (100%) rename {src/beast/test => test}/http/rfc7230.cpp (100%) rename {src/beast/test => test}/http/streambuf_body.cpp (100%) rename {src/beast/test => test}/http/string_body.cpp (100%) rename {src/beast/test => test}/http/write.cpp (90%) rename {src/beast/test => test}/version.cpp (100%) rename {src/beast/test => test}/websocket.cpp (100%) rename {src/beast/test => test}/websocket/CMakeLists.txt (90%) rename {src/beast/test => test}/websocket/error.cpp (100%) rename {src/beast/test => test}/websocket/frame.cpp (100%) rename {src/beast/test => test}/websocket/mask.cpp (100%) rename {src/beast/test => test}/websocket/option.cpp (100%) rename {src/beast/test => test}/websocket/rfc6455.cpp (100%) rename {src/beast/test => test}/websocket/stream.cpp (95%) rename {src/beast/test => test}/websocket/teardown.cpp (100%) rename {src/beast/test => test}/websocket/utf8_checker.cpp (100%) rename {src/beast/test => test}/websocket/websocket_async_echo_server.hpp (100%) rename {src/beast/test => test}/websocket/websocket_sync_echo_server.hpp (100%) rename {src/beast/test => test}/zlib.cpp (100%) rename {src/beast/test => test}/zlib/CMakeLists.txt (89%) rename {src/beast/test => test}/zlib/deflate_stream.cpp (100%) rename {src/beast/test => test}/zlib/error.cpp (100%) rename {src/beast/test => test}/zlib/inflate_stream.cpp (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/CMakeLists.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/ChangeLog (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/FAQ (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/INDEX (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/Makefile (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/Makefile.in (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/README (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/adler32.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/amiga/Makefile.pup (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/amiga/Makefile.sas (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/as400/bndsrc (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/as400/compile.clp (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/as400/readme.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/as400/zlib.inc (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/compress.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/configure (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/README.contrib (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/ada/buffer_demo.adb (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/ada/mtest.adb (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/ada/read.adb (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/ada/readme.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/ada/test.adb (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/ada/zlib-streams.adb (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/ada/zlib-streams.ads (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/ada/zlib-thin.adb (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/ada/zlib-thin.ads (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/ada/zlib.adb (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/ada/zlib.ads (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/ada/zlib.gpr (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/amd64/amd64-match.S (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/asm686/README.686 (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/asm686/match.S (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/blast/Makefile (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/blast/README (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/blast/blast.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/blast/blast.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/blast/test.pk (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/blast/test.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/delphi/ZLib.pas (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/delphi/ZLibConst.pas (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/delphi/readme.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/delphi/zlibd32.mak (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/dotzlib/DotZLib.build (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/dotzlib/DotZLib.chm (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/dotzlib/DotZLib.sln (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/dotzlib/DotZLib/AssemblyInfo.cs (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/dotzlib/DotZLib/ChecksumImpl.cs (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/dotzlib/DotZLib/CircularBuffer.cs (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/dotzlib/DotZLib/CodecBase.cs (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/dotzlib/DotZLib/Deflater.cs (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/dotzlib/DotZLib/DotZLib.cs (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/dotzlib/DotZLib/DotZLib.csproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/dotzlib/DotZLib/GZipStream.cs (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/dotzlib/DotZLib/Inflater.cs (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/dotzlib/DotZLib/UnitTests.cs (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/dotzlib/LICENSE_1_0.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/dotzlib/readme.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/gcc_gvmat64/gvmat64.S (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/infback9/README (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/infback9/infback9.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/infback9/infback9.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/infback9/inffix9.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/infback9/inflate9.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/infback9/inftree9.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/infback9/inftree9.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/inflate86/inffas86.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/inflate86/inffast.S (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/iostream/test.cpp (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/iostream/zfstream.cpp (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/iostream/zfstream.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/iostream2/zstream.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/iostream2/zstream_test.cpp (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/iostream3/README (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/iostream3/TODO (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/iostream3/test.cc (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/iostream3/zfstream.cc (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/iostream3/zfstream.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/masmx64/bld_ml64.bat (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/masmx64/gvmat64.asm (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/masmx64/inffas8664.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/masmx64/inffasx64.asm (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/masmx64/readme.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/masmx86/bld_ml32.bat (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/masmx86/inffas32.asm (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/masmx86/match686.asm (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/masmx86/readme.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/Makefile (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/Makefile.am (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/MiniZip64_Changes.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/MiniZip64_info.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/configure.ac (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/crypt.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/ioapi.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/ioapi.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/iowin32.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/iowin32.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/make_vms.com (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/miniunz.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/miniunzip.1 (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/minizip.1 (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/minizip.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/minizip.pc.in (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/mztools.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/mztools.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/unzip.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/unzip.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/zip.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/minizip/zip.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/pascal/example.pas (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/pascal/readme.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/pascal/zlibd32.mak (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/pascal/zlibpas.pas (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/puff/Makefile (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/puff/README (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/puff/puff.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/puff/puff.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/puff/pufftest.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/puff/zeros.raw (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/testzlib/testzlib.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/testzlib/testzlib.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/untgz/Makefile (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/untgz/Makefile.msc (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/untgz/untgz.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/readme.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc10/miniunz.vcxproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc10/miniunz.vcxproj.filters (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc10/minizip.vcxproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc10/minizip.vcxproj.filters (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc10/testzlib.vcxproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc10/testzlib.vcxproj.filters (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc10/testzlibdll.vcxproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc10/testzlibdll.vcxproj.filters (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc10/zlib.rc (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc10/zlibstat.vcxproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc10/zlibstat.vcxproj.filters (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc10/zlibvc.def (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc10/zlibvc.sln (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc10/zlibvc.vcxproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc10/zlibvc.vcxproj.filters (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc11/miniunz.vcxproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc11/minizip.vcxproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc11/testzlib.vcxproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc11/testzlibdll.vcxproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc11/zlib.rc (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc11/zlibstat.vcxproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc11/zlibvc.def (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc11/zlibvc.sln (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc11/zlibvc.vcxproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc9/miniunz.vcproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc9/minizip.vcproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc9/testzlib.vcproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc9/testzlibdll.vcproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc9/zlib.rc (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc9/zlibstat.vcproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc9/zlibvc.def (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc9/zlibvc.sln (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/contrib/vstudio/vc9/zlibvc.vcproj (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/crc32.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/crc32.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/deflate.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/deflate.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/doc/algorithm.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/doc/rfc1950.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/doc/rfc1951.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/doc/rfc1952.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/doc/txtvsbin.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/examples/README.examples (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/examples/enough.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/examples/fitblk.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/examples/gun.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/examples/gzappend.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/examples/gzjoin.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/examples/gzlog.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/examples/gzlog.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/examples/zlib_how.html (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/examples/zpipe.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/examples/zran.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/gzclose.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/gzguts.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/gzlib.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/gzread.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/gzwrite.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/infback.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/inffast.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/inffast.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/inffixed.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/inflate.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/inflate.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/inftrees.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/inftrees.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/make_vms.com (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/msdos/Makefile.bor (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/msdos/Makefile.dj2 (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/msdos/Makefile.emx (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/msdos/Makefile.msc (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/msdos/Makefile.tc (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/nintendods/Makefile (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/nintendods/README (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/old/Makefile.emx (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/old/Makefile.riscos (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/old/README (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/old/descrip.mms (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/old/os2/Makefile.os2 (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/old/os2/zlib.def (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/old/visual-basic.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/qnx/package.qpg (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/test/example.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/test/infcover.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/test/minigzip.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/treebuild.xml (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/trees.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/trees.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/uncompr.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/watcom/watcom_f.mak (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/watcom/watcom_l.mak (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/win32/DLL_FAQ.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/win32/Makefile.bor (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/win32/Makefile.gcc (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/win32/Makefile.msc (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/win32/README-WIN32.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/win32/VisualC.txt (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/win32/zlib.def (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/win32/zlib1.rc (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/zconf.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/zconf.h.cmakein (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/zconf.h.in (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/zlib.3 (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/zlib.3.pdf (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/zlib.h (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/zlib.map (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/zlib.pc.cmakein (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/zlib.pc.in (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/zlib2ansi (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/zutil.c (100%) rename {src/beast/test => test}/zlib/zlib-1.2.8/zutil.h (100%) rename {src/beast/test => test}/zlib/ztest.hpp (100%) diff --git a/.gitattributes b/.gitattributes index 472cfb380c..8d9c7343dc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,9 +1,8 @@ # Set default behaviour, in case users don't have core.autocrlf set. -#* text=auto +* text=auto -# These annoying files -rippled.1 binary -LICENSE binary +# Github +.md text eol=lf # Visual Studio *.sln text eol=crlf diff --git a/.gitignore b/.gitignore index 3f7ff7b7b4..99f984bdaa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,96 +1,2 @@ -# .gitignore - -bin/boostbook_catalog.xml -bin/config.log -bin/project-cache.jam - -# Ignore vim swap files. -*.swp - -# Ignore SCons support files. -.sconsign.dblite - -# Ignore python compiled files. -*.pyc - -# Ignore Macintosh Desktop Services Store files. -.DS_Store - -# Ignore backup/temps -*~ - -# Ignore object files. -*.o -build -tags -TAGS -bin/rippled -Debug/*.* -Release/*.* - -# Ignore coverage files. -*.gcno -*.gcda -*.gcov - -# Ignore locally installed node_modules -/node_modules - -# Ignore tmp directory. -tmp - -# Ignore database directory. -db/ -db/*.db -db/*.db-* - -# Ignore debug logs -debug_log.txt - -# Ignore customized configs -rippled.cfg -validators.txt -test/config.js - -# Doxygen generated documentation output -HtmlDocumentation - -# Xcode user-specific project settings -# Xcode -.DS_Store -*/build/* -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -profile -*.moved-aside -DerivedData -.idea/ -*.hmap - -# Intel Parallel Studio 2013 XE -My Amplifier XE Results - RippleD - -# Compiler intermediate output -/out.txt - -# Build Log -rippled-build.log - -# Profiling data -gmon.out - -Builds/VisualStudio2015/*.db -Builds/VisualStudio2015/*.user -Builds/VisualStudio2015/*.opendb -Builds/VisualStudio2015/*.sdf - -# MSVC -*.pdb -.vs/ +bin/ +bin64/ diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 58060902fc..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,12 +0,0 @@ -[submodule "docs/docca"] - path = docs/docca - url = https://github.com/vinniefalco/docca.git -[submodule "src/nudb/extras/beast"] - path = src/nudb/extras/beast - url = https://github.com/vinniefalco/Beast.git -[submodule "src/nudb/extras/rocksdb"] - path = src/nudb/extras/rocksdb - url = https://github.com/facebook/rocksdb.git -[submodule "src/nudb/doc/docca"] - path = src/nudb/doc/docca - url = https://github.com/vinniefalco/docca.git diff --git a/.travis.yml b/.travis.yml index e9f062abbc..236e8da718 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,8 +10,9 @@ env: # namepart must match the folder name internal # to boost's .tar.gz. - LCOV_ROOT=$HOME/lcov - - BOOST_ROOT=$HOME/boost_1_60_0 - - BOOST_URL='http://sourceforge.net/projects/boost/files/boost/1.60.0/boost_1_60_0.tar.gz' + - VALGRIND_ROOT=$HOME/valgrind-install + - BOOST_ROOT=$HOME/boost_1_61_0 + - BOOST_URL='http://sourceforge.net/projects/boost/files/boost/1.61.0/boost_1_61_0.tar.gz' addons: apt: @@ -20,52 +21,66 @@ addons: - gcc-5 - g++-5 - python-software-properties - - protobuf-compiler - - libprotobuf-dev - libssl-dev + - libffi-dev - libstdc++6 - binutils-gold # Provides a backtrace if the unittests crash - gdb + # Needed for installing valgrind + - subversion + - automake + - autotools-dev + - libc6-dbg matrix: include: - # Default BUILD is "scons". - + # GCC/Coverage/Autobahn (if master or develop branch) - compiler: gcc - env: GCC_VER=5 BUILD=cmake TARGET=debug.nounity PATH=$PWD/cmake/bin:$PATH - - - compiler: gcc - env: GCC_VER=5 TARGET=coverage + env: + - GCC_VER=5 + - VARIANT=coverage + - ADDRESS_MODEL=64 + - BUILD_SYSTEM=cmake + - PATH=$PWD/cmake/bin:$PATH + # Clang/UndefinedBehaviourSanitizer - compiler: clang - env: GCC_VER=5 TARGET=debug CLANG_VER=3.8 PATH=$PWD/llvm-$LLVM_VERSION/bin:$PATH + env: + - GCC_VER=5 + - VARIANT=usan + - CLANG_VER=3.8 + - ADDRESS_MODEL=64 + - UBSAN_OPTIONS='print_stacktrace=1' + - BUILD_SYSTEM=cmake + - PATH=$PWD/cmake/bin:$PATH + - PATH=$PWD/llvm-$LLVM_VERSION/bin:$PATH + # Clang/AddressSanitizer - compiler: clang - env: GCC_VER=5 TARGET=debug.nounity CLANG_VER=3.8 PATH=$PWD/llvm-$LLVM_VERSION/bin:$PATH - - # The clang cmake builds do not link. - # - compiler: clang - # env: GCC_VER=5 BUILD=cmake TARGET=debug CLANG_VER=3.8 PATH=$PWD/llvm-$LLVM_VERSION/bin:$PWD/cmake/bin:$PATH - - # - compiler: clang - # env: GCC_VER=5 BUILD=cmake TARGET=debug.nounity CLANG_VER=3.8 PATH=$PWD/llvm-$LLVM_VERSION/bin:$PWD/cmake/bin:$PATH + env: + - GCC_VER=5 + - VARIANT=asan + - CLANG_VER=3.8 + - ADDRESS_MODEL=64 + - PATH=$PWD/llvm-$LLVM_VERSION/bin:$PATH cache: directories: - $BOOST_ROOT + - $VALGRIND_ROOT - llvm-$LLVM_VERSION - cmake before_install: - - bin/ci/ubuntu/install-dependencies.sh + - scripts/install-dependencies.sh script: - - travis_retry bin/ci/ubuntu/build-and-test.sh + - travis_retry scripts/build-and-test.sh + +after_script: + - cat nohup.out || echo "nohup.out already deleted" notifications: email: false - irc: - channels: - - "chat.freenode.net#ripple-dev" diff --git a/Builds/ArchLinux/PKGBUILD b/Builds/ArchLinux/PKGBUILD deleted file mode 100644 index 6ea10324a8..0000000000 --- a/Builds/ArchLinux/PKGBUILD +++ /dev/null @@ -1,38 +0,0 @@ -# Maintainer: Roberto Catini - -pkgname=rippled -pkgrel=1 -pkgver=0 -pkgdesc="Ripple peer-to-peer network daemon" -arch=('i686' 'x86_64') -url="https://github.com/ripple/rippled" -license=('custom:ISC') -depends=('protobuf' 'openssl' 'boost-libs') -makedepends=('git' 'scons' 'boost') -backup=("etc/$pkgname/rippled.cfg") -source=("git://github.com/ripple/rippled.git#branch=master") -sha512sums=('SKIP') - -pkgver() { - cd "$srcdir/$pkgname" - git describe --long --tags | sed -r 's/([^-]*-g)/r\1/;s/-/./g' -} - -build() { - cd "$srcdir/$pkgname" - scons -} - -check() { - cd "$srcdir/$pkgname" - build/rippled --unittest -} - -package() { - cd "$srcdir/$pkgname" - install -D -m644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE" - install -D build/rippled "$pkgdir/usr/bin/rippled" - install -D -m644 doc/rippled-example.cfg "$pkgdir/etc/$pkgname/rippled.cfg" - mkdir -p "$pkgdir/var/lib/$pkgname/db" - mkdir -p "$pkgdir/var/log/$pkgname" -} diff --git a/Builds/CMake/CMakeFuncs.cmake b/Builds/CMake/CMakeFuncs.cmake deleted file mode 100644 index 764aa2e3a2..0000000000 --- a/Builds/CMake/CMakeFuncs.cmake +++ /dev/null @@ -1,662 +0,0 @@ -# This is a set of common functions and settings for rippled -# and derived products. - -############################################################ - -cmake_minimum_required(VERSION 3.1.0) - -if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") - message(WARNING "Builds are strongly discouraged in " - "${CMAKE_SOURCE_DIR}.") -endif() - -macro(parse_target) - - if (NOT target AND NOT CMAKE_BUILD_TYPE) - if (APPLE) - set(target clang.debug) - elseif(WIN32) - set(target msvc) - else() - set(target gcc.debug) - endif() - endif() - - if (target) - # Parse the target - set(remaining ${target}) - while (remaining) - # get the component up to the next dot or end - string(REGEX REPLACE "^\\.?([^\\.]+).*$" "\\1" cur_component ${remaining}) - string(REGEX REPLACE "^\\.?[^\\.]+(.*$)" "\\1" remaining ${remaining}) - - if (${cur_component} STREQUAL gcc) - if (DEFINED ENV{GNU_CC}) - set(CMAKE_C_COMPILER $ENV{GNU_CC}) - elseif ($ENV{CXX} MATCHES .*gcc.*) - set(CMAKE_CXX_COMPILER $ENV{CC}) - else() - find_program(CMAKE_C_COMPILER gcc) - endif() - - if (DEFINED ENV{GNU_CXX}) - set(CMAKE_C_COMPILER $ENV{GNU_CXX}) - elseif ($ENV{CXX} MATCHES .*g\\+\\+.*) - set(CMAKE_C_COMPILER $ENV{CC}) - else() - find_program(CMAKE_CXX_COMPILER g++) - endif() - endif() - - if (${cur_component} STREQUAL clang) - if (DEFINED ENV{CLANG_CC}) - set(CMAKE_C_COMPILER $ENV{CLANG_CC}) - elseif ($ENV{CXX} MATCHES .*clang.*) - set(CMAKE_CXX_COMPILER $ENV{CC}) - else() - find_program(CMAKE_C_COMPILER clang) - endif() - - if (DEFINED ENV{CLANG_CXX}) - set(CMAKE_C_COMPILER $ENV{CLANG_CXX}) - elseif ($ENV{CXX} MATCHES .*clang.*) - set(CMAKE_C_COMPILER $ENV{CC}) - else() - find_program(CMAKE_CXX_COMPILER clang++) - endif() - endif() - - if (${cur_component} STREQUAL msvc) - # TBD - endif() - - if (${cur_component} STREQUAL unity) - set(unity true) - set(nonunity false) - endif() - - if (${cur_component} STREQUAL nounity) - set(unity false) - set(nonunity true) - endif() - - if (${cur_component} STREQUAL debug) - set(release false) - endif() - - if (${cur_component} STREQUAL release) - set(release true) - endif() - - if (${cur_component} STREQUAL coverage) - set(coverage true) - set(debug true) - endif() - - if (${cur_component} STREQUAL profile) - set(profile true) - endif() - - if (${cur_component} STREQUAL ci) - # Workarounds that make various CI builds work, but that - # we don't want in the general case. - set(ci true) - set(openssl_min 1.0.1) - endif() - - endwhile() - - if (release) - set(CMAKE_BUILD_TYPE Release) - else() - set(CMAKE_BUILD_TYPE Debug) - endif() - - if (NOT unity) - set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE}Classic) - endif() - endif() - -endmacro() - -############################################################ - -macro(setup_build_cache) - set(san "" CACHE STRING "On gcc & clang, add sanitizer - instrumentation") - set_property(CACHE san PROPERTY STRINGS ";address;thread") - set(assert false CACHE BOOL "Enables asserts, even in release builds") - set(static false CACHE BOOL - "On linux, link protobuf, openssl, libc++, and boost statically") - - if (static AND (WIN32 OR APPLE)) - message(FATAL_ERROR "Static linking is only supported on linux.") - endif() - - if (${CMAKE_GENERATOR} STREQUAL "Unix Makefiles" AND NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Debug) - endif() - - # Can't exclude files from configurations, so can't support both - # unity and nonunity configurations at the same time - if (NOT DEFINED unity OR unity) - set(CMAKE_CONFIGURATION_TYPES - Debug - Release) - else() - set(CMAKE_CONFIGURATION_TYPES - DebugClassic - ReleaseClassic) - endif() - - set(CMAKE_CONFIGURATION_TYPES - ${CMAKE_CONFIGURATION_TYPES} CACHE STRING "" FORCE) -endmacro() - -############################################################ - -function(prepend var prefix) - set(listVar "") - foreach(f ${ARGN}) - list(APPEND listVar "${prefix}${f}") - endforeach(f) - set(${var} "${listVar}" PARENT_SCOPE) -endfunction() - -macro(append_flags name) - foreach (arg ${ARGN}) - set(${name} "${${name}} ${arg}") - endforeach() -endmacro() - -macro(group_sources curdir) - file(GLOB children RELATIVE ${PROJECT_SOURCE_DIR}/${curdir} - ${PROJECT_SOURCE_DIR}/${curdir}/*) - foreach (child ${children}) - if (IS_DIRECTORY ${PROJECT_SOURCE_DIR}/${curdir}/${child}) - group_sources(${curdir}/${child}) - else() - string(REPLACE "/" "\\" groupname ${curdir}) - source_group(${groupname} FILES - ${PROJECT_SOURCE_DIR}/${curdir}/${child}) - endif() - endforeach() -endmacro() - -macro(add_with_props src_var files) - list(APPEND ${src_var} ${files}) - foreach (arg ${ARGN}) - set(props "${props} ${arg}") - endforeach() - set_source_files_properties( - ${files} - PROPERTIES COMPILE_FLAGS - ${props}) -endmacro() - -############################################################ - -macro(determine_build_type) - if ("${CMAKE_CXX_COMPILER_ID}" MATCHES ".*Clang") # both Clang and AppleClang - set(is_clang true) - elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") - set(is_gcc true) - elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") - set(is_msvc true) - endif() - - if (${CMAKE_GENERATOR} STREQUAL "Xcode") - set(is_xcode true) - else() - set(is_xcode false) - endif() - - if (NOT is_gcc AND NOT is_clang AND NOT is_msvc) - message("Current compiler is ${CMAKE_CXX_COMPILER_ID}") - message(FATAL_ERROR "Missing compiler. Must be GNU, Clang, or MSVC") - endif() -endmacro() - -############################################################ - -macro(check_gcc4_abi) - # Check if should use gcc4's ABI - set(gcc4_abi false) - - if ($ENV{RIPPLED_OLD_GCC_ABI}) - set(gcc4_abi true) - endif() - - if (is_gcc AND NOT gcc4_abi) - if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 5) - execute_process(COMMAND lsb_release -si OUTPUT_VARIABLE lsb) - string(STRIP "${lsb}" lsb) - if ("${lsb}" STREQUAL "Ubuntu") - execute_process(COMMAND lsb_release -sr OUTPUT_VARIABLE lsb) - string(STRIP ${lsb} lsb) - if (${lsb} VERSION_LESS 15.1) - set(gcc4_abi true) - endif() - endif() - endif() - endif() - - if (gcc4_abi) - add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) - endif() -endmacro() - -############################################################ - -macro(special_build_flags) - if (coverage) - add_compile_options(-fprofile-arcs -ftest-coverage) - append_flags(CMAKE_EXE_LINKER_FLAGS -fprofile-arcs -ftest-coverage) - endif() - - if (profile) - add_compile_options(-p -pg) - append_flags(CMAKE_EXE_LINKER_FLAGS -p -pg) - endif() -endmacro() - -############################################################ - -# Params: Boost components to search for. -macro(use_boost) - if ((NOT DEFINED BOOST_ROOT) AND (DEFINED ENV{BOOST_ROOT})) - set(BOOST_ROOT $ENV{BOOST_ROOT}) - endif() - if(WIN32 OR CYGWIN) - # Workaround for MSVC having two boost versions - x86 and x64 on same PC in stage folders - if(DEFINED BOOST_ROOT) - if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND IS_DIRECTORY ${BOOST_ROOT}/stage64/lib) - set(Boost_LIBRARY_DIR ${BOOST_ROOT}/stage64/lib) - else() - set(Boost_LIBRARY_DIR ${BOOST_ROOT}/stage/lib) - endif() - endif() - endif() - - if (is_clang AND DEFINED ENV{CLANG_BOOST_ROOT}) - set(BOOST_ROOT $ENV{CLANG_BOOST_ROOT}) - endif() - - set(Boost_USE_STATIC_LIBS on) - set(Boost_USE_MULTITHREADED on) - set(Boost_USE_STATIC_RUNTIME off) - find_package(Boost COMPONENTS - ${ARGN}) - - if (Boost_FOUND OR - ((CYGWIN OR WIN32) AND Boost_INCLUDE_DIRS AND Boost_LIBRARY_DIRS)) - if(NOT Boost_FOUND) - message(WARNING "Boost directory found, but not all components. May not be able to build.") - endif() - include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) - link_directories(${Boost_LIBRARY_DIRS}) - else() - message(FATAL_ERROR "Boost not found") - endif() -endmacro() - -macro(use_pthread) - if (NOT WIN32) - set(THREADS_PREFER_PTHREAD_FLAG ON) - find_package(Threads) - add_compile_options(${CMAKE_THREAD_LIBS_INIT}) - endif() -endmacro() - -macro(use_openssl openssl_min) - if (APPLE AND NOT DEFINED ENV{OPENSSL_ROOT_DIR}) - find_program(HOMEBREW brew) - if (NOT HOMEBREW STREQUAL "HOMEBREW-NOTFOUND") - execute_process(COMMAND brew --prefix openssl - OUTPUT_VARIABLE OPENSSL_ROOT_DIR - OUTPUT_STRIP_TRAILING_WHITESPACE) - endif() - endif() - - if (WIN32) - if (DEFINED ENV{OPENSSL_ROOT}) - include_directories($ENV{OPENSSL_ROOT}/include) - link_directories($ENV{OPENSSL_ROOT}/lib) - endif() - else() - if (static) - set(tmp CMAKE_FIND_LIBRARY_SUFFIXES) - set(CMAKE_FIND_LIBRARY_SUFFIXES .a) - endif() - - find_package(OpenSSL) - - if (static) - set(CMAKE_FIND_LIBRARY_SUFFIXES tmp) - endif() - - if (OPENSSL_FOUND) - include_directories(${OPENSSL_INCLUDE_DIR}) - else() - message(FATAL_ERROR "OpenSSL not found") - endif() - if (UNIX AND NOT APPLE AND ${OPENSSL_VERSION} VERSION_LESS ${openssl_min}) - message(FATAL_ERROR - "Your openssl is Version: ${OPENSSL_VERSION}, ${openssl_min} or better is required.") - endif() - endif() -endmacro() - -macro(use_protobuf) - if (WIN32) - if (DEFINED ENV{PROTOBUF_ROOT}) - include_directories($ENV{PROTOBUF_ROOT}/src) - link_directories($ENV{PROTOBUF_ROOT}/src/.libs) - endif() - - # Modified from FindProtobuf.cmake - FUNCTION(PROTOBUF_GENERATE_CPP SRCS HDRS PROTOFILES) - # argument parsing - IF(NOT PROTOFILES) - MESSAGE(SEND_ERROR "Error: PROTOBUF_GENERATE_CPP() called without any proto files") - RETURN() - ENDIF() - - SET(OUTPATH ${CMAKE_CURRENT_BINARY_DIR}) - SET(PROTOROOT ${CMAKE_CURRENT_SOURCE_DIR}) - # the real logic - SET(${SRCS}) - SET(${HDRS}) - FOREACH(PROTOFILE ${PROTOFILES}) - # ensure that the file ends with .proto - STRING(REGEX MATCH "\\.proto$$" PROTOEND ${PROTOFILE}) - IF(NOT PROTOEND) - MESSAGE(SEND_ERROR "Proto file '${PROTOFILE}' does not end with .proto") - ENDIF() - - GET_FILENAME_COMPONENT(PROTO_PATH ${PROTOFILE} PATH) - GET_FILENAME_COMPONENT(ABS_FILE ${PROTOFILE} ABSOLUTE) - GET_FILENAME_COMPONENT(FILE_WE ${PROTOFILE} NAME_WE) - - STRING(REGEX MATCH "^${PROTOROOT}" IN_ROOT_PATH ${PROTOFILE}) - STRING(REGEX MATCH "^${PROTOROOT}" IN_ROOT_ABS_FILE ${ABS_FILE}) - - IF(IN_ROOT_PATH) - SET(MATCH_PATH ${PROTOFILE}) - ELSEIF(IN_ROOT_ABS_FILE) - SET(MATCH_PATH ${ABS_FILE}) - ELSE() - MESSAGE(SEND_ERROR "Proto file '${PROTOFILE}' is not in protoroot '${PROTOROOT}'") - ENDIF() - - # build the result file name - STRING(REGEX REPLACE "^${PROTOROOT}(/?)" "" ROOT_CLEANED_FILE ${MATCH_PATH}) - STRING(REGEX REPLACE "\\.proto$$" "" EXT_CLEANED_FILE ${ROOT_CLEANED_FILE}) - - SET(CPP_FILE "${OUTPATH}/${EXT_CLEANED_FILE}.pb.cc") - SET(H_FILE "${OUTPATH}/${EXT_CLEANED_FILE}.pb.h") - - LIST(APPEND ${SRCS} "${CPP_FILE}") - LIST(APPEND ${HDRS} "${H_FILE}") - - ADD_CUSTOM_COMMAND( - OUTPUT "${CPP_FILE}" "${H_FILE}" - COMMAND ${CMAKE_COMMAND} -E make_directory ${OUTPATH} - COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} - ARGS "--cpp_out=${OUTPATH}" --proto_path "${PROTOROOT}" "${MATCH_PATH}" - DEPENDS ${ABS_FILE} - COMMENT "Running C++ protocol buffer compiler on ${MATCH_PATH} with root ${PROTOROOT}, generating: ${CPP_FILE}" - VERBATIM) - - ENDFOREACH() - - SET_SOURCE_FILES_PROPERTIES(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE) - SET(${SRCS} ${${SRCS}} PARENT_SCOPE) - SET(${HDRS} ${${HDRS}} PARENT_SCOPE) - - ENDFUNCTION() - - set(PROTOBUF_PROTOC_EXECUTABLE Protoc) # must be on path - else() - if (static) - set(tmp CMAKE_FIND_LIBRARY_SUFFIXES) - set(CMAKE_FIND_LIBRARY_SUFFIXES .a) - endif() - - find_package(Protobuf REQUIRED) - - if (static) - set(CMAKE_FIND_LIBRARY_SUFFIXES tmp) - endif() - - if (is_clang AND DEFINED ENV{CLANG_PROTOBUF_ROOT}) - link_directories($ENV{CLANG_PROTOBUF_ROOT}/src/.libs) - include_directories($ENV{CLANG_PROTOBUF_ROOT}/src) - else() - include_directories(${PROTOBUF_INCLUDE_DIRS}) - endif() - endif() - include_directories(${CMAKE_CURRENT_BINARY_DIR}) - - file(GLOB ripple_proto src/ripple/proto/*.proto) - PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS ${ripple_proto}) - - if (WIN32) - include_directories(src/protobuf/src - src/protobuf/vsprojects - ${CMAKE_CURRENT_BINARY_DIR}/src/ripple/proto) - endif() - -endmacro() - -############################################################ - -macro(setup_build_boilerplate) - if (NOT WIN32 AND san) - add_compile_options(-fsanitize=${san} -fno-omit-frame-pointer) - - append_flags(CMAKE_EXE_LINKER_FLAGS - -fsanitize=${san}) - - string(TOLOWER ${san} ci_san) - if (${ci_san} STREQUAL address) - set(SANITIZER_LIBRARIES asan) - add_definitions(-DSANITIZER=ASAN) - endif() - if (${ci_san} STREQUAL thread) - set(SANITIZER_LIBRARIES tsan) - add_definitions(-DSANITIZER=TSAN) - endif() - endif() - - ############################################################ - - add_definitions( - -DOPENSSL_NO_SSL2 - -DDEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER - -DHAVE_USLEEP=1 - -DSOCI_CXX_C11=1 - -D_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS - -DBOOST_NO_AUTO_PTR - ) - - if (is_gcc) - add_compile_options(-Wno-unused-but-set-variable -Wno-deprecated) - endif() - - # Generator expressions are not supported in add_definitions, use set_property instead - set_property( - DIRECTORY - APPEND - PROPERTY COMPILE_DEFINITIONS - $<$,$>:DEBUG _DEBUG>) - - if (NOT assert) - set_property( - DIRECTORY - APPEND - PROPERTY COMPILE_DEFINITIONS - $<$,$,$>:NDEBUG>) - else() - # CMAKE_CXX_FLAGS_RELEASE is created by CMake for most / all generators - # with defaults including /DNDEBUG or -DNDEBUG, and that value is stored - # in the cache. Override that locally so that the cache value will be - # avaiable if "assert" is ever changed. - STRING(REGEX REPLACE "[-/]DNDEBUG" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") - STRING(REGEX REPLACE "[-/]DNDEBUG" "" CMAKE_CXX_FLAGS_RELEASECLASSIC "${CMAKE_CXX_FLAGS_RELEASECLASSIC}") - STRING(REGEX REPLACE "[-/]DNDEBUG" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") - STRING(REGEX REPLACE "[-/]DNDEBUG" "" CMAKE_C_FLAGS_RELEASECLASSIC "${CMAKE_C_FLAGS_RELEASECLASSIC}") - endif() - - if (NOT WIN32) - add_definitions(-D_FILE_OFFSET_BITS=64) - append_flags(CMAKE_CXX_FLAGS -frtti -std=c++14 -Wno-invalid-offsetof - -DBOOST_COROUTINE_NO_DEPRECATION_WARNING -DBOOST_COROUTINES_NO_DEPRECATION_WARNING) - add_compile_options(-Wall -Wno-sign-compare -Wno-char-subscripts -Wno-format - -Wno-unused-local-typedefs -g) - # There seems to be an issue using generator experssions with multiple values, - # split the expression - add_compile_options($<$,$>:-O3>) - add_compile_options($<$,$>:-fno-strict-aliasing>) - append_flags(CMAKE_EXE_LINKER_FLAGS -rdynamic -g) - - if (is_clang) - add_compile_options( - -Wno-redeclared-class-member -Wno-mismatched-tags -Wno-deprecated-register) - add_definitions(-DBOOST_ASIO_HAS_STD_ARRAY) - endif() - - if (APPLE) - add_definitions(-DBEAST_COMPILE_OBJECTIVE_CPP=1 - -DNO_LOG_UNHANDLED_EXCEPTIONS) - add_compile_options( - -Wno-deprecated -Wno-deprecated-declarations -Wno-unused-variable -Wno-unused-function) - endif() - - if (is_gcc) - add_compile_options(-Wno-unused-but-set-variable -Wno-unused-local-typedefs) - add_compile_options($<$,$>:-O0>) - endif (is_gcc) - else(NOT WIN32) - add_compile_options( - /bigobj # Increase object file max size - /EHa # ExceptionHandling all - /fp:precise # Floating point behavior - /Gd # __cdecl calling convention - /Gm- # Minimal rebuild: disabled - /GR # Enable RTTI - /Gy- # Function level linking: disabled - /FS - /MP # Multiprocessor compilation - /openmp- # pragma omp: disabled - /Zc:forScope # Language extension: for scope - /Zi # Generate complete debug info - /errorReport:none # No error reporting to Internet - /nologo # Suppress login banner - /W3 # Warning level 3 - /WX- # Disable warnings as errors - /wd"4018" - /wd"4244" - /wd"4267" - /wd"4800" # Disable C4800(int to bool performance) - /wd"4503" # Decorated name length exceeded, name was truncated - ) - add_definitions( - -D_WIN32_WINNT=0x6000 - -D_SCL_SECURE_NO_WARNINGS - -D_CRT_SECURE_NO_WARNINGS - -DWIN32_CONSOLE - -DNOMINMAX - -DBOOST_COROUTINE_NO_DEPRECATION_WARNING - -DBOOST_COROUTINES_NO_DEPRECATION_WARNING) - append_flags(CMAKE_EXE_LINKER_FLAGS - /DEBUG - /DYNAMICBASE - /ERRORREPORT:NONE - /MACHINE:X64 - /MANIFEST - /nologo - /NXCOMPAT - /SUBSYSTEM:CONSOLE - /TLBID:1) - - - # There seems to be an issue using generator experssions with multiple values, - # split the expression - # /GS Buffers security check: enable - add_compile_options($<$,$>:/GS>) - # /MTd Language: Multi-threaded Debug CRT - add_compile_options($<$,$>:/MTd>) - # /Od Optimization: Disabled - add_compile_options($<$,$>:/Od>) - # /RTC1 Run-time error checks: - add_compile_options($<$,$>:/RTC1>) - - # Generator expressions are not supported in add_definitions, use set_property instead - set_property( - DIRECTORY - APPEND - PROPERTY COMPILE_DEFINITIONS - $<$,$>:_CRTDBG_MAP_ALLOC>) - - # /MT Language: Multi-threaded CRT - add_compile_options($<$,$>:/MT>) - add_compile_options($<$,$>:/Ox>) - # /Ox Optimization: Full - - endif (NOT WIN32) - - if (static) - append_flags(CMAKE_EXE_LINKER_FLAGS -static-libstdc++) - # set_target_properties(ripple-libpp PROPERTIES LINK_SEARCH_START_STATIC 1) - # set_target_properties(ripple-libpp PROPERTIES LINK_SEARCH_END_STATIC 1) - endif() -endmacro() - -############################################################ - -macro(create_build_folder cur_project) - if (NOT WIN32) - ADD_CUSTOM_TARGET(build_folder ALL - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR} - COMMENT "Creating build output folder") - add_dependencies(${cur_project} build_folder) - endif() -endmacro() - -macro(set_startup_project cur_project) - if (WIN32 AND NOT ci) - if (CMAKE_VERSION VERSION_LESS 3.6) - message(WARNING - "Setting the VS startup project requires cmake 3.6 or later. Please upgrade.") - endif() - set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY - VS_STARTUP_PROJECT ${cur_project}) - endif() -endmacro() - -macro(link_common_libraries cur_project) - if (NOT MSVC) - target_link_libraries(${cur_project} ${Boost_LIBRARIES}) - target_link_libraries(${cur_project} dl) - target_link_libraries(${cur_project} Threads::Threads) - if (APPLE) - find_library(app_kit AppKit) - find_library(foundation Foundation) - target_link_libraries(${cur_project} - crypto ssl ${app_kit} ${foundation}) - else() - target_link_libraries(${cur_project} rt) - endif() - else(NOT MSVC) - target_link_libraries(${cur_project} - $<$,$>:VC/static/ssleay32MTd> - $<$,$>:VC/static/libeay32MTd>) - target_link_libraries(${cur_project} - $<$,$>:VC/static/ssleay32MT> - $<$,$>:VC/static/libeay32MT>) - target_link_libraries(${cur_project} - legacy_stdio_definitions.lib Shlwapi kernel32 user32 gdi32 winspool comdlg32 - advapi32 shell32 ole32 oleaut32 uuid odbc32 odbccp32) - endif (NOT MSVC) -endmacro() diff --git a/Builds/Docker/Dockerfile b/Builds/Docker/Dockerfile deleted file mode 100644 index 554f2ab702..0000000000 --- a/Builds/Docker/Dockerfile +++ /dev/null @@ -1,30 +0,0 @@ -# rippled - -# use the ubuntu base image -FROM ubuntu -MAINTAINER Roberto Catini roberto.catini@gmail.com - -# make sure the package repository is up to date -RUN apt-get update -RUN apt-get -y upgrade - -# install the dependencies -RUN apt-get -y install git scons pkg-config protobuf-compiler libprotobuf-dev libssl-dev libboost1.55-all-dev - -# download source code from official repository -RUN git clone https://github.com/ripple/rippled.git src; cd src/; git checkout master - -# compile -RUN cd src/; scons build/rippled - -# move to root directory and strip -RUN cp src/build/rippled rippled; strip rippled - -# copy default config -RUN cp src/doc/rippled-example.cfg rippled.cfg - -# clean source -RUN rm -r src - -# launch rippled when launching the container -ENTRYPOINT ./rippled diff --git a/Builds/Docker/Dockerfile-testnet b/Builds/Docker/Dockerfile-testnet deleted file mode 100644 index 3ac9a15216..0000000000 --- a/Builds/Docker/Dockerfile-testnet +++ /dev/null @@ -1,23 +0,0 @@ -FROM ubuntu -MAINTAINER Torrie Fischer - -RUN apt-get update -qq &&\ - apt-get install -qq software-properties-common &&\ - apt-add-repository -y ppa:ubuntu-toolchain-r/test &&\ - apt-add-repository -y ppa:afrank/boost &&\ - apt-get update -qq - -RUN apt-get purge -qq libboost1.48-dev &&\ - apt-get install -qq libprotobuf8 libboost1.57-all-dev - -RUN mkdir -p /srv/rippled/data - -VOLUME /srv/rippled/data/ - -ENTRYPOINT ["/srv/rippled/bin/rippled"] -CMD ["--conf", "/srv/rippled/data/rippled.cfg"] -EXPOSE 51235/udp -EXPOSE 5005/tcp - -ADD ./rippled.cfg /srv/rippled/data/rippled.cfg -ADD ./rippled /srv/rippled/bin/ diff --git a/Builds/Docker/build-ci.sh b/Builds/Docker/build-ci.sh deleted file mode 100755 index 5e12d01280..0000000000 --- a/Builds/Docker/build-ci.sh +++ /dev/null @@ -1,13 +0,0 @@ -set -e - -mkdir -p build/docker/ -cp doc/rippled-example.cfg build/clang.debug/rippled build/docker/ -cp Builds/Docker/Dockerfile-testnet build/docker/Dockerfile -mv build/docker/rippled-example.cfg build/docker/rippled.cfg -strip build/docker/rippled -docker build -t ripple/rippled:$CIRCLE_SHA1 build/docker/ -docker tag ripple/rippled:$CIRCLE_SHA1 ripple/rippled:latest - -if [ -z "$CIRCLE_PR_NUMBER" ]; then - docker tag ripple/rippled:$CIRCLE_SHA1 ripple/rippled:$CIRCLE_BRANCH -fi diff --git a/Builds/Docker/push-to-hub.sh b/Builds/Docker/push-to-hub.sh deleted file mode 100755 index 45738c4c62..0000000000 --- a/Builds/Docker/push-to-hub.sh +++ /dev/null @@ -1,16 +0,0 @@ -set -e - -if [ -z "$DOCKER_EMAIL" -o -z "$DOCKER_USERNAME" -o -z "$DOCKER_PASSWORD" ];then - echo "Docker credentials are not set. Can't login to docker, no containers will be pushed." - exit 0 -fi - -if [ -n "$CIRCLE_PR_NUMBER" ]; then - echo "Not pushing results of a pull request build." - exit 0 -fi - -docker login -e $DOCKER_EMAIL -u $DOCKER_USERNAME -p $DOCKER_PASSWORD -docker push ripple/rippled:$CIRCLE_SHA1 -docker push ripple/rippled:$CIRCLE_BRANCH -docker push ripple/rippled:latest diff --git a/Builds/Eclipse/README.md b/Builds/Eclipse/README.md deleted file mode 100644 index fbadb8b123..0000000000 --- a/Builds/Eclipse/README.md +++ /dev/null @@ -1,31 +0,0 @@ -**Requirements** - -1. Java Runtime Environment (JRE) -2. Eclipse with CDT (tested on Luna): -http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/lunasr2 -3. Eclipse SCons plugin: http://sconsolidator.com/ -**WARNING**: by default the SCons plugin uses 16 threads. Go to -*Window->Preferences->SCons->Build Settings* in Eclipse and make it -use only 4-8 jobs(threads) or whatever you feel confortable with. It will -positively freeze your system if you run with 16 threads/jobs. - -![scons](scons.png) - -**Getting Started** - -After setting up Eclipse just do a File->New->Other... -Select: C/C++ / New SCons project from existing source -Point the importer to the folder where the SConstruct resides (the root -folder of your git workspace normally) - -**Build** - -Just hit Project->Build All in Eclipse to get started. And remember to not -let it run 16 threads! - -**Debug** - -Start a new Eclipse debug configuration and set binary to run to build/rippled -(assuming you have built it). - -![debug](debug.png) diff --git a/Builds/Eclipse/debug.png b/Builds/Eclipse/debug.png deleted file mode 100644 index 24e2ba8c91fff2eb83e24298996fbb1ad7c19496..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18404 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 KpUXO@geCw0!tt5_ diff --git a/Builds/Eclipse/scons.png b/Builds/Eclipse/scons.png deleted file mode 100644 index 84836a88fe6fe993534b86120497469ea5ab2013..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17625 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 G5}E)o+-@@f diff --git a/Builds/Fedora/install_rippled_depends_fedora.sh b/Builds/Fedora/install_rippled_depends_fedora.sh deleted file mode 100755 index 5803188aad..0000000000 --- a/Builds/Fedora/install_rippled_depends_fedora.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -# -# This scripts installs the dependencies needed by rippled. It should be run -# with sudo. -# - -if [ ! -f /etc/fedora-release ]; then - echo "This script is meant to be run on fedora" - exit 1 -fi - -fedora_release=$(grep -o '[0-9]*' /etc/fedora-release) - -if (( $(bc <<< "${fedora_release} < 22") )); then - echo "This script is meant to run on fedora 22 or greater" - exit 1 -fi - -yum -y update -yum -y group install "Development Tools" -yum -y install gcc-c++ scons openssl-devel openssl-static protobuf-devel protobuf-static boost-devel boost-static libstdc++-static diff --git a/Builds/QtCreator/.gitignore b/Builds/QtCreator/.gitignore deleted file mode 100644 index 20e0d48afd..0000000000 --- a/Builds/QtCreator/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# QTCreator - -Makefile -*.user - diff --git a/Builds/QtCreator/rippled.pro b/Builds/QtCreator/rippled.pro deleted file mode 100644 index 4c4a96b3cf..0000000000 --- a/Builds/QtCreator/rippled.pro +++ /dev/null @@ -1,112 +0,0 @@ - -# Ripple protocol buffers - -PROTOS = ../../src/ripple_data/protocol/ripple.proto -PROTOS_DIR = ../../build/proto - -# Google Protocol Buffers support - -protobuf_h.name = protobuf header -protobuf_h.input = PROTOS -protobuf_h.output = $${PROTOS_DIR}/${QMAKE_FILE_BASE}.pb.h -protobuf_h.depends = ${QMAKE_FILE_NAME} -protobuf_h.commands = protoc --cpp_out=$${PROTOS_DIR} --proto_path=${QMAKE_FILE_PATH} ${QMAKE_FILE_NAME} -protobuf_h.variable_out = HEADERS -QMAKE_EXTRA_COMPILERS += protobuf_h - -protobuf_cc.name = protobuf implementation -protobuf_cc.input = PROTOS -protobuf_cc.output = $${PROTOS_DIR}/${QMAKE_FILE_BASE}.pb.cc -protobuf_cc.depends = $${PROTOS_DIR}/${QMAKE_FILE_BASE}.pb.h -protobuf_cc.commands = $$escape_expand(\\n) -#protobuf_cc.variable_out = SOURCES -QMAKE_EXTRA_COMPILERS += protobuf_cc - -# Ripple compilation - -DESTDIR = ../../build/QtCreator -OBJECTS_DIR = ../../build/QtCreator/obj - -TEMPLATE = app -CONFIG += console thread warn_off -CONFIG -= qt gui - -DEFINES += _DEBUG - -linux-g++:QMAKE_CXXFLAGS += \ - -Wall \ - -Wno-sign-compare \ - -Wno-char-subscripts \ - -Wno-invalid-offsetof \ - -Wno-unused-parameter \ - -Wformat \ - -O0 \ - -std=c++11 \ - -pthread - -INCLUDEPATH += \ - "../../src/leveldb/" \ - "../../src/leveldb/port" \ - "../../src/leveldb/include" \ - $${PROTOS_DIR} - -OTHER_FILES += \ -# $$files(../../src/*, true) \ -# $$files(../../src/beast/*) \ -# $$files(../../src/beast/modules/beast_basics/diagnostic/*) -# $$files(../../src/beast/modules/beast_core/, true) - -UI_HEADERS_DIR += ../../src/ripple_basics - -# --------- -# New style -# -SOURCES += \ - ../../src/ripple/beast/ripple_beast.unity.cpp \ - ../../src/ripple/beast/ripple_beastc.c \ - ../../src/ripple/common/ripple_common.unity.cpp \ - ../../src/ripple/http/ripple_http.unity.cpp \ - ../../src/ripple/json/ripple_json.unity.cpp \ - ../../src/ripple/peerfinder/ripple_peerfinder.unity.cpp \ - ../../src/ripple/radmap/ripple_radmap.unity.cpp \ - ../../src/ripple/resource/ripple_resource.unity.cpp \ - ../../src/ripple/sitefiles/ripple_sitefiles.unity.cpp \ - ../../src/ripple/sslutil/ripple_sslutil.unity.cpp \ - ../../src/ripple/testoverlay/ripple_testoverlay.unity.cpp \ - ../../src/ripple/types/ripple_types.unity.cpp \ - ../../src/ripple/validators/ripple_validators.unity.cpp - -# --------- -# Old style -# -SOURCES += \ - ../../src/ripple_app/ripple_app.unity.cpp \ - ../../src/ripple_app/ripple_app_pt1.unity.cpp \ - ../../src/ripple_app/ripple_app_pt2.unity.cpp \ - ../../src/ripple_app/ripple_app_pt3.unity.cpp \ - ../../src/ripple_app/ripple_app_pt4.unity.cpp \ - ../../src/ripple_app/ripple_app_pt5.unity.cpp \ - ../../src/ripple_app/ripple_app_pt6.unity.cpp \ - ../../src/ripple_app/ripple_app_pt7.unity.cpp \ - ../../src/ripple_app/ripple_app_pt8.unity.cpp \ - ../../src/ripple_basics/ripple_basics.unity.cpp \ - ../../src/ripple_core/ripple_core.unity.cpp \ - ../../src/ripple_data/ripple_data.unity.cpp \ - ../../src/ripple_hyperleveldb/ripple_hyperleveldb.unity.cpp \ - ../../src/ripple_leveldb/ripple_leveldb.unity.cpp \ - ../../src/ripple_net/ripple_net.unity.cpp \ - ../../src/ripple_overlay/ripple_overlay.unity.cpp \ - ../../src/ripple_rpc/ripple_rpc.unity.cpp \ - ../../src/ripple_websocket/ripple_websocket.unity.cpp - -LIBS += \ - -lboost_date_time-mt\ - -lboost_filesystem-mt \ - -lboost_program_options-mt \ - -lboost_regex-mt \ - -lboost_system-mt \ - -lboost_thread-mt \ - -lboost_random-mt \ - -lprotobuf \ - -lssl \ - -lrt diff --git a/Builds/Test.py b/Builds/Test.py deleted file mode 100755 index ccf2c1622c..0000000000 --- a/Builds/Test.py +++ /dev/null @@ -1,266 +0,0 @@ -#!/usr/bin/env python - -# This file is part of rippled: https://github.com/ripple/rippled -# Copyright (c) 2012 - 2015 Ripple Labs Inc. -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -""" -Invocation: - - ./Builds/Test.py - builds and tests all configurations - -The build must succeed without shell aliases for this to work. - -To pass flags to scons, put them at the very end of the command line, after -the -- flag - like this: - - ./Builds/Test.py -- -j4 # Pass -j4 to scons. - - -Common problems: - -1) Boost not found. Solution: export BOOST_ROOT=[path to boost folder] - -2) OpenSSL not found. Solution: export OPENSSL_ROOT=[path to OpenSSL folder] - -3) scons is an alias. Solution: Create a script named "scons" somewhere in - your $PATH (eg. ~/bin/scons will often work). - - #!/bin/sh - python /C/Python27/Scripts/scons.py "${@}" - -""" -from __future__ import absolute_import, division, print_function, unicode_literals - -import argparse -import itertools -import os -import platform -import re -import shutil -import sys -import subprocess - - -def powerset(iterable): - """powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)""" - s = list(iterable) - return itertools.chain.from_iterable(itertools.combinations(s, r) for r in range(len(s) + 1)) - -IS_WINDOWS = platform.system().lower() == 'windows' -IS_OS_X = platform.system().lower() == 'darwin' - -if IS_WINDOWS or IS_OS_X: - ALL_TARGETS = [('debug',), ('release',)] -else: - ALL_TARGETS = [(cc + "." + target,) - for cc in ['gcc', 'clang'] - for target in ['debug', 'release', 'coverage', 'profile', - 'debug.nounity', 'release.nounity', 'coverage.nounity', 'profile.nounity']] - -# list of tuples of all possible options -if IS_WINDOWS or IS_OS_X: - ALL_OPTIONS = [tuple(x) for x in powerset(['--assert'])] -else: - ALL_OPTIONS = list(set( - [tuple(x) for x in powerset(['--ninja', '--static', '--assert', '--sanitize=address'])] + - [tuple(x) for x in powerset(['--ninja', '--static', '--assert', '--sanitize=thread'])])) - -# list of tuples of all possible options + all possible targets -ALL_BUILDS = [options + target - for target in ALL_TARGETS - for options in ALL_OPTIONS] - -parser = argparse.ArgumentParser( - description='Test.py - run ripple tests' -) - -parser.add_argument( - '--all', '-a', - action='store_true', - help='Build all configurations.', -) - -parser.add_argument( - '--keep_going', '-k', - action='store_true', - help='Keep going after one configuration has failed.', -) - -parser.add_argument( - '--silent', '-s', - action='store_true', - help='Silence all messages except errors', -) - -parser.add_argument( - '--verbose', '-v', - action='store_true', - help=('Report more information about which commands are executed and the ' - 'results.'), -) - -parser.add_argument( - '--test', '-t', - default='', - help='Add a prefix for unit tests', -) - -parser.add_argument( - '--clean', '-c', - action='store_true', - help='delete all build artifacts after testing', -) - -parser.add_argument( - 'scons_args', - default=(), - nargs='*' -) - -ARGS = parser.parse_args() - - -def shell(cmd, args=(), silent=False): - """"Execute a shell command and return the output.""" - silent = ARGS.silent or silent - verbose = not silent and ARGS.verbose - if verbose: - print('$' + cmd, *args) - - command = (cmd,) + args - - process = subprocess.Popen( - command, - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - shell=IS_WINDOWS) - lines = [] - count = 0 - for line in process.stdout: - # Python 2 vs. Python 3 - if isinstance(line, str): - decoded = line - else: - decoded = line.decode() - lines.append(decoded) - if verbose: - print(decoded, end='') - elif not silent: - count += 1 - if count >= 80: - print() - count = 0 - else: - print('.', end='') - - if not verbose and count: - print() - process.wait() - return process.returncode, lines - - -def run_tests(args): - failed = [] - if IS_WINDOWS: - binary_re = re.compile(r'build\\([^\\]+)\\rippled.exe') - else: - binary_re = re.compile(r'build/([^/]+)/rippled') - _, lines = shell('scons', ('-n', '--tree=derived',) + args, silent=True) - for line in lines: - match = binary_re.search(line) - if match: - executable, target = match.group(0, 1) - - print('Unit tests for', target) - testflag = '--unittest' - if ARGS.test: - testflag += ('=' + ARGS.test) - resultcode, lines = shell(executable, (testflag,)) - - if resultcode: - if not ARGS.verbose: - print('ERROR:', *lines, sep='') - failed.append([target, 'unittest']) - if not ARGS.keep_going: - break - - return failed - - -def run_build(args=None): - print('Building:', *args or ('(default)',)) - resultcode, lines = shell('scons', args) - - if resultcode: - print('Build FAILED:') - if not ARGS.verbose: - print(*lines, sep='') - sys.exit(1) - if '--ninja' in args: - resultcode, lines = shell('ninja') - - if resultcode: - print('Ninja build FAILED:') - if not ARGS.verbose: - print(*lines, sep='') - sys.exit(1) - - -def main(): - if ARGS.all: - to_build = ALL_BUILDS - else: - to_build = [tuple(ARGS.scons_args)] - - all_failed = [] - - for build in to_build: - args = () - # additional arguments come first - for arg in list(ARGS.scons_args): - if arg not in build: - args += (arg,) - args += build - - run_build(args) - failed = run_tests(args) - - if failed: - print('FAILED:', *(':'.join(f) for f in failed)) - if not ARGS.keep_going: - sys.exit(1) - else: - all_failed.extend([','.join(build), ':'.join(f)] - for f in failed) - else: - print('Success') - - if ARGS.clean: - shutil.rmtree('build') - if '--ninja' in args: - os.remove('build.ninja') - os.remove('.ninja_deps') - os.remove('.ninja_log') - - if all_failed: - if len(to_build) > 1: - print() - print('FAILED:', *(':'.join(f) for f in all_failed)) - sys.exit(1) - -if __name__ == '__main__': - main() - sys.exit(0) diff --git a/Builds/Ubuntu/build_clang_libs.sh b/Builds/Ubuntu/build_clang_libs.sh deleted file mode 100755 index 42b07005a3..0000000000 --- a/Builds/Ubuntu/build_clang_libs.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env bash - -# -# This scripts installs boost and protobuf built with clang. This is needed on -# ubuntu 15.10 when building with clang -# It will build these in a 'clang' subdirectory that it creates below the directory -# this script is run from. If a clang directory already exists the script will refuse -# to run. - -if hash lsb_release 2>/dev/null; then - if [ $(lsb_release -si) == "Ubuntu" ]; then - ubuntu_release=$(lsb_release -sr) - fi -fi - -if [ -z "${ubuntu_release}" ]; then - echo "System not supported" - exit 1 -fi - -if ! hash clang 2>/dev/null; then - clang_version=3.7 - if [ ${ubuntu_release} == "16.04" ]; then - clang_version=3.8 - fi - sudo apt-get -y install clang-${clang_version} - update-alternatives --install /usr/bin/clang clang /usr/bin/clang-${clang_version} 99 clang++ - hash -r - if ! hash clang 2>/dev/null; then - echo "Please install clang" - exit 1 - fi -fi - -if [ ${ubuntu_release} != "16.04" ] && [ ${ubuntu_release} != "15.10" ]; then - echo "clang specific boost and protobuf not needed" - exit 0 -fi - -if [ -d clang ]; then - echo "clang directory already exists. Cowardly refusing to run" - exit 1 -fi - -if ! hash wget 2>/dev/null; then - sudo apt-get -y install wget - hash -r - if ! hash wget 2>/dev/null; then - echo "Please install wget" - exit 1 - fi -fi - -num_procs=$(lscpu -p | grep -v '^#' | sort -u -t, -k 2,4 | wc -l) # pysical cores - -mkdir clang -pushd clang > /dev/null - -# Install protobuf -pb=protobuf-2.6.1 -pb_tar=${pb}.tar.gz -wget -O ${pb_tar} https://github.com/google/protobuf/releases/download/v2.6.1/${pb_tar} -tar xf ${pb_tar} -rm ${pb_tar} -pushd ${pb} > /dev/null -./configure CC=clang CXX=clang++ CXXFLAGS='-std=c++14 -O3 -g' -make -j${num_procs} -popd > /dev/null - -# Install boost -boost_ver=1.60.0 -bd=boost_${boost_ver//./_} -bd_tar=${bd}.tar.gz -wget -O ${bd_tar} http://sourceforge.net/projects/boost/files/boost/${boost_ver}/${bd_tar} -tar xf ${bd_tar} -rm ${bd_tar} -pushd ${bd} > /dev/null -./bootstrap.sh -./b2 toolset=clang -j${num_procs} -popd > /dev/null - -popd > /dev/null diff --git a/Builds/Ubuntu/install_boost.sh b/Builds/Ubuntu/install_boost.sh deleted file mode 100755 index 9f9d0e297e..0000000000 --- a/Builds/Ubuntu/install_boost.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -# -# This script builds boost with the correct ABI flags for ubuntu -# - -version=59 -patch=0 - -if hash lsb_release 2>/dev/null; then - if [ $(lsb_release -si) == "Ubuntu" ]; then - ubuntu_release=$(lsb_release -sr) - fi -fi - -if [ -z "${ubuntu_release}" ]; then - echo "System not supported" - exit 1 -fi - -extra_defines="" -if (( $(bc <<< "${ubuntu_release} < 15.1") )); then - extra_defines="define=_GLIBCXX_USE_CXX11_ABI=0" -fi -num_procs=$(lscpu -p | grep -v '^#' | sort -u -t, -k 2,4 | wc -l) # pysical cores -printf "\nBuild command will be: ./b2 -j${num_procs} ${extra_defines}\n\n" - -boost_dir="boost_1_${version}_${patch}" -boost_tag="boost-1.${version}.${patch}" -git clone -b "${boost_tag}" --recursive https://github.com/boostorg/boost.git "${boost_dir}" - -cd ${boost_dir} -git checkout --force ${boost_tag} -git submodule foreach git checkout --force ${boost_tag} -./bootstrap.sh -./b2 headers -./b2 -j${num_procs} ${extra_defines} -echo "Build command was: ./b2 -j${num_procs} ${extra_defines}" -echo "Don't forget to set BOOST_ROOT!" diff --git a/Builds/Ubuntu/install_rippled_depends_ubuntu.sh b/Builds/Ubuntu/install_rippled_depends_ubuntu.sh deleted file mode 100755 index 140dbd1d7a..0000000000 --- a/Builds/Ubuntu/install_rippled_depends_ubuntu.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env bash - -# -# This scripts installs the dependencies needed by rippled. It should be run -# with sudo. For ubuntu < 15.10, it installs gcc 5 as the default compiler. gcc -# 5 is ABI incompatable with gcc 4. If needed, the following will switch back to -# gcc-4: `sudo update-alternatives --config gcc` and choosing the gcc-4 -# option. -# - -if hash lsb_release 2>/dev/null; then - if [ $(lsb_release -si) == "Ubuntu" ]; then - ubuntu_release=$(lsb_release -sr) - fi -fi - -if [ -z "${ubuntu_release}" ]; then - echo "System not supported" - exit 1 -fi - -if [ ${ubuntu_release} == "12.04" ]; then - apt-get install python-software-properties - add-apt-repository ppa:afrank/boost - add-apt-repository ppa:ubuntu-toolchain-r/test - apt-get update - apt-get -y upgrade - apt-get -y install curl git scons ctags pkg-config protobuf-compiler libprotobuf-dev libssl-dev python-software-properties boost1.57-all-dev g++-5 g++-4.9 - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 99 --slave /usr/bin/g++ g++ /usr/bin/g++-5 - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 99 --slave /usr/bin/g++ g++ /usr/bin/g++-4.9 - exit 0 -fi - -if [ ${ubuntu_release} == "14.04" ] || [ ${ubuntu_release} == "15.04" ]; then - apt-get install python-software-properties - echo "deb [arch=amd64] https://mirrors.ripple.com/ubuntu/ trusty stable contrib" | sudo tee /etc/apt/sources.list.d/ripple.list - wget -O- -q https://mirrors.ripple.com/mirrors.ripple.com.gpg.key | sudo apt-key add - - add-apt-repository ppa:ubuntu-toolchain-r/test - apt-get update - apt-get -y upgrade - apt-get -y install curl git scons ctags pkg-config protobuf-compiler libprotobuf-dev libssl-dev python-software-properties boost-all-dev g++-5 g++-4.9 - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 99 --slave /usr/bin/g++ g++ /usr/bin/g++-5 - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 99 --slave /usr/bin/g++ g++ /usr/bin/g++-4.9 - exit 0 -fi - -if [ ${ubuntu_release} == "16.04" ] || [ ${ubuntu_release} == "15.10" ]; then - apt-get update - apt-get -y upgrade - apt-get -y install python-software-properties curl git scons ctags pkg-config protobuf-compiler libprotobuf-dev libssl-dev python-software-properties libboost-all-dev - exit 0 -fi - -echo "System not supported" -exit 1 diff --git a/Builds/VisualStudio2015/.gitattributes b/Builds/VisualStudio2015/.gitattributes deleted file mode 100644 index d9117c325a..0000000000 --- a/Builds/VisualStudio2015/.gitattributes +++ /dev/null @@ -1,4 +0,0 @@ -RippleD.vcxproj -text -RippleD.vcxproj.filters -text - - diff --git a/Builds/VisualStudio2015/README.md b/Builds/VisualStudio2015/README.md deleted file mode 100644 index c60b4c4f2c..0000000000 --- a/Builds/VisualStudio2015/README.md +++ /dev/null @@ -1,255 +0,0 @@ -# Visual Studio 2015 Build Instructions - -## Important - -We do not recommend Windows for rippled production use at this time. Currently, the Ubuntu -platform has received the highest level of quality assurance, testing, and support. -Additionally, 32-bit Windows versions are not supported. - -## Prerequisites - -To clone the source code repository, create branches for inspection or modification, -build rippled under Visual Studio, and run the unit tests you will need these -software components: - -* [Visual Studio 2015](README.md#install-visual-studio-2015) -* [Git for Windows](README.md#install-git-for-windows) -* [Google Protocol Buffers Compiler](README.md#install-google-protocol-buffers-compiler) -* (Optional) [Python and Scons](README.md#optional-install-python-and-scons) -* [OpenSSL Library](README.md#install-openssl) -* [Boost library](README.md#build-boost) - -## Install Software - -### Install Visual Studio 2015 - -If not already installed on your system, download your choice of installer from the -[Visual Studio 2015 Download](https://www.visualstudio.com/downloads/download-visual-studio-vs) -page, run the installer, and follow the directions. You may need to choose a "Custom" -installation and ensure that "Visual C++" is selected under "Programming Languages". - -Any version of Visual Studio 2015 may be used to build rippled. -The **Visual Studio 2015 Community** edition is available free of charge (see -[the product page](https://www.visualstudio.com/products/visual-studio-community-vs) -for licensing details), while paid editions may be used for an free initial trial period. - -### Install Git for Windows - -Git is a distributed revision control system. The Windows version also provides the -bash shell and many Windows versions of Unix commands. While there are other -varieties of Git (such as TortoiseGit, which has a native Windows interface and -integrates with the Explorer shell), we recommend installing -[Git for Windows](https://git-scm.com/) since -it provides a Unix-like command line environment useful for running shell scripts. -Use of the bash shell under Windows is mandatory for running the unit tests. - -* NOTE: To gain full featured access to the - [git-subtree](https://blogs.atlassian.com/2013/05/alternatives-to-git-submodule-git-subtree/) - functionality used in the rippled repository we suggest Git version 2.6.2 or later. - -### Install Google Protocol Buffers Compiler - -Building rippled requires **protoc.exe** version 2.5.1 or later. At your option you -may build it yourself from the sources in the -[Google Protocol Buffers](https://github.com/google/protobuf) repository, -or you may download a -[protoc.exe](https://ripple.github.io/Downloads/protoc/2.5.1/protoc.exe) -([alternate link](https://github.com/ripple/Downloads/raw/gh-pages/protoc/2.5.1/protoc.exe)) -precompiled Windows executable from the -[Ripple Organization](https://github.com/ripple). - -Either way, once you have the required version of **protoc.exe**, copy it into -a folder in your command line `%PATH%`. - -* **NOTE:** If you use an older version of the compiler, the build will - fail with errors related to a mismatch of the version of protocol - buffer headers versus the compiler. - -### (Optional) Install Python and Scons - -[Python](https://www.python.org/downloads/) and -[Scons](http://scons.org/download.php) are not required to build -rippled with Visual Studio, but can be used to build from the -command line and in scripts, and are required to properly update -the `RippleD.vcxproj` file. - -If you wish to build with scons, a version after 2.3.5 is required -for Visual Studio 2015 support. - -## Configure Dependencies - -### Install OpenSSL - -[Download OpenSSL.](http://slproweb.com/products/Win32OpenSSL.html) -There will be four variants available: - -1. 64-bit. Use this if you are running 64-bit windows. As of this writing, the link is called: "Win64 OpenSSL v1.0.2j". -2. 64-bit light - Don't use this. It is missing files needed to build rippled. As of this writing, the link is called: "Win64 OpenSSL v1.0.2j Light" - -Run the installer, and choose an appropriate location for your OpenSSL -installation. In this guide we use **C:\lib\OpenSSL-Win64** as the -destination location. - -You may be informed on running the installer that "Visual C++ 2008 -Redistributables" must first be installed first. If so, download it -from the [same page](http://slproweb.com/products/Win32OpenSSL.html), -again making sure to get the correct 32-/64-bit variant. - -* NOTE: Since rippled links statically to OpenSSL, it does not matter - where the OpenSSL .DLL files are placed, or what version they are. - rippled does not use or require any external .DLL files to run - other than the standard operating system ones. - -### Build Boost - -After [downloading boost](http://www.boost.org/users/download/) and -unpacking it, open a **Developer Command Prompt** for -Visual Studio, change to the directory containing boost, then -bootstrap the build tools: - -(As of this writing, the most recent version of boost is 1.62.0, which -will unpack into a directory named `boost_1_62_0`. For higher versions -of boost, adjust the directories provided in these examples as -appropriate.) - -```powershell -cd C:\lib\boost_1_62_0 -bootstrap -``` - -The rippled application is linked statically to the standard runtimes and external -dependencies on Windows, to ensure that the behavior of the executable is not -affected by changes in outside files. Therefore, it is necessary to build the -required boost static libraries using this command: - -```powershell -bjam --toolset=msvc-14.0 address-model=64 architecture=x86 link=static threading=multi runtime-link=shared,static stage --stagedir=stage64 -``` - -Building the boost libraries may take considerable time. When the build process -is completed, take note of both the reported compiler include paths and linker -library paths as they will be required later. - -* NOTE: If older versions of Visual Studio are also installed, the build may fail. - If this happens, make sure that only Visual Studio 2015 is installed. Due to - defects in the uninstallation procedures of these Microsoft products, it may - be necessary to start with a fresh install of the operating system with only - the necessary development environment components installed to have a successful build. - -### Clone the rippled repository - -If you are familiar with cloning github repositories, just follow your normal process -and clone `git@github.com:ripple/rippled.git`. Otherwise follow this section for instructions. - -1. If you don't have a github account, sign up for one at - [github.com](https://github.com/). -2. Make sure you have Github ssh keys. For help see - [generating-ssh-keys](https://help.github.com/articles/generating-ssh-keys). - -Open the "Git Bash" shell that was installed with "Git for Windows" in the -step above. Navigate to the directory where you want to clone rippled (git -bash uses `/c` for windows's `C:` and forward slash where windows uses -backslash, so `C:\Users\joe\projs` would be `/c/Users/joe/projs` in git bash). -Now clone the repository and optionally switch to the *master* branch. -Type the following at the bash prompt: - -```powershell -git clone git@github.com:ripple/rippled.git -cd rippled -git checkout master -``` - -* If you receive an error about not having the "correct access rights" - make sure you have Github ssh keys, as described above. - -### Configure Library Paths - -Open the solution file located at **Builds/Visual Studio 2015/ripple.sln** -and select the "View->Property Manager" to bring up the Property Manager. -Expand the *debug | x64* section and -double click the *Microsoft.Cpp.x64.user* property sheet to bring up the -*Property Pages* dialog. These are global properties applied to all -64-bit build targets: - -![Visual Studio 2015 Global Properties](images/VS2015x64Properties.png) - -Go to *C/C++, General, Additional Include Directories* and add the -location of the boost installation: - -![Visual Studio 2015 Include Directories](images/VS2015x64IncludeDirs.png) - -Then, go to *Linker, General, Additional Library Directories* and add -the location of the compiled boost libraries reported at the completion -of building the boost libraries: - -![Visual Studio 2015 Library Directories](images/VS2015x64LibraryDirs.png) - -Follow the same procedure for adding the `Additional Include Directories` -and `Additional Library Directories` required for OpenSSL. In our example -these directories are **C:\lib\OpenSSL-Win64\include** and -**C:\lib\OpenSSL-Win64\lib** respectively. - -# Setup Environment - -## Create a working directory for rippled.cfg - -The rippled server uses the [Rippled.cfg](https://wiki.ripple.com/Rippled.cfg) -file to read its configuration parameters. This section describes setting up -a directory to hold the config file. The next sections describe how to tell -the rippled server where that file is. - -1. Create a directory to hold the configuration file. In this example, the - ripple config directory was created in `C:\Users\joe\ripple\config`. -2. Copy the example config file located in `doc\rippled-example.cfg` to the - new directory and rename it "rippled.cfg". -3. Read the rippled.cfg file and edit as appropriate. - -## Change the Visual Studio Projects Debugging Properties - -1. If not already open, open the solution file located at **Builds/Visual Studio 2015/Ripple.sln** -2. Select the correct solution platform in the solution platform dropdown (either *x64* - or *Win32* depending on machine type). -3. Select the "Project->Properties" menu item to bring up RippleD's Properties Pages -4. In "Configuration Properties" select "Debugging". -5. In the upper-left Configurations drop down, select "All Configurations". -6. In "Debugger to Launch" select "Local Windows Debugger". - -### Tell rippled where to find the configuration file. - -The `--conf` command-line switch to tell rippled where to find this file. -In the "Command Arguments" field in the properties dialog (that you opened -in the above section), add: `--conf="C:/Users/joe/ripple/config/rippled.cfg"` -(of course replacing that path with the path you set up above). - -![Visual Studio 2013 Command Args Prop Page](images/VSCommandArgsPropPage.png) - -### Set the _NO_DEBUG_HEAP Environment Variable - -Rippled can run very slowly in the debugger when using the Windows Debug Heap. -Set the `_NO_DEBUG_HEAP` environment variable to one to disable the debug heap. -In the "Environment" field (that you opened in the above section), add: -`_NO_DEBUG_HEAP=1` - -![Visual Studio 2013 No Debug Heap Prop Page](images/NoDebugHeapPropPage.png) - -# Build - -After these steps are complete, rippled should be ready to build. Simply -set rippled as the startup project by right clicking on it in the -Visual Studio Solution Explorer, choose **Set as Startup Project**, -and then choose the **Build->Build Solution** menu item. - -# Unit Tests (Recommended) - -The rippled unit tests are written in C++ and are part -of the rippled executable. - -From a Windows console, run the unit tests: - -``` -./build/msvc.debug/rippled.exe --unittest -``` - -Substitute the correct path to the executable to test different builds. - - diff --git a/Builds/VisualStudio2015/RippleD.vcxproj b/Builds/VisualStudio2015/RippleD.vcxproj deleted file mode 100644 index fdf8c7e9d0..0000000000 --- a/Builds/VisualStudio2015/RippleD.vcxproj +++ /dev/null @@ -1,4978 +0,0 @@ - - - - {26B7D9AC-1A80-8EF8-6703-D061F1BECB75} - Win32Proj - RippleD - true - - - - debug.classic - x64 - - - debug - x64 - - - release.classic - x64 - - - release - x64 - - - - - MultiByte - Application - v140 - False - False - False - false - ..\..\build\msvc.debug.nounity\src\ - ..\..\build\msvc.debug.nounity\ - - - MultiByte - Application - v140 - False - False - False - false - ..\..\build\msvc.debug\src\ - ..\..\build\msvc.debug\ - - - MultiByte - Application - v140 - False - False - False - false - ..\..\build\msvc.release.nounity\src\ - ..\..\build\msvc.release.nounity\ - - - MultiByte - Application - v140 - False - False - False - false - ..\..\build\msvc.release\src\ - ..\..\build\msvc.release\ - - - - - - - - - - - - - - - - - - - HAVE_USLEEP=1;SOCI_CXX_C11=1;_WIN32_WINNT=0x6000;BOOST_COROUTINES_NO_DEPRECATION_WARNING;BOOST_COROUTINE_NO_DEPRECATION_WARNING;BOOST_NO_AUTO_PTR;DEBUG;DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER;NOMINMAX;OPENSSL_NO_SSL2;WIN32_CONSOLE;_CRTDBG_MAP_ALLOC;_CRT_SECURE_NO_WARNINGS;_DEBUG;_SCL_SECURE_NO_WARNINGS;_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS;%(PreprocessorDefinitions) - ..\..\build\proto;..\..\src;..\..\src\beast;..\..\src\beast\extras;..\..\src\beast\include;..\..\src\nudb\include;..\..\src\protobuf\src;..\..\src\protobuf\vsprojects;..\..\src\soci\include;..\..\src\soci\src;%(AdditionalIncludeDirectories) - 4800;4244;4267;4503;4018 - Async - MultiThreadedDebug - Precise - False - EnableFastChecks - None - True - True - True - False - True - Disabled - False - False - ProgramDatabase - Cdecl - True - Level3 - /bigobj /FS %(AdditionalOptions) - - - advapi32.lib;comdlg32.lib;gdi32.lib;kernel32.lib;legacy_stdio_definitions.lib;odbc32.lib;odbccp32.lib;ole32.lib;oleaut32.lib;shell32.lib;Shlwapi.lib;user32.lib;uuid.lib;VC/static/libeay32MTd.lib;VC/static/ssleay32MTd.lib;winspool.lib;%(AdditionalDependencies) - True - NoErrorReport - Console - True - true - True - MachineX64 - /MANIFEST /TLBID:1 %(AdditionalOptions) - - - - - HAVE_USLEEP=1;SOCI_CXX_C11=1;_WIN32_WINNT=0x6000;BOOST_COROUTINES_NO_DEPRECATION_WARNING;BOOST_COROUTINE_NO_DEPRECATION_WARNING;BOOST_NO_AUTO_PTR;DEBUG;DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER;NOMINMAX;OPENSSL_NO_SSL2;WIN32_CONSOLE;_CRTDBG_MAP_ALLOC;_CRT_SECURE_NO_WARNINGS;_DEBUG;_SCL_SECURE_NO_WARNINGS;_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS;%(PreprocessorDefinitions) - ..\..\build\proto;..\..\src;..\..\src\beast;..\..\src\beast\extras;..\..\src\beast\include;..\..\src\nudb\include;..\..\src\protobuf\src;..\..\src\protobuf\vsprojects;..\..\src\soci\include;..\..\src\soci\src;%(AdditionalIncludeDirectories) - 4800;4244;4267;4503;4018 - Async - MultiThreadedDebug - Precise - False - EnableFastChecks - None - True - True - True - False - True - Disabled - False - False - ProgramDatabase - Cdecl - True - Level3 - /bigobj /FS %(AdditionalOptions) - - - advapi32.lib;comdlg32.lib;gdi32.lib;kernel32.lib;legacy_stdio_definitions.lib;odbc32.lib;odbccp32.lib;ole32.lib;oleaut32.lib;shell32.lib;Shlwapi.lib;user32.lib;uuid.lib;VC/static/libeay32MTd.lib;VC/static/ssleay32MTd.lib;winspool.lib;%(AdditionalDependencies) - True - NoErrorReport - Console - True - true - True - MachineX64 - /MANIFEST /TLBID:1 %(AdditionalOptions) - - - - - HAVE_USLEEP=1;SOCI_CXX_C11=1;_WIN32_WINNT=0x6000;BOOST_COROUTINES_NO_DEPRECATION_WARNING;BOOST_COROUTINE_NO_DEPRECATION_WARNING;BOOST_NO_AUTO_PTR;DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER;NDEBUG;NOMINMAX;OPENSSL_NO_SSL2;WIN32_CONSOLE;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS;%(PreprocessorDefinitions) - ..\..\build\proto;..\..\src;..\..\src\beast;..\..\src\beast\extras;..\..\src\beast\include;..\..\src\nudb\include;..\..\src\protobuf\src;..\..\src\protobuf\vsprojects;..\..\src\soci\include;..\..\src\soci\src;%(AdditionalIncludeDirectories) - 4800;4244;4267;4503;4018 - Async - Precise - False - None - True - True - MultiThreaded - False - True - False - False - ProgramDatabase - Cdecl - True - Full - Level3 - /bigobj /FS %(AdditionalOptions) - - - advapi32.lib;comdlg32.lib;gdi32.lib;kernel32.lib;legacy_stdio_definitions.lib;odbc32.lib;odbccp32.lib;ole32.lib;oleaut32.lib;shell32.lib;Shlwapi.lib;user32.lib;uuid.lib;VC/static/libeay32MT.lib;VC/static/ssleay32MT.lib;winspool.lib;%(AdditionalDependencies) - True - NoErrorReport - Console - True - true - True - MachineX64 - /MANIFEST /TLBID:1 %(AdditionalOptions) - - - - - HAVE_USLEEP=1;SOCI_CXX_C11=1;_WIN32_WINNT=0x6000;BOOST_COROUTINES_NO_DEPRECATION_WARNING;BOOST_COROUTINE_NO_DEPRECATION_WARNING;BOOST_NO_AUTO_PTR;DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER;NDEBUG;NOMINMAX;OPENSSL_NO_SSL2;WIN32_CONSOLE;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS;%(PreprocessorDefinitions) - ..\..\build\proto;..\..\src;..\..\src\beast;..\..\src\beast\extras;..\..\src\beast\include;..\..\src\nudb\include;..\..\src\protobuf\src;..\..\src\protobuf\vsprojects;..\..\src\soci\include;..\..\src\soci\src;%(AdditionalIncludeDirectories) - 4800;4244;4267;4503;4018 - Async - Precise - False - None - True - True - MultiThreaded - False - True - False - False - ProgramDatabase - Cdecl - True - Full - Level3 - /bigobj /FS %(AdditionalOptions) - - - advapi32.lib;comdlg32.lib;gdi32.lib;kernel32.lib;legacy_stdio_definitions.lib;odbc32.lib;odbccp32.lib;ole32.lib;oleaut32.lib;shell32.lib;Shlwapi.lib;user32.lib;uuid.lib;VC/static/libeay32MT.lib;VC/static/ssleay32MT.lib;winspool.lib;%(AdditionalDependencies) - True - NoErrorReport - Console - True - true - True - MachineX64 - /MANIFEST /TLBID:1 %(AdditionalOptions) - - - - - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - - - - - - - - - True - - - - - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - - - - - - - - - - - - - - - - - True - - - - - True - - - - - - - - - True - - - - - - - - - True - - - - - True - - - True - - - - - True - - - - - - - - - - - True - - - - - True - - - - - True - - - - - True - - - - - - - - - - - - - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - - - True - True - - - - - True - True - - - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - True - True - - - - - - - - - True - True - - - - - - - - - True - True - - - - - - - - - True - True - - - - - - - - - - - - - True - True - - - - - - - - - True - True - - - - - True - True - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - True - True - - - - - True - True - - - - - - - - - True - True - - - - - - - True - True - - - True - True - - - - - True - True - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - True - True - - - - - - - - - True - True - - - - - - - - - True - True - - - - - - - True - True - - - - - True - True - - - - - True - True - - - True - True - - - True - True - - - True - True - - - - - True - True - - - True - True - - - True - True - - - True - True - - - - - True - True - - - True - True - - - True - True - - - - - True - True - - - - - - - True - True - - - True - True - - - - - True - True - - - - - - - - - True - True - - - True - True - - - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - - - - - - - - - True - True - - - True - True - - - - - True - True - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - - - True - True - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - - - - - - - - - - - True - - - - - True - - - - - - - - - - - - - - - True - - - - - - - - - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - - - - - - - - - - - - - - - - - - - True - - - True - - - - - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - - - - - - - - - - - True - True - - - True - True - - - True - True - - - True - True - - - - - - - - - - - - - - - - - - - True - True - - - True - True - - - True - True - - - - - - - - - - - - - - - True - True - - - True - True - - - True - True - - - - - - - - - - - - - - - - - - - - - - - True - True - - - True - True - - - True - True - - - True - True - - - - - - - - - - - - - - - - - - - - - True - True - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - - - True - True - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - - - True - True - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - - - True - True - - - - - True - True - - - True - True - - - True - True - - - - - True - True - - - - - - - - - True - True - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - - - - - - - - - - - - - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - - - - - - - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - - - - - - - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - - - - - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - - - - - - - - - - - - - - - - - - - True - True - - - True - True - - - - - True - True - - - - - True - True - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - True - True - - - - - - - - - - - - - - - - - - - - - - - True - True - - - - - - - - - True - True - - - - - - - - - - - - - True - True - - - True - True - - - - - True - True - - - - - - - True - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Document - protoc --cpp_out=..\..\build\proto --proto_path=%(RelativeDir) %(Identity) - ..\..\build\proto\ripple.pb.h;..\..\build\proto\ripple.pb.cc - protoc --cpp_out=..\..\build\proto --proto_path=%(RelativeDir) %(Identity) - false - Document - protoc --cpp_out=..\..\build\proto --proto_path=%(RelativeDir) %(Identity) - ..\..\build\proto\ripple.pb.h;..\..\build\proto\ripple.pb.cc - protoc --cpp_out=..\..\build\proto --proto_path=%(RelativeDir) %(Identity) - false - Document - protoc --cpp_out=..\..\build\proto --proto_path=%(RelativeDir) %(Identity) - ..\..\build\proto\ripple.pb.h;..\..\build\proto\ripple.pb.cc - protoc --cpp_out=..\..\build\proto --proto_path=%(RelativeDir) %(Identity) - false - Document - protoc --cpp_out=..\..\build\proto --proto_path=%(RelativeDir) %(Identity) - ..\..\build\proto\ripple.pb.h;..\..\build\proto\ripple.pb.cc - protoc --cpp_out=..\..\build\proto --proto_path=%(RelativeDir) %(Identity) - false - - - - - - - - - - - - - True - - - True - - - - - True - - - - - - - - - - - True - - - - - - - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - True - True - - - - - True - True - - - True - True - - - - - True - True - - - - - True - True - - - True - True - - - True - True - - - - - True - True - - - - - True - True - - - True - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - - - - - - - - - True - True - - - - - - - - - - - - - - - - - - - - - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - - - - - - - - - - - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - True - True - - - True - True - - - True - True - - - ..\..\src\ed25519-donna;%(AdditionalIncludeDirectories) - ..\..\src\ed25519-donna;%(AdditionalIncludeDirectories) - ..\..\src\ed25519-donna;%(AdditionalIncludeDirectories) - ..\..\src\ed25519-donna;%(AdditionalIncludeDirectories) - - - True - True - - - True - True - - - - - True - True - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - True - True - - - True - True - - - - - True - True - - - - - - - ..\..\src\rocksdb2;..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2;..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2;..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2;..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - - - True - True - - - ..\..\src\secp256k1;%(AdditionalIncludeDirectories) - ..\..\src\secp256k1;%(AdditionalIncludeDirectories) - ..\..\src\secp256k1;%(AdditionalIncludeDirectories) - ..\..\src\secp256k1;%(AdditionalIncludeDirectories) - - - True - True - - - True - True - - - ..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - ..\..\src\soci\include\private;..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\include\private;..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\include\private;..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\include\private;..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\soci\include\private;..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - ..\..\src\soci\include\private;..\..\src\soci\src\core;..\..\src\sqlite;%(AdditionalIncludeDirectories) - - - True - - - - - True - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - True - - - - - True - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - - - True - - - - - True - - - - - True - - - - - True - - - - - - - True - - - - - True - - - True - - - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - True - - - - - True - - - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - - - True - - - - - True - - - - - - - - - - - - - True - - - True - - - True - - - True - - - - - - - True - - - True - - - - - True - - - - - True - - - True - - - - - - - - - True - - - - - True - - - - - True - - - - - - - True - - - - - True - - - - - True - - - - - True - - - True - - - - - True - - - True - - - - - True - - - True - - - - - True - - - True - - - True - - - True - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - True - - - - - - - True - - - True - - - - - True - - - - - True - - - - - - - True - - - True - - - True - - - - - - - - - True - - - - - True - - - True - - - True - - - - - True - - - - - - - True - - - - - True - - - - - True - - - - - True - - - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - - - - - - - - - True - - - - - True - - - - - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - - - True - - - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - - - - - True - - - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - True - True - - - - - - - - - - - - - - - True - True - - - - - - - - - - - True - True - - - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - ..\..\src\rocksdb2\include;..\..\src\snappy\config;..\..\src\snappy\snappy;%(AdditionalIncludeDirectories) - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - True - True - - - - - - diff --git a/Builds/VisualStudio2015/RippleD.vcxproj.filters b/Builds/VisualStudio2015/RippleD.vcxproj.filters deleted file mode 100644 index c1ddfe0605..0000000000 --- a/Builds/VisualStudio2015/RippleD.vcxproj.filters +++ /dev/null @@ -1,5623 +0,0 @@ - - - - - {B4CFBB41-DA25-70B1-E486-4F869E226E12} - - - {6DD9EDCB-63DB-D377-3F12-12825FA8437E} - - - {3CBEFECB-9A7C-B235-BA05-30D41AB8827D} - - - {79EFD023-52CA-3A59-E21D-E73328FA46EA} - - - {2A1F4F78-5521-936E-8CE2-BA798D578A14} - - - {7138D215-DA65-98D5-EF7D-C9896685201E} - - - {3E84AA4C-CB48-99F0-EB35-5603FF633A51} - - - {932F732F-F09E-5C50-C8A1-D62342CCAA1F} - - - {0ED4CDBE-296D-2599-04B3-095BFD1668A4} - - - {2762284D-66E5-8B48-1F8E-67116DB1FC6B} - - - {AC49CD8A-C2A7-FBEC-CA36-635A5303E73E} - - - {D05C2DB7-CE99-9326-23E6-4C7828632E0E} - - - {FB0BEDED-4C83-F0AF-0450-3DB01A05BD0B} - - - {A7FC9CC0-AB8D-4252-CCB2-B67F7BE99CF5} - - - {9455431B-BD48-F8C8-B53B-D9BCAF355341} - - - {508136FB-F124-7376-5A6F-F28EDEB18389} - - - {F85F4A52-7A2A-700C-4804-97FFC11E99FD} - - - {9DEED977-2072-A182-5BD9-CEBF206E8C91} - - - {B211F8F1-22D2-47BA-C39E-F9846A844D11} - - - {4F65E5BD-7EC4-113A-4603-B4625F16BC18} - - - {A5499F4E-D602-E9BA-FBB6-DCF5ED7C0D61} - - - {B97D2E02-83E3-F589-90C1-1B3398703938} - - - {F71FA1B4-4F94-A225-CFD2-C7A7B7966A9C} - - - {133EFD69-2398-8391-8995-ADF0FDB69A27} - - - {C535C933-C404-7C0F-2AB9-059F92DE0A80} - - - {BEF4689C-DF44-FE00-8811-EF00F064682D} - - - {8547002E-FB54-7C5D-EA27-12C3E50CE8D2} - - - {C1C81078-724B-2D05-0709-E1BA96B0C510} - - - {B7D055A3-42C2-904A-B3DC-966418EE6C5B} - - - {825BC971-25C9-82E3-4397-DDDB862500F2} - - - {26CC768D-6309-8C03-DB71-29E3BCA255A8} - - - {1FDEB2E3-854A-6C63-09E9-1B4E00FD16A1} - - - {5DA545F5-86B2-6120-E3A6-8D0875402F4D} - - - {C99E2B0C-64FF-A4A9-6FCF-DF19BE8E4C66} - - - {83B96C00-A786-6597-826D-E12FA6187AA8} - - - {0E8BC18A-9853-B13E-1A9D-C55FA29DA60F} - - - {CE126498-A44D-30A2-345B-0F672BCDF947} - - - {0EF1A571-94CC-4D70-E004-48579DF8AF2B} - - - {91D5931B-D981-52BC-BC12-08DA9F7BF606} - - - {5A1509B2-871B-A7AC-1E60-544D3F398741} - - - {C4BDB9F8-7DB7-E304-D286-098085D5D16E} - - - {03533509-DAC6-636F-9F7E-288894549E95} - - - {9AD8D049-10A8-704C-D51A-FAD55B1F235F} - - - {38932157-7DA1-A9CC-CABC-2A3D9CACF188} - - - {50FDCDC1-EC9C-9F3B-34C9-EF4137E132B4} - - - {4849F8A8-26D5-8416-2D59-F4CA49F0100C} - - - {B8720E2F-21B1-2847-F96C-4E00A45DC639} - - - {1B5E3484-E132-ADEA-8A38-01B0F4ABAC58} - - - {B75D9C70-388A-3FA5-53E7-8F37FDF4704B} - - - {18E2EE25-691B-C8C6-CE50-559012D120C5} - - - {B19A7492-A21F-6398-8E2C-CB226DAB2AB5} - - - {55CEA641-A406-D50E-17E4-0617F38C4279} - - - {D17C7530-EB8E-2A5E-6900-050BBEAD7C9F} - - - {2878154F-A12B-FAF9-2731-F1E554045252} - - - {FD4D1806-56C7-EFD3-8177-B77ECCB62673} - - - {D2FEF8DB-10F1-40FD-149C-2929726AB662} - - - {462217CD-F700-FBAF-6337-9B66824D1964} - - - {EFCF517A-692C-C748-5A6B-E7A80A245AE8} - - - {A434A188-4373-CE55-6995-BA4EC86D2125} - - - {A0CD1F88-1FA8-FDBF-8C82-A5427B6E10AE} - - - {1CB945B8-4655-2C56-1C03-24281400ABD8} - - - {061B26E1-FD5A-69B2-F70A-DC6B19CD7068} - - - {4CC44F87-2E4D-81E7-CB8C-027C2928EC7D} - - - {7A1954FE-9751-AE24-A1AF-C282F14B5757} - - - {38E875CA-FF93-DCC2-393B-1E2E128AD077} - - - {D7812F07-CB10-3361-544B-EB66B18F2D7F} - - - {411729E2-D597-D511-9CCB-A9E0FF697232} - - - {C94B6C51-E253-633B-0AA8-8D18CD695D5E} - - - {44E216F9-ACFD-B770-C6C9-BFFAD162566D} - - - {155DC1A3-8A60-BC74-A7E4-1AC1A679FFF9} - - - {235DCF23-2CF8-4F03-1A54-C159823A7E8D} - - - {D9A8899A-B47C-E5BB-DDF1-32A50545A7D3} - - - {165391B0-6CF7-0ECF-2566-2F12A922148E} - - - {8EF07519-1C32-2E82-D707-702EB0157733} - - - {BEDCC703-A2C8-FF25-7E1E-3471BD39ED98} - - - {32043215-B959-04E5-00FF-F97C7F597235} - - - {33BBF793-1734-8439-B367-C4A48AB37EFC} - - - {3F9EB11B-A89B-C878-201C-5F1113B3A6E8} - - - {EA35E0D0-6876-9DC8-10FA-1E6A0486C574} - - - {6649BD29-BE86-723F-501A-045E39310112} - - - {18A4343E-EF40-5824-86E0-6374708FDDBC} - - - {D3E78215-1C49-D4FB-E9FC-5074083D184F} - - - {B79A9145-D4DD-8A3C-59ED-AF8BEE7AD7A3} - - - {9D691DE1-17A1-5989-3E2E-F69B3E43152F} - - - {51E817F6-DC2E-045A-9009-37E3D16D0990} - - - {07E4BC73-2B68-D0D1-D922-FEBBB573F503} - - - {186385AD-A056-FA3A-7E0E-759EB55E9EAB} - - - {26FDAE33-6FB7-5B19-3F9D-3F635A0C93BA} - - - {F1CDEBFB-0510-764D-010B-F14BCA9456EB} - - - {8016685C-6468-9514-D06F-F95060DB5F10} - - - {AAA1F4C4-829E-8085-A768-FB4DC3670296} - - - {0AFA29AA-2CF8-9A4D-112E-AA1044C005EC} - - - {7F5082C0-3323-CAC3-1868-CA49C7F63A34} - - - {A05858D1-18F0-3A7E-ECFD-7729C370F65B} - - - {BCDBB833-2810-D5F5-A023-4E346AD0EED3} - - - {98D31BEB-9D82-93F8-6AC3-70AC5A1EA2E1} - - - {93AC3675-D183-4DB4-021E-8F4CA1586866} - - - {8A61DBF7-69CB-9043-8312-D44C40EC6AE9} - - - {B0649154-4449-1172-FF4F-9F7A46908774} - - - {81841155-E173-EABC-D87B-5DDBE199F8E3} - - - {92AC870A-6B4B-9CD5-4F7F-648C72CFA0D3} - - - {5DB3CD0B-B361-B301-9562-697CA8A52B68} - - - {15B4B65A-0F03-7BA9-38CD-42A5712392CB} - - - {6D89B6B8-9214-EC35-55E9-8F23F38CA4BD} - - - {667DE39F-2604-4FE8-A614-819EEB24732D} - - - {52E62747-3597-E27D-DFB4-56139A352DB9} - - - {42869C0B-56BC-B32F-1916-4A4080D2417E} - - - {D3C48D7F-1D8E-CE9E-27C8-D55F5E5A5B87} - - - {0E10D53B-8D04-FF58-45C4-0ABCB1D35E7F} - - - {FC54DB48-EF4D-7E0F-DDFE-B3F38B0B7738} - - - {A746507A-5BC2-4D28-1548-27C4A985BA1F} - - - {07F5949C-8323-60C6-86FA-478527ACA329} - - - {E8713421-1FD0-C069-9337-FA196101F1EB} - - - {D1AC8B4A-AD89-99FE-E006-C5216043BF1C} - - - {105DC146-D508-21EC-FFEA-1D161832CCEF} - - - {9127B497-2610-2304-EEC9-8BEFBE9EA84E} - - - {54BB5EB5-AAE6-285E-E486-052F58B9C667} - - - {3B09A7F7-FA71-6AF1-D990-01EB9B1F903D} - - - {0671E6E7-996E-D7C7-CF71-11A7A8F34F1F} - - - {393C9B81-CD6C-8E75-2B17-ED6ED04E4C28} - - - {A69B6BFC-CCCF-679E-555F-CE2E562DD85B} - - - {ED8A5019-B4FC-AE9E-E99A-10137DCF03C1} - - - {395EACFC-5313-28FC-4686-B001C679D86A} - - - {91DD523A-1974-4AD0-719D-F02BF0544FA3} - - - {ECE6F4C7-0F1A-FC81-6DE9-76BC48243350} - - - {E25BE380-48B7-7EA9-DFD6-F38F1E8A22FF} - - - {6BE34C70-DCAB-96D1-487C-ADC692DA720B} - - - {46FCBB68-FE6A-0EB7-98C9-C695B05E6503} - - - {0B56B4A9-D9BC-B7FB-DD09-ADAF9DDE4895} - - - {26306562-F81D-B6CD-B192-22BA51E1A96B} - - - {A018809C-BAF9-A68D-5AF9-2B7E0ADF444E} - - - {575659AE-C11F-C7F6-CEA1-3F2FBB560918} - - - {E5334950-60C3-CE41-4DD7-535029F143F7} - - - {326BC235-4389-131A-EFCF-B54C652509F1} - - - {95BB48F7-02FF-05FA-0112-506B0BB188FE} - - - {227F15C2-FEEE-AFD6-835C-989647DBEBE2} - - - {AEF95E82-C569-5213-CEFC-7546DD7CDD77} - - - {5A1D8022-39F2-67E1-FFBE-EA7D5BF9FBDB} - - - {AA927DBA-1AF8-6600-04B7-D1C1EBFB4103} - - - {75E6832F-A6F7-8360-FA3A-7427A06A9959} - - - {D4BF99B9-6486-2124-6103-825710EDD595} - - - {FA8496D0-0D5F-AC6F-3422-DEAB4BA19ACA} - - - {D2A046B6-8986-92AC-082F-15B3A01B8E40} - - - {D5859751-012E-81F5-D121-159FE9A25436} - - - {CB62DF03-8B06-99E3-905E-DE9E4444A179} - - - {E1429BDE-60F8-9F50-97E2-A4533D1F3DA4} - - - {8B0B95AC-5386-EE34-AA85-E1C7974E6E93} - - - {F421E9A0-BB69-E638-F7AC-A3BD9B7D4827} - - - {26D7F11B-5BF1-54BC-8BF5-D45F68A6A408} - - - {87249A3B-D8F5-1A8C-6C1D-F1CDCCF5242B} - - - {1B5596EA-E920-0BF3-81F5-D0D3A1786006} - - - {EE178E31-46DB-6ED5-D5F4-81BDC7A96765} - - - {272EB630-1801-CFB7-68ED-3FD2AF1FEF87} - - - {D245AFF2-E02A-AB08-85C6-632FFB77D25B} - - - {0198696A-8575-E86B-C683-4ACB35406C22} - - - {643C570C-14A2-D7AB-6B2C-61C011864D8F} - - - {48FBA929-C7B7-CE6C-4074-D440347DCEBC} - - - {3E8DC74A-BEA9-DE65-C5AE-F7F7F9373552} - - - {FDF959A9-11D3-61C5-07F6-077C556E1A8E} - - - {6CFCE215-49E3-9407-C201-479021338F6C} - - - {2E37F2EA-49FC-1F02-C3EA-D7EB608603A1} - - - {4FD99791-5191-0BFF-8D77-19500238E44E} - - - - - proto - - - proto - - - . - - - beast\test - - - beast\unit_test - - - beast\unit_test\detail - - - beast\unit_test - - - beast\unit_test - - - beast\unit_test - - - beast\unit_test - - - beast\unit_test - - - beast\unit_test - - - beast\unit_test - - - beast\unit_test - - - beast\unit_test - - - beast\unit_test - - - beast\unit_test - - - beast\core - - - beast\core - - - beast\core - - - beast\core - - - beast\core - - - beast\core\detail - - - beast\core\detail - - - beast\core\detail - - - beast\core\detail - - - beast\core\detail - - - beast\core\detail - - - beast\core\detail - - - beast\core\detail - - - beast\core\detail - - - beast\core\detail - - - beast\core\detail - - - beast\core\detail - - - beast\core\detail - - - beast\core\detail - - - beast\core\detail - - - beast\core\detail - - - beast\core - - - beast\core - - - beast\core - - - beast\core - - - beast\core - - - beast\core - - - beast\core\impl - - - beast\core\impl - - - beast\core\impl - - - beast\core\impl - - - beast\core\impl - - - beast\core - - - beast\core - - - beast\core - - - beast\core - - - beast\core - - - beast\core - - - beast\core - - - beast\core - - - beast\core - - - beast - - - beast\http - - - beast\http - - - beast\http - - - beast\http - - - beast\http - - - beast\http\detail - - - beast\http\detail - - - beast\http\detail - - - beast\http\detail - - - beast\http - - - beast\http - - - beast\http - - - beast\http\impl - - - beast\http\impl - - - beast\http\impl - - - beast\http\impl - - - beast\http\impl - - - beast\http\impl - - - beast\http\impl - - - beast\http\impl - - - beast\http - - - beast\http - - - beast\http - - - beast\http - - - beast\http - - - beast\http - - - beast\http - - - beast\http - - - beast\http - - - beast\http - - - beast\http - - - beast - - - beast - - - beast\websocket\detail - - - beast\websocket\detail - - - beast\websocket\detail - - - beast\websocket\detail - - - beast\websocket\detail - - - beast\websocket\detail - - - beast\websocket\detail - - - beast\websocket\detail - - - beast\websocket\detail - - - beast\websocket - - - beast\websocket\impl - - - beast\websocket\impl - - - beast\websocket\impl - - - beast\websocket\impl - - - beast\websocket\impl - - - beast\websocket\impl - - - beast\websocket\impl - - - beast\websocket\impl - - - beast\websocket\impl - - - beast\websocket\impl - - - beast\websocket - - - beast\websocket - - - beast\websocket - - - beast\websocket - - - beast\websocket - - - beast\zlib - - - beast\zlib\detail - - - beast\zlib\detail - - - beast\zlib\detail - - - beast\zlib\detail - - - beast\zlib\detail - - - beast\zlib - - - beast\zlib\impl - - - beast\zlib - - - beast\zlib - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - ed25519-donna - - - lz4\lib - - - lz4\lib - - - lz4\lib - - - lz4\lib - - - nudb - - - nudb - - - nudb - - - nudb\detail - - - nudb\detail - - - nudb\detail - - - nudb\detail - - - nudb\detail - - - nudb\detail - - - nudb\detail - - - nudb\detail - - - nudb\detail - - - nudb\detail - - - nudb\detail - - - nudb\detail - - - nudb\detail - - - nudb - - - nudb - - - nudb\impl - - - nudb\impl - - - nudb\impl - - - nudb\impl - - - nudb\impl - - - nudb\impl - - - nudb\impl - - - nudb\impl - - - nudb\impl - - - nudb - - - nudb - - - nudb - - - nudb - - - nudb - - - nudb - - - nudb - - - nudb - - - nudb - - - nudb - - - nudb - - - nudb - - - nudb - - - protobuf\src\google\protobuf\compiler - - - protobuf\src\google\protobuf\compiler - - - protobuf\src\google\protobuf\compiler - - - protobuf\src\google\protobuf\compiler - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf\io - - - protobuf\src\google\protobuf\io - - - protobuf\src\google\protobuf\io - - - protobuf\src\google\protobuf\io - - - protobuf\src\google\protobuf\io - - - protobuf\src\google\protobuf\io - - - protobuf\src\google\protobuf\io - - - protobuf\src\google\protobuf\io - - - protobuf\src\google\protobuf\io - - - protobuf\src\google\protobuf\io - - - protobuf\src\google\protobuf\io - - - protobuf\src\google\protobuf\io - - - protobuf\src\google\protobuf\io - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\stubs - - - protobuf\src\google\protobuf\testing - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\src\google\protobuf - - - protobuf\vsprojects - - - ripple\app\consensus - - - ripple\app\consensus - - - ripple\app\consensus - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger\impl - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\ledger - - - ripple\app\main - - - ripple\app\main - - - ripple\app\main - - - ripple\app\main - - - ripple\app\main - - - ripple\app\main - - - ripple\app\main - - - ripple\app\main - - - ripple\app\main - - - ripple\app\main - - - ripple\app\main - - - ripple\app\main - - - ripple\app\main - - - ripple\app\main - - - ripple\app\main - - - ripple\app\main - - - ripple\app\main - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc\impl - - - ripple\app\misc\impl - - - ripple\app\misc\impl - - - ripple\app\misc\impl - - - ripple\app\misc\impl - - - ripple\app\misc\impl - - - ripple\app\misc\impl - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\misc - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths\cursor - - - ripple\app\paths\cursor - - - ripple\app\paths\cursor - - - ripple\app\paths\cursor - - - ripple\app\paths\cursor - - - ripple\app\paths\cursor - - - ripple\app\paths\cursor - - - ripple\app\paths\cursor - - - ripple\app\paths\cursor - - - ripple\app\paths\cursor - - - ripple\app\paths\cursor - - - ripple\app\paths\cursor - - - ripple\app\paths\cursor - - - ripple\app\paths\cursor - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths\impl - - - ripple\app\paths\impl - - - ripple\app\paths\impl - - - ripple\app\paths\impl - - - ripple\app\paths\impl - - - ripple\app\paths\impl - - - ripple\app\paths\impl - - - ripple\app\paths\impl - - - ripple\app\paths\impl - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\paths - - - ripple\app\tx - - - ripple\app\tx - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\app\tx\impl - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics\impl - - - ripple\basics\impl - - - ripple\basics\impl - - - ripple\basics\impl - - - ripple\basics\impl - - - ripple\basics\impl - - - ripple\basics\impl - - - ripple\basics\impl - - - ripple\basics\impl - - - ripple\basics\impl - - - ripple\basics\impl - - - ripple\basics\impl - - - ripple\basics\impl - - - ripple\basics\impl - - - ripple\basics\impl - - - ripple\basics\impl - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\basics - - - ripple\beast\asio - - - ripple\beast\asio - - - ripple\beast\asio - - - ripple\beast\clock - - - ripple\beast\clock - - - ripple\beast\clock - - - ripple\beast\clock - - - ripple\beast\container - - - ripple\beast\container - - - ripple\beast\container - - - ripple\beast\container - - - ripple\beast\container - - - ripple\beast\container - - - ripple\beast\container - - - ripple\beast\container - - - ripple\beast\container - - - ripple\beast\container - - - ripple\beast\container\detail - - - ripple\beast\container\detail - - - ripple\beast\container\detail - - - ripple\beast\container\detail - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\core - - - ripple\beast\crypto\detail - - - ripple\beast\crypto\detail - - - ripple\beast\crypto\detail - - - ripple\beast\crypto - - - ripple\beast\crypto - - - ripple\beast\crypto - - - ripple\beast\cxx17 - - - ripple\beast\hash - - - ripple\beast\hash - - - ripple\beast\hash - - - ripple\beast\hash\impl - - - ripple\beast\hash\impl - - - ripple\beast\hash\impl - - - ripple\beast\hash\impl - - - ripple\beast\hash\impl - - - ripple\beast\hash - - - ripple\beast\hash - - - ripple\beast\hash - - - ripple\beast\hash\tests - - - ripple\beast\hash - - - ripple\beast\hash - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\insight\impl - - - ripple\beast\insight\impl - - - ripple\beast\insight\impl - - - ripple\beast\insight\impl - - - ripple\beast\insight\impl - - - ripple\beast\insight\impl - - - ripple\beast\insight\impl - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\insight - - - ripple\beast\net\detail - - - ripple\beast\net\impl - - - ripple\beast\net\impl - - - ripple\beast\net\impl - - - ripple\beast\net\impl - - - ripple\beast\net - - - ripple\beast\net - - - ripple\beast\net - - - ripple\beast\net - - - ripple\beast\net - - - ripple\beast - - - ripple\beast - - - ripple\beast\unity - - - ripple\beast\unity - - - ripple\beast\unity - - - ripple\beast\unity - - - ripple\beast - - - ripple\beast\utility - - - ripple\beast\utility - - - ripple\beast\utility - - - ripple\beast\utility - - - ripple\beast\utility - - - ripple\beast\utility\src - - - ripple\beast\utility\src - - - ripple\beast\utility\src - - - ripple\beast\utility - - - ripple\beast\utility - - - ripple\beast\utility - - - ripple\beast\utility - - - ripple\beast\utility - - - ripple\beast - - - ripple\conditions - - - ripple\conditions - - - ripple\conditions - - - ripple\conditions\impl - - - ripple\conditions\impl - - - ripple\conditions\impl - - - ripple\conditions\impl - - - ripple\conditions\impl - - - ripple\conditions\impl - - - ripple\conditions - - - ripple\conditions - - - ripple\conditions - - - ripple\core - - - ripple\core - - - ripple\core - - - ripple\core - - - ripple\core - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core\impl - - - ripple\core - - - ripple\core - - - ripple\core - - - ripple\core - - - ripple\core - - - ripple\core - - - ripple\core - - - ripple\core - - - ripple\core - - - ripple\core - - - ripple\core - - - ripple\crypto - - - ripple\crypto - - - ripple\crypto\impl - - - ripple\crypto\impl - - - ripple\crypto\impl - - - ripple\crypto\impl - - - ripple\crypto\impl - - - ripple\crypto\impl - - - ripple\crypto\impl - - - ripple\crypto\impl - - - ripple\crypto - - - ripple\crypto - - - ripple\crypto - - - ripple\json\impl - - - ripple\json\impl - - - ripple\json\impl - - - ripple\json\impl - - - ripple\json\impl - - - ripple\json\impl - - - ripple\json\impl - - - ripple\json\impl - - - ripple\json\impl - - - ripple\json\impl - - - ripple\json - - - ripple\json - - - ripple\json - - - ripple\json - - - ripple\json - - - ripple\json - - - ripple\json - - - ripple\json - - - ripple\json - - - ripple\ledger - - - ripple\ledger - - - ripple\ledger - - - ripple\ledger - - - ripple\ledger - - - ripple\ledger\detail - - - ripple\ledger\detail - - - ripple\ledger\detail - - - ripple\ledger\detail - - - ripple\ledger\detail - - - ripple\ledger - - - ripple\ledger\impl - - - ripple\ledger\impl - - - ripple\ledger\impl - - - ripple\ledger\impl - - - ripple\ledger\impl - - - ripple\ledger\impl - - - ripple\ledger\impl - - - ripple\ledger\impl - - - ripple\ledger\impl - - - ripple\ledger\impl - - - ripple\ledger\impl - - - ripple\ledger\impl - - - ripple\ledger\impl - - - ripple\ledger - - - ripple\ledger - - - ripple\ledger - - - ripple\ledger - - - ripple\ledger - - - ripple\ledger - - - ripple\ledger - - - ripple\net - - - ripple\net - - - ripple\net\impl - - - ripple\net\impl - - - ripple\net\impl - - - ripple\net\impl - - - ripple\net\impl - - - ripple\net - - - ripple\net - - - ripple\net - - - ripple\net - - - ripple\nodestore - - - ripple\nodestore\backend - - - ripple\nodestore\backend - - - ripple\nodestore\backend - - - ripple\nodestore\backend - - - ripple\nodestore\backend - - - ripple\nodestore - - - ripple\nodestore - - - ripple\nodestore - - - ripple\nodestore - - - ripple\nodestore\impl - - - ripple\nodestore\impl - - - ripple\nodestore\impl - - - ripple\nodestore\impl - - - ripple\nodestore\impl - - - ripple\nodestore\impl - - - ripple\nodestore\impl - - - ripple\nodestore\impl - - - ripple\nodestore\impl - - - ripple\nodestore\impl - - - ripple\nodestore\impl - - - ripple\nodestore\impl - - - ripple\nodestore\impl - - - ripple\nodestore\impl - - - ripple\nodestore\impl - - - ripple\nodestore\impl - - - ripple\nodestore - - - ripple\nodestore - - - ripple\nodestore - - - ripple\nodestore - - - ripple\nodestore - - - ripple\overlay - - - ripple\overlay - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay\impl - - - ripple\overlay - - - ripple\overlay - - - ripple\overlay - - - ripple\overlay - - - ripple\overlay - - - ripple\overlay - - - ripple\overlay - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder\impl - - - ripple\peerfinder - - - ripple\peerfinder - - - ripple\peerfinder - - - ripple\peerfinder\sim - - - ripple\peerfinder\sim - - - ripple\peerfinder\sim - - - ripple\peerfinder\sim - - - ripple\peerfinder\sim - - - ripple\peerfinder\sim - - - ripple\peerfinder - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol\impl - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\protocol - - - ripple\proto - - - ripple\resource - - - ripple\resource - - - ripple\resource - - - ripple\resource - - - ripple\resource - - - ripple\resource\impl - - - ripple\resource\impl - - - ripple\resource\impl - - - ripple\resource\impl - - - ripple\resource\impl - - - ripple\resource\impl - - - ripple\resource\impl - - - ripple\resource\impl - - - ripple\resource\impl - - - ripple\resource\impl - - - ripple\resource - - - ripple\resource - - - ripple\rpc - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\handlers - - - ripple\rpc\impl - - - ripple\rpc\impl - - - ripple\rpc\impl - - - ripple\rpc\impl - - - ripple\rpc\impl - - - ripple\rpc\impl - - - ripple\rpc\impl - - - ripple\rpc\impl - - - ripple\rpc\impl - - - ripple\rpc\impl - - - ripple\rpc\impl - - - ripple\rpc\impl - - - ripple\rpc\impl - - - ripple\rpc\impl - - - ripple\rpc\impl - - - ripple\rpc - - - ripple\rpc - - - ripple\rpc - - - ripple\rpc - - - ripple\rpc - - - ripple\server - - - ripple\server\impl - - - ripple\server\impl - - - ripple\server\impl - - - ripple\server\impl - - - ripple\server\impl - - - ripple\server\impl - - - ripple\server\impl - - - ripple\server\impl - - - ripple\server\impl - - - ripple\server\impl - - - ripple\server\impl - - - ripple\server\impl - - - ripple\server\impl - - - ripple\server - - - ripple\server - - - ripple\server - - - ripple\server - - - ripple\server - - - ripple\server - - - ripple\shamap - - - ripple\shamap - - - ripple\shamap\impl - - - ripple\shamap\impl - - - ripple\shamap\impl - - - ripple\shamap\impl - - - ripple\shamap\impl - - - ripple\shamap\impl - - - ripple\shamap\impl - - - ripple\shamap - - - ripple\shamap - - - ripple\shamap - - - ripple\shamap - - - ripple\shamap - - - ripple\shamap - - - ripple\shamap - - - ripple\shamap - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - ripple\unity - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\db - - - rocksdb2\hdfs - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb\utilities - - - rocksdb2\include\rocksdb\utilities - - - rocksdb2\include\rocksdb\utilities - - - rocksdb2\include\rocksdb\utilities - - - rocksdb2\include\rocksdb\utilities - - - rocksdb2\include\rocksdb\utilities - - - rocksdb2\include\rocksdb\utilities - - - rocksdb2\include\rocksdb\utilities - - - rocksdb2\include\rocksdb - - - rocksdb2\include\rocksdb - - - rocksdb2\port - - - rocksdb2\port - - - rocksdb2\port - - - rocksdb2\port - - - rocksdb2\port - - - rocksdb2\port - - - rocksdb2\port - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\table - - - rocksdb2\third-party\rapidjson\internal - - - rocksdb2\third-party\rapidjson\internal - - - rocksdb2\third-party\rapidjson - - - rocksdb2\third-party\rapidjson - - - rocksdb2\utilities\backupable - - - rocksdb2\utilities\document - - - rocksdb2\utilities\document - - - rocksdb2\utilities\geodb - - - rocksdb2\utilities\geodb - - - rocksdb2\utilities - - - rocksdb2\utilities\merge_operators - - - rocksdb2\utilities\merge_operators\string_append - - - rocksdb2\utilities\merge_operators\string_append - - - rocksdb2\utilities\merge_operators\string_append - - - rocksdb2\utilities\merge_operators\string_append - - - rocksdb2\utilities\merge_operators - - - rocksdb2\utilities\redis - - - rocksdb2\utilities\redis - - - rocksdb2\utilities\redis - - - rocksdb2\utilities\redis - - - rocksdb2\utilities\spatialdb - - - rocksdb2\utilities\spatialdb - - - rocksdb2\utilities\ttl - - - rocksdb2\utilities\ttl - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - rocksdb2\util - - - secp256k1\include - - - secp256k1\include - - - secp256k1\include - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src\modules\ecdh - - - secp256k1\src\modules\recovery - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - secp256k1\src - - - snappy\config - - - snappy\snappy - - - snappy\snappy - - - snappy\snappy - - - snappy\snappy - - - snappy\snappy - - - snappy\snappy - - - snappy\snappy - - - soci\include\private - - - soci\include\private - - - soci\include\private - - - soci\include\private - - - soci\include\private - - - soci\include\private - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci\sqlite3 - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\include\soci - - - soci\src\backends\sqlite3 - - - soci\src\backends\sqlite3 - - - soci\src\backends\sqlite3 - - - soci\src\backends\sqlite3 - - - soci\src\backends\sqlite3 - - - soci\src\backends\sqlite3 - - - soci\src\backends\sqlite3 - - - soci\src\backends\sqlite3 - - - soci\src\backends\sqlite3 - - - soci\src\backends\sqlite3 - - - soci\src\backends\sqlite3 - - - soci\src\backends\sqlite3 - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - soci\src\core - - - sqlite - - - sqlite - - - sqlite\sqlite - - - sqlite\sqlite - - - sqlite - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\app - - - test\basics - - - test\basics - - - test\basics - - - test\basics - - - test\basics - - - test\basics - - - test\basics - - - test\basics - - - test\basics - - - test\basics - - - test\basics - - - test\beast - - - test\beast - - - test\beast - - - test\beast - - - test\beast - - - test\beast - - - test\beast - - - test\beast - - - test\beast - - - test\beast - - - test\beast - - - test\beast - - - test\beast - - - test\beast - - - test\beast - - - test\beast - - - test\conditions - - - test\conditions - - - test\conditions - - - test\conditions - - - test\core - - - test\core - - - test\core - - - test\core - - - test\core - - - test\core - - - test\json - - - test\json - - - test\json - - - test\json - - - test\json - - - test - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx\impl - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\jtx - - - test\ledger - - - test\ledger - - - test\ledger - - - test\ledger - - - test\ledger - - - test\ledger - - - test\ledger - - - test\nodestore - - - test\nodestore - - - test\nodestore - - - test\nodestore - - - test\nodestore - - - test\nodestore - - - test\nodestore - - - test\overlay - - - test\overlay - - - test\overlay - - - test\overlay - - - test\peerfinder - - - test\peerfinder - - - test\protocol - - - test\protocol - - - test\protocol - - - test\protocol - - - test\protocol - - - test\protocol - - - test\protocol - - - test\protocol - - - test\protocol - - - test\protocol - - - test\protocol - - - test\protocol - - - test\protocol - - - test\protocol - - - test\protocol - - - test\resource - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\rpc - - - test\server - - - test\server - - - test\shamap - - - test\shamap - - - test\shamap - - - test\shamap - - - test\unity - - - test\unity - - - test\unity - - - test\unity - - - test\unity - - - test\unity - - - test\unity - - - test\unity - - - test\unity - - - test\unity - - - test\unity - - - test\unity - - - test\unity - - - test\unity - - - test\unity - - - test\unity - - - diff --git a/Builds/VisualStudio2015/images/NoDebugHeapPropPage.png b/Builds/VisualStudio2015/images/NoDebugHeapPropPage.png deleted file mode 100644 index 63f5e252faad4b81e27d4a8ae7cf61b743e59db9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34285 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 diff --git a/Builds/VisualStudio2015/images/VS2015x64IncludeDirs.png b/Builds/VisualStudio2015/images/VS2015x64IncludeDirs.png deleted file mode 100644 index 6d9b490db3813e9b61130413d929df18673aa62b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68334 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 diff --git a/Builds/VisualStudio2015/images/VS2015x64LibraryDirs.png b/Builds/VisualStudio2015/images/VS2015x64LibraryDirs.png deleted file mode 100644 index c6546a79e4c49cc96055bf999690a01ca345acd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68136 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 diff --git a/Builds/VisualStudio2015/images/VS2015x64Properties.png b/Builds/VisualStudio2015/images/VS2015x64Properties.png deleted file mode 100644 index c0c35803e77b2b0d8d2bd52998272ee9dd321988..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15609 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 ASO5S3 diff --git a/Builds/VisualStudio2015/images/VSCommandArgsPropPage.png b/Builds/VisualStudio2015/images/VSCommandArgsPropPage.png deleted file mode 100644 index 7bb6d602706c35cc37273e6cb1dca78425ac08d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19676 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 "[Homebrew](http://brew.sh/) installs the stuff you need that Apple didn’t." - -Open a terminal and type: - -``` -ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" -``` - -For more info, see "Step 3: Install Homebrew" -[here](http://www.moncefbelyamani.com/how-to-install-xcode-homebrew-git-rvm-ruby-on-mac) - -### Install Git - -``` -brew update brew install git -``` - -For more info, see "Step 4: Install Git" -[here](http://www.moncefbelyamani.com/how-to-install-xcode-homebrew-git-rvm-ruby-on-mac) - -**NOTE**: To gain full featured access to the -[git-subtree](http://blogs.atlassian.com/2013/05/alternatives-to-git-submodule-git-subtree/) -functionality used in the rippled repository, we suggest Git version 1.8.3.2 or -later. - -### Install Scons - -Requires version 2.3.0 or later - -``` -brew install scons -``` - -`brew` will generally install the latest stable version of any package, which -will satisfy the scons minimum version requirement for rippled. - -### Install Package Config - -``` -brew install pkg-config -``` - -## Install/Build/Configure Dependencies - -### Build Google Protocol Buffers Compiler - -Building rippled on osx requires `protoc` version 2.5.x or 2.6.x (later versions -do not work with rippled at this time). - -Download [this](https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.bz2) - -We want to compile protocol buffers with clang/libc++: - -``` -tar xfvj protobuf-2.6.1.tar.bz2 -cd protobuf-2.6.1 -./configure CC=clang CXX=clang++ CXXFLAGS='-std=c++11 -stdlib=libc++ -O3 -g' LDFLAGS='-stdlib=libc++' LIBS="-lc++ -lc++abi" -make -j 4 -sudo make install -``` - -If you have installed `protobuf` via brew - either directly or indirectly as a -dependency of some other package - this is likely to conflict with our specific -version requirements. The simplest way to avoid conflicts is to uninstall it. -`brew ls --versions protobuf` will list any versions of protobuf -you currently have installed. - -### Install OpenSSL - -``` -brew install openssl -``` - -### Build Boost - -We want to compile boost with clang/libc++ - -Download [a release](https://sourceforge.net/projects/boost/files/boost/1.61.0/boost_1_61_0.tar.bz2) - -Extract it to a folder, making note of where, open a terminal, then: - -``` -./bootstrap.sh ./b2 toolset=clang threading=multi runtime-link=static link=static cxxflags="-stdlib=libc++" linkflags="-stdlib=libc++" address-model=64 -``` - -Create an environment variable `BOOST_ROOT` in one of your `rc` files, pointing -to the root of the extracted directory. - -### Clone the rippled repository - -From the terminal - -``` -git clone git@github.com:ripple/rippled.git -cd rippled -``` - -Choose the master branch or one of the tagged releases listed on -[GitHub](https://github.com/ripple/rippled/releases GitHub). - -``` -git checkout master -``` - -or to test the latest release candidate, choose the `release` branch. - -``` -git checkout release -``` - -### Configure Library Paths - -If you didn't persistently set the `BOOST_ROOT` environment variable to the -root of the extracted directory above, then you should set it temporarily. - -For example, assuming your username were `Abigail` and you extracted Boost -1.61.0 in `/Users/Abigail/Downloads/boost_1_61_0`, you would do for any -shell in which you want to build: - -``` -export BOOST_ROOT=/Users/Abigail/Downloads/boost_1_61_0 -``` - -## Build - -``` -scons -``` - -See: [here](https://ripple.com/wiki/Rippled_build_instructions#Building) - -## Unit Tests (Recommended) - -rippled builds a set of unit tests into the server executable. To run these unit -tests after building, pass the `--unittest` option to the compiled `rippled` -executable. The executable will exit after running the unit tests. - - diff --git a/Builds/build_all.sh b/Builds/build_all.sh deleted file mode 100644 index 52beed007f..0000000000 --- a/Builds/build_all.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -num_procs=$(lscpu -p | grep -v '^#' | sort -u -t, -k 2,4 | wc -l) # number of physical cores - -cd .. -./Builds/Test.py -a -c -- -j${num_procs} diff --git a/Builds/travis/clang.boost.patch b/Builds/travis/clang.boost.patch deleted file mode 100644 index 7234a99970..0000000000 --- a/Builds/travis/clang.boost.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- /usr/include/boost/config/compiler/clang.hpp 2013-07-20 13:17:10.000000000 -0400 -+++ /usr/include/boost/config/compiler/clang.rippled.hpp 2014-03-11 16:40:51.000000000 -0400 -@@ -39,6 +39,10 @@ - // Clang supports "long long" in all compilation modes. - #define BOOST_HAS_LONG_LONG - -+#if defined(__SIZEOF_INT128__) -+# define BOOST_HAS_INT128 -+#endif -+ - // - // Dynamic shared object (DSO) and dynamic-link library (DLL) support - // diff --git a/Builds/travis/static_error.boost.patch b/Builds/travis/static_error.boost.patch deleted file mode 100644 index 68a34b1796..0000000000 --- a/Builds/travis/static_error.boost.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- /usr/include/boost/bimap/detail/debug/static_error.hpp 2008-03-22 17:45:55.000000000 -0400 -+++ /usr/include/boost/bimap/detail/debug/static_error.rippled.hpp 2014-03-12 19:40:05.000000000 -0400 -@@ -25,7 +25,6 @@ - // a static error. - /*===========================================================================*/ - #define BOOST_BIMAP_STATIC_ERROR(MESSAGE,VARIABLES) \ -- struct BOOST_PP_CAT(BIMAP_STATIC_ERROR__,MESSAGE) {}; \ - BOOST_MPL_ASSERT_MSG(false, \ - BOOST_PP_CAT(BIMAP_STATIC_ERROR__,MESSAGE), \ - VARIABLES) diff --git a/src/beast/CHANGELOG.md b/CHANGELOG.md similarity index 91% rename from src/beast/CHANGELOG.md rename to CHANGELOG.md index 383491ba70..2dcb1650c7 100644 --- a/src/beast/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,47 @@ +1.0.0-b34 + +* Fix and tidy up CMake build scripts + +-------------------------------------------------------------------------------- + +1.0.0-b33 + +* Require Visual Studio 2015 Update 3 or later + +HTTP + +* Use fwrite return value in file_body + +WebSocket + +* Set internal state correctly when writing frames +* Add decorator unit test +* Add write_frames unit test + +-------------------------------------------------------------------------------- + +1.0.0-b32 + +* Add io_service completion invariants test +* Update CMake scripts for finding packages + +API Changes: + +* Remove http Writer suspend and resume feature + +-------------------------------------------------------------------------------- + +1.0.0-b31 + +* Tidy up build settings +* Add missing dynabuf_readstream member + +WebSocket + +* Move the handler, don't copy it + +-------------------------------------------------------------------------------- + 1.0.0-b30 WebSocket diff --git a/CMakeLists.txt b/CMakeLists.txt index d5817b4e24..c82014589f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,519 +1,178 @@ -# !!! The official build system is SConstruct !!! -# This is an experimental cmake build file for rippled -# -# cmake support in rippled. Currently supports: -# -# * unity/nounity debug/release -# * running protobuf -# * sanitizer builds -# * optional release build with assert turned on -# * `target` variable to easily set compiler/debug/unity -# (i.e. -Dtarget=gcc.debug.nounity) -# * gcc/clang/visual studio/xcode -# * linux/mac/win -# * gcc 4 ABI, when needed -# * ninja builds -# * check openssl version on linux -# * static builds (swd TBD: needs to be tested by building & deploying on different systems) -# -# TBD: -# * jemalloc support -# * count -# * Windows protobuf compiler puts generated file in src directory instead of build directory. -# -# Notes: -# * Use the -G"Visual Studio 14 2015 Win64" generator on Windows. Without this -# a 32-bit project will be created. There is no way to set the generator or -# force a 64-bit build in CMakeLists.txt (setting CMAKE_GENERATOR_PLATFORM won't work). -# The best solution may be to wrap cmake with a script. -# -# * It is not possible to generate a visual studio project on linux or -# mac. The visual studio generator is only available on windows. -# -# * The visual studio project can be _either_ unity or -# non-unity (selected at generation time). It does not appear possible -# to disable compilation based on configuration. -# -# * Language is _much_ worse than python, poor documentation and "quirky" -# language support (for example, generator expressions can only be used -# in limited contexts and seem to work differently based on -# context (set_property can set multiple values, add_compile_options -# can not/or is buggy) -# -# * Could not call out to `sed` because cmake messed with the regular -# expression before calling the external command. I did not see a way -# around this. -# -# * Makefile generators want to be single target. It wants a separate -# directory for each target type. I saw some mentions on the web for -# ways around this bug haven't look into it. The visual studio project -# does support debug/release configurations in the same project (but -# not unity/non-unity). +# Part of Beast -############################################################ +cmake_minimum_required (VERSION 3.5.2) -cmake_minimum_required(VERSION 3.1.0) +project (Beast) -# The project command can override some computed values. -# Don't put any code above this line. -project(rippled) +set_property (GLOBAL PROPERTY USE_FOLDERS ON) -if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") - set(dir "build") - set(cmd "cmake") - if (target) - set(dir "${dir}/${target}") - set(cmd "${cmd} -Dtarget=${target}") - elseif(CMAKE_BUILD_TYPE) - set(dir "${dir}/${CMAKE_BUILD_TYPE}") - set(cmd "${cmd} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") - else() - set(dir "${dir}/default") +if (MSVC) + # /wd4244 /wd4127 + add_definitions (-D_WIN32_WINNT=0x0601) + add_definitions (-D_SCL_SECURE_NO_WARNINGS=1) + add_definitions (-D_CRT_SECURE_NO_WARNINGS=1) + + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4100 /wd4244 /wd4251 /MP /W4 /bigobj") + set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ob2 /Oi /Ot /GL") + set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Oi /Ot") + + set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO") + set (CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG") + + # for RelWithDebInfo builds, disable incremental linking + # since CMake sets it ON by default for that build type and it + # causes warnings + # + string (REPLACE "/INCREMENTAL" "/INCREMENTAL:NO" replacement_flags + ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}) + set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO ${replacement_flags}) + +else() + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads) + + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wextra -Wpedantic -Wno-unused-parameter") +endif() + +#------------------------------------------------------------------------------- +# +# Boost +# + +option (Boost_USE_STATIC_LIBS "Use static libraries for boost" ON) + +set (Boost_NO_SYSTEM_PATHS ON) +set (Boost_USE_MULTITHREADED ON) + +unset (Boost_INCLUDE_DIR CACHE) +unset (Boost_LIBRARY_DIRS CACHE) +find_package (Boost REQUIRED COMPONENTS + coroutine + context + filesystem + program_options + system + thread + ) + +include_directories (SYSTEM ${Boost_INCLUDE_DIRS}) +link_libraries (${Boost_LIBRARIES}) + +if (MSVC) + add_definitions (-DBOOST_ALL_NO_LIB) # disable autolinking +elseif (MINGW) + link_libraries(ws2_32 mswsock) +endif() + +add_definitions (-DBOOST_COROUTINES_NO_DEPRECATION_WARNING=1) # for asio + +#------------------------------------------------------------------------------- +# +# OpenSSL +# + +if (APPLE AND NOT DEFINED ENV{OPENSSL_ROOT_DIR}) + find_program(HOMEBREW brew) + if (NOT HOMEBREW STREQUAL "HOMEBREW-NOTFOUND") + execute_process(COMMAND brew --prefix openssl + OUTPUT_VARIABLE OPENSSL_ROOT_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE) endif() - set(cmd "${cmd} ${CMAKE_SOURCE_DIR}") - - message(FATAL_ERROR "Builds are not allowed in ${CMAKE_SOURCE_DIR}.\n" - "Instead:\n" - "1) Remove the CMakeCache.txt file and CMakeFiles directory " - "from ${CMAKE_SOURCE_DIR}.\n" - "2) Create a directory to hold your build files, for example: ${dir}.\n" - "3) Change to that directory.\n" - "4) Run cmake targetting ${CMAKE_SOURCE_DIR}, for example: ${cmd}") -endif() -if("${CMAKE_GENERATOR}" MATCHES "Visual Studio" AND - NOT ("${CMAKE_GENERATOR}" MATCHES .*Win64.*)) - message(FATAL_ERROR "Visual Studio 32-bit build is unsupported. Use - -G\"${CMAKE_GENERATOR} Win64\"") endif() -set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/Builds/CMake") -include(CMakeFuncs) +find_package(OpenSSL) -set(openssl_min 1.0.2) +# +#------------------------------------------------------------------------------- -parse_target() - -if (NOT DEFINED unity) - set(unity true) - set(nonunity false) -endif() - -setup_build_cache() - -if(nonunity) - get_cmake_property(allvars VARIABLES) - string(REGEX MATCHALL "[^;]*(DEBUG|RELEASE)[^;]*" matchvars "${allvars}") - foreach(var IN LISTS matchvars) - string(REGEX REPLACE "(DEBUG|RELEASE)" "\\1CLASSIC" newvar ${var}) - set(${newvar} ${${var}}) +function(DoGroupSources curdir rootdir folder) + file(GLOB children RELATIVE ${PROJECT_SOURCE_DIR}/${curdir} ${PROJECT_SOURCE_DIR}/${curdir}/*) + foreach(child ${children}) + if(IS_DIRECTORY ${PROJECT_SOURCE_DIR}/${curdir}/${child}) + DoGroupSources(${curdir}/${child} ${rootdir} ${folder}) + elseif(${child} STREQUAL "CMakeLists.txt") + source_group("" FILES ${PROJECT_SOURCE_DIR}/${curdir}/${child}) + else() + string(REGEX REPLACE ^${rootdir} ${folder} groupname ${curdir}) + string(REPLACE "/" "\\" groupname ${groupname}) + source_group(${groupname} FILES ${PROJECT_SOURCE_DIR}/${curdir}/${child}) + endif() endforeach() +endfunction() - get_cmake_property(allvars CACHE_VARIABLES) - string(REGEX MATCHALL "[^;]*(DEBUG|RELEASE)[^;]*" matchvars "${allvars}") - foreach(var IN LISTS matchvars) - string(REGEX REPLACE "(DEBUG|RELEASE)" "\\1CLASSIC" newvar ${var}) - set(${newvar} ${${var}} CACHE STRING "Copied from ${var}") - endforeach() +function(GroupSources curdir folder) + DoGroupSources(${curdir} ${curdir} ${folder}) +endfunction() + +#------------------------------------------------------------------------------- + +if ("${VARIANT}" STREQUAL "coverage") + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") + set(CMAKE_BUILD_TYPE RELWITHDEBINFO) + set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lgcov") +elseif ("${VARIANT}" STREQUAL "asan") + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer") + set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") + set(CMAKE_BUILD_TYPE RELWITHDEBINFO) +elseif ("${VARIANT}" STREQUAL "usan") + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-omit-frame-pointer") + set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined") + set(CMAKE_BUILD_TYPE RELWITHDEBINFO) +elseif ("${VARIANT}" STREQUAL "debug") + set(CMAKE_BUILD_TYPE DEBUG) +elseif ("${VARIANT}" STREQUAL "release") + set(CMAKE_BUILD_TYPE RELEASE) endif() -determine_build_type() +include_directories (extras) +include_directories (include) -check_gcc4_abi() +set(ZLIB_SOURCES + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/crc32.h + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/deflate.h + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/inffast.h + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/inffixed.h + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/inflate.h + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/inftrees.h + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/trees.h + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/zlib.h + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/zutil.h + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/adler32.c + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/compress.c + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/crc32.c + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/deflate.c + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/infback.c + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/inffast.c + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/inflate.c + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/inftrees.c + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/trees.c + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/uncompr.c + ${PROJECT_SOURCE_DIR}/test/zlib/zlib-1.2.8/zutil.c +) -############################################################ +file(GLOB_RECURSE BEAST_INCLUDES + ${PROJECT_SOURCE_DIR}/include/beast/*.hpp + ${PROJECT_SOURCE_DIR}/include/beast/*.ipp +) -include_directories( - src - src/beast - src/beast/include - src/beast/extras - src/nudb/include - src/soci/src - src/soci/include) +file(GLOB_RECURSE EXTRAS_INCLUDES + ${PROJECT_SOURCE_DIR}/extras/beast/*.hpp + ${PROJECT_SOURCE_DIR}/extras/beast/*.ipp +) -special_build_flags() - -############################################################ - -use_boost( - # resist the temptation to alphabetize these. coroutine - # must come before context. - chrono - coroutine - context - date_time - filesystem - program_options - regex - system - thread) - -use_pthread() - -use_openssl(${openssl_min}) - -use_protobuf() - -setup_build_boilerplate() - -############################################################ - -if (is_clang) - set(rocks_db_system_header --system-header-prefix=rocksdb2) +add_subdirectory (examples) +if (NOT OPENSSL_FOUND) + message("OpenSSL not found. Not building examples/ssl") else() - unset(rocks_db_system_header) + add_subdirectory (examples/ssl) endif() -set(soci_extra_includes - -I"${CMAKE_SOURCE_DIR}/"src/soci/src/core - -I"${CMAKE_SOURCE_DIR}/"src/soci/include/private - -I"${CMAKE_SOURCE_DIR}/"src/sqlite) - -############################################################ - -# Unity sources -prepend(beast_unity_srcs -src/ripple/beast/unity/ -beast_insight_unity.cpp -beast_net_unity.cpp -beast_utility_unity.cpp) - -prepend(ripple_unity_srcs -src/ripple/unity/ -app_ledger.cpp -app_main.cpp -app_misc.cpp -app_paths.cpp -app_tx.cpp -conditions.cpp -core.cpp -basics.cpp -crypto.cpp -ledger.cpp -net.cpp -overlay.cpp -peerfinder.cpp -json.cpp -protocol.cpp -rpcx.cpp -shamap.cpp -server.cpp) - -prepend(test_unity_srcs -src/test/unity/ -app_test_unity.cpp -basics_test_unity.cpp -beast_test_unity.cpp -conditions_test_unity.cpp -core_test_unity.cpp -json_test_unity.cpp -ledger_test_unity.cpp -overlay_test_unity.cpp -peerfinder_test_unity.cpp -protocol_test_unity.cpp -resource_test_unity.cpp -rpc_test_unity.cpp -server_test_unity.cpp -shamap_test_unity.cpp -support_unity.cpp) - -list(APPEND rippled_src_unity ${beast_unity_srcs} ${ripple_unity_srcs} ${test_unity_srcs}) - -add_with_props(rippled_src_unity src/test/unity/nodestore_test_unity.cpp --I"${CMAKE_SOURCE_DIR}/"src/rocksdb2/include --I"${CMAKE_SOURCE_DIR}/"src/snappy/snappy --I"${CMAKE_SOURCE_DIR}/"src/snappy/config -${rocks_db_system_header}) - -add_with_props(rippled_src_unity src/ripple/unity/nodestore.cpp --I"${CMAKE_SOURCE_DIR}/"src/rocksdb2/include --I"${CMAKE_SOURCE_DIR}/"src/snappy/snappy --I"${CMAKE_SOURCE_DIR}/"src/snappy/config -${rocks_db_system_header}) - -add_with_props(rippled_src_unity src/ripple/unity/soci_ripple.cpp ${soci_extra_includes}) - -list(APPEND ripple_unity_srcs ${beast_unity_srcs} ${test_unity_srcs} -src/ripple/unity/nodestore.cpp -src/ripple/unity/soci_ripple.cpp -src/test/unity/nodestore_test_unity.cpp) - -############################################################ - -# Non-unity sources -file(GLOB_RECURSE core_srcs src/ripple/core/*.cpp) -add_with_props(rippled_src_nonunity "${core_srcs}" - -I"${CMAKE_SOURCE_DIR}/"src/soci/src/core - -I"${CMAKE_SOURCE_DIR}/"src/sqlite) - -set(non_unity_srcs ${core_srcs}) - -foreach(curdir - beast/clock - beast/container - beast/insight - beast/net - beast/utility - app - basics - conditions - crypto - json - ledger - legacy - net - overlay - peerfinder - protocol - rpc - server - shamap) - file(GLOB_RECURSE cursrcs src/ripple/${curdir}/*.cpp) - list(APPEND rippled_src_nonunity "${cursrcs}") - list(APPEND non_unity_srcs "${cursrcs}") -endforeach() - -file(GLOB_RECURSE nodestore_srcs src/ripple/nodestore/*.cpp - src/test/nodestore/*.cpp) - -add_with_props(rippled_src_nonunity "${nodestore_srcs}" - -I"${CMAKE_SOURCE_DIR}/"src/rocksdb2/include - -I"${CMAKE_SOURCE_DIR}/"src/snappy/snappy - -I"${CMAKE_SOURCE_DIR}/"src/snappy/config - ${rocks_db_system_header}) - -list(APPEND non_unity_srcs "${nodestore_srcs}") - -# unit test sources -foreach(curdir - app - basics - beast - conditions - core - json - ledger - nodestore - overlay - peerfinder - protocol - resource - rpc - server - shamap - jtx) - file(GLOB_RECURSE cursrcs src/test/${curdir}/*.cpp) - list(APPEND test_srcs "${cursrcs}") -endforeach() - -add_with_props(rippled_src_nonunity "${test_srcs}" - -I"${CMAKE_SOURCE_DIR}/"src/rocksdb2/include - -I"${CMAKE_SOURCE_DIR}/"src/snappy/snappy - -I"${CMAKE_SOURCE_DIR}/"src/snappy/config - ${rocks_db_system_header}) - -list(APPEND non_unity_srcs "${test_srcs}") - -if(WIN32 OR is_xcode) - # Rippled headers. Only needed for IDEs. - file(GLOB_RECURSE rippled_headers src/*.h src/*.hpp) - list(APPEND rippled_headers Builds/CMake/CMakeFuncs.cmake) - foreach(curdir - beast/asio - beast/core - beast/crypto - beast/cxx17 - beast/hash - proto - resource - validators - websocket) - file(GLOB_RECURSE cursrcs src/ripple/${curdir}/*.cpp) - list(APPEND rippled_headers "${cursrcs}") - endforeach() - list(APPEND rippled_src_nonunity "${rippled_headers}") - - set_property( - SOURCE ${rippled_headers} - APPEND - PROPERTY HEADER_FILE_ONLY - true) - # Doesn't work - # $,$>) -endif() - -if (WIN32 OR is_xcode) - # Documentation sources. Only needed for IDEs. - prepend(doc_srcs - docs/ - Jamfile.v2 - boostbook.dtd - index.xml - main.qbk - quickref.xml - reference.xsl - source.dox) - - set_property( - SOURCE ${doc_srcs} - APPEND - PROPERTY HEADER_FILE_ONLY - true) - # Doesn't work - # $,$>) -endif() - -############################################################ - -add_with_props(rippled_src_all src/ripple/unity/soci.cpp - ${soci_extra_includes}) - -if (NOT is_msvc) - set(no_unused_w -Wno-unused-function) -else() - unset(no_unused_w) -endif() - -add_with_props(rippled_src_all src/ripple/unity/secp256k1.cpp - -I"${CMAKE_SOURCE_DIR}/"src/secp256k1 - ${no_unused_w} - ) - -foreach(cursrc - src/ripple/beast/unity/beast_hash_unity.cpp - src/ripple/unity/beast.cpp - src/ripple/unity/lz4.c - src/ripple/unity/protobuf.cpp - src/ripple/unity/ripple.proto.cpp - src/ripple/unity/resource.cpp) - - add_with_props(rippled_src_all ${cursrc} - ${rocks_db_system_header} - ) - -endforeach() - -if (NOT is_msvc) - set(extra_props -Wno-array-bounds) -else() - unset(extra_props) -endif() - -add_with_props(rippled_src_all src/sqlite/sqlite_unity.c - ${extra_props}) - -add_with_props(rippled_src_all src/ripple/unity/ed25519_donna.c - -I"${CMAKE_SOURCE_DIR}/"src/ed25519-donna) - -if (is_gcc) - set(no_init_w -Wno-maybe-uninitialized) -else() - unset(no_init_w) -endif() - -add_with_props(rippled_src_all src/ripple/unity/rocksdb.cpp - -I"${CMAKE_SOURCE_DIR}/"src/rocksdb2 - -I"${CMAKE_SOURCE_DIR}/"src/rocksdb2/include - -I"${CMAKE_SOURCE_DIR}/"src/snappy/snappy - -I"${CMAKE_SOURCE_DIR}/"src/snappy/config - ${no_init_w} ${rocks_db_system_header}) - -if (NOT is_msvc) - set(no_unused_w -Wno-unused-function) -endif() - -add_with_props(rippled_src_all src/ripple/unity/snappy.cpp - -I"${CMAKE_SOURCE_DIR}/"src/snappy/snappy - -I"${CMAKE_SOURCE_DIR}/"src/snappy/config - ${no_unused_w}) - -if (APPLE AND is_clang) - list(APPEND rippled_src_all src/ripple/unity/beastobjc.mm) -endif() - -list(APPEND rippled_src_unity "${rippled_src_all}") -list(APPEND rippled_src_nonunity "${rippled_src_all}") - -############################################################ - -if (WIN32 OR is_xcode) - group_sources(src) - group_sources(docs) - group_sources(Builds) -endif() - -if(unity) - add_executable(rippled ${rippled_src_unity} ${PROTO_HDRS}) - add_executable(rippled_classic EXCLUDE_FROM_ALL ${rippled_src_nonunity} ${PROTO_HDRS}) - set(other_target rippled_classic) -else() - add_executable(rippled ${rippled_src_nonunity} ${PROTO_HDRS}) - add_executable(rippled_unity EXCLUDE_FROM_ALL ${rippled_src_unity} ${PROTO_HDRS}) - set(other_target rippled_unity) -endif() -list(APPEND targets "rippled") -list(APPEND targets ${other_target}) -# Not the same as EXCLUDE_FROM_ALL. Prevents Visual Studio from building the -# other_target when the user builds the solution (default when pressing ) -set_property(TARGET ${other_target} PROPERTY EXCLUDE_FROM_DEFAULT_BUILD true) - -find_program( - B2_EXE - NAMES b2 - HINTS ${BOOST_ROOT} - PATHS ${BOOST_ROOT} - DOC "Location of the b2 build executable from Boost") -if(${B2_EXE} STREQUAL "B2_EXE-NOTFOUND") - message(WARNING - "Boost b2 executable not found. docs target will not be buildable") -elseif(NOT BOOST_ROOT) - if(Boost_INCLUDE_DIRS) - set(BOOST_ROOT ${Boost_INCLUDE_DIRS}) - else() - get_filename_component(BOOST_ROOT ${B2_EXE} DIRECTORY) - endif() -endif() -# The value for BOOST_ROOT will be determined based on -# 1) The environment BOOST_ROOT -# 2) The Boost_INCLUDE_DIRS found by `get_boost` -# 3) The folder the `b2` executable is found in. -# If those checks don't yield the correct path, BOOST_ROOT -# can be defined on the cmake command line: -# cmake -DBOOST_ROOT= -if(BOOST_ROOT) - set(B2_PARAMS "-sBOOST_ROOT=${BOOST_ROOT}") -endif() - -# Find bash to help Windows avoid file association problems -find_program( - BASH_EXE - NAMES bash sh - DOC "Location of the bash shell executable" - ) -if(${BASH_EXE} STREQUAL "BASH_EXE-NOTFOUND") - message(WARNING - "Unable to find bash executable. docs target may not be buildable") - set(BASH_EXE "") -endif() - -add_custom_target(docs - COMMAND ${CMAKE_COMMAND} -E env "PATH=$ENV{PATH} " ${BASH_EXE} ./makeqbk.sh - COMMAND ${B2_EXE} ${B2_PARAMS} - BYPRODUCTS "${CMAKE_SOURCE_DIR}/docs/html/index.html" - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/docs" - SOURCES "${doc_srcs}" - ) - -set_startup_project(rippled) - -foreach(target IN LISTS targets) - target_link_libraries(${target} - ${OPENSSL_LIBRARIES} ${PROTOBUF_LIBRARIES} ${SANITIZER_LIBRARIES}) - - link_common_libraries(${target}) -endforeach() - -if (NOT CMAKE_SIZEOF_VOID_P EQUAL 8) - message(WARNING "Rippled requires a 64 bit target architecture.\n" - "The most likely cause of this warning is trying to build rippled with a 32-bit OS.") -endif() +add_subdirectory (test) +add_subdirectory (test/core) +add_subdirectory (test/http) +add_subdirectory (test/websocket) +add_subdirectory (test/zlib) diff --git a/Jamroot b/Jamroot index f15328c97e..277100ab23 100644 --- a/Jamroot +++ b/Jamroot @@ -5,7 +5,124 @@ # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) # +import os ; +import feature ; import boost ; boost.use-project ; +if [ os.name ] = SOLARIS +{ + lib socket ; + lib nsl ; +} +else if [ os.name ] = NT +{ + lib ws2_32 ; + lib mswsock ; +} +else if [ os.name ] = HPUX +{ + lib ipv6 ; +} +else if [ os.name ] = QNXNTO +{ + lib socket ; +} +else if [ os.name ] = HAIKU +{ + lib network ; +} + +if [ os.name ] = NT +{ + lib ssl : : ssleay32 ; + lib crypto : : libeay32 ; +} +else +{ + lib ssl ; + lib crypto ; +} + +if [ os.name ] = MACOSX +{ + using clang : : ; +} + +variant coverage + : + debug + : + "-fprofile-arcs -ftest-coverage" + "-lgcov" + ; + +variant asan + : + release + : + "-fsanitize=address -fno-omit-frame-pointer" + "-fsanitize=address" + ; + +variant msan + : + debug + : + "-fsanitize=memory -fno-omit-frame-pointer -fsanitize-memory-track-origins=2 -fsanitize-memory-use-after-dtor" + "-fsanitize=memory" + ; + +variant usan + : + debug + : + "-fsanitize=undefined -fno-omit-frame-pointer" + "-fsanitize=undefined" + ; + +project beast + : requirements + . + ./extras + ./include + #/boost//headers + /boost/system//boost_system + /boost/coroutine//boost_coroutine + /boost/filesystem//boost_filesystem + /boost/program_options//boost_program_options + BOOST_ALL_NO_LIB=1 + BOOST_COROUTINES_NO_DEPRECATION_WARNING=1 + multi + shared + on + gcc:-std=c++11 + gcc:-Wno-unused-parameter + gcc:-Wno-unused-variable # Temporary until we can figure out -isystem + clang:-std=c++11 + clang:-Wno-unused-parameter + clang:-Wno-unused-variable # Temporary until we can figure out -isystem + msvc:_SCL_SECURE_NO_WARNINGS=1 + msvc:_CRT_SECURE_NO_WARNINGS=1 + msvc:"/wd4100 /wd4251 /bigobj" + msvc:release:"/Ob2 /Oi /Ot" + LINUX:_XOPEN_SOURCE=600 + LINUX:_GNU_SOURCE=1 + SOLARIS:_XOPEN_SOURCE=500 + SOLARIS:__EXTENSIONS__ + SOLARIS:socket + SOLARIS:nsl + NT:_WIN32_WINNT=0x0601 + NT,cw:ws2_32 + NT,cw:mswsock + NT,gcc:ws2_32 + NT,gcc:mswsock + NT,gcc-cygwin:__USE_W32_SOCKETS + : usage-requirements + : + build-dir bin + ; + +build-project test ; +build-project examples ; diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 90e6e374f2c29b20ecae5dd550e21a940131e3c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3341 zcmbtXO>>(_5WVv&x^hZVM6#3J!{)SD!WO#-ynyWFlp4XvOoA8|1}o05-`69MWm~D* z+P%mU^z_&Cd;Of1l0=^CZ6oRjRo~G@RkEYLE@VshqE))@DA&zHtL{qEO&n)7{-D?S z8+w0s{@&%!5BBpHN>tNSl0vcWD5!HBxR&i!b)C{R8BKjBUF*=LtuEB&!6i`_RH)9h zYTX-2rc@nudSiB?m9)_<3?7`OZyVi7+9^{Kp7CGZ8`?-ourFmR*AH~pirUD+rKZ*Q zs*nY|34;$*xz_j6Ig~=RHY&$s1h)~J$27-RO(R81swPoYoU@YLfNbGY8ee9&UgA@b z(sdHw1ap5*ue=n$Uy&EhiH*Efwulp&2k9*If@Mlx7!pn;UX%rX>f8p|f)fAAOJE=4 z2%J4Sj%ML%9z<96RIt1b1B7@yP4T6(^pn{F&b*5t46@HQ@MVxiewt1wh$xE5zwx7t z(glY;%IU(VFz_xypDyFX@uJU^Ui-7a3tgm}__NH#`SBZSn8i`*|FwcI*wEZtdRKl* zc)>@9pU&;V%hDJT6I7M1!i=-OOyVVlaSH28TBSY$c$vpX(KjTUx^%nnky^qTdy(VK zvLKGw8bPxJKV6Fat1!6oqnXbKV{4to2@F^0sy*P6mjo$Cj8_>q2ZnG69}&u7kG9?1 z17u<2`w5C)de-aZ)AsWrYoU4nonTU--$|fE-f@X7PNp1;Kp%My_Lwj zKpCyxQX+P=M4_z`6{Q0rT?$PxIYQW;E4X%8ZadN&ZiGX?!i>UwwG&E#Q?^0(TG=(a zF1SaX?puIxPdW_stp?@`X@shPHKG@6^MT%-&da8S6W5g#Xz#u1l%dj?=Hqm_+wCS_ z`&>>ybT6v((jX@JU2MTy-A89SeG&BR!#gnCInBxzG^HDm4J{}1r!K2fZ#E!8enB9b zZ{wpv8y=VS{8tFio}vJtP|PnWHIFzlvV zW!{aanz8}VpACJ6!N2W40{_Qr2;WDbKhFCJtOL)}w+_8MJws=|67Bu7iHEI{*tJTD z>|}c{3yi!yeY7)AEVoUIo&aWfDcU=%Q><02Na7A-$?7%GQv+QbL+nSwV)D2irXfAz+ODkRtdOOYpde05mIz&7@H&Td>7>x!Q!gRQjnHT@cNRl4lvQ7B+E__<|MD%t?9I@zj-&5N-20P~(5_A2)(FfpLZe5RP8;;A%%Lf)BR+9F2B0;r9XztX$PDiV zD-U}Qw%C86Ji3w<#~LL1c4#6}c%nlX>?pr8;B97SY$O}^dC}uQ@!osX7EeXXyHT|8 zhUD!zsEp6Ngn7aL2`%6fC*yy*#%jmT9tFv`j&B2A?ZH8`jIP1}$o6>uVnM?dJ2`g$ zT*AQLpkP>;kVn@Z*8FT0dJqh&A*6%VKLpF|HlMsY^o{01GIvv7eYzAcoR27|D}J?upmHxWiG zls>anoY+fZEoUX*6BWdsa1s&zj}RJK4G~=IXB#ANdgw_&`a>g+v(NknWi+lnh6QbV zY`m8DI~>-SX(NCoyS7G-I_RbWC|t(yFG5}k1y10ho;r?K6rdaIUBvmj2l3blt-OP# iVR2z){Xh_aE2#OAeaU>?{hoJ|6aa$mC?@`V<@^IvTOpqS diff --git a/src/beast/LICENSE_1_0.txt b/LICENSE_1_0.txt similarity index 100% rename from src/beast/LICENSE_1_0.txt rename to LICENSE_1_0.txt diff --git a/README.md b/README.md index b7b6c53490..1dcf4b52a1 100644 --- a/README.md +++ b/README.md @@ -1,91 +1,238 @@ -![Ripple](/images/ripple.png) +Beast -# What is Ripple? -Ripple is a network of computers which use the [Ripple consensus algorithm] -(https://www.youtube.com/watch?v=pj1QVb1vlC0) to atomically settle and record -transactions on a secure distributed database, the Ripple Consensus Ledger -(RCL). Because of its distributed nature, the RCL offers transaction immutability -without a central operator. The RCL contains a built-in currency exchange and its -path-finding algorithm finds competitive exchange rates across order books -and currency pairs. +[![Join the chat at https://gitter.im/vinniefalco/Beast](https://badges.gitter.im/vinniefalco/Beast.svg)](https://gitter.im/vinniefalco/Beast?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://travis-ci.org/vinniefalco/Beast.svg?branch=master)](https://travis-ci.org/vinniefalco/Beast) [![codecov](https://codecov.io/gh/vinniefalco/Beast/branch/master/graph/badge.svg)](https://codecov.io/gh/vinniefalco/Beast) [![coveralls](https://coveralls.io/repos/github/vinniefalco/Beast/badge.svg?branch=master)](https://coveralls.io/github/vinniefalco/Beast?branch=master) [![Documentation](https://img.shields.io/badge/documentation-master-brightgreen.svg)](http://vinniefalco.github.io/beast/) [![License](https://img.shields.io/badge/license-boost-brightgreen.svg)](LICENSE_1_0.txt) -### Key Features -- **Distributed** - - Direct account-to-account settlement with no central operator - - Decentralized global market for competitive FX -- **Secure** - - Transactions are cryptographically signed using ECDSA or Ed25519 - - Multi-signing capabilities -- **Scalable** - - Capacity to process the world’s cross-border payments volume - - Easy access to liquidity through a competitive FX marketplace +# HTTP and WebSocket built on Boost.Asio in C++11 -## Cross-border payments -Ripple enables banks to settle cross-border payments in real-time, with -end-to-end transparency, and at lower costs. Banks can provide liquidity -for FX themselves or source it from third parties. +--- -As Ripple adoption grows, so do the number of currencies and counterparties. -Liquidity providers need to maintain accounts with each counterparty for -each currency – a capital- and time-intensive endeavor that spreads liquidity -thin. Further, some transactions, such as exotic currency trades, will require -multiple trading parties, who each layer costs to the transaction. Thin -liquidity and many intermediary trading parties make competitive pricing -challenging. +## Appearances -![Flow - Direct](images/flow1.png) +| CppCast 2017 | CppCon 2016 | +| ------------ | ----------- | +| Vinnie Falco | Beast | -### XRP as a Bridge Currency -Ripple can bridge even exotic currency pairs directly through XRP. Similar to -USD in today’s currency market, XRP allows liquidity providers to focus on -offering competitive FX rates on fewer pairs and adding depth to order books. -Unlike USD, trading through XRP does not require bank accounts, service fees, -counterparty risk, or additional operational costs. By using XRP, liquidity -providers can specialize in certain currency corridors, reduce operational -costs, and ultimately, offer more competitive FX pricing. +--- -![Flow - Bridged over XRP](images/flow2.png) +## Contents -# rippled - Ripple server -`rippled` is the reference server implementation of the Ripple -protocol. To learn more about how to build and run a `rippled` -server, visit https://ripple.com/build/rippled-setup/ +- [Introduction](#introduction) +- [Description](#description) +- [Requirements](#requirements) +- [Building](#building) +- [Usage](#usage) +- [Licence](#licence) +- [Contact](#contact) -[![travis-ci.org: Build Status](https://travis-ci.org/ripple/rippled.png?branch=develop)](https://travis-ci.org/ripple/rippled) -[![codecov.io: Code Coverage](https://codecov.io/gh/ripple/rippled/branch/develop/graph/badge.svg)](https://codecov.io/gh/ripple/rippled) +## Introduction -### License -`rippled` is open source and permissively licensed under the -ISC license. See the LICENSE file for more details. +Beast is a header-only, cross-platform C++ library built on Boost.Asio and +Boost, containing two modules implementing widely used network protocols. +Beast.HTTP offers a universal model for describing, sending, and receiving +HTTP messages while Beast.WebSocket provides a complete implementation of +the WebSocket protocol. Their design achieves these goals: -#### Repository Contents +* **Symmetry.** Interfaces are role-agnostic; the same interfaces can be +used to build clients, servers, or both. -| Folder | Contents | -|---------|----------| -| ./bin | Scripts and data files for Ripple integrators. | -| ./build | Intermediate and final build outputs. | -| ./Builds| Platform or IDE-specific project files. | -| ./doc | Documentation and example configuration files. | -| ./src | Source code. | +* **Ease of Use.** HTTP messages are modeled using simple, readily +accessible objects. Functions and classes used to send and receive HTTP +or WebSocket messages are designed to resemble Boost.Asio as closely as +possible. Users familiar with Boost.Asio will be immediately comfortable +using this library. -Some of the directories under `src` are external repositories inlined via -git-subtree. See the corresponding README for more details. +* **Flexibility.** Interfaces do not mandate specific implementation +strategies; important decisions such as buffer or thread management are +left to users of the library. -##For more information: +* **Performance.** The implementation performs competitively, making it a +realistic choice for building high performance network servers. -* [Ripple Knowledge Center](https://ripple.com/learn/) -* [Ripple Developer Center](https://ripple.com/build/) -* [Ripple Whitepapers & Reports](https://ripple.com/whitepapers-reports/) - * [Ripple Consensus Whitepaper](https://ripple.com/consensus-whitepaper/) - * [Ripple Solutions Guide](https://ripple.com/files/ripple_solutions_guide.pdf) +* **Scalability.** Development of network applications that scale to thousands +of concurrent connections is possible with the implementation. -To learn about how Ripple is transforming global payments visit -[https://ripple.com/contact/](https://ripple.com/contact/) +* **Basis for further abstraction.** The interfaces facilitate the +development of other libraries that provide higher levels of abstraction. -- - - +Beast is used in [rippled](https://github.com/ripple/rippled), an +open source server application that implements a decentralized +cryptocurrency system. -Copyright © 2015, Ripple Labs. All rights reserved. +## Description -Portions of this document, including but not limited to the Ripple logo, -images and image templates are the property of Ripple Labs and cannot be -copied or used without permission. +This software is currently in beta: interfaces may change. +For recent changes see the [CHANGELOG](CHANGELOG.md). +The library has been submitted to the +[Boost Library Incubator](http://rrsd.com/blincubator.com/bi_library/beast-2/?gform_post_id=1579) + +* [Project Site](http://vinniefalco.github.io/) +* [Repository](https://github.com/vinniefalco/Beast) +* [Project Documentation](http://vinniefalco.github.io/beast/) +* [Autobahn.testsuite results](http://vinniefalco.github.io/autobahn/index.html) + +## Requirements + +* Boost 1.58 or later +* C++11 or later + +When using Microsoft Visual C++, Visual Studio 2015 Update 3 or later is required. + +These components are optionally required in order to build the +tests and examples: + +* OpenSSL (optional) +* CMake 3.7.2 or later (optional) +* Properly configured bjam/b2 (optional) + +## Building + +Beast is header-only so there are no libraries to build or link with. +To use Beast in your project, simply copy the Beast sources to your +project's source tree (alternatively, bring Beast into your Git repository +using the `git subtree` or `git submodule` commands). Then, edit your + build scripts to add the `include/` directory to the list of paths checked + by the C++ compiler when searching for includes. Beast `#include` lines + will look like this: +```C++ +#include +#include +``` + +To link your program successfully, you'll need to add the Boost.System +library to link with. If you use coroutines you'll also need the +Boost.Coroutine library. Please visit the Boost documentation for +instructions on how to do this for your particular build system. + +For the examples and tests, Beast provides build scripts for Boost.Build (bjam) +and CMake. It is possible to generate Microsoft Visual Studio or Apple +Developers using Microsoft Visual Studio can generate Visual Studio +project files by executing these commands from the root of the repository: + +``` +cd bin +cmake .. # for 32-bit Windows builds + +cd ../bin64 +cmake .. # for Linux/Mac builds, OR +cmake -G"Visual Studio 14 2015 Win64" .. # for 64-bit Windows builds +``` + +When using Apple Xcode it is possible to generate Xcode project files +using these commands: + +``` +cd bin +cmake -G Xcode .. # for Apple Xcode builds +``` + +To build with Boost.Build, it is necessary to have the bjam executable +in your path. And bjam needs to know how to find the Boost sources. The +easiest way to do this is make sure that the version of bjam in your path +is the one at the root of the Boost source tree, which is built when +running `bootstrap.sh` (or `bootstrap.bat` on Windows). + +Once bjam is in your path, simply run bjam in the root of the Beast +repository to automatically build the required Boost libraries if they +are not already built, build the examples, then build and run the unit +tests. + +The files in the repository are laid out thusly: + +``` +./ + bin/ Holds executables and project files + bin64/ Holds 64-bit Windows executables and project files + doc/ Source code and scripts for the documentation + include/ Add this to your compiler includes + beast/ + extras/ Additional APIs, may change + examples/ Self contained example programs + test/ Unit tests and benchmarks +``` + + +## Usage + +These examples are complete, self-contained programs that you can build +and run yourself (they are in the `examples` directory). + +Example WebSocket program: +```C++ +#include +#include +#include +#include +#include + +int main() +{ + // Normal boost::asio setup + std::string const host = "echo.websocket.org"; + boost::asio::io_service ios; + boost::asio::ip::tcp::resolver r{ios}; + boost::asio::ip::tcp::socket sock{ios}; + boost::asio::connect(sock, + r.resolve(boost::asio::ip::tcp::resolver::query{host, "80"})); + + // WebSocket connect and send message using beast + beast::websocket::stream ws{sock}; + ws.handshake(host, "/"); + ws.write(boost::asio::buffer(std::string("Hello, world!"))); + + // Receive WebSocket message, print and close using beast + beast::streambuf sb; + beast::websocket::opcode op; + ws.read(op, sb); + ws.close(beast::websocket::close_code::normal); + std::cout << beast::to_string(sb.data()) << "\n"; +} +``` + +Example HTTP program: +```C++ +#include +#include +#include +#include +#include + +int main() +{ + // Normal boost::asio setup + std::string const host = "boost.org"; + boost::asio::io_service ios; + boost::asio::ip::tcp::resolver r{ios}; + boost::asio::ip::tcp::socket sock{ios}; + boost::asio::connect(sock, + r.resolve(boost::asio::ip::tcp::resolver::query{host, "http"})); + + // Send HTTP request using beast + beast::http::request req; + req.method = "GET"; + req.url = "/"; + req.version = 11; + req.fields.replace("Host", host + ":" + + boost::lexical_cast(sock.remote_endpoint().port())); + req.fields.replace("User-Agent", "Beast"); + beast::http::prepare(req); + beast::http::write(sock, req); + + // Receive and print HTTP response using beast + beast::streambuf sb; + beast::http::response resp; + beast::http::read(sock, sb, resp); + std::cout << resp; +} +``` + +## License + +Distributed under the Boost Software License, Version 1.0. +(See accompanying file [LICENSE_1_0.txt](LICENSE_1_0.txt) or copy at +http://www.boost.org/LICENSE_1_0.txt) + +## Contact + +Please report issues or questions here: +https://github.com/vinniefalco/Beast/issues diff --git a/RELEASENOTES.md b/RELEASENOTES.md deleted file mode 100644 index a68e70af77..0000000000 --- a/RELEASENOTES.md +++ /dev/null @@ -1,2401 +0,0 @@ -![Ripple](/images/ripple.png) - -This document contains the release notes for `rippled`, the reference server -implementation of the Ripple protocol. To learn more about how to build and -run a `rippled` server, visit https://ripple.com/build/rippled-setup/ - -If you are using Red Hat Enterprise Linux 7 or CentOS 7, you can [update using `yum`](https://ripple.com/build/rippled-setup/#updating-rippled). For other platforms, please [compile from source](https://wiki.ripple.com/Rippled_build_instructions). - - -# Releases - -## Version 0.50.2 - -The `rippled` 0.50.2 release adjusts the default TLS cipher list and corrects a flaw that would not allow an SSL handshake to properly complete if the port was configured using the `wss` keyword. Ripple recommends upgrading to 0.50.2 only if server operators are running rippled servers that accept client connections over TLS. - -**New and Updated Features** - -This release has no new features. - -**Bug Fixes** - -Adjust the default cipher list and correct a flaw that would not allow an SSL handshake to properly complete if the port was configured using the `wss` keyword (#1985) - - -## Version 0.50.0 - -The `rippled` 0.50.0 release includes TickSize, which allows gateways to set a "tick size" for assets they issue to help promote faster price discovery and deeper liquidity, as well as reduce transaction spam and ledger churn on RCL. Ripple expects TickSize to be enabled via an Amendment called TickSize on Tuesday, 2017-02-21. - -You can [update to the new version](https://ripple.com/build/rippled-setup/#updating-rippled) on Red Hat Enterprise Linux 7 or CentOS 7 using yum. For other platforms, please [compile the new version from source](https://wiki.ripple.com/Rippled_build_instructions). - -**New and Updated Features** - -**Tick Size** - -Currently, offers on RCL can differ by as little as one part in a quadrillion. This means that there is essentially no value to placing an offer early, as an offer placed later at a microscopically better price gets priority over it. The [TickSize](https://ripple.com/build/amendments/#ticksize) Amendment solves this problem by introducing a minimum tick size that a price must move for an offer to be considered to be at a better price. The tick size is controlled by the issuers of the assets involved. - -This change lets issuers quantize the exchange rates of offers to use a specified number of significant digits. Gateways must enable a TickSize on their account for this feature to benefit them. A single AccountSet transaction may set a `TickSize` parameter. Legal values are 0 and 3-15 inclusive. Zero removes the setting. 3-15 allow that many decimal digits of precision in the pricing of offers for assets issued by this account. It will still be possible to place an offer to buy or sell any amount of an asset and the offer will still keep that amount as exactly as it does now. If an offer involves two assets that each have a tick size, the smaller number of significant figures (larger ticks) controls. - -For asset pairs with XRP, the tick size imposed, if any, is the tick size of the issuer of the non-XRP asset. For asset pairs without XRP, the tick size imposed, if any, is the smaller of the two issuer's configured tick sizes. - -The tick size is imposed by rounding the offer quality down to the nearest tick and recomputing the non-critical side of the offer. For a buy, the amount offered is rounded down. For a sell, the amount charged is rounded up. - -The primary expected benefit of the TickSize amendment is the reduction of bots fighting over the tip of the order book, which means: -- Quicker price discovery as outpricing someone by a microscopic amount is made impossible (currently bots can spend hours outbidding each other with no significant price movement) -- A reduction in offer creation and cancellation spam -- Traders can't outbid by a microscopic amount -- More offers left on the books as priority - -We also expect larger tick sizes to benefit market makers in the following ways: -- They increase the delta between the fair market value and the trade price, ultimately reducing spreads -- They prevent market makers from consuming each other's offers due to slight changes in perceived fair market value, which promotes liquidity -- They promote faster price discovery by reducing the back and forths required to move the price by traders who don't want to move the price more than they need to -- They reduce transaction spam by reducing fighting over the tip of the order book and reducing the need to change offers due to slight price changes -- They reduce ledger churn and metadata sizes by reducing the number of indexes each order book must have -- They allow the order book as presented to traders to better reflect the actual book since these presentations are inevitably aggregated into ticks - -**Hardened TLS configuration** - -This release updates the default TLS configuration for rippled. The new release supports only 2048-bit DH parameters and defines a new default set of modern ciphers to use, removing support for ciphers and hash functions that are no longer considered secure. - -Server administrators who wish to have different settings can configure custom global and per-port cipher suites in the configuration file using the `ssl_ciphers` directive. - -**0.50.0 Change Log** - -Remove websocketpp support (#1910) - -Increase OpenSSL requirements & harden default TLS cipher suites (#1913) - -Move test support sources out of ripple directory (#1916) - -Enhance ledger header RPC commands (#1918) - -Add support for tick sizes (#1922) - -Port discrepancy-test.coffee to c++ (#1930) - -Remove redundant call to `clearNeedNetworkLedger` (#1931) - -Port freeze-test.coffee to C++ unit test. (#1934) - -Fix CMake docs target to work if `BOOST_ROOT` is not set (#1937) - -Improve setup for account_tx paging test (#1942) - -Eliminate npm tests (#1943) - -Port uniport js test to cpp (#1944) - -Enable amendments in genesis ledger (#1944) - -Trim ledger data in Discrepancy_test (#1948) - -Add `current_ledger` field to `fee` result (#1949) - -Cleanup unit test support code (#1953) - -Add ledger save / load tests (#1955) - -Remove unused websocket files (#1957) - -Update RPC handler role/usage (#1966) - -**Bug Fixes** - -Validator's manifest not forwarded beyond directly connected peers (#1919) - -**Upcoming Features** - -We expect the previously announced Suspended Payments feature, which introduces new transaction types to the Ripple protocol that will permit users to cryptographically escrow XRP on RCL, to be enabled via the [SusPay](https://ripple.com/build/amendments/#suspay) Amendment on Tuesday, 2017-02-21. - -Also, we expect support for crypto-conditions, which are signature-like structures that can be used with suspended payments to support ILP integration, to be included in the next rippled release scheduled for March. - -Lastly, we do not have an update on the previously announced changes to the hash tree structure that rippled uses to represent a ledger, called [SHAMapV2](https://ripple.com/build/amendments/#shamapv2). At the time of activation, this amendment will require brief scheduled allowable unavailability while the changes to the hash tree structure are computed by the network. We will keep the community updated as we progress towards this date (TBA). - - -## Version 0.40.1 - -The `rippled` 0.40.1 release increases SQLite database limits in all rippled servers. Ripple recommends upgrading to 0.40.1 only if server operators are running rippled servers with full-history of the ledger. There are no new or updated features in the 0.40.1 release. - -You can update to the new version on Red Hat Enterprise Linux 7 or CentOS 7 using yum. For other platforms, please compile the new version from source. - -**New and Updated Features** - -This release has no new features. - -**Bug Fixes** - -Increase SQLite database limits to prevent full-history servers from crashing when restarting. (#1961) - -## Version 0.40.0 - -The `rippled` 0.40.0 release includes Suspended Payments, a new transaction type on the Ripple network that functions similar to an escrow service, which permits users cryptographically escrow XRP on RCL with an expiration date. Ripple expects Suspended Payments to be enabled via an Amendment named [SusPay](https://ripple.com/build/amendments/#suspay) on Tuesday, 2017-01-17. - -You can update to the new version on Red Hat Enterprise Linux 7 or CentOS 7 using yum. For other platforms, please compile the new version from source. - -**New and Updated Features** - -Previously, Ripple announced the introduction of Payment Channels during the release of rippled version 0.33.0, which permit scalable, off-ledger checkpoints of high volume, low value payments flowing in a single direction. This was the first step in a multi-phase effort to make RCL more scalable and to support Interledger Protocol (ILP). Ripple expects Payment Channels to be enabled via an Amendment called [PayChan](https://ripple.com/build/amendments/#paychan) on a future date to be determined. - -In the second phase towards making RCL more scalable and compatible with ILP, Ripple is introducing Suspended Payments, a new transaction type on the Ripple network that functions similar to an escrow service, which permits users to cryptographically escrow XRP on RCL with an expiration date. Ripple expects Suspended Payments to be enabled via an Amendment named [SusPay](https://ripple.com/build/amendments/#suspay) on Tuesday, 2017-01-17. - -A Suspended Payment can be created, which deducts the funds from the sending account. It can then be either fulfilled or canceled. It can only be fulfilled if the fulfillment transaction makes it into a ledger with a CloseTime lower than the expiry date of the transaction. It can be canceled with a transaction that makes it into a ledger with a CloseTime greater than the expiry date of the transaction. - -In the third phase towards making RCL more scalable and compatible with ILP, Ripple plans to introduce additional library support for crypto-conditions, which are distributable event descriptions written in a standard format that describe how to recognize a fulfillment message without saying exactly what the fulfillment is. Fulfillments are cryptographically verifiable messages that prove an event occurred. If you transmit a fulfillment, then everyone who has the condition can agree that the condition has been met. Fulfillment requires the submission of a signature that matches the condition (message hash and public key). This format supports multiple algorithms, including different hash functions and cryptographic signing schemes. Crypto-conditions can be nested in multiple levels, with each level possibly having multiple signatures. - -Lastly, we do not have an update on the previously announced changes to the hash tree structure that rippled uses to represent a ledger, called [SHAMapV2](https://ripple.com/build/amendments/#shamapv2). This will require brief scheduled allowable downtime while the changes to the hash tree structure are propagated by the network. We will keep the community updated as we progress towards this date (TBA). - -Consensus refactor (#1874) - -Bug Fixes - -Correct an issue in payment flow code that did not remove an unfunded offer (#1860) - -Sign validator manifests with both ephemeral and master keys (#1865) - -Correctly parse multi-buffer JSON messages (#1862) - - -## Version 0.33.0 - -The `rippled` 0.33.0 release includes an improved version of the payment code, which we expect to be activated via Amendment on Wednesday, 2016-10-20 with the name [Flow](https://ripple.com/build/amendments/#flow). We are also introducing XRP Payment Channels, a new structure in the ledger designed to support [Interledger Protocol](https://interledger.org/) trust lines as balances get substantial, which we expect to be activated via Amendment on a future date (TBA) with the name [PayChan](https://ripple.com/build/amendments/#paychan). Lastly, we will be introducing changes to the hash tree structure that rippled uses to represent a ledger, which we expect to be available via Amendment on a future date (TBA) with the name [SHAMapV2](https://ripple.com/build/amendments/#shamapv2). - -You can [update to the new version](https://ripple.com/build/rippled-setup/#updating-rippled) on Red Hat Enterprise Linux 7 or CentOS 7 using yum. For other platforms, please [compile the new version from source](https://wiki.ripple.com/Rippled_build_instructions). - -** New and Updated Features ** - -A fixed version of the new payment processing engine, which we initially announced on Friday, 2016-07-29, is expected to be available via Amendment on Wednesday, 2016-10-20 with the name [Flow](https://ripple.com/build/amendments/#flow). The new payments code adds no new features, but improves efficiency and robustness in payment handling. - -The Flow code may occasionally produce slightly different results than the old payment processing engine due to the effects of floating point rounding. - -We will be introducing changes to the hash tree structure that rippled uses to represent a ledger, which we expect to be activated via Amendment on a future date (TBA) with the name [SHAMapV2](https://ripple.com/build/amendments/#shamapv2). The new structure is more compact and efficient than the previous version. This affects how ledger hashes are calculated, but has no other user-facing consequences. The activation of the SHAMapV2 amendment will require brief scheduled allowable downtime, while the changes to the hash tree structure are propagated by the network. We will keep the community updated as we progress towards this date (TBA). - -In an effort to make RCL more scalable and to support Interledger Protocol (ILP) trust lines as balances get more substantial, we’re introducing XRP Payment Channels, a new structure in the ledger, which we expect to be available via Amendment on a future date (TBA) with the name [PayChan](https://ripple.com/build/amendments/#paychan). - -XRP Payment Channels permit scalable, intermittent, off-ledger settlement of ILP trust lines for high volume payments flowing in a single direction. For bidirectional channels, an XRP Payment Channel can be used in each direction. The recipient can claim any unpaid balance at any time. The owner can top off the channel as needed. The owner must wait out a delay to close the channel to give the recipient a chance to supply any claims. The total amount paid increases monotonically as newer claims are issued. - -The initial concept behind payment channels was discussed as early as 2011 and the first implementation was done by Mike Hearn in bitcoinj. Recent work being done by Lightning Network has showcased examples of the many use cases for payment channels. The introduction of XRP Payment Channels allows for a more efficient integration between RCL and ILP to further support enterprise use cases for high volume payments. - -Added `getInfoRippled.sh` support script to gather health check for rippled servers [RIPD-1284] - -The `account_info` command can now return information about queued transactions - [RIPD-1205] - -Automatically-provided sequence numbers now consider the transaction queue - [RIPD-1206] - -The `server_info` and `server_state` commands now include the queue-related escalated fee factor in the load_factor field of the response - [RIPD-1207] - -A transaction with a high transaction cost can now cause transactions from the same sender queued in front of it to get into the open ledger if the transaction costs are high enough on average across all such transactions. - [RIPD-1246] - -Reorganization: Move `LoadFeeTrack` to app/tx and clean up functions - [RIPD-956] - -Reorganization: unit test source files - [RIPD-1132] - -Reorganization: NuDB stand-alone repository - [RIPD-1163] - -Reorganization: Add `BEAST_EXPECT` to Beast - [RIPD-1243] - -Reorganization: Beast 64-bit CMake/Bjam target on Windows - [RIPD-1262] - -** Bug Fixes ** - -`PaymentSandbox::balanceHook` can return the wrong issuer, which could cause the transfer fee to be incorrectly by-passed in rare circumstances. [RIPD-1274, #1827] - -Prevent concurrent write operations in websockets [#1806] - -Add HTTP status page for new websocket implementation [#1855] - - -## Version 0.32.1 - -The `rippled` 0.32.1 release includes an improved version of the payment code, which we expect to be available via Amendment on Wednesday, 2016-08-24 with the name FlowV2, and a completely new implementation of the WebSocket protocol for serving clients. - -You can [update to the new version](https://ripple.com/build/rippled-setup/#updating-rippled) on Red Hat Enterprise Linux 7 or CentOS 7 using yum. For other platforms, please [compile the new version from source](https://wiki.ripple.com/Rippled_build_instructions). - -**New and Updated Features** - -An improved version of the payment processing engine, which we expect to be available via Amendment on Wednesday, 2016-08-24 with the name “FlowV2â€. The new payments code adds no new features, but improves efficiency and robustness in payment handling. - -The FlowV2 code may occasionally produce slightly different results than the old payment processing engine due to the effects of floating point rounding. Once FlowV2 is enabled on the network then old servers without the FlowV2 amendment will lose sync more frequently because of these differences. - -**Beast WebSocket** - -A completely new implementation of the WebSocket protocol for serving clients is available as a configurable option for `rippled` administrators. To enable this new implementation, change the “protocol†field in `rippled.cfg` from “ws†to “ws2†(or from “wss†to “wss2†for Secure WebSockets), as illustrated in this example: - - [port_ws_public] - port = 5006 - ip = 0.0.0.0 - protocol = wss2 - -The new implementation paves the way for increased reliability and future performance when submitting commands over WebSocket. The behavior and syntax of commands should be identical to the previous implementation. Please report any issues to support@ripple.com. A future version of rippled will remove the old WebSocket implementation, and use only the new one. - -**Bug fixes** - -Fix a non-exploitable, intermittent crash in some client pathfinding requests (RIPD-1219) - -Fix a non-exploitable crash caused by a race condition in the HTTP server. (RIPD-1251) - -Fix bug that could cause a previously fee queued transaction to not be relayed after being in the open ledger for an extended time without being included in a validated ledger. Fix bug that would allow an account to have more than the allowed limit of transactions in the fee queue. Fix bug that could crash debug builds in rare cases when replacing a dropped transaction. (RIPD-1200) - -Remove incompatible OS X switches in Test.py (RIPD-1250) - -Autofilling a transaction fee (sign / submit) with the experimental `x-queue-okay` parameter will use the user’s maximum fee if the open ledger fee is higher, improving queue position, and giving the tx more chance to succeed. (RIPD-1194) - - - -## Version 0.32.0 - -The `rippled` 0.32.0 release improves transaction queue which now supports batching and can hold up to 10 transactions per account, allowing users to queue multiple transactions for processing when the network load is high. Additionally, the `server_info` and `server_state` commands now include information on transaction cost multipliers and the fee command is available to unprivileged users. We advise rippled operators to upgrade immediately. - -You can update to the new version on Red Hat Enterprise Linux 7 or CentOS 7 using yum. For other platforms, please compile the new version from source. - -**New and Updated Features** - -- Allow multiple transactions per account in transaction queue (RIPD-1048). This also introduces a new transaction engine code, `telCAN_NOT_QUEUE`. -- Charge pathfinding consumers per source currency (RIPD-1019): The IP address used to perform pathfinding operations is now charged an additional resource increment for each source currency in the path set. -- New implementation of payment processing engine. This implementation is not yet enabled by default. -- Include amendments in validations subscription -- Add C++17 compatibility -- New WebSocket server implementation with Beast.WebSocket library. The new library offers a stable, high-performance websocket server implementation. To take advantage of this implementation, change websocket protocol under rippled.cfg from wss and ws to wss2 and ws2 under `[port_wss_admin]` and `[port_ws_public]` stanzas: -``` - [port_wss_admin] - port = 51237 - ip = 127.0.0.1 - admin = 127.0.0.1 - protocol = wss2 - - [port_ws_public] - port = 51233 - ip = 0.0.0.0 - protocol = wss2, ws2 -``` -- The fee command is now public (RIPD-1113) -- The fee command checks open ledger rules (RIPD-1183) -- Log when number of available file descriptors is insufficient (RIPD-1125) -- Publish all validation fields for signature verification -- Get quorum and trusted master validator keys from validators.txt -- Standalone mode uses temp DB files by default (RIPD-1129): If a [database_path] is configured, it will always be used, and tables will be upgraded on startup. -- Include config manifest in server_info admin response (RIPD-1172) - -**Bug fixes** - -- Fix history acquire check (RIPD-1112) -- Correctly handle connections that fail security checks (RIPD-1114) -- Fix secured Websocket closing -- Reject invalid MessageKey in SetAccount handler (RIPD-308, RIPD-990) -- Fix advisory delete effect on history acquisition (RIPD-1112) -- Improve websocket send performance (RIPD-1158) -- Fix XRP bridge payment bug (RIPD-1141) -- Improve error reporting for wallet_propose command. Also include a warning if the key used may be an insecure, low-entropy key. (RIPD-1110) - -**Deprecated features** - -- Remove obsolete sendGetPeers support (RIPD-164) -- Remove obsolete internal command (RIPD-888) - - - - -## Version 0.31.2 - -The `rippled` 0.31.2 release corrects issues with the fee escalation algorithm. We advise `rippled` operators to upgrade immediately. - -You can [update to the new version](https://ripple.com/build/rippled-setup/#updating-rippled) on Red Hat Enterprise Linux 7 or CentOS 7 using yum. For other platforms, please [compile the new version from source](https://wiki.ripple.com/Rippled_build_instructions). - -**New and Updated Features** - -This release has no new features. - -**Bug Fixes** - -- A defect in the fee escalation algorithm that caused network fees to escalate more rapidly than intended has been corrected. (RIPD-1177) -- The minimum local fee advertised by validators will no longer be adjusted upwards. - - - -## Version 0.31.1 - -The `rippled` 0.31.1 release contains one important bug fix. We advise `rippled` operators to upgrade immediately. - -You can [update to the new version](https://ripple.com/build/rippled-setup/#updating-rippled) on Red Hat Enterprise Linux 7 or CentOS 7 using yum. For other platforms, please [compile the new version from source](https://wiki.ripple.com/Rippled_build_instructions). - -**New and Updated Features** - -This release has no new features. - -**Bug Fixes** - -`rippled` 0.31.1 contains the following fix: - -- Correctly handle ledger validations with no `LedgerSequence` field. Previous versions of `rippled` incorrectly assumed that the optional validation field would always be included. Current versions of the software always include the field, and gracefully handle its absence. - - - -## Version 0.31.0 - -`rippled` 0.31.0 has been released. - -You can [update to the new version](https://ripple.com/build/rippled-setup/#updating-rippled) on Red Hat Enterprise Linux 7 or CentOS 7 using yum. - -For other platforms, please [compile the new version from source](https://wiki.ripple.com/Rippled_build_instructions). Use the `git log` command to confirm you have the correct source tree. The first log entry should be the change setting the version: - - - commit a5d58566386fd86ae4c816c82085fe242b255d2c - Author: Nik Bougalis - Date: Sun Apr 17 18:02:02 2016 -0700 - - Set version to 0.31.0 - - -**Warnings** - -Please expect a one-time delay when starting 0.31.0 while certain database indices are being built or rebuilt. The delay can be up to five minutes, during which CPU will spike and the server will appear unresponsive (no response to RPC, etc.). - -Additionally, `rippled` 0.31.0 now checks at start-up time that it has sufficient open file descriptors available, and shuts down with an error message if it does not. Previous versions of `rippled` could run out of file descriptors unexpectedly during operation. If you get a file-descriptor error message, increase the number of file descriptors available to `rippled` (for example, editing `/etc/security/limits.conf`) and restart. - -**New and Updated Features** - -`rippled` 0.31.0 has the following new or updated features: - -- (New) [**Amendments**](https://ripple.com/build/amendments/) - A consensus-based system for introducing changes to transaction processing. -- (New) [**Multi-Signing**](https://ripple.com/build/transactions/#multi-signing) - (To be enabled as an amendment) Allow transactions to be authorized by a list of signatures. (RIPD-182) -- (New) **Transaction queue and FeeEscalation** - (To be enabled as an amendment) Include or defer transactions based on the [transaction cost](https://ripple.com/build/transaction-cost/) offered, for better behavior in DDoS conditions. (RIPD-598) -- (Updated) Validations subscription stream now includes `ledger_index` field. (DEC-564) -- (Updated) You can request SignerList information in the `account_info` command (RIPD-1061) - -**Closed Issues** - -`rippled` 0.31.0 has the following fixes and improvements: - -- Improve held transaction submission -- Update SQLite from 3.8.11.1 to 3.11.0 -- Allow random seed with specified wallet_propose key_type (RIPD-1030) -- Limit pathfinding source currency limits (RIPD-1062) -- Speed up out of order transaction processing (RIPD-239) -- Pathfinding optimizations -- Streamlined UNL/validator list: The new code removes the ability to specify domain names in the [validators] configuration block, and no longer supports the [validators_site] option. -- Add websocket client -- Add description of rpcSENDMAX_MALFORMED error -- Convert PathRequest to use std::chrono (RIPD-1069) -- Improve compile-time OpenSSL version check -- Clear old Validations during online delete (RIPD-870) -- Return correct error code during unfunded offer cross (RIPD-1082) -- Report delivered_amount for legacy account_tx queries. -- Improve error message when signing fails (RIPD-1066) -- Fix websocket deadlock - - - - -## Version 0.30.1 - -rippled 0.30.1 has been released. The commit can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit c717006c44126aa0edb3a36ca29ee30e7a72c1d3 - Author: Nik Bougalis - Date: Wed Feb 3 14:49:07 2016 -0800 - - Set version to 0.30.1 - -This release incorporates a number of important features, bugfixes and functional improvements. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.30.1) for more detailed information. - -**Release Overview** - -The rippled team is proud to release rippled version 0.30.1. This version contains a several minor new features as well as significant improvements to the consensus algorithm that make it work faster and with more consistency. In the time we have been testing the new release on our validators, these changes have led to increased agreement and shorter close times between ledger versions, for approximately 40% more ledgers validated per day. - -**New Features** - -- Secure gateway: configured IPs can forward identifying user data in HTTP headers, including user name and origin IP. If the user name exists, then resource limits are lifted for that session. See rippled-example.cfg for more information. -- Allow fractional fee multipliers (RIPD-626) -- Add “expiration†to account\_offers (RIPD-1049) -- Add “owner\_funds†to “transactions†array in RPC ledger (RIPD-1050) -- Add "tx" option to "ledger" command line -- Add server uptime in server\_info -- Allow multiple incoming connections from the same IP -- Report connection uptime in peer command (RIPD-927) -- Permit pathfinding to be disabled by setting \[path\_search\_max\] to 0 in rippled.cfg file (RIPD-271) -- Add subscription to peer status changes (RIPD-579) - -**Improvements** - -- Improvements to ledger\_request response -- Improvements to validations proposal relaying (RIPD-1057) -- Improvements to consensus algorithm -- Ledger close time optimizations (RIPD-998, RIPD-791) -- Delete unfunded offers in predictable order - -**Development-Related Updates** - -- Require boost 1.57 -- Implement new coroutines (RIPD-1043) -- Force STAccount interface to 160-bit size (RIPD-994) -- Improve compile-time OpenSSL version check - -**Bug Fixes** - -- Fix handling of secp256r1 signatures (RIPD-1040) -- Fix websocket messages dispatching -- Fix pathfinding early response (RIPD-1064) -- Handle account\_objects empty response (RIPD-958) -- Fix delivered\_amount reporting for minor ledgers (RIPD-1051) -- Fix setting admin privileges on websocket -- Fix race conditions in account\_tx command (RIPD-1035) -- Fix to enforce no-ripple constraints - -**Assistance** - -For assistance, please contact **integration@ripple.com** - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - - - ------------------------------------------------------------ - -## Version 0.30.0 - -rippled 0.30.0 has been released. The commit can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit a8859b495b552fe1eb140771f0f2cb32d11d2ac2 - Author: Vinnie Falco - Date: Wed Oct 21 18:26:02 2015 -0700 - - Set version to 0.30.0 - -This release incorporates a number of important features, bugfixes and functional improvements. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.30.0) for more detailed information. - -**Release Overview** - -As part of Ripple Labs’ ongoing commitment toward protocol security, the rippled team would like to release rippled 0.30.0. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**`grep '^processor' /proc/cpuinfo | wc -l`**), you can use them to assist in the build process by compiling with the command **`scons -j[number of CPUs - 1]`**. - -**New Features** - -- Honor markers in ledger\_data requests ([RIPD-1010](https://ripplelabs.atlassian.net/browse/RIPD-1010)). -- New Amendment - **TrustSetAuth** (Not currently enabled) Create zero balance trust lines with auth flag ([RIPD-1003](https://ripplelabs.atlassian.net/browse/RIPD-1003)): this allows a TrustSet transaction to create a trust line if the only thing being changed is setting the tfSetfAuth flag. -- Randomize the initial transaction execution order for closed ledgers based on the hash of the consensus set ([RIPD-961](https://ripplelabs.atlassian.net/browse/RIPD-961)). **Activates on October 27, 2015 at 11:00 AM PCT**. -- Differentiate path\_find response ([RIPD-1013](https://ripplelabs.atlassian.net/browse/RIPD-1013)). -- Convert all of an asset ([RIPD-655](https://ripplelabs.atlassian.net/browse/RIPD-655)). - -**Improvements** - -- SHAMap improvements. -- Upgrade SQLite from 3.8.8.2 to 3.8.11.1. -- Limit the number of offers that can be consumed during crossing ([RIPD-1026](https://ripplelabs.atlassian.net/browse/RIPD-1026)). -- Remove unfunded offers on tecOVERSIZE ([RIPD-1026](https://ripplelabs.atlassian.net/browse/RIPD-1026)). -- Improve transport security ([RIPD-1029](https://ripplelabs.atlassian.net/browse/RIPD-1029)): to take full advantage of the improved transport security, servers with a single, static public IP address should add it to their configuration file, as follows: - - [overlay] - public_ip= - -**Development-Related Updates** - -- Transitional support for gcc 5.2: to enable support define the environmental variable `RIPPLED_OLD_GCC_ABI`=1 -- Transitional support for C++ 14: to enable support define the environment variable `RIPPLED_USE_CPP_14`=1 -- Visual Studio 2015 support -- Updates to integration tests -- Add uptime to crawl data ([RIPD-997](https://ripplelabs.atlassian.net/browse/RIPD-997)) - -**Assistance** - -For assistance, please contact **integration@ripple.com** - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - - - ------------------------------------------------------------ - -## Version 0.29.0 - -rippled 0.29.0 has been released. The commit can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 5964710f736e258c7892e8b848c48952a4c7856c - Author: Nik Bougalis - Date: Tue Aug 4 13:22:45 2015 -0700 - - Set version to 0.29.0 - -This release incorporates a number of important features, bugfixes and functional improvements. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.29.0) for more detailed information. - -**Release Overview** - -As part of Ripple Labs’ ongoing commitment toward protocol security, the rippled team would like to announce rippled release 0.29.0. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -**New Features** - -- Subscription stream for validations ([RIPD-504](https://ripplelabs.atlassian.net/browse/RIPD-504)) - -**Deprecated features** - -- Disable Websocket ping timer - -**Bug Fixes** - -- Fix off-by one bug that overstates the account reserve during OfferCreate transaction. **Activates August 17, 2015**. -- Fix funded offer removal during Payment transaction ([RIPD-113](https://ripplelabs.atlassian.net/browse/RIPD-113)). **Activates August 17, 2015**. -- Fix display discrepancy in fee. - -**Improvements** - -- Add “quality†field to account\_offers API response: quality is defined as the exchange rate, the ratio taker\_pays divided by taker\_gets. -- Add [full\_reply](https://ripple.com/build/rippled-apis/#path-find-create) field to path\_find API response: full\_reply is defined as true/false value depending on the completed depth of pathfinding search ([RIPD-894](https://ripplelabs.atlassian.net/browse/RIPD-894)). -- Add [DeliverMin](https://ripple.com/build/transactions/#payment) transaction field ([RIPD-930](https://ripplelabs.atlassian.net/browse/RIPD-930)). **Activates August 17, 2015**. - -**Development-Related Updates** - -- Add uptime to crawl data ([RIPD-997](https://ripplelabs.atlassian.net/browse/RIPD-997)). -- Add IOUAmount and XRPAmount: these numeric types replace the monolithic functionality found in STAmount ([RIPD-976](https://ripplelabs.atlassian.net/browse/RIPD-976)). -- Log metadata differences on built ledger mismatch. -- Add enableTesting flag to applyTransactions. - -**Assistance** - -For assistance, please contact **integration@ripple.com** - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - - - ------------------------------------------------------------ - -## Version 0.28.2 - -rippled 0.28.2 has been released. The commit can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 6374aad9bc94595e051a04e23580617bc1aaf300 - Author: Vinnie Falco - Date: Tue Jul 7 09:21:44 2015 -0700 - - Set version to 0.28.2 - -This release incorporates a number of important features, bugfixes and functional improvements. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/release) for more detailed information. - -**Release Overview** - -As part of Ripple Labs’ ongoing commitment toward protocol security, the rippled team would like to announce rippled release 0.28.2. **This release is necessary for compatibility with OpenSSL v.1.0.1n and later.** - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -The minimum supported version of Boost is v1.57.0. You **must** upgrade to this release or later to successfully compile this release of rippled. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**rippled.cfg Updates** - -For \[ips\] stanza, a port must be specified for each listed IP address with the space between IP address and port, ex.: `r.ripple.com` `51235` ([RIPD-893](https://ripplelabs.atlassian.net/browse/RIPD-893)) - -**New Features** - -- New API: [gateway\_balances](https://ripple.com/build/rippled-apis/#gateway-balances) to get a gateway's hot wallet balances and total obligations. - -**Deprecated features** - -- Removed temp\_db ([RIPD-887](https://ripplelabs.atlassian.net/browse/RIPD-887)) - -**Improvements** - -- Improve peer send queue management -- Support larger EDH keys -- More robust call to get the valid ledger index -- Performance improvements to transactions application to open ledger - -**Development-Related Updates** - -- New Env transaction testing framework for unit testing -- Fix MSVC link -- C++ 14 readiness - -**Assistance** - -For assistance, please contact **integration@ripple.com** - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - - - ------------------------------------------------------------ - -## Version 0.28.1 - -rippled 0.28.1 has been released. The commit can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 399c43cae6e90a428e9ce6a988123972b0f03c99 - Author: Miguel Portilla - Date: Wed May 20 13:30:54 2015 -0400 - - Set version to 0.28.1 - -This release incorporates a number of important features, bugfixes and functional improvements. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.28.1) for more detailed information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -The minimum supported version of Boost is v1.57.0. You **must** upgrade to this release or later to successfully compile this release of rippled. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**New Features** - -- Filtering for Account Objects ([RIPD-868](https://ripplelabs.atlassian.net/browse/RIPD-868)). -- Track rippled server peers latency ([RIPD-879](https://ripplelabs.atlassian.net/browse/RIPD-879)). - -**Bug fixes** - -- Expedite zero flow handling for offers -- Fix offer crossing when funds are the limiting factor - -**Deprecated features** - -- Wallet\_accounts and generator maps ([RIPD-804](https://ripplelabs.atlassian.net/browse/RIPD-804)) - -**Improvements** - -- Control ledger query depth based on peers latency -- Improvements to ledger history fetches -- Improve RPC ledger synchronization requirements ([RIPD-27](https://ripplelabs.atlassian.net/browse/RIPD-27), [RIPD-840](https://ripplelabs.atlassian.net/browse/RIPD-840)) -- Eliminate need for ledger in delivered\_amount calculation ([RIPD-860](https://ripplelabs.atlassian.net/browse/RIPD-860)) -- Improvements to JSON parsing - -**Development-Related Updates** - -- Add historical ledger fetches per minute to get\_counts -- Compute validated ledger age from signing time -- Remove unused database table ([RIPD-755](https://ripplelabs.atlassian.net/browse/RIPD-755)) - -**Assistance** - -For assistance, please contact **integration@ripple.com** - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - - - ------------------------------------------------------------ - -## Version 0.28.0 - -rippled 0.28.0 has been released. The commit can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 7efd0ab0d6ef017331a0e214a3053893c88f38a9 - Author: Vinnie Falco - Date: Fri Apr 24 18:57:36 2015 -0700 - - Set version to 0.28.0 - -This release incorporates a number of important features, bugfixes and functional improvements. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.28.0) for more detailed information. - -**Release Overview** - -As part of Ripple Labs’ ongoing commitment toward improving the protocol, the rippled team is excited to announce **autobridging** — a feature that allows XRP to serve as a bridge currency. Autobridging enhances utility and has the potential to expose more of the network to liquidity and improve prices. For more information please refer to the [autobridging blog post](https://ripple.com/uncategorized/introducing-offer-autobridging/). - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -The minimum supported version of Boost is v1.57.0. You **must** upgrade to this release or later to successfully compile this release of rippled. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**Important rippled.cfg update** - -With rippled version 0.28, the rippled.cfg file must be changed according to these instructions: - -- Change any entries that say - -`admin` `=` `allow` to `admin` `=` - -- For most installations, 127.0.0.1 will preserve current behavior. 0.0.0.0 may be specified to indicate "any IP" but cannot be combined with other IP addresses. Use of 0.0.0.0 may introduce severe security risks and is not recommended. See docs/rippled-example.cfg for more information. - -**More Strict Requirements on MemoType** - -The requirements on the contents of the MemoType field, if present, are more strict than the previous version. Transactions that can successfully be submitted to 0.27.4 and earlier may fail in 0.28.0. For details, please refer to [updated memo documentation](https://ripple.com/build/transactions/#memos) for details. Partners should check their implementation to make sure that their MemoType follows the new rules. - -**New Features** - -- Autobridging implementation ([RIPD-423](https://ripplelabs.atlassian.net/browse/RIPD-423)). **This feature will be turned on May 12, 2015**. -- Combine history\_ledger\_index and online\_delete settings in rippled.cfg ([RIPD-774](https://ripplelabs.atlassian.net/browse/RIPD-774)). -- Claim a fee when a required destination tag is not specified ([RIPD-574](https://ripplelabs.atlassian.net/browse/RIPD-574)). -- Require the master key when disabling the use of the master key or when enabling 'no freeze' ([RIPD-666](https://ripplelabs.atlassian.net/browse/RIPD-666)). -- Change the port setting admin to accept allowable admin IP addresses ([RIPD-820](https://ripplelabs.atlassian.net/browse/RIPD-820)): - - rpc\_admin\_allow has been removed. - - Comma-separated list of IP addresses that are allowed administrative privileges (subject to username & password authentication if configured). - - 127.0.0.1 is no longer a default admin IP. - - 0.0.0.0 may be specified to indicate "any IP" but cannot be combined with other MIP addresses. Use of 0.0.0.0 may introduce severe security risks and is not recommended. -- Enable Amendments from config file or static data ([RIPD-746](https://ripplelabs.atlassian.net/browse/RIPD-746)). - -**Bug fixes** - -- Fix payment engine handling of offer ⇔ account ⇔ offer cases ([RIPD-639](https://ripplelabs.atlassian.net/browse/RIPD-639)). **This fix will take effect on May 12, 2015**. -- Fix specified destination issuer in pathfinding ([RIPD-812](https://ripplelabs.atlassian.net/browse/RIPD-812)). -- Only report delivered\_amount for executed payments ([RIPD-827](https://ripplelabs.atlassian.net/browse/RIPD-827)). -- Return a validated ledger if there is one ([RIPD-814](https://ripplelabs.atlassian.net/browse/RIPD-814)). -- Refund owner's ticket reserve when a ticket is canceled ([RIPD-855](https://ripplelabs.atlassian.net/browse/RIPD-855)). -- Return descriptive error from account\_currencies RPC ([RIPD-806](https://ripplelabs.atlassian.net/browse/RIPD-806)). -- Fix transaction enumeration in account\_tx API ([RIPD-734](https://ripplelabs.atlassian.net/browse/RIPD-734)). -- Fix inconsistent ledger\_current return ([RIPD-669](https://ripplelabs.atlassian.net/browse/RIPD-669)). -- Fix flags --rpc\_ip and --rpc\_port ([RIPD-679](https://ripplelabs.atlassian.net/browse/RIPD-679)). -- Skip inefficient SQL query ([RIPD-870](https://ripplelabs.atlassian.net/browse/RIPD-870)) - -**Deprecated features** - -- Remove support for deprecated PreviousTxnID field ([RIPD-710](https://ripplelabs.atlassian.net/browse/RIPD-710)). **This will take effect on May 12, 2015**. -- Eliminate temREDUNDANT\_SEND\_MAX ([RIPD-690](https://ripplelabs.atlassian.net/browse/RIPD-690)). -- Remove WalletAdd ([RIPD-725](https://ripplelabs.atlassian.net/browse/RIPD-725)). -- Remove SMS support. - -**Improvements** - -- Improvements to peer communications. -- Reduce master lock for client requests. -- Update SQLite to 3.8.8.2. -- Require Boost 1.57. -- Improvements to Universal Port ([RIPD-687](https://ripplelabs.atlassian.net/browse/RIPD-687)). -- Constrain valid inputs for memo fields ([RIPD-712](https://ripplelabs.atlassian.net/browse/RIPD-712)). -- Binary option for ledger command ([RIPD-692](https://ripplelabs.atlassian.net/browse/RIPD-692)). -- Optimize transaction checks ([RIPD-751](https://ripplelabs.atlassian.net/browse/RIPD-751)). - -**Development-Related Updates** - -- Add RPC metrics ([RIPD-705](https://ripplelabs.atlassian.net/browse/RIPD-705)). -- Track and report peer load. -- Builds/Test.py will build and test by one or more scons targets. -- Support a --noserver command line option in tests: -- Run npm/integration tests without launching rippled, using a running instance of rippled (possibly in a debugger) instead. -- Works for npm test and mocha. -- Display human readable SSL error codes. -- Better transaction analysis ([RIPD-755](https://ripplelabs.atlassian.net/browse/RIPD-755)). - -**Assistance** - -For assistance, please contact **integration@ripple.com** - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - - - ------------------------------------------------------------ - -## Version 0.27.4 - -rippled 0.27.4 has been released. The commit can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 92812fe7239ffa3ba91649b2ece1e892b866ec2a - Author: Nik Bougalis - Date: Wed Mar 11 11:26:44 2015 -0700 - - Set version to 0.27.4 - -This release includes one new feature. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.27.4) for more detailed information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -The minimum supported version of Boost is v1.57.0. You **must** upgrade to this release or later to successfully compile this release of rippled. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**Bug Fixes** - -- Limit passes in the payment engine - -**Assistance** - -For assistance, please contact **integration@ripple.com** - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - - - ------------------------------------------------------------ - -## Version 0.27.3-sp2 - -rippled 0.27.3-sp2 has been released. The commit can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit f999839e599e131ed624330ad0ce85bb995f02d3 - Author: Nik Bougalis - Date: Thu Mar 12 13:37:47 2015 -0700 - - Set version to 0.27.3-sp2 - -This release includes one new feature. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.27.3-sp2) for more detailed information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -The minimum supported version of Boost is v1.57.0. You **must** upgrade to this release or later to successfully compile this release of rippled. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**New Features** - -- Add noripple\_check RPC command: this command tells gateways what they need to do to set "Default Ripple" account flag and fix any trust lines created before the flag was set. - -**Assistance** - -For assistance, please contact **integration@ripple.com** - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - - - ------------------------------------------------------------ - -## Version 0.27.3-sp1 - -rippled 0.27.3-sp1 has been released. The commit can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 232693419a2c9a8276a0fae991f688f6f01a3add - Author: Nik Bougalis - Date: Wed Mar 11 10:26:39 2015 -0700 - - Set version to 0.27.3-sp1 - -This release includes one new feature. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.27.3-sp1) for more detailed information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -The minimum supported version of Boost is v1.57.0. You **must** upgrade to this release or later to successfully compile this release of rippled. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**New Features** - -- Add "Default Ripple" account flag - -**Assistance** - -For assistance, please contact **integration@ripple.com** - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - ------------------------------------------------------------ - -## Version 0.27.3 - -rippled 0.27.3 has been released. The commit can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 70c2854f7c8a28801a7ebc81dd62bf0d068188f0 - Author: Nik Bougalis - Date: Tue Mar 10 14:06:33 2015 -0700 - - Set version to 0.27.3 - -This release includes one new feature. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.27.3) for more detailed information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -The minimum supported version of Boost is v1.57.0. You **must** upgrade to this release or later to successfully compile this release of rippled. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**New Features** - -- Add "Default Ripple" account flag - -**Assistance** - -For assistance, please contact **integration@ripple.com** - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - ------------------------------------------------------------ - -## Version 0.27.2 - -rippled 0.27.2 has been released. The commit can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 9cc8eec773e8afc9c12a6aab4982deda80495cf1 - Author: Nik Bougalis - Date: Sun Mar 1 14:56:44 2015 -0800 - - Set version to 0.27.2 - -This release incorporates a number of important bugfixes and functional improvements. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.27.2) for more detailed information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -The minimum supported version of Boost is v1.57.0. You **must** upgrade to this release or later to successfully compile this release of rippled. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**New Features** - -- NuDB backend option: high performance key/value database optimized for rippled (set “type=nudb†in .cfg). - - Either import RockdDB to NuDB using import tool, or - - Start fresh with NuDB but delete SQLite databases if rippled ran previously with RocksDB: - - rm [database_path]/transaction.* [database_path]/ledger.* - -**Bug Fixes** - -- Fix offer quality bug - -**Deprecated** - -- HyperLevelDB, LevelDB, and SQLlite backend options. Use RocksDB for spinning drives and NuDB for SSDs backend options. - -**Assistance** - -For assistance, please contact **integration@ripple.com** - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - ------------------------------------------------------------ - -## Version 0.27.1 - -rippled 0.27.1 has been released. The commit can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 95973ba3e8b0bd28eeaa034da8b806faaf498d8a - Author: Vinnie Falco - Date: Tue Feb 24 13:31:13 2015 -0800 - - Set version to 0.27.1 - -This release incorporates a number of important bugfixes and functional improvements. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.27.1) for more detailed information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -The minimum supported version of Boost is v1.57.0. You **must** upgrade to this release or later to successfully compile this release of rippled. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**New Features** - -- RocksDB to NuDB import tool ([RIPD-781](https://ripplelabs.atlassian.net/browse/RIPD-781), [RIPD-785](https://ripplelabs.atlassian.net/browse/RIPD-785)): custom tool specifically designed for very fast import of RocksDB nodestore databases into NuDB - -**Bug Fixes** - -- Fix streambuf bug - -**Improvements** - -- Update RocksDB backend settings -- NuDB improvements: - - Limit size of mempool ([RIPD-787](https://ripplelabs.atlassian.net/browse/RIPD-787)) - - Performance improvements ([RIPD-793](https://ripplelabs.atlassian.net/browse/RIPD-793), [RIPD-796](https://ripplelabs.atlassian.net/browse/RIPD-796)): changes in Nudb to improve speed, reduce database size, and enhance correctness. The most significant change is to store hashes rather than entire keys in the key file. The output of the hash function is reduced to 48 bits, and stored directly in buckets. - -**Experimental** - -- Add /crawl cgi request feature to peer protocol ([RIPD-729](https://ripplelabs.atlassian.net/browse/RIPD-729)): adds support for a cgi /crawl request, issued over HTTPS to the configured peer protocol port. The response to the request is a JSON object containing the node public key, type, and IP address of each directly connected neighbor. The IP address is suppressed unless the neighbor has requested its address to be revealed by adding "Crawl: public" to its HTTP headers. This field is currently set by the peer\_private option in the rippled.cfg file. - -**Assistance** - -For assistance, please contact **integration@ripple.com** - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - ------------------------------------------------------------ - -## Version 0.27.0 - -rippled 0.27.0 has been released. The commit can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit c6c8e5d70c6fbde02cd946135a061aa77744396f - Author: Vinnie Falco - Date: Mon Jan 26 10:56:11 2015 -0800 - - Set version to 0.27.0 - -This release incorporates a number of important bugfixes and functional improvements. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.27.0) for more detailed information. - -**Release Overview** - -The rippled team is proud to release rippled 0.27.0. This new version includes many exciting features that will appeal to our users. The team continues to work on stability, scalability, and performance. - -The first feature is Online Delete. This feature allows rippled to maintain it’s database of previous ledgers within a fixed amount of disk space. It does this while allowing rippled to stay online and maintain an administrator specify minimum number of ledgers. This means administrators with limited disk space will no longer need to manage disk space by periodically manually removing the database. Also, with the previously existing backend databases performance would gradually degrade as the database grew in size. In particular, rippled would perform poorly whenever the backend database performed ever growing compaction operations. By limiting rippled to less history, compaction is less resource intensive and systems with less disk performance can now run rippled. - -Additionally, we are very excited to include Universal Port. This feature allows rippled's listening port to handshake in multiple protocols. For example, a single listening port can be configured to receive incoming peer connections, incoming RPC commands over HTTP, and incoming RPC commands over HTTPS at the same time. Or, a single port can receive both Websockets and Secure Websockets clients at the same. - -Finally, a new, experimental backend database, NuDB, has been added. This database was developed by Ripple Labs to take advantage of rippled’s specific data usage profile and performs much better than previous databases. Significantly, this database does not degrade in performance as the database grows. Very excitingly, this database works on OS X and Windows. This allows rippled to use these platforms for the first time. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -The minimum supported version of Boost is v1.57.0. You **must** upgrade to this release or later to successfully compile this release of rippled. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**Important rippled.cfg Update** - -**The format of the configuration file has changed. If upgrading from a previous version of rippled, please see the migration instructions below.** - -**New Features** - -- SHAMapStore Online Delete ([RIPD-415](https://ripplelabs.atlassian.net/browse/RIPD-415)): Makes rippled configurable to support deletion of all data in its key-value store (nodestore) and ledger and transaction SQLite databases based on validated ledger sequence numbers. See doc/rippled-example.cfg for configuration setup. -- [Universal Port](https://forum.ripple.com/viewtopic.php?f=2&t=8313&p=57969). See necessary config changes below. -- Config "ledger\_history\_index" option ([RIPD-559](https://ripplelabs.atlassian.net/browse/RIPD-559)) - -**Bug Fixes** - -- Fix pathfinding with multiple issuers for one currency ([RIPD-618](https://ripplelabs.atlassian.net/browse/RIPD-618)) -- Fix account\_lines, account\_offers and book\_offers result ([RIPD-682](https://ripplelabs.atlassian.net/browse/RIPD-682)) -- Fix pathfinding bugs ([RIPD-735](https://ripplelabs.atlassian.net/browse/RIPD-735)) -- Fix RPC subscribe with multiple books ([RIPD-77](https://ripplelabs.atlassian.net/browse/RIPD-77)) -- Fix account\_tx API - -**Improvements** - -- Improve the human-readable description of the tesSUCCESS code -- Add 'delivered\_amount' to Transaction JSON ([RIPD-643](https://ripplelabs.atlassian.net/browse/RIPD-643)): The synthetic field 'delivered\_amount' can be used to determine the exact amount delivered by a Payment without having to check the DeliveredAmount field, if present, or the Amount field otherwise. - -**Development-Related Updates** - -- HTTP Handshaking for Peers on Universal Port ([RIPD-446](https://ripplelabs.atlassian.net/browse/RIPD-446)) -- Use asio signal handling in Application ([RIPD-140](https://ripplelabs.atlassian.net/browse/RIPD-140)) -- Build dependency on Boost 1.57.0 -- Support a "no\_server" flag in test config -- API for improved Unit Testing ([RIPD-432](https://ripplelabs.atlassian.net/browse/RIPD-432)) -- Option to specify rippled path on command line (--rippled=\) - -**Experimental** - -- NuDB backend option: high performance key/value database optimized for rippled (set “type=nudb†in .cfg) - -**Migration Instructions** - -With rippled version 0.27.0, the rippled.cfg file must be changed according to these instructions: - -- Add new stanza - `[server]`. This section will contain a list of port names and key/value pairs. A port name must start with a letter and contain only letters and numbers. The name is not case-sensitive. For each name in this list, rippled will look for a configuration file section with the same name and use it to create a listening port. To simplify migration, you can use port names from your previous version of rippled.cfg (see Section 1. Server for detailed explanation in doc/rippled-example.cfg). For example: - - [server] - rpc_port - peer_port - websocket_port - ssl_key = - ssl_cert = - ssl_chain = - -- For each port name in `[server]` stanza, add separate stanzas. For example: - - [rpc_port] - port = - ip = - admin = allow - protocol = https - - [peer_port] - port = - ip = - protocol = peer - - [websocket_port] - port = - ip = - admin = allow - protocol = wss - -- Remove current `[rpc_port],` `[rpc_ip],` `[rpc_allow_remote],` `[rpc_ssl_key],` `[rpc_ssl_cert],` `and` `[rpc_ssl_chain],` `[peer_port],` `[peer_ip],` `[websocket_port],` `[websocket_ip]` settings from rippled.cfg - -- If you allow untrusted websocket connections to your rippled, add `[websocket_public_port]` stanza under `[server]` section and replace websocket public settings with `[websocket_public_port]` section: - - [websocket_public_port] - port = - ip = - protocol = ws ↠make sure this is ws, not wss` - -- Remove `[websocket_public_port],` `[websocket_public_ip],` `[websocket_ssl_key],` `[websocket_ssl_cert],` `[websocket_ssl_chain]` settings from rippled.cfg -- Disable `[ssl_verify]` section by setting it to 0 -- Migrate the remaining configurations without changes. To enable online delete feature, check Section 6. Database in doc/rippled-example.cfg - -**Integration Notes** - -With this release, integrators should deprecate the "DeliveredAmount" field in favor of "delivered\_amount." - -**For Transactions That Occurred Before January 20, 2014:** - -- If amount actually delivered is different than the transactions “Amount†field - - "delivered\_amount" will show as unavailable indicating a developer should use caution when processing this payment. - - Example: A partial payment transaction (tfPartialPayment). -- Otherwise - - "delivered\_amount" will show the correct destination balance change. - -**For Transactions That Occur After January 20, 2014:** - -- If amount actually delivered is different than the transactions “Amount†field - - A "delivered\_amount" field will determine the destination amount change - - Example: A partial payment transaction (tfPartialPayment). -- Otherwise - - "delivered\_amount" will show the correct destination balance change. - -**Assistance** - -For assistance, please contact **integration@ripple.com** - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - ------------------------------------------------------------ - -## Version 0.26.4 - -rippled 0.26.4 has been released. The repository tag is *0.26.4* and can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 05a04aa80192452475888479c84ff4b9b54e6ae7 - Author: Vinnie Falco - Date: Mon Nov 3 16:53:37 2014 -0800 - - Set version to 0.26.4 - -This release incorporates a number of important bugfixes and functional improvements. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.26.4) for more detailed information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -The minimum supported version of Boost is v1.55.0. You **must** upgrade to this release or later to successfully compile this release of rippled. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**Important JSON-RPC Update** - -With rippled version 0.26.4, the [rippled.cfg](https://github.com/ripple/rippled/blob/0.26.4/doc/rippled-example.cfg) file must set the ssl\_verify property to 0. Without this update, JSON-RPC API calls may not work. - -**New Features** - -- Rocksdb v. 3.5.1 -- SQLite v. 3.8.7 -- Disable SSLv3 -- Add counters to track ledger read and write activities -- Use trusted validators median fee when determining transaction fee -- Add --quorum argument for server start ([RIPD-563](https://ripplelabs.atlassian.net/browse/RIPD-563)) -- Add account\_offers paging ([RIPD-344](https://ripplelabs.atlassian.net/browse/RIPD-344)) -- Add account\_lines paging ([RIPD-343](https://ripplelabs.atlassian.net/browse/RIPD-343)) -- Ability to configure network fee in rippled.cfg file ([RIPD-564](https://ripplelabs.atlassian.net/browse/RIPD-564)) - -**Bug Fixes** - -- Fix OS X version parsing/error related to OS X 10.10 update -- Fix incorrect address in connectivity check report -- Fix page sizes for ledger\_data ([RIPD-249](https://ripplelabs.atlassian.net/browse/RIPD-249)) -- Make log partitions case-insensitive in rippled.cfg - -**Improvements** - -- Performance - - Ledger performance improvements for storage and traversal ([RIPD-434](https://ripplelabs.atlassian.net/browse/RIPD-434)) - - Improve client performance for JSON responses ([RIPD-439](https://ripplelabs.atlassian.net/browse/RIPD-439)) -- Other - - Remove PROXY handshake feature - - Change to rippled.cfg to support sections containing both key/value pairs and a list of values - - Return descriptive error message for memo validation ([RIPD-591](https://ripplelabs.atlassian.net/browse/RIPD-591)) - - Changes to enforce JSON-RPC 2.0 error format - - Optimize account\_lines and account\_offers ([RIPD-587](https://ripplelabs.atlassian.net/browse/RIPD-587)) - - Improve fee setting logic ([RIPD-614](https://ripplelabs.atlassian.net/browse/RIPD-614)) - - Improve transaction security - - Config improvements - - Improve path filtering ([RIPD-561](https://ripplelabs.atlassian.net/browse/RIPD-561)) - - Logging to distinguish Byzantine failure from tx bug ([RIPD-523](https://ripplelabs.atlassian.net/browse/RIPD-523)) - -**Experimental** - -- Add "deferred" flag to transaction relay message (required for future code that will relay deferred transactions) -- Refactor STParsedJSON to parse an object or array (required for multisign implementation) ([RIPD-480](https://ripplelabs.atlassian.net/browse/RIPD-480)) - -**Development-Related Updates** - -- Changes to DatabaseReader to read ledger numbers from database -- Improvements to SConstruct - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - ------------------------------------------------------------ - -## Version 0.26.3-sp1 - -rippled 0.26.3-sp1 has been released. The repository tag is *0.26.3-sp1* and can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 2ad6f0a65e248b4f614d38d199a9d5d02f5aaed8 - Author: Vinnie Falco - Date: Fri Sep 12 15:22:54 2014 -0700 - - Set version to 0.26.3-sp1 - -This release incorporates a number of important bugfixes and functional improvements. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.26.3-sp1) for more detailed information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -The minimum supported version of Boost is v1.55.0. You **must** upgrade to this release or later to successfully compile this release of rippled. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**New Features** - -- New command to display HTTP/S-RPC sessions metrics ([RIPD-533](https://ripplelabs.atlassian.net/browse/RIPD-533)) - -**Bug Fixes** - -- Improved handling of HTTP/S-RPC sessions ([RIPD-489](https://ripplelabs.atlassian.net/browse/RIPD-489)) -- Fix unit tests for Windows. -- Fix integer overflows in JSON parser. - -**Improvements** - -- Improve processing of trust lines during pathfinding. - -**Experimental Features** - -- Added a command line utility called LedgerTool for retrieving and processing ledger blocks from the Ripple network. - -**Development-Related Updates** - -- HTTP message and parser improvements. - - Streambuf wrapper supports rvalue move. - - Message class holds a complete HTTP message. - - Body class holds the HTTP content body. - - Headers class holds RFC-compliant HTTP headers. - - Basic\_parser provides class interface to joyent's http-parser. - - Parser class parses into a message object. - - Remove unused http get client free function. - - Unit test for parsing malformed messages. -- Add enable\_if\_lvalue. -- Updates to includes and scons. -- Additional ledger.history.mismatch insight statistic. -- Convert rvalue to an lvalue. ([RIPD-494](https://ripplelabs.atlassian.net/browse/RIPD-494)) -- Enable heap profiling with jemalloc. -- Add aged containers to Validators module. ([RIPD-349](https://ripplelabs.atlassian.net/browse/RIPD-349)) -- Account for high-ASCII characters. ([RIPD-464](https://ripplelabs.atlassian.net/browse/RIPD-464)) - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - ------------------------------------------------------------ - -## Version 0.26.2 - -rippled 0.26.2 has been released. The repository tag is *0.26.2* and can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit b9454e0f0ca8dbc23844a0520d49394e10d445b1 - Author: Vinnie Falco - Date: Mon Aug 11 15:25:44 2014 -0400 - - Set version to 0.26.2 - -This release incorporates a small number of important bugfixes. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.26.2) for more detailed information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -The minimum supported version of Boost is v1.55.0. You **must** upgrade to this release or later to successfully compile this release of rippled. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**New Features** - -- Freeze enforcement: activates on September 15, 2014 ([RIPD-399](https://ripplelabs.atlassian.net/browse/RIPD-399)) -- Add pubkey\_node and hostid to server stream messages ([RIPD-407](https://ripplelabs.atlassian.net/browse/RIPD-407)) - -**Bug Fixes** - -- Fix intermittent exception when closing HTTPS connections ([RIPD-475](https://ripplelabs.atlassian.net/browse/RIPD-475)) -- Correct Pathfinder::getPaths out to handle order books ([RIPD-427](https://ripplelabs.atlassian.net/browse/RIPD-427)) -- Detect inconsistency in PeerFinder self-connects ([RIPD-411](https://ripplelabs.atlassian.net/browse/RIPD-411)) - -**Experimental Features** - -- Add owner\_funds to client subscription data ([RIPD-377](https://ripplelabs.atlassian.net/browse/RIPD-377)) - -The offer funding status feature is “experimental†in this version. Developers are able to see the field, but it is subject to change in future releases. - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - ------------------------------------------------------------ - -## Version 0.26.1 - -rippled v0.26.1 has been released. The repository tag is **0.26.1** and can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 9a0e806f78300374e20070e2573755fbafdbfd03 - Author: Vinnie Falco - Date: Mon Jul 28 11:27:31 2014 -0700 - - Set version to 0.26.1 - -This release incorporates a small number of important bugfixes. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/0.26.1) for more detailed information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -The minimum supported version of Boost is v1.55.0. You **must** upgrade to this release or later to successfully compile this release of rippled. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**Bug Fixes** - -- Enabled asynchronous handling of HTTP-RPC interactions. This fixes client handlers using RPC that periodically return blank responses to requests. ([RIPD-390](https://ripplelabs.atlassian.net/browse/RIPD-390)) -- Fixed auth handling during OfferCreate. This fixes a regression of [RIPD-256](https://ripplelabs.atlassian.net/browse/RIPD-256). ([RIPD-414](https://ripplelabs.atlassian.net/browse/RIPD-414)) - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - ------------------------------------------------------------ - -## Version 0.26.0 - -rippled v0.26.0 has been released. The repository tag is **0.26.0** and can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 9fa5e3987260e39dba322f218d39ac228a5b361b - Author: Vinnie Falco - Date: Tue Jul 22 09:59:45 2014 -0700 - - Set version to 0.26.0 - -This release incorporates a significant number of improvements and important bugfixes. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/develop) for more detailed information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend compiling on (virtual) machines with 8GB of RAM or more. If your build machine has more than one CPU (**\`grep '^processor' /proc/cpuinfo | wc -l\`**), you can use them to assist in the build process by compiling with the command **scons -j\[number of CPUs - 1\]**. - -The minimum supported version of Boost is v1.55.0. You **must** upgrade to this release or later to successfully compile this release of rippled. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**Improvements** - -- Updated integration tests. -- Updated tests for account freeze functionality. -- Implement setting the no-freeze flag on Ripple accounts ([RIPD-394](https://ripplelabs.atlassian.net/browse/RIPD-394)). -- Improve transaction fee and execution logic ([RIPD-323](https://ripplelabs.atlassian.net/browse/RIPD-323)). -- Implemented finding of 'sabfd' paths ([RIPD-335](https://ripplelabs.atlassian.net/browse/RIPD-335)). -- Imposed a local limit on paths lengths ([RIPD-350](https://ripplelabs.atlassian.net/browse/RIPD-350)). -- Documented [ledger entries](https://github.com/ripple/rippled/blob/develop/src/ripple/module/app/ledger/README.md) ([RIPD-361](https://ripplelabs.atlassian.net/browse/RIPD-361)). -- Documented [SHAMap](https://github.com/ripple/rippled/blob/develop/src/ripple/module/app/shamap/README.md). - -**Bug Fixes** - -- Fixed the limit parameter on book\_offers ([RIPD-295](https://ripplelabs.atlassian.net/browse/RIPD-295)). -- Removed SHAMapNodeID from SHAMapTreeNode to fix "right data, wrong ID" bug in the tree node cache ([RIPD-347](https://ripplelabs.atlassian.net/browse/RIPD-347)). -- Eliminated spurious SHAMap::getFetchPack failure ([RIPD-379](https://ripplelabs.atlassian.net/browse/RIPD-379)). -- Disabled SSLv2. -- Implemented rate-limiting of SSL client renegotiation to mitigate [SCIR DoS vulnerability](https://www.thc.org/thc-ssl-dos/) ([RIPD-360](https://ripplelabs.atlassian.net/browse/RIPD-360)). -- Display unprintable or malformatted currency codes as hex digits. -- Fix static initializers in RippleSSLContext ([RIPD-375](https://ripplelabs.atlassian.net/browse/RIPD-375)). - -**More information** - -For more information or assistance, the following resources will be of use: - -- [Ripple Developer Forums](https://ripple.com/forum/viewforum.php?f=2) -- [IRC](https://webchat.freenode.net/?channels=#ripple) - - ------------------------------------------------------------ - -## Version 0.25.2 - -rippled v0.25.2 has been released. The repository tag is **0.25.2** and can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit ddf68d464d74e1c76a0cfd100a08bc8e65b91fec - Author: Mark Travis - Date: Mon Jul 7 11:46:15 2014 -0700 - - Set version to 0.25.2 - -This release incorporates significant improvements which may not warrant separate entries but are incorporated into the feature changes as summary lines. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/develop) for more information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -While it may be possible to compile rippled on (virtual) machines with 4GB of RAM, we recommend build machines with 8GB of RAM. - -The minimum supported version of Boost is v1.55. You **must** upgrade to this release or later to successfully compile this release. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**Improvements** - -- CPU utilization for certain operations has been optimized. -- Improve serialization of public ledger blocks. -- rippled now takes much less time to compile. -- Additional pathfinding heuristic: increases liquidity in some cases. - -**Bug Fixes** - -- Unprintable currency codes will be printed as hex digits. -- Transactions with unreasonably long path lengths are rejected. The maximum is now eight (8) hops. - - ------------------------------------------------------------ - -## Version 0.25.1 - -`rippled` v0.25.1 has been released. The repository tag is `0.25.1` and can be found on GitHub at: https://github.com/ripple/rippled/tree/0.25.1 - -Prior to building, please confirm you have the correct source tree with the `git log` command. The first log entry should be the change setting the version: - - commit b677cacb8ce0d4ef21f8c60112af1db51dce5bb4 - Author: Vinnie Falco - Date: Thu May 15 08:27:20 2014 -0700 - - Set version to 0.25.1 - -This release incorporates significant improvements which may not warrant separate entries but are incorporated into the feature changes as summary lines. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/develop) for more information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -A minimum of 4GB of RAM are required to successfully compile this release. - -The minimum supported version of Boost is v1.55. You **must** upgrade to this release or later to successfully compile this release. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**Major Features** - -* Option to compress the NodeStore db. More speed, less space. See [`rippled-example.cfg`](https://github.com/ripple/rippled/blob/0.25.1/doc/rippled-example.cfg#L691) - -**Improvements** - -* Remove redundant checkAccept call -* Added I/O latency to output of ''server_info''. -* Better performance handling of Fetch Packs. -* Improved handling of modified ledger nodes. -* Improved performance of JSON document generator. -* Made strConcat operate in O(n) time for greater efficiency. -* Added some new configuration options to doc/rippled-example.cfg - -**Bug Fixes** - -* Fixed a bug in Unicode parsing of transactions. -* Fix a blocker with tfRequireAuth -* Merkle tree nodes that are retrieved as a result of client requests are cached locally. -* Use the last ledger node closed for finding old paths through the network. -* Reduced number of asynchronous fetches. - - ------------------------------------------------------------ - -## Version 0.25.0 - -rippled version 0.25.0 has been released. The repository tag is **0.25.0** and can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 29d1d5f06261a93c5e94b4011c7675ff42443b7f - Author: Vinnie Falco - Date: Wed May 14 09:01:44 2014 -0700 - - Set version to 0.25.0 - -This release incorporates significant improvements which may not warrant separate entries but are incorporated into the feature changes as summary lines. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/develop) for more information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -A minimum of 4GB of RAM are required to successfully compile this release. - -The minimum supported version of Boost is v1.55. You **must** upgrade to this release or later to successfully compile this release. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**Major Features** - -- Option to compress the NodeStore db. More speed, less space. See [`rippled-example.cfg`](https://github.com/ripple/rippled/blob/0.25.0/doc/rippled-example.cfg#L691) - -**Improvements** - -- Remove redundant checkAccept call -- Added I/O latency to output of *server\_info*. -- Better performance handling of Fetch Packs. -- Improved handling of modified ledger nodes. -- Improved performance of JSON document generator. -- Made strConcat operate in O(n) time for greater efficiency. - -**Bug Fixes** - -- Fix a blocker with tfRequireAuth -- Merkle tree nodes that are retrieved as a result of client requests are cached locally. -- Use the last ledger node closed for finding old paths through the network. -- Reduced number of asynchronous fetches. - - ------------------------------------------------------------ - -## Version 0.24.0 - -rippled version 0.24.0 has been released. The repository tag is **0.24.0** and can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 3eb1c7bd6f93e5d874192197f76571184338f702 - Author: Vinnie Falco - Date: Mon May 5 10:20:46 2014 -0700 - - Set version to 0.24.0 - -This release incorporates significant improvements which may not warrant separate entries but are incorporated into the feature changes as summary lines. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/develop) for more information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -A minimum of 4GB of RAM are required to successfully compile this release. - -The minimum supported version of Boost is v1.55. You **must** upgrade to this release or later to successfully compile this release. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**Improvements** - -- Implemented logic for ledger processes and features. -- Use "high threads" for background RocksDB database writes. -- Separately track locally-issued transactions to ensure they always appear in the open ledger. - -**Bug Fixes** - -- Fix AccountSet for canonical transactions. -- The RPC [sign](https://ripple.com/build/rippled-apis/#sign) command will now sign with either an account's master or regular secret key. -- Fixed out-of-order network initialization. -- Improved efficiency of pathfinding for transactions. -- Reworked timing of ledger validation and related operations to fix race condition against the network. -- Build process enforces minimum versions of OpenSSL and BOOST for operation. - - ------------------------------------------------------------ - -## Version 0.23.0 - -rippled version 0.23.0 has been released. The repository tag is **0.23.0** and can be found on GitHub at: - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 29a4f61551236f70865d46d6653da2e62de1c701 - Author: Vinnie Falco - Date: Fri Mar 14 13:01:23 2014 -0700 - - Set version to 0.23.0 - -This release incorporates significant improvements which may not warrant separate entries but are incorporated into the feature changes as summary lines. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/develop) for more information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -A minimum of 4GB of RAM are required to successfully compile this release. - -The minimum supported version of Boost is v1.55. You **must** upgrade to this release or later to successfully compile this release. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**Improvements** - -- Allow the word 'none' in the *.cfg* file to disable storing historical ledgers. -- Clarify the initialization of hash prefixes used in the *RadMap*. -- Better validation of RPC-JSON from all sources -- Reduce spurious log output from Peers -- Eliminated some I/O for certain operations in the *RadMap*. -- Client requests for full state trees now require administrative privileges. -- Added "MemoData" field for transaction memos. -- Prevent the node cache from overflowing needlessly in certain cases -- Add "ledger\_data" command for retrieving entire ledgers in chunks. -- Reduce the quantity of forwarded transactions and proposals in some cases -- Improved diagnostics when errors occur loading SSL certificates - -**Bug Fixes** - -- Fix rare crash when a race condition involving disconnecting sockets occurs -- Fix a corner case with hex conversion of strings with odd character lengths -- Fix an exception in a corner case when erroneous transactions were being logged -- Fix the treatment of expired offers when cleaning up offers -- Prevent a needless transactor from being created if the tx ID is not valid -- Fix the peer action transition from "syncing" to "full" -- Fix error reporting for unknown inner JSON fields -- Fix source file path displayed when an assertion failure is reported -- Fix typos in transaction engine error code identifiers - - ------------------------------------------------------------ - -## Version 0.22.0 - -rippled version 0.22.0 has been released. This release is currently the tip of the **develop/** branch and can be found on GitHub at: The tag is **0.22.0** and can be found on GitHub at: - -**This is a critical release affecting transaction processing. All partners should update immediately.** - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - -This release incorporates significant improvements which may not warrant separate entries but are incorporated into the feature changes as summary lines. Please refer to the [Git commit history](https://github.com/ripple/rippled/commits/develop) for more information. - -**Toolchain support** - -The minimum supported version of GCC used to compile rippled is v4.8. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Ubuntu_versions_older_than_13.10_:_Install_gcc_4.8) if you have not upgraded already. - -A minimum of 4GB of RAM are required to successfully compile this release. - -The minimum supported version of libBOOST is v1.55. You **must** upgrade to this release or later to successfully compile this release. Please follow [these instructions](https://wiki.ripple.com/Ubuntu_build_instructions#Install_Boost) if you have not upgraded already. - -**Key release features** - -- **PeerFinder** - - - Actively guides network topology. - - Scrubs listening advertisements based on connectivity checks. - - Redirection for new nodes when existing nodes are full. - -- **Memos** - - - Transactions can optionally include a short text message, which optionally can be encrypted. - -- **Database** - - - Improved management of I/O resources. - - Better performance accessing historical data. - -- **PathFinding** - - - More efficient search algorithm when computing paths - -**Major Partner Issues Fixed** - -- **Transactions** - - - Malleability: Ability to ensure that signatures are fully canonical. - -- **PathFinding** - - - Less time needed to get the first path result! - -- **Database** - - - Eliminated "meltdowns" caused when fetching historical ledger data. - -**Significant Changes** - -- Cleaned up logic which controls when ledgers are fetched and under what conditions. -- Cleaned up file path calculation for database files. -- Changed dispatcher for WebSocket requests. -- Cleaned up multithreading mechanisms. -- Fixed custom currency code parsing. -- Optimized transaction node lookup circumstances in the node store. - - ------------------------------------------------------------ - -## Version 0.21.0 - -rippled version 0.21.0 has been released. This release is currently the tip of the **develop/** branch and can be found on GitHub at [1](https://github.com/ripple/rippled/tree/develop). The tag is **0.21.0-rc2** and can be found on GitHub at [2](https://github.com/ripple/rippled/tree/0.21.0-rc2). - -**This is a critical release. All partners should update immediately.** - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit f295bb20a16d1d2999f606c1297c8930d8e33c40 - Author: JoelKatz - Date: Fri Jan 24 11:17:16 2014 -0800 - - Set version to 0.21.0.rc2 - -**Major Partner Issues Fixed** - -- Order book issues - - Ensure all crossing offers are taken - - Ensure order book is not left crossed -- Added **DeliveredAmount** field to transaction metadata - - Reports amount delivered in partial payments - -**Toolchain support** - -As with the previous release, the minimum supported version of GCC used to compile rippled is v4.8. - -**Significant Changes** - -- Pairwise no-ripple - - Permits trust lines to be protected from rippling - - Operates on protected pairs -- Performance improvements - - Improve I/O latency - - Improve fetching ledgers - - Improve pathfinding -- Features for robust transaction submission - - LastLedgerSeq for transaction expiration - - AccountTxnID for transaction chaining -- Fix some cases where an invalid transaction would stay in limbo -- Code cleanups -- Better reporting of invalid parameters - -**Release Candidates** - -RC1 fixed performance problems with order book retrieval. - -RC2 fixed a bug that caused crashes in order processing and a bug in parsing order book requests. - -**Notice** - -If you are upgrading from version 0.12 or earlier of rippled, these next sections apply to you because the format of the *rippled.cfg* file changed around that time. If you have upgraded since that time and you have applied the configuration file fixes, you can safely ignore them. - -**Validators** - -Ripple Labs is now running five validators. You can use this template for your *validators.txt* file (or place this in your config file): - - [validators] - n9KPnVLn7ewVzHvn218DcEYsnWLzKerTDwhpofhk4Ym1RUq4TeGw RIP1 - n9LFzWuhKNvXStHAuemfRKFVECLApowncMAM5chSCL9R5ECHGN4V RIP2 - n94rSdgTyBNGvYg8pZXGuNt59Y5bGAZGxbxyvjDaqD9ceRAgD85P RIP3 - n9LeQeDcLDMZKjx1TZtrXoLBLo5q1bR1sUQrWG7tEADFU6R27UBp RIP4 - n9KF6RpvktjNs2MDBkmxpJbup4BKrKeMKDXPhaXkq7cKTwLmWkFr RIP5 - -You should also raise your quorum to at least three by putting the following in your *rippled.cfg* file: - - [validation_quorum] - 3 - -If you are a validator, you should set your quorum to at least four. - -**IPs** - -A list of Ripple Labs server IP addresses can be found by resolving **r.ripple.com**. You can also add this to your *rippled.cfg* file to ensure you always have several peer connections to Ripple Labs servers: - - [ips] - 184.73.226.101 51235 - 23.23.201.55 51235 - 54.200.43.173 51235 - 184.73.57.84 51235 - 54.234.249.55 51235 - 54.200.86.110 51235 - -**RocksDB back end** - -RocksDB is based on LevelDB with improvements from Facebook and the community. Preliminary tests show that it stalls less often than HyperLevelDB for our use cases. - -If you are switching over from an existing back end, you have two options. You can remove your old database and let rippled recreate it as it re-syncs, or you can import your old database into the new one. - -To remove your old database, make sure the server is shut down (\`rippled stop\`). Remove the *db/ledger.db* and *db/transaction.db* files. Remove all the files in your back end store directory (*db/hashnode* by default). Then change your configuration file to use the RocksDB back end and restart. - -To import your old database, start by shutting the server down. Then modify the configuration file by renaming your *\[node\_db\]* stanza to *\[import\_db\]*. Create a new *\[node\_db\]* stanza and specify a RocksDB back end with a different directory. Start the server with the command **rippled --import**. When the import finishes gracefully stop the server (\`rippled stop\`). Please wait for rippled to stop on its own because it can take several minutes for it to shut down after an import. Remove the old database, put the new database into place, remove the *\[import\_db\]* section, change the *\[node\_db\]* section to refer to the final location, and restart the server. - -The recommended RocksDB configuration is: - - [node_db] - type=RocksDB - path=db/hashnode - open_files=1200 - filter_bits=12 - cache_mb=128 - file_size_mb=8 - file_size_mult=2 - -**Configuring your Node DB** - -You need to configure the [NodeBackEnd](https://wiki.ripple.com/NodeBackEnd) that you want the server to use. See above for an example RocksDB configuration. - -- **Note**: HyperLevelDB and RocksDB are not available on Windows platform. - - ------------------------------------------------------------ - -## Version 0.20.1 - -rippled version 0.20.1 has been released. This release is currently the tip of the [develop](https://github.com/ripple/rippled/tree/develop) branch and the tag is [0.20.1](https://github.com/ripple/rippled/tree/0.20.1). - -**This is a critical release. All partners should update immediately.** - -Prior to building, please confirm you have the correct source tree with the **git log** command. The first log entry should be the change setting the version: - - commit 95a573b755219d7e1e078d53b8e11a8f0d7cade1 - Author: Vinnie Falco - Date: Wed Jan 8 17:08:27 2014 -0800 - - Set version to 0.20.1 - -**Major Partner Issues Fixed** - -- rippled will crash randomly. - - Entries in the three parts of the order book are missing or do not match. In such a case, rippled will crash. -- Server loses sync randomly. - - This is due to rippled restarting after it crashes. That the server restarted is not obvious and appears to be something else. -- Server goes 'offline' randomly. - - This is due to rippled restarting after it crashes. That the server restarted is not obvious and appears to be something else. -- **complete\_ledgers** part of **server\_info** output says "None". - - This is due to rippled restarting and reconstructing the ledger after it crashes. - - If the node back end is corrupted or has been moved without being renamed in rippled.cfg, this can cause rippled to crash and restart. - -**Toolchain support** - -Starting with this release, the minimum supported version of GCC used to compile rippled is v4.8. - -**Significant Changes** - -- Don't log StatsD messages to the console by default. -- Fixed missing jtACCEPT job limit. -- Removed dead code to clean up the codebase. -- Reset liquidity before retrying rippleCalc. -- Made improvements becuase items in SHAMaps are immutable. -- Multiple pathfinding bugfixes: - - Make each path request track whether it needs updating. - - Improve new request handling, reverse order for processing requests. - - Break to handle new requests immediately. - - Make mPathFindThread an integer rather than a bool. Allow two threads. - - Suspend processing requests if server is backed up. - - Multiple performance improvements and enhancements. - - Fixed locking. -- Refactored codebase to make it C++11 compliant. -- Multiple fixes to ledger acquisition, cleanup, and logging. -- Made multiple improvements to WebSockets server. -- Added Debian-style initscript (doc/rippled.init). -- Updated default config file (doc/rippled-example.cfg) to reflect best practices. -- Made changes to SHAMapTreeNode and visitLeavesInternal to conserve memory. -- Implemented new fee schedule: - - Transaction fee: 10 drops - - Base reserve: 20 XRP - - Incremental reserve: 5 XRP -- Fixed bug \#211 (getTxsAccountB in NetworkOPs). -- Fixed a store/fetch race condition in ther node back end. -- Fixed multiple comparison operations. -- Removed Sophia and Lightning databases. - -**Notice** - -If you are upgrading from version 0.12 or earlier of rippled, these next sections apply to you because the format of the *rippled.cfg* file changed around that time. If you have upgraded since that time and you have applied the configuration file fixes, you can safely ignore them. - -**Validators** - -Ripple Labs is now running five validators. You can use this template for your *validators.txt* file (or place this in your config file): - - [validators] - n9KPnVLn7ewVzHvn218DcEYsnWLzKerTDwhpofhk4Ym1RUq4TeGw RIP1 - n9LFzWuhKNvXStHAuemfRKFVECLApowncMAM5chSCL9R5ECHGN4V RIP2 - n94rSdgTyBNGvYg8pZXGuNt59Y5bGAZGxbxyvjDaqD9ceRAgD85P RIP3 - n9LeQeDcLDMZKjx1TZtrXoLBLo5q1bR1sUQrWG7tEADFU6R27UBp RIP4 - n9KF6RpvktjNs2MDBkmxpJbup4BKrKeMKDXPhaXkq7cKTwLmWkFr RIP5 - -You should also raise your quorum to at least three by putting the following in your *rippled.cfg* file: - - [validation_quorum] - 3 - -If you are a validator, you should set your quorum to at least four. - -**IPs** - -A list of Ripple Labs server IP addresses can be found by resolving **r.ripple.com**. You can also add this to your *rippled.cfg* file to ensure you always have several peer connections to Ripple Labs servers: - - [ips] - 54.225.112.220 51235 - 54.225.123.13 51235 - 54.227.239.106 51235 - 107.21.251.218 51235 - 184.73.226.101 51235 - 23.23.201.55 51235 - -**New RocksDB back end** - -RocksDB is based on LevelDB with improvements from Facebook and the community. Preliminary tests show that it stalls less often than HyperLevelDB for our use cases. - -If you are switching over from an existing back end, you have two options. You can remove your old database and let rippled recreate it as it re-syncs, or you can import your old database into the new one. - -To remove your old database, make sure the server is shut down (`rippled stop`). Remove the *db/ledger.db* and *db/transaction.db* files. Remove all the files in your back end store directory (*db/hashnode* by default). Then change your configuration file to use the RocksDB back end and restart. - -To import your old database, start by shutting the server down. Then modify the configuration file by renaming your *\[node\_db\]* stanza to *\[import\_db\]*. Create a new *\[node\_db\]* stanza and specify a RocksDB back end with a different directory. Start the server with the command **rippled --import**. When the import finishes gracefully stop the server (`rippled stop`). Please wait for rippled to stop on its own because it can take several minutes for it to shut down after an import. Remove the old database, put the new database into place, remove the *\[import\_db\]* section, change the *\[node\_db\]* section to refer to the final location, and restart the server. - -The recommended RocksDB configuration is: - - [node_db] - type=RocksDB - path=db/hashnode - open_files=1200 - filter_bits=12 - cache_mb=256 - file_size_mb=8 - file_size_mult=2 - -**Configuring your Node DB** - -You need to configure the [NodeBackEnd](https://wiki.ripple.com/NodeBackEnd) that you want the server to use. See above for an example RocksDB configuration. - -- **Note**: HyperLevelDB and RocksDB are not available on Windows platform. - - ------------------------------------------------------------ - -## Version 0.19 - -rippled version 0.19 has now been released. This release is currently the tip of the [release](https://github.com/ripple/rippled/tree/release) branch and the tag is [0.19.0](https://github.com/ripple/rippled/tree/0.19.0). - -Prior to building, please confirm you have the correct source tree with the `git log` command. The first log entry should be the change setting the version: - - commit 26783607157a8b96e6e754f71565f4eb0134efc1 - Author: Vinnie Falco - Date: Fri Nov 22 23:36:50 2013 -0800 - - Set version to 0.19.0 - -**Significant Changes** - -- Bugfixes and improvements in path finding, path filtering, and payment execution. -- Updates to HyperLevelDB and LevelDB node storage back ends. -- Addition of RocksDB node storage back end. -- New resource manager for tracking server load. -- Fixes for a few bugs that can crashes or inability to serve client requests. - -**Validators** - -Ripple Labs is now running five validators. You can use this template for your `validators.txt` file (or place this in your config file): - - [validators] - n9KPnVLn7ewVzHvn218DcEYsnWLzKerTDwhpofhk4Ym1RUq4TeGw RIP1 - n9LFzWuhKNvXStHAuemfRKFVECLApowncMAM5chSCL9R5ECHGN4V RIP2 - n94rSdgTyBNGvYg8pZXGuNt59Y5bGAZGxbxyvjDaqD9ceRAgD85P RIP3 - n9LeQeDcLDMZKjx1TZtrXoLBLo5q1bR1sUQrWG7tEADFU6R27UBp RIP4 - n9KF6RpvktjNs2MDBkmxpJbup4BKrKeMKDXPhaXkq7cKTwLmWkFr RIP5 - -You should also raise your quorum to at least three by putting the following in your `rippled.cfg` file: - - [validation_quorum] - 3 - -If you are a validator, you should set your quorum to at least four. - -**IPs** - -A list of Ripple Labs server IP addresses can be found by resolving `r.ripple.com`. You can also add this to your `rippled.cfg` file to ensure you always have several peer connections to Ripple Labs servers: - - [ips] - 54.225.112.220 51235 - 54.225.123.13 51235 - 54.227.239.106 51235 - 107.21.251.218 51235 - 184.73.226.101 51235 - 23.23.201.55 51235 - -**New RocksDB back end** - -RocksDB is based on LevelDB with improvements from Facebook and the community. Preliminary tests show that it stall less often than HyperLevelDB. - -If you are switching over from an existing back end, you have two choices. You can remove your old database or you can import it. - -To remove your old database, make sure the server is shutdown. Remove the `db/ledger.db` and `db/transaction.db` files. Remove all the files in your back end store directory, `db/hashnode` by default. Then you can change your configuration file to use the RocksDB back end and restart. - -To import your old database, start by shutting the server down. Then modify the configuration file by renaming your `[node_db]` portion to `[import_db]`. Create a new `[node_db]` section specify a RocksDB back end and a different directory. Start the server with `rippled --import`. When the import finishes, stop the server (it can take several minutes to shut down after an import), remove the old database, put the new database into place, remove the `[import_db]` section, change the `[node_db]` section to refer to the final location, and restart the server. - -The recommended RocksDB configuration is: - - [node_db] - type=RocksDB - path=db/hashnode - open_files=1200 - filter_bits=12 - cache_mb=256 - file_size_mb=8 - file_size_mult=2 - -**Configuring your Node DB** - -You need to configure the [NodeBackEnd](https://wiki.ripple.com/NodeBackEnd) that you want the server to use. See above for an example RocksDB configuration. - -- **Note:** HyperLevelDB and RocksDB are not available on Windows platform. - - ------------------------------------------------------------ - -## Version 0.16 - -rippled version 0.16 has now been released. This release is currently the tip of the [master](https://github.com/ripple/rippled/tree/master) branch and the tag is [v0.16.0](https://github.com/ripple/rippled/tree/v0.16.0). - -Prior to building, please confirm you have the correct source tree with the `git log` command. The first log entry should be the change setting the version: - - commit 15ef43505473225af21bb7b575fb0b628d5e7f73 - Author: vinniefalco - Date: Wed Oct 2 2013 - - Set version to 0.16.0 - -**Significant Changes** - -- Improved peer discovery -- Improved pathfinding -- Ledger speed improvements -- Reduced memory consumption -- Improved server stability -- rippled no longer throws and exception on exiting -- Better error reporting -- Ripple-lib tests have been ported to use the Mocha testing framework - -**Validators** - -Ripple Labs is now running five validators. You can use this template for your `validators.txt` file: - - [validators] - n9KPnVLn7ewVzHvn218DcEYsnWLzKerTDwhpofhk4Ym1RUq4TeGw RIP1 - n9LFzWuhKNvXStHAuemfRKFVECLApowncMAM5chSCL9R5ECHGN4V RIP2 - n94rSdgTyBNGvYg8pZXGuNt59Y5bGAZGxbxyvjDaqD9ceRAgD85P RIP3 - n9LeQeDcLDMZKjx1TZtrXoLBLo5q1bR1sUQrWG7tEADFU6R27UBp RIP4 - n9KF6RpvktjNs2MDBkmxpJbup4BKrKeMKDXPhaXkq7cKTwLmWkFr RIP5 - -You should also raise your quorum to at least three by putting the following in your `rippled.cfg` file: - - [validation_quorum] - 3 - -If you are a validator, you should set your quorum to at least four. - -**IPs** - -A list of Ripple Labs server IP addresses can be found by resolving `r.ripple.com`. You can also add this to your `rippled.cfg` file to ensure you always have several peer connections to Ripple Labs servers: - - [ips] - 54.225.112.220 51235 - 54.225.123.13 51235 - 54.227.239.106 51235 - 107.21.251.218 51235 - 184.73.226.101 51235 - 23.23.201.55 51235 - -**Node DB** - -You need to configure the [NodeBackEnd](https://wiki.ripple.com/NodeBackEnd) that you want the server to use. In most cases, that will mean adding this to your configuration file: - - [node_db] - type=HyperLevelDB - path=db/hashnode - -- NOTE HyperLevelDB is not available on Windows platforms. - -**Release Candidates** - -**Issues** - -None known - - ------------------------------------------------------------ - -## Version 0.14 - -rippled version 0.14 has now been released. This release is currently the tip of the [master](https://github.com/ripple/rippled/tree/master) branch and the tag is [v0.12.0](https://github.com/ripple/rippled/tree/v0.14.0). - -Prior to building, please confirm you have the correct source tree with the `git log` command. The first log entry should be the change setting the version: - - commit b6d11c08d0245ee9bafbb97143f5d685dd2979fc - Author: vinniefalco - Date: Wed Oct 2 2013 - - Set version to 0.14.0 - -**Significant Changes** - -- Improved peer discovery -- Improved pathfinding -- Ledger speed improvements -- Reduced memory consumption -- Improved server stability -- rippled no longer throws and exception on exiting -- Better error reporting -- Ripple-lib tests have been ported to use the Mocha testing framework - -**Validators** - -Ripple Labs is now running five validators. You can use this template for your `validators.txt` file: - - [validators] - n9KPnVLn7ewVzHvn218DcEYsnWLzKerTDwhpofhk4Ym1RUq4TeGw RIP1 - n9LFzWuhKNvXStHAuemfRKFVECLApowncMAM5chSCL9R5ECHGN4V RIP2 - n94rSdgTyBNGvYg8pZXGuNt59Y5bGAZGxbxyvjDaqD9ceRAgD85P RIP3 - n9LeQeDcLDMZKjx1TZtrXoLBLo5q1bR1sUQrWG7tEADFU6R27UBp RIP4 - n9KF6RpvktjNs2MDBkmxpJbup4BKrKeMKDXPhaXkq7cKTwLmWkFr RIP5 - -You should also raise your quorum to at least three by putting the following in your `rippled.cfg` file: - - [validation_quorum] - 3 - -If you are a validator, you should set your quorum to at least four. - -**IPs** - -A list of Ripple Labs server IP addresses can be found by resolving `r.ripple.com`. You can also add this to your `rippled.cfg` file to ensure you always have several peer connections to Ripple Labs servers: - - [ips] - 54.225.112.220 51235 - 54.225.123.13 51235 - 54.227.239.106 51235 - 107.21.251.218 51235 - 184.73.226.101 51235 - 23.23.201.55 51235 - -**Node DB** - -You need to configure the [NodeBackEnd](https://wiki.ripple.com/NodeBackEnd) that you want the server to use. In most cases, that will mean adding this to your configuration file: - - [node_db] - type=HyperLevelDB - path=db/hashnode - -- NOTE HyperLevelDB is not available on Windows platforms. - -**Release Candidates** - -**Issues** - -None known - - ------------------------------------------------------------ - -## Version 0.12 - -rippled version 0.12 has now been released. This release is currently the tip of the [master branch](https://github.com/ripple/rippled/tree/master) and can be found on GitHub. The tag is [v0.12.0](https://github.com/ripple/rippled/tree/v0.12.0). - -Prior to building, please confirm you have the correct source tree with the `git log` command. The first log entry should be the change setting the version: - - commit d0a9da6f16f4083993e4b6c5728777ffebf80f3a - Author: JoelKatz - Date: Mon Aug 26 12:08:05 2013 -0700 - - Set version to v0.12.0 - -**Major Partner Issues Fixed** - -- Server Showing "Offline" - -This issue was caused by LevelDB periodically compacting its internal data structure. While compacting, rippled's processing would stall causing the node to lose sync with the rest of the network. This issue was solved by switching from LevelDB to HyperLevelDB. rippled operators will need to change their ripple.cfg file. See below for configuration details. - -- Premature Validation of Transactions - -On rare occasions, a transaction would show as locally validated before the full network consensus was confirmed. This issue was resolved by changing the way transactions are saved. - -- Missing Ledgers - -Occasionally, some rippled servers would fail to fetch all ledgers. This left gaps in the local history and caused some API calls to report incomplete results. The ledger fetch code was rewritten to both prevent this and to repair any existing gaps. - -**Significant Changes** - -- The way transactions are saved has been changed. This fixes a number of ways transactions can incorrectly be reported as fully-validated. -- `doTransactionEntry` now works against open ledgers. -- `doLedgerEntry` now supports a binary option. -- A bug in `getBookPage` that caused it to skip offers is fixed. -- `getNodeFat` now returns deeper chains, reducing ledger acquire latency. -- Catching up if the (published ledger stream falls behind the network) is now more aggressive. -- I/O stalls are drastically reduced by using the HyperLevelDB node back end. -- Persistent ledger gaps should no longer occur. -- Clusters now exchange load information. - -**Validators** - -Ripple Labs is now running five validators. You can use this template for your `validators.txt` file: - - - - [validators] - n9KPnVLn7ewVzHvn218DcEYsnWLzKerTDwhpofhk4Ym1RUq4TeGw RIP1 - n9LFzWuhKNvXStHAuemfRKFVECLApowncMAM5chSCL9R5ECHGN4V RIP2 - n94rSdgTyBNGvYg8pZXGuNt59Y5bGAZGxbxyvjDaqD9ceRAgD85P RIP3 - n9LeQeDcLDMZKjx1TZtrXoLBLo5q1bR1sUQrWG7tEADFU6R27UBp RIP4 - n9KF6RpvktjNs2MDBkmxpJbup4BKrKeMKDXPhaXkq7cKTwLmWkFr RIP5 - - - -**Update April 2014** - Due to a vulnerability in OpenSSL the validator keys above have been cycled out, the five validators by RippleLabs use the following keys now: - - [validators] - n949f75evCHwgyP4fPVgaHqNHxUVN15PsJEZ3B3HnXPcPjcZAoy7 RL1 - n9MD5h24qrQqiyBC8aeqqCWvpiBiYQ3jxSr91uiDvmrkyHRdYLUj RL2 - n9L81uNCaPgtUJfaHh89gmdvXKAmSt5Gdsw2g1iPWaPkAHW5Nm4C RL3 - n9KiYM9CgngLvtRCQHZwgC2gjpdaZcCcbt3VboxiNFcKuwFVujzS RL4 - n9LdgEtkmGB9E2h3K4Vp7iGUaKuq23Zr32ehxiU8FWY7xoxbWTSA RL5 - -You should also raise your quorum to at least three by putting the following in your `rippled.cfg` file: - - [validation_quorum] - 3 - -If you are a validator, you should set your quorum to at least four. - -**IPs** - -A list of Ripple Labs server IP addresses can be found by resolving `r.ripple.com`. You can also add this to your `rippled.cfg` file to ensure you always have several peer connections to Ripple Labs servers: - - [ips] - 54.225.112.220 51235 - 54.225.123.13 51235 - 54.227.239.106 51235 - 107.21.251.218 51235 - 184.73.226.101 51235 - 23.23.201.55 51235 - -**Node DB** - -You need to configure the [NodeBackEnd](https://wiki.ripple.com/NodeBackEnd) that you want the server to use. In most cases, that will mean adding this to your configuration file: - - [node_db] - type=HyperLevelDB - path=db/hashnode - -- NOTE HyperLevelDB is not available on Windows platforms. - -**Release Candidates** - -RC1 was the first release candidate. - -RC2 fixed a bug that could cause ledger acquires to stall. - -RC3 fixed compilation under OSX. - -RC4 includes performance improvements in countAccountTx and numerous small fixes to ledger acquisition. - -RC5 changed the peer low water mark from 4 to 10 to acquire more server connections. - -RC6 fixed some possible load issues with the network state timer and cluster reporting timers. - -**Issues** - -Fetching of historical ledgers is slower in this build than in previous builds. This is being investigated. diff --git a/SConstruct b/SConstruct deleted file mode 100644 index e7ac3bd309..0000000000 --- a/SConstruct +++ /dev/null @@ -1,1283 +0,0 @@ -# rippled SConstruct -# -''' - - Target Builds - ---------------------------------------------------------------------------- - - Same as 'install' - install Default target and copies it to build/rippled (default) - - all All available variants - debug All available debug variants - release All available release variants - profile All available profile variants - - clang All clang variants - clang.debug clang debug variant - clang.coverage clang coverage variant - clang.release clang release variant - clang.profile clang profile variant - - gcc All gcc variants - gcc.debug gcc debug variant - gcc.coverage gcc coverage variant - gcc.release gcc release variant - gcc.profile gcc profile variant - - msvc All msvc variants - msvc.debug MSVC debug variant - msvc.release MSVC release variant - - vcxproj Generate Visual Studio 2013 project file - - count Show line count metrics - - Any individual target can also have ".nounity" appended for a classic, - non unity build. Example: - - scons gcc.debug.nounity - -If the clang toolchain is detected, then the default target will use it, else -the gcc toolchain will be used. On Windows environments, the MSVC toolchain is -also detected. - -The following environment variables modify the build environment: - CLANG_CC - CLANG_CXX - CLANG_LINK - If set, a clang toolchain will be used. These must all be set together. - - GNU_CC - GNU_CXX - GNU_LINK - If set, a gcc toolchain will be used (unless a clang toolchain is - detected first). These must all be set together. - - CXX - If set, used to detect a toolchain. - - BOOST_ROOT - Path to the boost directory. - OPENSSL_ROOT - Path to the openssl directory. - PROTOBUF_ROOT - Path to the protobuf directory. - CLANG_PROTOBUF_ROOT - Override the path to the protobuf directory for the clang toolset. This is - usually only needed when the installed protobuf library uses a different - ABI than clang (as with ubuntu 15.10). - CLANG_BOOST_ROOT - Override the path to the boost directory for the clang toolset. This is - usually only needed when the installed protobuf library uses a different - ABI than clang (as with ubuntu 15.10). - -The following extra options may be used: - --ninja Generate a `build.ninja` build file for the specified target - (see: https://martine.github.io/ninja/). Only gcc and clang targets - are supported. - - --static On linux, link protobuf, openssl, libc++, and boost statically - - --sanitize=[address, thread] On gcc & clang, add sanitizer instrumentation - - --assert Enable asserts, even in release builds. - -GCC 5: If the gcc toolchain is used, gcc version 5 or better is required. On - linux distros that ship with gcc 4 (ubuntu < 15.10), rippled will force gcc - to use gcc4's ABI (there was an ABI change between versions). This allows us - to use the package manager to install rippled dependencies. It also means if - the user builds C++ dependencies themselves - such as boost - they must - either be built with gcc 4 or with the preprocessor flag - `_GLIBCXX_USE_CXX11_ABI` set to zero. - -Clang on linux: Clang cannot use the new gcc 5 ABI (clang does not know about - the `abi_tag` attribute). On linux distros that ship with the gcc 5 ABI - (ubuntu >= 15.10), building with clang requires building boost and protobuf - with the old ABI (best to build them with clang). It is best to statically - link rippled in this scenario (use the `--static` with scons), as dynamic - linking may use a library with the incorrect ABI. - - -''' -# -''' - -TODO - -- Fix git-describe support -- Fix printing exemplar command lines -- Fix toolchain detection - - -''' -#------------------------------------------------------------------------------- - -import collections -import os -import platform -import subprocess -import sys -import textwrap -import time -import glob -import SCons.Action - -if (not platform.machine().endswith('64')): - print('Warning: Detected {} architecture. Rippled requires a 64-bit OS.'.format( - platform.machine())); - -sys.path.append(os.path.join('src', 'ripple', 'beast', 'site_scons')) -sys.path.append(os.path.join('src', 'ripple', 'site_scons')) - -import Beast -import scons_to_ninja - -#------------------------------------------------------------------------------ - -AddOption('--ninja', dest='ninja', action='store_true', - help='generate ninja build file build.ninja') - -AddOption('--sanitize', dest='sanitize', choices=['address', 'thread'], - help='Build with sanitizer support (gcc and clang only).') - -AddOption('--static', dest='static', action='store_true', - help='On linux, link protobuf, openssl, libc++, and boost statically') - -AddOption('--assert', dest='assert', action='store_true', - help='Enable asserts, even in release mode') - -def parse_time(t): - l = len(t.split()) - if l==5: - return time.strptime(t, '%a %b %d %H:%M:%S %Y') - elif l==3: - return time.strptime(t, '%d %b %Y') - else: - return time.strptime(t, '%a %b %d %H:%M:%S %Z %Y') - -UNITY_BUILD_DIRECTORY = 'src/ripple/unity/' - -def memoize(function): - memo = {} - def wrapper(*args): - if args in memo: - return memo[args] - else: - rv = function(*args) - memo[args] = rv - return rv - return wrapper - -def check_openssl(): - if Beast.system.platform not in ['Debian', 'Ubuntu']: - return - line = subprocess.check_output('openssl version -b'.split()).strip() - check_line = 'built on: ' - if not line.startswith(check_line): - raise Exception("Didn't find any '%s' line in '$ %s'" % - (check_line, 'openssl version -b')) - d = line[len(check_line):] - if 'date unspecified' in d: - words = subprocess.check_output('openssl version'.split()).split() - if len(words)!=5: - raise Exception("Didn't find version date in '$ openssl version'") - d = ' '.join(words[-3:]) - build_time = 'Mon Apr 7 20:33:19 UTC 2014' - if parse_time(d) < parse_time(build_time): - raise Exception('Your openSSL was built on %s; ' - 'rippled needs a version built on or after %s.' - % (line, build_time)) - - -def set_implicit_cache(): - '''Use implicit_cache on some targets to improve build times. - - By default, scons scans each file for include dependecies. The implicit - cache flag lets you cache these dependencies for later builds, and will - only rescan files that change. - - Failure cases are: - 1) If the include search paths are changed (i.e. CPPPATH), then a file - may not be rebuilt. - 2) If a same-named file has been added to a directory that is earlier in - the search path than the directory in which the file was found. - Turn on if this build is for a specific debug target (i.e. clang.debug) - - If one of the failure cases applies, you can force a rescan of dependencies - using the command line option `--implicit-deps-changed` - ''' - if len(COMMAND_LINE_TARGETS) == 1: - s = COMMAND_LINE_TARGETS[0].split('.') - if len(s) > 1 and 'debug' in s: - SetOption('implicit_cache', 1) - - -def import_environ(env): - '''Imports environment settings into the construction environment''' - def set(keys): - if type(keys) == list: - for key in keys: - set(key) - return - if keys in os.environ: - value = os.environ[keys] - env[keys] = value - set(['GNU_CC', 'GNU_CXX', 'GNU_LINK']) - set(['CLANG_CC', 'CLANG_CXX', 'CLANG_LINK']) - -def detect_toolchains(env): - def is_compiler(comp_from, comp_to): - return comp_from and comp_to in comp_from - - def detect_clang(env): - n = sum(x in env for x in ['CLANG_CC', 'CLANG_CXX', 'CLANG_LINK']) - if n > 0: - if n == 3: - return True - raise ValueError('CLANG_CC, CLANG_CXX, and CLANG_LINK must be set together') - cc = env.get('CC') - cxx = env.get('CXX') - link = env.subst(env.get('LINK')) - if (cc and cxx and link and - is_compiler(cc, 'clang') and - is_compiler(cxx, 'clang') and - is_compiler(link, 'clang')): - env['CLANG_CC'] = cc - env['CLANG_CXX'] = cxx - env['CLANG_LINK'] = link - return True - cc = env.WhereIs('clang') - cxx = env.WhereIs('clang++') - link = cxx - if (is_compiler(cc, 'clang') and - is_compiler(cxx, 'clang') and - is_compiler(link, 'clang')): - env['CLANG_CC'] = cc - env['CLANG_CXX'] = cxx - env['CLANG_LINK'] = link - return True - env['CLANG_CC'] = 'clang' - env['CLANG_CXX'] = 'clang++' - env['CLANG_LINK'] = env['LINK'] - return False - - def detect_gcc(env): - n = sum(x in env for x in ['GNU_CC', 'GNU_CXX', 'GNU_LINK']) - if n > 0: - if n == 3: - return True - raise ValueError('GNU_CC, GNU_CXX, and GNU_LINK must be set together') - cc = env.get('CC') - cxx = env.get('CXX') - link = env.subst(env.get('LINK')) - if (cc and cxx and link and - is_compiler(cc, 'gcc') and - is_compiler(cxx, 'g++') and - is_compiler(link, 'g++')): - env['GNU_CC'] = cc - env['GNU_CXX'] = cxx - env['GNU_LINK'] = link - return True - cc = env.WhereIs('gcc') - cxx = env.WhereIs('g++') - link = cxx - if (is_compiler(cc, 'gcc') and - is_compiler(cxx, 'g++') and - is_compiler(link, 'g++')): - env['GNU_CC'] = cc - env['GNU_CXX'] = cxx - env['GNU_LINK'] = link - return True - env['GNU_CC'] = 'gcc' - env['GNU_CXX'] = 'g++' - env['GNU_LINK'] = env['LINK'] - return False - - toolchains = [] - if detect_clang(env): - toolchains.append('clang') - if detect_gcc(env): - toolchains.append('gcc') - if env.Detect('cl'): - toolchains.append('msvc') - return toolchains - -def files(base): - def _iter(base): - for parent, _, files in os.walk(base): - for path in files: - path = os.path.join(parent, path) - yield os.path.normpath(path) - return list(_iter(base)) - -def print_coms(target, source, env): - '''Display command line exemplars for an environment''' - print ('Target: ' + Beast.yellow(str(target[0]))) - # TODO Add 'PROTOCCOM' to this list and make it work - Beast.print_coms(['CXXCOM', 'CCCOM', 'LINKCOM'], env) - -def is_debug_variant(variant): - return variant in ('debug', 'coverage') - -@memoize -def is_ubuntu(): - try: - return "Ubuntu" == subprocess.check_output(['lsb_release', '-si'], - stderr=subprocess.STDOUT).strip() - except: - return False - -@memoize -def use_gcc4_abi(cc_cmd): - if os.getenv('RIPPLED_OLD_GCC_ABI'): - return True - gcc_ver = '' - ubuntu_ver = None - try: - if 'gcc' in cc_cmd: - gcc_ver = subprocess.check_output([cc_cmd, '-dumpversion'], - stderr=subprocess.STDOUT).strip() - else: - gcc_ver = '5' # assume gcc 5 for ABI purposes for clang - - if is_ubuntu(): - ubuntu_ver = float( - subprocess.check_output(['lsb_release', '-sr'], - stderr=subprocess.STDOUT).strip()) - except: - print("Unable to determine gcc version. Assuming native ABI.") - return False - if ubuntu_ver and ubuntu_ver < 15.1 and gcc_ver.startswith('5'): - return True - return False - -#------------------------------------------------------------------------------- - -# Set construction variables for the base environment -def config_base(env): - if False: - env.Replace( - CCCOMSTR='Compiling ' + Beast.blue('$SOURCES'), - CXXCOMSTR='Compiling ' + Beast.blue('$SOURCES'), - LINKCOMSTR='Linking ' + Beast.blue('$TARGET'), - ) - check_openssl() - - env.Append(CPPDEFINES=[ - 'OPENSSL_NO_SSL2' - ,'DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER' - ,{'HAVE_USLEEP' : '1'} - ,{'SOCI_CXX_C11' : '1'} - ,'_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS' - ,'BOOST_NO_AUTO_PTR' - ]) - - if Beast.system.windows: - try: - OPENSSL_ROOT = os.path.normpath(os.environ['OPENSSL_ROOT']) - env.Append(CPPPATH=[ - os.path.join(OPENSSL_ROOT, 'include'), - ]) - env.Append(LIBPATH=[ - os.path.join(OPENSSL_ROOT, 'lib'), - ]) - except KeyError: - pass - elif Beast.system.osx: - try: - openssl = subprocess.check_output(['brew', '--prefix','openssl'], - stderr=subprocess.STDOUT).strip() - env.Prepend(CPPPATH='%s/include' % openssl) - env.Prepend(LIBPATH=['%s/lib' % openssl]) - except: - pass - if not 'vcxproj' in COMMAND_LINE_TARGETS: - env.Append(CPPDEFINES=['NO_LOG_UNHANDLED_EXCEPTIONS']) - - # handle command-line arguments - profile_jemalloc = ARGUMENTS.get('profile-jemalloc') - if profile_jemalloc: - env.Append(CPPDEFINES={'PROFILE_JEMALLOC' : profile_jemalloc}) - env.Append(LIBS=['jemalloc']) - env.Append(LIBPATH=[os.path.join(profile_jemalloc, 'lib')]) - env.Append(CPPPATH=[os.path.join(profile_jemalloc, 'include')]) - env.Append(LINKFLAGS=['-Wl,-rpath,' + os.path.join(profile_jemalloc, 'lib')]) - -def add_static_libs(env, static_libs, dyn_libs=None): - if not 'HASSTATICLIBS' in env: - env['HASSTATICLIBS'] = True - env.Replace(LINKCOM=env['LINKCOM'] + " -Wl,-Bstatic $STATICLIBS -Wl,-Bdynamic $DYNAMICLIBS") - for k,l in [('STATICLIBS', static_libs or []), ('DYNAMICLIBS', dyn_libs or [])]: - c = env.get(k, '') - for f in l: - c += ' -l' + f - env[k] = c - -def get_libs(lib, static): - '''Returns a tuple of lists. The first element is the static libs, - the second element is the dynamic libs - ''' - always_dynamic = ['dl', 'pthread', 'z', # for ubuntu - 'gssapi_krb5', 'krb5', 'com_err', 'k5crypto', # for fedora - ] - try: - cmd = ['pkg-config', '--static', '--libs', lib] - libs = subprocess.check_output(cmd, - stderr=subprocess.STDOUT).strip() - all_libs = [l[2:] for l in libs.split() if l.startswith('-l')] - if not static: - return ([], all_libs) - static_libs = [] - dynamic_libs = [] - for l in all_libs: - if l in always_dynamic: - dynamic_libs.append(l) - else: - static_libs.append(l) - return (static_libs, dynamic_libs) - except Exception as e: - raise Exception('pkg-config failed for ' + lib + '; Exception: ' + str(e)) - -def add_sanitizer (toolchain, env): - san = GetOption('sanitize') - if not san: return - san_to_lib = {'address': 'asan', 'thread': 'tsan'} - if toolchain not in Split('clang gcc'): - raise Exception("Sanitizers are only supported for gcc and clang") - env.Append(CCFLAGS=['-fsanitize='+san, '-fno-omit-frame-pointer']) - env.Append(LINKFLAGS=['-fsanitize='+san]) - add_static_libs(env, [san_to_lib[san]]) - env.Append(CPPDEFINES=['SANITIZER='+san_to_lib[san].upper()]) - -def add_boost_and_protobuf(toolchain, env): - def get_environ_value(candidates): - for c in candidates: - try: - return os.environ[c] - except KeyError: - pass - raise KeyError('Environment variable not set') - - try: - br_cands = ['CLANG_BOOST_ROOT'] if toolchain == 'clang' else [] - br_cands.append('BOOST_ROOT') - BOOST_ROOT = os.path.normpath(get_environ_value(br_cands)) - stage64_path = os.path.join(BOOST_ROOT, 'stage64', 'lib') - if os.path.exists(stage64_path): - env.Append(LIBPATH=[ - stage64_path, - ]) - else: - env.Append(LIBPATH=[ - os.path.join(BOOST_ROOT, 'stage', 'lib'), - ]) - env['BOOST_ROOT'] = BOOST_ROOT - if toolchain in ['gcc', 'clang']: - env.Append(CCFLAGS=['-isystem' + env['BOOST_ROOT']]) - else: - env.Append(CPPPATH=[ - env['BOOST_ROOT'], - ]) - except KeyError: - pass - - try: - pb_cands = ['CLANG_PROTOBUF_ROOT'] if toolchain == 'clang' else [] - pb_cands.append('PROTOBUF_ROOT') - PROTOBUF_ROOT = os.path.normpath(get_environ_value(pb_cands)) - env.Append(LIBPATH=[PROTOBUF_ROOT + '/src/.libs']) - if not should_link_static() and toolchain in['clang', 'gcc']: - env.Append(LINKFLAGS=['-Wl,-rpath,' + PROTOBUF_ROOT + '/src/.libs']) - env['PROTOBUF_ROOT'] = PROTOBUF_ROOT - env.Append(CPPPATH=[env['PROTOBUF_ROOT'] + '/src',]) - except KeyError: - pass - -def enable_asserts (): - return GetOption('assert') - -# Set toolchain and variant specific construction variables -def config_env(toolchain, variant, env): - add_boost_and_protobuf(toolchain, env) - env.Append(CPPDEFINES=[ - 'BOOST_COROUTINE_NO_DEPRECATION_WARNING', - 'BOOST_COROUTINES_NO_DEPRECATION_WARNING' - ]) - if is_debug_variant(variant): - env.Append(CPPDEFINES=['DEBUG', '_DEBUG']) - - elif (variant == 'release' or variant == 'profile') and (not enable_asserts()): - env.Append(CPPDEFINES=['NDEBUG']) - - if should_link_static() and not Beast.system.linux: - raise Exception("Static linking is only implemented for linux.") - - add_sanitizer(toolchain, env) - - if toolchain in Split('clang gcc'): - if Beast.system.linux: - link_static = should_link_static() - for l in ['openssl', 'protobuf']: - static, dynamic = get_libs(l, link_static) - if link_static: - add_static_libs(env, static, dynamic) - else: - env.Append(LIBS=dynamic) - env.ParseConfig('pkg-config --static --cflags ' + l) - - env.Prepend(CFLAGS=['-Wall']) - env.Prepend(CXXFLAGS=['-Wall']) - - env.Append(CCFLAGS=[ - '-Wno-sign-compare', - '-Wno-char-subscripts', - '-Wno-format', - '-g' # generate debug symbols - ]) - - env.Append(LINKFLAGS=[ - '-rdynamic', - '-g', - ]) - - if variant == 'profile': - env.Append(CCFLAGS=[ - '-p', - '-pg', - ]) - env.Append(LINKFLAGS=[ - '-p', - '-pg', - ]) - - if toolchain == 'clang': - env.Append(CCFLAGS=['-Wno-redeclared-class-member']) - env.Append(CPPDEFINES=['BOOST_ASIO_HAS_STD_ARRAY']) - - env.Append(CXXFLAGS=[ - '-frtti', - '-std=c++14', - '-Wno-invalid-offsetof' - ]) - - env.Append(CPPDEFINES=['_FILE_OFFSET_BITS=64']) - - if Beast.system.osx: - env.Append(CPPDEFINES={ - 'BEAST_COMPILE_OBJECTIVE_CPP': 1, - }) - - # These should be the same regardless of platform... - if Beast.system.osx: - env.Append(CCFLAGS=[ - '-Wno-deprecated', - '-Wno-deprecated-declarations', - '-Wno-unused-variable', - '-Wno-unused-function', - ]) - else: - if should_link_static(): - env.Append(LINKFLAGS=[ - '-static-libstdc++', - ]) - if use_gcc4_abi(env['CC'] if 'CC' in env else 'gcc'): - env.Append(CPPDEFINES={ - '-D_GLIBCXX_USE_CXX11_ABI' : 0 - }) - if toolchain == 'gcc': - - env.Append(CCFLAGS=[ - '-Wno-unused-but-set-variable', - '-Wno-deprecated', - ]) - - boost_libs = [ - # resist the temptation to alphabetize these. coroutine - # must come before context. - 'boost_chrono', - 'boost_coroutine', - 'boost_context', - 'boost_date_time', - 'boost_filesystem', - 'boost_program_options', - 'boost_regex', - 'boost_system', - 'boost_thread' - ] - env.Append(LIBS=['dl']) - - if should_link_static(): - add_static_libs(env, boost_libs) - else: - # We prefer static libraries for boost - if env.get('BOOST_ROOT'): - static_libs64 = ['%s/stage64/lib/lib%s.a' % (env['BOOST_ROOT'], l) for - l in boost_libs] - static_libs = ['%s/stage/lib/lib%s.a' % (env['BOOST_ROOT'], l) for - l in boost_libs] - if all(os.path.exists(f) for f in static_libs64): - boost_libs = [File(f) for f in static_libs64] - elif all(os.path.exists(f) for f in static_libs): - boost_libs = [File(f) for f in static_libs] - env.Append(LIBS=boost_libs) - - if Beast.system.osx: - env.Append(LIBS=[ - 'crypto', - 'protobuf', - 'ssl', - ]) - env.Append(FRAMEWORKS=[ - 'AppKit', - 'Foundation' - ]) - else: - env.Append(LIBS=['rt']) - - if variant == 'release': - env.Append(CCFLAGS=[ - '-O3', - '-fno-strict-aliasing' - ]) - - if variant == 'coverage': - env.Append(CXXFLAGS=[ - '-fprofile-arcs', '-ftest-coverage']) - env.Append(LINKFLAGS=[ - '-fprofile-arcs', '-ftest-coverage']) - - if toolchain == 'clang': - if Beast.system.osx: - env.Replace(CC='clang', CXX='clang++', LINK='clang++') - elif 'CLANG_CC' in env and 'CLANG_CXX' in env and 'CLANG_LINK' in env: - env.Replace(CC=env['CLANG_CC'], - CXX=env['CLANG_CXX'], - LINK=env['CLANG_LINK']) - # C and C++ - # Add '-Wshorten-64-to-32' - env.Append(CCFLAGS=[]) - # C++ only - env.Append(CXXFLAGS=[ - '-Wno-mismatched-tags', - '-Wno-deprecated-register', - '-Wno-unused-local-typedefs', - '-Wno-unknown-warning-option', - ]) - - elif toolchain == 'gcc': - if 'GNU_CC' in env and 'GNU_CXX' in env and 'GNU_LINK' in env: - env.Replace(CC=env['GNU_CC'], - CXX=env['GNU_CXX'], - LINK=env['GNU_LINK']) - # Why is this only for gcc?! - env.Append(CCFLAGS=['-Wno-unused-local-typedefs']) - - # If we are in debug mode, use GCC-specific functionality to add - # extra error checking into the code (e.g. std::vector will throw - # for out-of-bounds conditions) - if is_debug_variant(variant): - env.Append(CCFLAGS=[ - '-O0' - ]) - - elif toolchain == 'msvc': - env.Append (CPPPATH=[ - os.path.join('src', 'protobuf', 'src'), - os.path.join('src', 'protobuf', 'vsprojects'), - ]) - env.Append(CCFLAGS=[ - '/bigobj', # Increase object file max size - '/EHa', # ExceptionHandling all - '/fp:precise', # Floating point behavior - '/Gd', # __cdecl calling convention - '/Gm-', # Minimal rebuild: disabled - '/GR', # Enable RTTI - '/Gy-', # Function level linking: disabled - '/FS', - '/MP', # Multiprocessor compilation - '/openmp-', # pragma omp: disabled - '/Zc:forScope', # Language extension: for scope - '/Zi', # Generate complete debug info - '/errorReport:none', # No error reporting to Internet - '/nologo', # Suppress login banner - #'/Fd${TARGET}.pdb', # Path: Program Database (.pdb) - '/W3', # Warning level 3 - '/WX-', # Disable warnings as errors - '/wd"4018"', - '/wd"4244"', - '/wd"4267"', - '/wd"4800"', # Disable C4800 (int to bool performance) - '/wd"4503"', # Disable C4503 (Decorated name length exceeded) - ]) - env.Append(CPPDEFINES={ - '_WIN32_WINNT' : '0x6000', - }) - env.Append(CPPDEFINES=[ - '_SCL_SECURE_NO_WARNINGS', - '_CRT_SECURE_NO_WARNINGS', - 'WIN32_CONSOLE', - 'NOMINMAX' - ]) - if variant == 'debug': - env.Append(LIBS=[ - 'VC/static/ssleay32MTd.lib', - 'VC/static/libeay32MTd.lib', - ]) - else: - env.Append(LIBS=[ - 'VC/static/ssleay32MT.lib', - 'VC/static/libeay32MT.lib', - ]) - env.Append(LIBS=[ - 'legacy_stdio_definitions.lib', - 'Shlwapi.lib', - 'kernel32.lib', - 'user32.lib', - 'gdi32.lib', - 'winspool.lib', - 'comdlg32.lib', - 'advapi32.lib', - 'shell32.lib', - 'ole32.lib', - 'oleaut32.lib', - 'uuid.lib', - 'odbc32.lib', - 'odbccp32.lib', - ]) - env.Append(LINKFLAGS=[ - '/DEBUG', - '/DYNAMICBASE', - '/ERRORREPORT:NONE', - #'/INCREMENTAL', - '/MACHINE:X64', - '/MANIFEST', - #'''/MANIFESTUAC:"level='asInvoker' uiAccess='false'"''', - '/nologo', - '/NXCOMPAT', - '/SUBSYSTEM:CONSOLE', - '/TLBID:1', - ]) - - if variant == 'debug': - env.Append(CCFLAGS=[ - '/GS', # Buffers security check: enable - '/MTd', # Language: Multi-threaded Debug CRT - '/Od', # Optimization: Disabled - '/RTC1', # Run-time error checks: - ]) - env.Append(CPPDEFINES=[ - '_CRTDBG_MAP_ALLOC' - ]) - else: - env.Append(CCFLAGS=[ - '/MT', # Language: Multi-threaded CRT - '/Ox', # Optimization: Full - ]) - - else: - raise SCons.UserError('Unknown toolchain == "%s"' % toolchain) - -#------------------------------------------------------------------------------- - -# Configure the base construction environment -root_dir = Dir('#').srcnode().get_abspath() # Path to this SConstruct file -build_dir = os.path.join('build') - -base = Environment( - toolpath=[os.path.join ('src', 'ripple', 'beast', 'site_scons', 'site_tools')], - tools=['default', 'Protoc', 'VSProject'], - ENV=os.environ, - TARGET_ARCH='x86_64') -import_environ(base) -config_base(base) -base.Append(CPPPATH=[ - 'src', - os.path.join('src', 'beast'), - os.path.join('src', 'beast', 'include'), - os.path.join('src', 'beast', 'extras'), - os.path.join('src', 'nudb', 'include'), - os.path.join(build_dir, 'proto'), - os.path.join('src','soci','src'), - os.path.join('src','soci','include'), - ]) - -base.Decider('MD5-timestamp') -set_implicit_cache() - -# Configure the toolchains, variants, default toolchain, and default target -variants = ['debug', 'coverage', 'release', 'profile'] -all_toolchains = ['clang', 'gcc', 'msvc'] -if Beast.system.osx: - toolchains = ['clang'] - default_toolchain = 'clang' -else: - toolchains = detect_toolchains(base) - if not toolchains: - raise ValueError('No toolchains detected!') - if 'msvc' in toolchains: - default_toolchain = 'msvc' - elif 'gcc' in toolchains: - if 'clang' in toolchains: - cxx = os.environ.get('CXX', 'g++') - default_toolchain = 'clang' if 'clang' in cxx else 'gcc' - else: - default_toolchain = 'gcc' - elif 'clang' in toolchains: - default_toolchain = 'clang' - else: - raise ValueError("Don't understand toolchains in " + str(toolchains)) - -default_tu_style = 'unity' -default_variant = 'release' -default_target = None - -for source in [ - 'src/ripple/proto/ripple.proto', - ]: - base.Protoc([], - source, - PROTOCPROTOPATH=[os.path.dirname(source)], - PROTOCOUTDIR=os.path.join(build_dir, 'proto'), - PROTOCPYTHONOUTDIR=None) - -#------------------------------------------------------------------------------- - -class ObjectBuilder(object): - def __init__(self, env, variant_dirs): - self.env = env - self.variant_dirs = variant_dirs - self.objects = [] - self.child_envs = [] - - def add_source_files(self, *filenames, **kwds): - for filename in filenames: - env = self.env - if kwds: - env = env.Clone() - env.Prepend(**kwds) - self.child_envs.append(env) - o = env.Object(Beast.variantFile(filename, self.variant_dirs)) - self.objects.append(o) - -def list_sources(base, suffixes): - def _iter(base): - for parent, dirs, files in os.walk(base): - files = [f for f in files if not f[0] == '.'] - dirs[:] = [d for d in dirs if not d[0] == '.'] - for path in files: - path = os.path.join(parent, path) - r = os.path.splitext(path) - if r[1] and r[1] in suffixes: - yield os.path.normpath(path) - return list(_iter(base)) - - -def append_sources(result, *filenames, **kwds): - result.append([filenames, kwds]) - - -def get_soci_sources(style): - result = [] - cpp_path = [ - 'src/soci/src/core', - 'src/soci/include/private', - 'src/sqlite', ] - append_sources(result, - 'src/ripple/unity/soci.cpp', - CPPPATH=cpp_path) - if style == 'unity': - append_sources(result, - 'src/ripple/unity/soci_ripple.cpp', - CPPPATH=cpp_path) - return result - -def use_shp(toolchain): - ''' - Return True if we want to use the --system-header-prefix command-line switch - ''' - if toolchain != 'clang': - return False - if use_shp.cache is None: - try: - ver = subprocess.check_output( - ['clang', '--version'], stderr=subprocess.STDOUT).strip() - use_shp.cache = 'version 3.4' not in ver and 'version 3.0' not in ver - except: - use_shp.cache = False - return use_shp.cache -use_shp.cache = None - -def get_common_sources(toolchain): - result = [] - if toolchain == 'msvc': - warning_flags = {} - else: - warning_flags = {'CCFLAGS': ['-Wno-unused-function']} - append_sources( - result, - 'src/ripple/unity/secp256k1.cpp', - CPPPATH=['src/secp256k1'], - **warning_flags) - return result - -def get_classic_sources(toolchain): - result = [] - append_sources( - result, - *list_sources('src/ripple/core', '.cpp'), - CPPPATH=[ - 'src/soci/src/core', - 'src/sqlite'] - ) - append_sources(result, *list_sources('src/ripple/beast/clock', '.cpp')) - append_sources(result, *list_sources('src/ripple/beast/container', '.cpp')) - append_sources(result, *list_sources('src/ripple/beast/insight', '.cpp')) - append_sources(result, *list_sources('src/ripple/beast/net', '.cpp')) - append_sources(result, *list_sources('src/ripple/beast/utility', '.cpp')) - append_sources(result, *list_sources('src/ripple/app', '.cpp')) - append_sources(result, *list_sources('src/ripple/basics', '.cpp')) - append_sources(result, *list_sources('src/ripple/conditions', '.cpp')) - append_sources(result, *list_sources('src/ripple/crypto', '.cpp')) - append_sources(result, *list_sources('src/ripple/json', '.cpp')) - append_sources(result, *list_sources('src/ripple/ledger', '.cpp')) - append_sources(result, *list_sources('src/ripple/legacy', '.cpp')) - append_sources(result, *list_sources('src/ripple/net', '.cpp')) - append_sources(result, *list_sources('src/ripple/overlay', '.cpp')) - append_sources(result, *list_sources('src/ripple/peerfinder', '.cpp')) - append_sources(result, *list_sources('src/ripple/protocol', '.cpp')) - append_sources(result, *list_sources('src/ripple/rpc', '.cpp')) - append_sources(result, *list_sources('src/ripple/shamap', '.cpp')) - append_sources(result, *list_sources('src/ripple/server', '.cpp')) - append_sources(result, *list_sources('src/test/app', '.cpp')) - append_sources(result, *list_sources('src/test/basics', '.cpp')) - append_sources(result, *list_sources('src/test/beast', '.cpp')) - append_sources(result, *list_sources('src/test/conditions', '.cpp')) - append_sources(result, *list_sources('src/test/core', '.cpp')) - append_sources(result, *list_sources('src/test/json', '.cpp')) - append_sources(result, *list_sources('src/test/ledger', '.cpp')) - append_sources(result, *list_sources('src/test/overlay', '.cpp')) - append_sources(result, *list_sources('src/test/peerfinder', '.cpp')) - append_sources(result, *list_sources('src/test/protocol', '.cpp')) - append_sources(result, *list_sources('src/test/resource', '.cpp')) - append_sources(result, *list_sources('src/test/rpc', '.cpp')) - append_sources(result, *list_sources('src/test/server', '.cpp')) - append_sources(result, *list_sources('src/test/shamap', '.cpp')) - append_sources(result, *list_sources('src/test/jtx', '.cpp')) - - - if use_shp(toolchain): - cc_flags = {'CCFLAGS': ['--system-header-prefix=rocksdb2']} - else: - cc_flags = {} - - append_sources( - result, - *(list_sources('src/ripple/nodestore', '.cpp') + list_sources('src/test/nodestore', '.cpp')), - CPPPATH=[ - 'src/rocksdb2/include', - 'src/snappy/snappy', - 'src/snappy/config', - ], - **cc_flags) - - result += get_soci_sources('classic') - result += get_common_sources(toolchain) - - return result - -def get_unity_sources(toolchain): - result = [] - append_sources( - result, - 'src/ripple/beast/unity/beast_insight_unity.cpp', - 'src/ripple/beast/unity/beast_net_unity.cpp', - 'src/ripple/beast/unity/beast_utility_unity.cpp', - 'src/ripple/unity/app_ledger.cpp', - 'src/ripple/unity/app_main.cpp', - 'src/ripple/unity/app_misc.cpp', - 'src/ripple/unity/app_paths.cpp', - 'src/ripple/unity/app_tx.cpp', - 'src/ripple/unity/conditions.cpp', - 'src/ripple/unity/core.cpp', - 'src/ripple/unity/basics.cpp', - 'src/ripple/unity/crypto.cpp', - 'src/ripple/unity/ledger.cpp', - 'src/ripple/unity/net.cpp', - 'src/ripple/unity/overlay.cpp', - 'src/ripple/unity/peerfinder.cpp', - 'src/ripple/unity/json.cpp', - 'src/ripple/unity/protocol.cpp', - 'src/ripple/unity/rpcx.cpp', - 'src/ripple/unity/shamap.cpp', - 'src/ripple/unity/server.cpp', - 'src/test/unity/app_test_unity.cpp', - 'src/test/unity/basics_test_unity.cpp', - 'src/test/unity/beast_test_unity.cpp', - 'src/test/unity/core_test_unity.cpp', - 'src/test/unity/conditions_test_unity.cpp', - 'src/test/unity/json_test_unity.cpp', - 'src/test/unity/ledger_test_unity.cpp', - 'src/test/unity/overlay_test_unity.cpp', - 'src/test/unity/peerfinder_test_unity.cpp', - 'src/test/unity/protocol_test_unity.cpp', - 'src/test/unity/resource_test_unity.cpp', - 'src/test/unity/rpc_test_unity.cpp', - 'src/test/unity/server_test_unity.cpp', - 'src/test/unity/shamap_test_unity.cpp', - 'src/test/unity/support_unity.cpp' - ) - - if use_shp(toolchain): - cc_flags = {'CCFLAGS': ['--system-header-prefix=rocksdb2']} - else: - cc_flags = {} - - append_sources( - result, - 'src/ripple/unity/nodestore.cpp', - 'src/test/unity/nodestore_test_unity.cpp', - CPPPATH=[ - 'src/rocksdb2/include', - 'src/snappy/snappy', - 'src/snappy/config', - ], - **cc_flags) - - result += get_soci_sources('unity') - result += get_common_sources(toolchain) - - return result - -# Declare the targets -aliases = collections.defaultdict(list) -msvc_configs = [] - - -def should_prepare_target(cl_target, - style, toolchain, variant): - if not cl_target: - # default target - return (style == default_tu_style and - toolchain == default_toolchain and - variant == default_variant) - if 'vcxproj' in cl_target: - return toolchain == 'msvc' - s = cl_target.split('.') - if style == 'unity' and 'nounity' in s: - return False - if len(s) == 1: - return ('all' in cl_target or - variant in cl_target or - toolchain in cl_target) - if len(s) == 2 or len(s) == 3: - return s[0] == toolchain and s[1] == variant - - return True # A target we don't know about, better prepare to build it - - -def should_prepare_targets(style, toolchain, variant): - if not COMMAND_LINE_TARGETS: - return should_prepare_target(None, style, toolchain, variant) - for t in COMMAND_LINE_TARGETS: - if should_prepare_target(t, style, toolchain, variant): - return True - -def should_link_static(): - """ - Return True if libraries should be linked statically - - """ - return GetOption('static') - -def should_build_ninja(style, toolchain, variant): - """ - Return True if a ninja build file should be generated. - - Typically, scons will be called as follows to generate a ninja build file: - `scons ninja=1 gcc.debug` where `gcc.debug` may be replaced with any of our - non-visual studio targets. Raise an exception if we cannot generate the - requested ninja build file (for example, if multiple targets are requested). - """ - if not GetOption('ninja'): - return False - if len(COMMAND_LINE_TARGETS) != 1: - raise Exception('Can only generate a ninja file for a single target') - cl_target = COMMAND_LINE_TARGETS[0] - if 'vcxproj' in cl_target: - raise Exception('Cannot generate a ninja file for a vcxproj') - s = cl_target.split('.') - if ( style == 'unity' and 'nounity' in s or - style == 'classic' and 'nounity' not in s or - len(s) == 1 ): - return False - if len(s) == 2 or len(s) == 3: - return s[0] == toolchain and s[1] == variant - return False - -for tu_style in ['classic', 'unity']: - for toolchain in all_toolchains: - for variant in variants: - if not should_prepare_targets(tu_style, toolchain, variant): - continue - if variant in ['profile', 'coverage'] and toolchain == 'msvc': - continue - # Configure this variant's construction environment - env = base.Clone() - config_env(toolchain, variant, env) - variant_name = '%s.%s' % (toolchain, variant) - if tu_style == 'classic': - variant_name += '.nounity' - variant_dir = os.path.join(build_dir, variant_name) - variant_dirs = { - os.path.join(variant_dir, 'src') : - 'src', - os.path.join(variant_dir, 'proto') : - os.path.join (build_dir, 'proto'), - } - for dest, source in variant_dirs.iteritems(): - env.VariantDir(dest, source, duplicate=0) - - object_builder = ObjectBuilder(env, variant_dirs) - - if tu_style == 'classic': - sources = get_classic_sources(toolchain) - else: - sources = get_unity_sources(toolchain) - for s, k in sources: - object_builder.add_source_files(*s, **k) - - if use_shp(toolchain): - cc_flags = {'CCFLAGS': ['--system-header-prefix=rocksdb2']} - else: - cc_flags = {} - - object_builder.add_source_files( - 'src/ripple/beast/unity/beast_hash_unity.cpp', - 'src/ripple/unity/beast.cpp', - 'src/ripple/unity/lz4.c', - 'src/ripple/unity/protobuf.cpp', - 'src/ripple/unity/ripple.proto.cpp', - 'src/ripple/unity/resource.cpp', - **cc_flags - ) - - object_builder.add_source_files( - 'src/sqlite/sqlite_unity.c', - CCFLAGS = ([] if toolchain == 'msvc' else ['-Wno-array-bounds'])) - - if 'gcc' in toolchain: - cc_flags = {'CCFLAGS': ['-Wno-maybe-uninitialized']} - elif use_shp(toolchain): - cc_flags = {'CCFLAGS': ['--system-header-prefix=rocksdb2']} - else: - cc_flags = {} - - object_builder.add_source_files( - 'src/ripple/unity/ed25519_donna.c', - CPPPATH=[ - 'src/ed25519-donna', - ] - ) - - object_builder.add_source_files( - 'src/ripple/unity/rocksdb.cpp', - CPPPATH=[ - 'src/rocksdb2', - 'src/rocksdb2/include', - 'src/snappy/snappy', - 'src/snappy/config', - ], - **cc_flags - ) - - object_builder.add_source_files( - 'src/ripple/unity/snappy.cpp', - CCFLAGS=([] if toolchain == 'msvc' else ['-Wno-unused-function']), - CPPPATH=[ - 'src/snappy/snappy', - 'src/snappy/config', - ] - ) - - if toolchain == "clang" and Beast.system.osx: - object_builder.add_source_files('src/ripple/unity/beastobjc.mm') - - target = env.Program( - target=os.path.join(variant_dir, 'rippled'), - source=object_builder.objects - ) - - if tu_style == default_tu_style: - if toolchain == default_toolchain and ( - variant == default_variant): - default_target = target - install_target = env.Install (build_dir, source=default_target) - env.Alias ('install', install_target) - env.Default (install_target) - aliases['all'].extend(install_target) - if toolchain == 'msvc': - config = env.VSProjectConfig(variant, 'x64', target, env) - msvc_configs.append(config) - if toolchain in toolchains: - aliases['all'].extend(target) - aliases[toolchain].extend(target) - elif toolchain == 'msvc': - config = env.VSProjectConfig(variant + ".classic", 'x64', target, env) - msvc_configs.append(config) - - if toolchain in toolchains: - aliases[variant].extend(target) - env.Alias(variant_name, target) - - # ninja support - if should_build_ninja(tu_style, toolchain, variant): - print('Generating ninja: {}:{}:{}'.format(tu_style, toolchain, variant)) - scons_to_ninja.GenerateNinjaFile( - [object_builder.env] + object_builder.child_envs, - dest_file='build.ninja') - -for key, value in aliases.iteritems(): - env.Alias(key, value) - -vcxproj = base.VSProject( - os.path.join('Builds', 'VisualStudio2015', 'RippleD'), - source = [], - VSPROJECT_ROOT_DIRS = [ - 'build/', - 'src/beast/extras', - 'src/beast/include', - 'src/nudb/include', - 'src', - '.'], - VSPROJECT_CONFIGS = msvc_configs) -base.Alias('vcxproj', vcxproj) - -#------------------------------------------------------------------------------- - -# Adds a phony target to the environment that always builds -# See: http://www.scons.org/wiki/PhonyTargets -def PhonyTargets(env = None, **kw): - if not env: env = DefaultEnvironment() - for target, action in kw.items(): - env.AlwaysBuild(env.Alias(target, [], action)) - -# Build the list of rippled source files that hold unit tests -def do_count(target, source, env): - def list_testfiles(base, suffixes): - def _iter(base): - for parent, _, files in os.walk(base): - for path in files: - path = os.path.join(parent, path) - r = os.path.splitext(path) - if r[1] in suffixes: - if r[0].endswith('_test'): - yield os.path.normpath(path) - return list(_iter(base)) - testfiles = list_testfiles(os.path.join('src', 'test'), env.get('CPPSUFFIXES')) - lines = 0 - for f in testfiles: - lines = lines + sum(1 for line in open(f)) - print "Total unit test lines: %d" % lines - -PhonyTargets(env, count = do_count) diff --git a/src/beast/TODO.txt b/TODO.txt similarity index 100% rename from src/beast/TODO.txt rename to TODO.txt diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index b02dd95879..0000000000 --- a/appveyor.yml +++ /dev/null @@ -1,134 +0,0 @@ -# Set environment variables. -environment: - PYTHON: C:/Python27-x64 - - # We bundle up protoc.exe and only the parts of boost and openssl we need so - # that it's a small download. We also use appveyor's free cache, avoiding fees - # downloading from S3 each time. - # TODO: script to create this package. - RIPPLED_DEPS_PATH: rippled_deps15.02 - RIPPLED_DEPS_URL: https://ripple.github.io/Downloads/appveyor/%RIPPLED_DEPS_PATH%.zip - - # Other dependencies we just download each time. - PIP_PATH: get-pip.py - PIP_URL: https://bootstrap.pypa.io/%PIP_PATH% - # The % in this URL messes up variable substition, so any updates will - # need to update both PYWIN32_PATH and PYWIN32_URL - PYWIN32_PATH: pywin32-220.win-amd64-py2.7.exe - PYWIN32_URL: https://downloads.sourceforge.net/project/pywin32/pywin32/Build%20220/pywin32-220.win-amd64-py2.7.exe - - # Scons honours these environment variables, setting the include/lib paths. - BOOST_ROOT: C:/%RIPPLED_DEPS_PATH%/boost - OPENSSL_ROOT: C:/%RIPPLED_DEPS_PATH%/openssl - - matrix: - # This build works, but our current Appveyor config runs matrix builds - # sequentially, and the one build is already slow enough. - # - build: scons - # target: msvc.debug - - build: cmake - target: msvc.debug - buildconfig: Debug - -os: Visual Studio 2015 - -# At the end of each successful build we cache this directory. -# https://www.appveyor.com/docs/build-cache/ -# Resulting archive should not exceed 100 MB. -cache: - - 'C:\%RIPPLED_DEPS_PATH%' - - '%PIP_PATH%' - - '%PYWIN32_PATH%' - -# This means we'll download a zip of the branch we want, rather than the full -# history. -shallow_clone: true - -install: - # We want easy_install, python and protoc.exe on PATH. - - SET PATH=%PYTHON%;%PYTHON%/Scripts;C:/%RIPPLED_DEPS_PATH%;%PATH% - - # `ps` prefix means the command is executed by powershell. - - ps: | - if ($env:build -eq "scons") { - if(-not(Test-Path $env:PIP_PATH)) { - echo "Download from $env:PIP_URL" - Start-FileDownload $env:PIP_URL - } - if(-not(Test-Path $env:PYWIN32_PATH)) { - echo "Download from $env:PYWIN32_URL" - Start-FileDownload $env:PYWIN32_URL - } - } - - bin/ci/windows/install-dependencies.bat - - # Download dependencies if appveyor didn't restore them from the cache. - # Use 7zip to unzip. - - ps: | - if (-not(Test-Path 'C:/$env:RIPPLED_DEPS_PATH')) { - echo "Download from $env:RIPPLED_DEPS_URL" - Start-FileDownload "$env:RIPPLED_DEPS_URL" - 7z x "$($env:RIPPLED_DEPS_PATH).zip" -oC:\ -y > $null - if ($LastExitCode -ne 0) { throw "7z failed" } - } - - # Newer DEPS include a versions file. - # Dump it so we can verify correct behavior. - - ps: | - if (Test-Path "C:/$env:RIPPLED_DEPS_PATH/versions.txt") { - cat "C:/$env:RIPPLED_DEPS_PATH/versions.txt" - } - -# TODO: This is giving me grief -# artifacts: -# # Save rippled.exe in the cloud after each build. -# - path: "build\\rippled.exe" - -build_script: - # We set the environment variables needed to put compilers on the PATH. - - '"%VS140COMNTOOLS%../../VC/vcvarsall.bat" x86_amd64' - # Show which version of the compiler we are using. - - cl - - ps: | - if ($env:build -eq "scons") { - # Build with scons - scons $env:target -j%NUMBER_OF_PROCESSORS% - if ($LastExitCode -ne 0) { throw "scons build failed" } - } - else - { - # Build with cmake - cmake --version - $cmake_target="$($env:target).ci" - "$cmake_target" - New-Item -ItemType Directory -Force -Path "build/$cmake_target" - Push-Location "build/$cmake_target" - cmake -G"Visual Studio 14 2015 Win64" -Dtarget="$cmake_target" ../.. - if ($LastExitCode -ne 0) { throw "CMake failed" } - cmake --build . --config $env:buildconfig -- -m - if ($LastExitCode -ne 0) { throw "CMake build failed" } - Pop-Location - } - -after_build: - - ps: | - if ($env:build -eq "scons") { - cp build/$($env:target)/rippled.exe build - ls build - $exe="build/rippled" - } - else - { - $exe="build/$cmake_target/$env:buildconfig/rippled" - } - "Exe is at $exe" - -test_script: - - ps: | - & { - # Run the rippled unit tests - & $exe --unittest - # https://connect.microsoft.com/PowerShell/feedback/details/751703/option-to-stop-script-if-command-line-exe-fails - if ($LastExitCode -ne 0) { throw "Unit tests failed" } - } - diff --git a/bin/LT b/bin/LT deleted file mode 120000 index 876ec9006d..0000000000 --- a/bin/LT +++ /dev/null @@ -1 +0,0 @@ -python/LedgerTool.py \ No newline at end of file diff --git a/bin/browser.js b/bin/browser.js deleted file mode 100755 index 81618bd002..0000000000 --- a/bin/browser.js +++ /dev/null @@ -1,470 +0,0 @@ -#!/usr/bin/node -// -// ledger?l=L -// transaction?h=H -// ledger_entry?l=L&h=H -// account?l=L&a=A -// directory?l=L&dir_root=H&i=I -// directory?l=L&o=A&i=I // owner directory -// offer?l=L&offer=H -// offer?l=L&account=A&i=I -// ripple_state=l=L&a=A&b=A&c=C -// account_lines?l=L&a=A -// -// A=address -// C=currency 3 letter code -// H=hash -// I=index -// L=current | closed | validated | index | hash -// - -var async = require("async"); -var extend = require("extend"); -var http = require("http"); -var url = require("url"); - -var Remote = require("ripple-lib").Remote; - -var program = process.argv[1]; - -var httpd_response = function (res, opts) { - var self=this; - - res.statusCode = opts.statusCode; - res.end( - "" - + "Title" - + "" - + "State:" + self.state - + "

" - + (opts.body || '') - + '
'
-      + (opts.url || '')
-      + '
' - + "" - + "" - ); -}; - -var html_link = function (generic) { - return '' + generic + ''; -}; - -// Build a link to a type. -var build_uri = function (params, opts) { - var c; - - if (params.type === 'account') { - c = { - pathname: 'account', - query: { - l: params.ledger, - a: params.account, - }, - }; - - } else if (params.type === 'ledger') { - c = { - pathname: 'ledger', - query: { - l: params.ledger, - }, - }; - - } else if (params.type === 'transaction') { - c = { - pathname: 'transaction', - query: { - h: params.hash, - }, - }; - } else { - c = {}; - } - - opts = opts || {}; - - c.protocol = "http"; - c.hostname = opts.hostname || self.base.hostname; - c.port = opts.port || self.base.port; - - return url.format(c); -}; - -var build_link = function (item, link) { -console.log(link); - return "" + item + ""; -}; - -var rewrite_field = function (type, obj, field, opts) { - if (field in obj) { - obj[field] = rewrite_type(type, obj[field], opts); - } -}; - -var rewrite_type = function (type, obj, opts) { - if ('amount' === type) { - if ('string' === typeof obj) { - // XRP. - return '' + obj + ''; - - } else { - rewrite_field('address', obj, 'issuer', opts); - - return obj; - } - return build_link( - obj, - build_uri({ - type: 'account', - account: obj - }, opts) - ); - } - if ('address' === type) { - return build_link( - obj, - build_uri({ - type: 'account', - account: obj - }, opts) - ); - } - else if ('ledger' === type) { - return build_link( - obj, - build_uri({ - type: 'ledger', - ledger: obj, - }, opts) - ); - } - else if ('node' === type) { - // A node - if ('PreviousTxnID' in obj) - obj.PreviousTxnID = rewrite_type('transaction', obj.PreviousTxnID, opts); - - if ('Offer' === obj.LedgerEntryType) { - if ('NewFields' in obj) { - if ('TakerGets' in obj.NewFields) - obj.NewFields.TakerGets = rewrite_type('amount', obj.NewFields.TakerGets, opts); - - if ('TakerPays' in obj.NewFields) - obj.NewFields.TakerPays = rewrite_type('amount', obj.NewFields.TakerPays, opts); - } - } - - obj.LedgerEntryType = '' + obj.LedgerEntryType + ''; - - return obj; - } - else if ('transaction' === type) { - // Reference to a transaction. - return build_link( - obj, - build_uri({ - type: 'transaction', - hash: obj - }, opts) - ); - } - - return 'ERROR: ' + type; -}; - -var rewrite_object = function (obj, opts) { - var out = extend({}, obj); - - rewrite_field('address', out, 'Account', opts); - - rewrite_field('ledger', out, 'parent_hash', opts); - rewrite_field('ledger', out, 'ledger_index', opts); - rewrite_field('ledger', out, 'ledger_current_index', opts); - rewrite_field('ledger', out, 'ledger_hash', opts); - - if ('ledger' in obj) { - // It's a ledger header. - out.ledger = rewrite_object(out.ledger, opts); - - if ('ledger_hash' in out.ledger) - out.ledger.ledger_hash = '' + out.ledger.ledger_hash + ''; - - delete out.ledger.hash; - delete out.ledger.totalCoins; - } - - if ('TransactionType' in obj) { - // It's a transaction. - out.TransactionType = '' + obj.TransactionType + ''; - - rewrite_field('amount', out, 'TakerGets', opts); - rewrite_field('amount', out, 'TakerPays', opts); - rewrite_field('ledger', out, 'inLedger', opts); - - out.meta.AffectedNodes = out.meta.AffectedNodes.map(function (node) { - var kind = 'CreatedNode' in node - ? 'CreatedNode' - : 'ModifiedNode' in node - ? 'ModifiedNode' - : 'DeletedNode' in node - ? 'DeletedNode' - : undefined; - - if (kind) { - node[kind] = rewrite_type('node', node[kind], opts); - } - return node; - }); - } - else if ('node' in obj && 'LedgerEntryType' in obj.node) { - // Its a ledger entry. - - if (obj.node.LedgerEntryType === 'AccountRoot') { - rewrite_field('address', out.node, 'Account', opts); - rewrite_field('transaction', out.node, 'PreviousTxnID', opts); - rewrite_field('ledger', out.node, 'PreviousTxnLgrSeq', opts); - } - - out.node.LedgerEntryType = '' + out.node.LedgerEntryType + ''; - } - - return out; -}; - -var augment_object = function (obj, opts, done) { - if (obj.node.LedgerEntryType == 'AccountRoot') { - var tx_hash = obj.node.PreviousTxnID; - var tx_ledger = obj.node.PreviousTxnLgrSeq; - - obj.history = []; - - async.whilst( - function () { return tx_hash; }, - function (callback) { -// console.log("augment_object: request: %s %s", tx_hash, tx_ledger); - opts.remote.request_tx(tx_hash) - .on('success', function (m) { - tx_hash = undefined; - tx_ledger = undefined; - -//console.log("augment_object: ", JSON.stringify(m)); - m.meta.AffectedNodes.filter(function(n) { -// console.log("augment_object: ", JSON.stringify(n)); -// if (n.ModifiedNode) -// console.log("augment_object: %s %s %s %s %s %s/%s", 'ModifiedNode' in n, n.ModifiedNode && (n.ModifiedNode.LedgerEntryType === 'AccountRoot'), n.ModifiedNode && n.ModifiedNode.FinalFields && (n.ModifiedNode.FinalFields.Account === obj.node.Account), Object.keys(n)[0], n.ModifiedNode && (n.ModifiedNode.LedgerEntryType), obj.node.Account, n.ModifiedNode && n.ModifiedNode.FinalFields && n.ModifiedNode.FinalFields.Account); -// if ('ModifiedNode' in n && n.ModifiedNode.LedgerEntryType === 'AccountRoot') -// { -// console.log("***: ", JSON.stringify(m)); -// console.log("***: ", JSON.stringify(n)); -// } - return 'ModifiedNode' in n - && n.ModifiedNode.LedgerEntryType === 'AccountRoot' - && n.ModifiedNode.FinalFields - && n.ModifiedNode.FinalFields.Account === obj.node.Account; - }) - .forEach(function (n) { - tx_hash = n.ModifiedNode.PreviousTxnID; - tx_ledger = n.ModifiedNode.PreviousTxnLgrSeq; - - obj.history.push({ - tx_hash: tx_hash, - tx_ledger: tx_ledger - }); -console.log("augment_object: next: %s %s", tx_hash, tx_ledger); - }); - - callback(); - }) - .on('error', function (m) { - callback(m); - }) - .request(); - }, - function (err) { - if (err) { - done(); - } - else { - async.forEach(obj.history, function (o, callback) { - opts.remote.request_account_info(obj.node.Account) - .ledger_index(o.tx_ledger) - .on('success', function (m) { -//console.log("augment_object: ", JSON.stringify(m)); - o.Balance = m.account_data.Balance; -// o.account_data = m.account_data; - callback(); - }) - .on('error', function (m) { - o.error = m; - callback(); - }) - .request(); - }, - function (err) { - done(err); - }); - } - }); - } - else { - done(); - } -}; - -if (process.argv.length < 4 || process.argv.length > 7) { - console.log("Usage: %s ws_ip ws_port [ [ []]]", program); -} -else { - var ws_ip = process.argv[2]; - var ws_port = process.argv[3]; - var ip = process.argv.length > 4 ? process.argv[4] : "127.0.0.1"; - var port = process.argv.length > 5 ? process.argv[5] : "8080"; - -// console.log("START"); - var self = this; - - var remote = (new Remote({ - websocket_ip: ws_ip, - websocket_port: ws_port, - trace: false - })) - .on('state', function (m) { - console.log("STATE: %s", m); - - self.state = m; - }) -// .once('ledger_closed', callback) - .connect() - ; - - self.base = { - hostname: ip, - port: port, - remote: remote, - }; - -// console.log("SERVE"); - var server = http.createServer(function (req, res) { - var input = ""; - - req.setEncoding(); - - req.on('data', function (buffer) { - // console.log("DATA: %s", buffer); - input = input + buffer; - }); - - req.on('end', function () { - // console.log("URL: %s", req.url); - // console.log("HEADERS: %s", JSON.stringify(req.headers, undefined, 2)); - - var _parsed = url.parse(req.url, true); - var _url = JSON.stringify(_parsed, undefined, 2); - - // console.log("HEADERS: %s", JSON.stringify(_parsed, undefined, 2)); - if (_parsed.pathname === "/account") { - var request = remote - .request_ledger_entry('account_root') - .ledger_index(-1) - .account_root(_parsed.query.a) - .on('success', function (m) { - // console.log("account_root: %s", JSON.stringify(m, undefined, 2)); - - augment_object(m, self.base, function() { - httpd_response(res, - { - statusCode: 200, - url: _url, - body: "
"
-                              + JSON.stringify(rewrite_object(m, self.base), undefined, 2)
-                              + "
" - }); - }); - }) - .request(); - - } else if (_parsed.pathname === "/ledger") { - var request = remote - .request_ledger(undefined, { expand: true, transactions: true }) - .on('success', function (m) { - // console.log("Ledger: %s", JSON.stringify(m, undefined, 2)); - - httpd_response(res, - { - statusCode: 200, - url: _url, - body: "
"
-                          + JSON.stringify(rewrite_object(m, self.base), undefined, 2)
-                          +"
" - }); - }) - - if (_parsed.query.l && _parsed.query.l.length === 64) { - request.ledger_hash(_parsed.query.l); - } - else if (_parsed.query.l) { - request.ledger_index(Number(_parsed.query.l)); - } - else { - request.ledger_index(-1); - } - - request.request(); - - } else if (_parsed.pathname === "/transaction") { - var request = remote - .request_tx(_parsed.query.h) -// .request_transaction_entry(_parsed.query.h) -// .ledger_select(_parsed.query.l) - .on('success', function (m) { - // console.log("transaction: %s", JSON.stringify(m, undefined, 2)); - - httpd_response(res, - { - statusCode: 200, - url: _url, - body: "
"
-                            + JSON.stringify(rewrite_object(m, self.base), undefined, 2)
-                            +"
" - }); - }) - .on('error', function (m) { - httpd_response(res, - { - statusCode: 200, - url: _url, - body: "
"
-                            + 'ERROR: ' + JSON.stringify(m, undefined, 2)
-                            +"
" - }); - }) - .request(); - - } else { - var test = build_uri({ - type: 'account', - ledger: 'closed', - account: 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', - }, self.base); - - httpd_response(res, - { - statusCode: req.url === "/" ? 200 : 404, - url: _url, - }); - } - }); - }); - - server.listen(port, ip, undefined, - function () { - console.log("Listening at: http://%s:%s", ip, port); - }); -} - -// vim:sw=2:sts=2:ts=8:et diff --git a/bin/ci/ubuntu/build-and-test.sh b/bin/ci/ubuntu/build-and-test.sh deleted file mode 100755 index 3f0a494256..0000000000 --- a/bin/ci/ubuntu/build-and-test.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/bash -u -# We use set -e and bash with -u to bail on first non zero exit code of any -# processes launched or upon any unbound variable. -# We use set -x to print commands before running them to help with -# debugging. -set -ex -__dirname=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) -echo "using CC: $CC" -echo "using TARGET: $TARGET" - -# Ensure APP defaults to rippled if it's not set. -: ${APP:=rippled} -if [[ ${BUILD:-scons} == "cmake" ]]; then - echo "cmake building ${APP}" - CMAKE_TARGET=$CC.$TARGET - if [[ ${CI:-} == true ]]; then - CMAKE_TARGET=$CMAKE_TARGET.ci - fi - mkdir -p "build/${CMAKE_TARGET}" - pushd "build/${CMAKE_TARGET}" - cmake ../.. -Dtarget=$CMAKE_TARGET - cmake --build . -- -j${NUM_PROCESSORS:-2} - popd - export APP_PATH="$PWD/build/${CMAKE_TARGET}/${APP}" - echo "using APP_PATH: $APP_PATH" - -else - export APP_PATH="$PWD/build/$CC.$TARGET/${APP}" - echo "using APP_PATH: $APP_PATH" - # Make sure vcxproj is up to date - scons vcxproj - git diff --exit-code - # $CC will be either `clang` or `gcc` - # http://docs.travis-ci.com/user/migrating-from-legacy/?utm_source=legacy-notice&utm_medium=banner&utm_campaign=legacy-upgrade - # indicates that 2 cores are available to containers. - scons -j${NUM_PROCESSORS:-2} $CC.$TARGET -fi -# We can be sure we're using the build/$CC.$TARGET variant -# (-f so never err) -rm -f build/${APP} - -# See what we've actually built -ldd $APP_PATH - -if [[ ${APP} == "rippled" ]]; then - export APP_ARGS="--unittest" - # Only report on src/ripple files - export LCOV_FILES="*/src/ripple/*" - # Nothing to explicitly exclude - export LCOV_EXCLUDE_FILES="LCOV_NO_EXCLUDE" -else - : ${APP_ARGS:=} - : ${LCOV_FILES:="*/src/*"} - # Don't exclude anything - : ${LCOV_EXCLUDE_FILES:="LCOV_NO_EXCLUDE"} -fi - -if [[ $TARGET == "coverage" ]]; then - export PATH=$PATH:$LCOV_ROOT/usr/bin - - # Create baseline coverage data file - lcov --no-external -c -i -d . -o baseline.info -fi - -# Execute unit tests under gdb, printing a call stack -# if we get a crash. -gdb -return-child-result -quiet -batch \ - -ex "set env MALLOC_CHECK_=3" \ - -ex "set print thread-events off" \ - -ex run \ - -ex "thread apply all backtrace full" \ - -ex "quit" \ - --args $APP_PATH --unittest - -if [[ $TARGET == "coverage" ]]; then - # Create test coverage data file - lcov --no-external -c -d . -o tests.info - - # Combine baseline and test coverage data - lcov -a baseline.info -a tests.info -o lcov-all.info - - # Included files - lcov -e "lcov-all.info" "${LCOV_FILES}" -o lcov.pre.info - - # Excluded files - lcov --remove lcov.pre.info "${LCOV_EXCLUDE_FILES}" -o lcov.info - - # Push the results (lcov.info) to codecov - codecov -X gcov # don't even try and look for .gcov files ;) -fi - - diff --git a/bin/ci/ubuntu/install-dependencies.sh b/bin/ci/ubuntu/install-dependencies.sh deleted file mode 100755 index f993210169..0000000000 --- a/bin/ci/ubuntu/install-dependencies.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash -u -# Exit if anything fails. Echo commands to aid debugging. -set -ex - -# Target working dir - defaults to current dir. -# Can be set from caller, or in the first parameter -TWD=$( cd ${TWD:-${1:-${PWD:-$( pwd )}}}; pwd ) -echo "Target path is: $TWD" -# Override gcc version to $GCC_VER. -# Put an appropriate symlink at the front of the path. -mkdir -v $HOME/bin -for g in gcc g++ gcov gcc-ar gcc-nm gcc-ranlib -do - test -x $( type -p ${g}-$GCC_VER ) - ln -sv $(type -p ${g}-$GCC_VER) $HOME/bin/${g} -done - -if [[ -n ${CLANG_VER:-} ]]; then - # There are cases where the directory exists, but the exe is not available. - # Use this workaround for now. - if [[ ! -x ${TWD}/llvm-${LLVM_VERSION}/bin/llvm-config && -d ${TWD}/llvm-${LLVM_VERSION} ]]; then - rm -fr ${TWD}/llvm-${LLVM_VERSION} - fi - if [[ ! -d ${TWD}/llvm-${LLVM_VERSION} ]]; then - mkdir ${TWD}/llvm-${LLVM_VERSION} - LLVM_URL="http://llvm.org/releases/${LLVM_VERSION}/clang+llvm-${LLVM_VERSION}-x86_64-linux-gnu-ubuntu-14.04.tar.xz" - wget -O - ${LLVM_URL} | tar -Jxvf - --strip 1 -C ${TWD}/llvm-${LLVM_VERSION} - fi - ${TWD}/llvm-${LLVM_VERSION}/bin/llvm-config --version; - export LLVM_CONFIG="${TWD}/llvm-${LLVM_VERSION}/bin/llvm-config"; -fi - -if [[ ${BUILD:-} == cmake ]]; then - # There are cases where the directory exists, but the exe is not available. - # Use this workaround for now. - if [[ ! -x ${TWD}/cmake/bin/cmake && -d ${TWD}/cmake ]]; then - rm -fr ${TWD}/cmake - fi - if [[ ! -d ${TWD}/cmake ]]; then - CMAKE_URL="https://www.cmake.org/files/v3.6/cmake-3.6.1-Linux-x86_64.tar.gz" - wget --version - # wget version 1.13.4 thinks this certificate is invalid, even though it's fine. - # "ERROR: no certificate subject alternative name matches" - # See also: https://github.com/travis-ci/travis-ci/issues/5059 - mkdir ${TWD}/cmake && - wget -O - --no-check-certificate ${CMAKE_URL} | tar --strip-components=1 -xz -C ${TWD}/cmake - cmake --version - fi -fi - -# What versions are we ACTUALLY running? -if [ -x $HOME/bin/g++ ]; then - $HOME/bin/g++ -v -fi - -pip install --user https://github.com/codecov/codecov-python/archive/master.zip - -bash bin/sh/install-boost.sh - -# Install lcov -# Download the archive -wget https://github.com/linux-test-project/lcov/releases/download/v1.12/lcov-1.12.tar.gz -# Extract to ~/lcov-1.12 -tar xfvz lcov-1.12.tar.gz -C $HOME -# Set install path -mkdir -p $LCOV_ROOT -cd $HOME/lcov-1.12 && make install PREFIX=$LCOV_ROOT diff --git a/bin/ci/windows/install-dependencies.bat b/bin/ci/windows/install-dependencies.bat deleted file mode 100644 index 407faf0005..0000000000 --- a/bin/ci/windows/install-dependencies.bat +++ /dev/null @@ -1,13 +0,0 @@ -if "%build%" == "scons" ( - rem Installing pip will install setuptools/easy_install. - python "%PIP_PATH%" - - rem Pip has some problems installing scons on windows so we use easy install. - rem - easy_install scons - rem Workaround - easy_install https://pypi.python.org/packages/source/S/SCons/scons-2.5.0.tar.gz#md5=bda5530a70a41a7831d83c8b191c021e - - rem Scons has problems with parallel builds on windows without pywin32. - easy_install "%PYWIN32_PATH%" - rem (easy_install can do headless installs of .exe wizards) -) diff --git a/bin/debug_local_sign.js b/bin/debug_local_sign.js deleted file mode 100644 index 24f9aab481..0000000000 --- a/bin/debug_local_sign.js +++ /dev/null @@ -1,64 +0,0 @@ -var ripple = require('ripple-lib'); - -var v = { - seed: "snoPBrXtMeMyMHUVTgbuqAfg1SUTb", - addr: "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh" -}; - -var remote = ripple.Remote.from_config({ - "trusted" : true, - "websocket_ip" : "127.0.0.1", - "websocket_port" : 5006, - "websocket_ssl" : false, - "local_signing" : true -}); - -var tx_json = { - "Account" : v.addr, - "Amount" : "10000000", - "Destination" : "rEu2ULPiEQm1BAL8pYzmXnNX1aFX9sCks", - "Fee" : "10", - "Flags" : 0, - "Sequence" : 3, - "TransactionType" : "Payment" - - //"SigningPubKey": '0396941B22791A448E5877A44CE98434DB217D6FB97D63F0DAD23BE49ED45173C9' -}; - -remote.on('connected', function () { - var req = remote.request_sign(v.seed, tx_json); - req.message.debug_signing = true; - req.on('success', function (result) { - console.log("SERVER RESULT"); - console.log(result); - - var sim = {}; - var tx = remote.transaction(); - tx.tx_json = tx_json; - tx._secret = v.seed; - tx.complete(); - var unsigned = tx.serialize().to_hex(); - tx.sign(); - - sim.tx_blob = tx.serialize().to_hex(); - sim.tx_json = tx.tx_json; - sim.tx_signing_hash = tx.signing_hash().to_hex(); - sim.tx_unsigned = unsigned; - - console.log("\nLOCAL RESULT"); - console.log(sim); - - remote.connect(false); - }); - req.on('error', function (err) { - if (err.error === "remoteError" && err.remote.error === "srcActNotFound") { - console.log("Please fund account "+v.addr+" to run this test."); - } else { - console.log('error', err); - } - remote.connect(false); - }); - req.request(); - -}); -remote.connect(); diff --git a/bin/email_hash.js b/bin/email_hash.js deleted file mode 100755 index ab4f97c47b..0000000000 --- a/bin/email_hash.js +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/node -// -// Returns a Gravatar style hash as per: http://en.gravatar.com/site/implement/hash/ -// - -if (3 != process.argv.length) { - process.stderr.write("Usage: " + process.argv[1] + " email_address\n\nReturns gravatar style hash.\n"); - process.exit(1); - -} else { - var md5 = require('crypto').createHash('md5'); - - md5.update(process.argv[2].trim().toLowerCase()); - - process.stdout.write(md5.digest('hex') + "\n"); -} - -// vim:sw=2:sts=2:ts=8:et diff --git a/bin/flash_policy.js b/bin/flash_policy.js deleted file mode 100755 index e1361d46dc..0000000000 --- a/bin/flash_policy.js +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/node -// -// This program allows IE 9 ripple-clients to make websocket connections to -// rippled using flash. As IE 9 does not have websocket support, this required -// if you wish to support IE 9 ripple-clients. -// -// http://www.lightsphere.com/dev/articles/flash_socket_policy.html -// -// For better security, be sure to set the Port below to the port of your -// [websocket_public_port]. -// - -var net = require("net"), - port = "*", - domains = ["*:"+port]; // Domain:Port - -net.createServer( - function(socket) { - socket.write("\n"); - socket.write("\n"); - socket.write("\n"); - domains.forEach( - function(domain) { - var parts = domain.split(':'); - socket.write("\t\n"); - } - ); - socket.write("\n"); - socket.end(); - } -).listen(843); diff --git a/bin/getInfoRippled.sh b/bin/getInfoRippled.sh deleted file mode 100644 index aa759729c9..0000000000 --- a/bin/getInfoRippled.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env bash - -rippled_exe=/opt/ripple/bin/rippled -conf_file=/etc/opt/ripple/rippled.cfg - -while getopts ":e:c:" opt; do - case $opt in - e) - rippled_exe=${OPTARG} - ;; - c) - conf_file=${OPTARG} - ;; - \?) - echo "Invalid option: -$OPTARG" - esac -done - -tmp_loc=$(mktemp -d --tmpdir ripple_info.XXXX) -cd /tmp -chmod 751 ripple_info.* -cd ~ -echo ${tmp_loc} - -cleaned_conf=${tmp_loc}/cleaned_rippled_cfg.txt - -if [[ -f ${conf_file} ]] -then - db=$(sed -r -e 's/\/secretsecretsecretsecretmaybe/g' ${conf_file} |\ - awk -v OUT_FILE=${cleaned_conf} ' - BEGIN {skip=0; db_path="";print > OUT_FILE} - /^\[validation_seed\]/ {skip=1; next} - /^\[node_seed\]/ {skip=1; next} - /^\[.*\]/ {skip=0} - skip==1 {next} - save==1 {save=0;db_path=$0} - /^\[database_path\]/ {save=1} - {print >> OUT_FILE} - END {print db_path} - ') -fi - -echo "database_path: ${db}" -df ${db} > ${tmp_loc}/db_path_df.txt -echo - -# Send output from this script to a log file -## this captures any messages -## or errors from the script itself - -log_file=${tmp_loc}/get_info.log -exec 3>&1 1>>${log_file} 2>&1 - -## Send all stdout files to /tmp - -if [[ -x ${rippled_exe} ]] -then - pgrep rippled && \ - ${rippled_exe} --conf ${conf_file} \ - -- server_info > ${tmp_loc}/server_info.txt -fi - -df -h > ${tmp_loc}/free_disk_space.txt -cat /proc/meminfo > ${tmp_loc}/amount_mem.txt -cat /proc/swaps > ${tmp_loc}/swap_space.txt -ulimit -a > ${tmp_loc}/reported_current_limits.txt - -for dev_path in $(df | awk '$1 ~ /^\/dev\// {print $1}'); do - # strip numbers from end and remove '/dev/' - dev=$(basename ${dev_path%%[0-9]}) - if [[ "$(cat /sys/block/${dev}/queue/rotational)" = 0 ]] - then - echo "${dev} : SSD" >> ${tmp_loc}/is_ssd.txt - else - echo "${dev} : NO SSD" >> ${tmp_loc}/is_ssd.txt - fi -done - -pushd ${tmp_loc} -tar -czvf info-package.tar.gz *.txt *.log -popd - -echo "Use the following command on your local machine to download from your rippled instance: scp @:${tmp_loc}/info-package.tar.gz "| tee /dev/fd/3 - diff --git a/bin/hexify.js b/bin/hexify.js deleted file mode 100755 index 1e2fb70009..0000000000 --- a/bin/hexify.js +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/node -// -// Returns hex of lowercasing a string. -// - -var stringToHex = function (s) { - return Array.prototype.map.call(s, function (c) { - var b = c.charCodeAt(0); - - return b < 16 ? "0" + b.toString(16) : b.toString(16); - }).join(""); -}; - -if (3 != process.argv.length) { - process.stderr.write("Usage: " + process.argv[1] + " string\n\nReturns hex of lowercasing string.\n"); - process.exit(1); - -} else { - - process.stdout.write(stringToHex(process.argv[2].toLowerCase()) + "\n"); -} - -// vim:sw=2:sts=2:ts=8:et diff --git a/bin/jsonrpc_request.js b/bin/jsonrpc_request.js deleted file mode 100755 index 0b9c08666d..0000000000 --- a/bin/jsonrpc_request.js +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/node -// -// This is a tool to issue JSON-RPC requests from the command line. -// -// This can be used to test a JSON-RPC server. -// -// Requires: npm simple-jsonrpc -// - -var jsonrpc = require('simple-jsonrpc'); - -var program = process.argv[1]; - -if (5 !== process.argv.length) { - console.log("Usage: %s ", program); -} -else { - var url = process.argv[2]; - var method = process.argv[3]; - var json_raw = process.argv[4]; - var json; - - try { - json = JSON.parse(json_raw); - } - catch (e) { - console.log("JSON parse error: %s", e.message); - throw e; - } - - var client = jsonrpc.client(url); - - client.call(method, json, - function (result) { - console.log(JSON.stringify(result, undefined, 2)); - }, - function (error) { - console.log(JSON.stringify(error, undefined, 2)); - }); -} - -// vim:sw=2:sts=2:ts=8:et diff --git a/bin/jsonrpc_server.js b/bin/jsonrpc_server.js deleted file mode 100755 index 4cd3ffb95c..0000000000 --- a/bin/jsonrpc_server.js +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/node -// -// This is a tool to listen for JSON-RPC requests at an IP and port. -// -// This will report the request to console and echo back the request as the response. -// - -var http = require("http"); - -var program = process.argv[1]; - -if (4 !== process.argv.length) { - console.log("Usage: %s ", program); -} -else { - var ip = process.argv[2]; - var port = process.argv[3]; - - var server = http.createServer(function (req, res) { - console.log("CONNECT"); - var input = ""; - - req.setEncoding(); - - req.on('data', function (buffer) { - // console.log("DATA: %s", buffer); - input = input + buffer; - }); - - req.on('end', function () { - // console.log("END"); - - var json_req; - - console.log("URL: %s", req.url); - console.log("HEADERS: %s", JSON.stringify(req.headers, undefined, 2)); - - try { - json_req = JSON.parse(input); - - console.log("REQ: %s", JSON.stringify(json_req, undefined, 2)); - } - catch (e) { - console.log("BAD JSON: %s", e.message); - - json_req = { error : e.message } - } - - res.statusCode = 200; - res.end(JSON.stringify({ - jsonrpc: "2.0", - result: { request : json_req }, - id: req.id - })); - }); - - req.on('close', function () { - console.log("CLOSE"); - }); - }); - - server.listen(port, ip, undefined, - function () { - console.log("Listening at: %s:%s", ip, port); - }); -} - -// vim:sw=2:sts=2:ts=8:et diff --git a/bin/manifest b/bin/manifest deleted file mode 120000 index c4ffa3bf5c..0000000000 --- a/bin/manifest +++ /dev/null @@ -1 +0,0 @@ -python/Manifest.py \ No newline at end of file diff --git a/bin/python/LedgerTool.py b/bin/python/LedgerTool.py deleted file mode 100755 index 4cc79e4d26..0000000000 --- a/bin/python/LedgerTool.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python - -from __future__ import absolute_import, division, print_function, unicode_literals - -import sys -import traceback - -from ripple.ledger import Server -from ripple.ledger.commands import Cache, Info, Print -from ripple.ledger.Args import ARGS -from ripple.util import Log -from ripple.util.CommandList import CommandList - -_COMMANDS = CommandList(Cache, Info, Print) - -if __name__ == '__main__': - try: - server = Server.Server() - args = list(ARGS.command) - _COMMANDS.run_safe(args.pop(0), server, *args) - except Exception as e: - if ARGS.verbose: - print(traceback.format_exc(), sys.stderr) - Log.error(e) diff --git a/bin/python/Manifest.py b/bin/python/Manifest.py deleted file mode 100755 index 002104cf2f..0000000000 --- a/bin/python/Manifest.py +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env python - -import sys -from ripple.util import Sign - -result = Sign.run_command(sys.argv[1:]) -sys.exit(0 if result else -1) diff --git a/bin/python/README.md b/bin/python/README.md deleted file mode 100644 index 7b49c4d657..0000000000 --- a/bin/python/README.md +++ /dev/null @@ -1,15 +0,0 @@ -Unit Tests -========== - -To run the Python unit tests, execute: - - python -m unittest discover - -from this directory. - -To run Python unit tests from a particular file (such as -`ripple/util/test_Sign.py`), execute: - - python -m unittest ripple.util.test_Sign - -Add `-v` to run tests in verbose mode. diff --git a/bin/python/decorator.py b/bin/python/decorator.py deleted file mode 100644 index e00391483a..0000000000 --- a/bin/python/decorator.py +++ /dev/null @@ -1,251 +0,0 @@ -########################## LICENCE ############################### - -# Copyright (c) 2005-2012, Michele Simionato -# All rights reserved. - -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: - -# Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# Redistributions in bytecode form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -# DAMAGE. - -""" -Decorator module, see http://pypi.python.org/pypi/decorator -for the documentation. -""" - -__version__ = '3.4.0' - -__all__ = ["decorator", "FunctionMaker", "contextmanager"] - -import sys, re, inspect -if sys.version >= '3': - from inspect import getfullargspec - def get_init(cls): - return cls.__init__ -else: - class getfullargspec(object): - "A quick and dirty replacement for getfullargspec for Python 2.X" - def __init__(self, f): - self.args, self.varargs, self.varkw, self.defaults = \ - inspect.getargspec(f) - self.kwonlyargs = [] - self.kwonlydefaults = None - def __iter__(self): - yield self.args - yield self.varargs - yield self.varkw - yield self.defaults - def get_init(cls): - return cls.__init__.im_func - -DEF = re.compile('\s*def\s*([_\w][_\w\d]*)\s*\(') - -# basic functionality -class FunctionMaker(object): - """ - An object with the ability to create functions with a given signature. - It has attributes name, doc, module, signature, defaults, dict and - methods update and make. - """ - def __init__(self, func=None, name=None, signature=None, - defaults=None, doc=None, module=None, funcdict=None): - self.shortsignature = signature - if func: - # func can be a class or a callable, but not an instance method - self.name = func.__name__ - if self.name == '': # small hack for lambda functions - self.name = '_lambda_' - self.doc = func.__doc__ - self.module = func.__module__ - if inspect.isfunction(func): - argspec = getfullargspec(func) - self.annotations = getattr(func, '__annotations__', {}) - for a in ('args', 'varargs', 'varkw', 'defaults', 'kwonlyargs', - 'kwonlydefaults'): - setattr(self, a, getattr(argspec, a)) - for i, arg in enumerate(self.args): - setattr(self, 'arg%d' % i, arg) - if sys.version < '3': # easy way - self.shortsignature = self.signature = \ - inspect.formatargspec( - formatvalue=lambda val: "", *argspec)[1:-1] - else: # Python 3 way - allargs = list(self.args) - allshortargs = list(self.args) - if self.varargs: - allargs.append('*' + self.varargs) - allshortargs.append('*' + self.varargs) - elif self.kwonlyargs: - allargs.append('*') # single star syntax - for a in self.kwonlyargs: - allargs.append('%s=None' % a) - allshortargs.append('%s=%s' % (a, a)) - if self.varkw: - allargs.append('**' + self.varkw) - allshortargs.append('**' + self.varkw) - self.signature = ', '.join(allargs) - self.shortsignature = ', '.join(allshortargs) - self.dict = func.__dict__.copy() - # func=None happens when decorating a caller - if name: - self.name = name - if signature is not None: - self.signature = signature - if defaults: - self.defaults = defaults - if doc: - self.doc = doc - if module: - self.module = module - if funcdict: - self.dict = funcdict - # check existence required attributes - assert hasattr(self, 'name') - if not hasattr(self, 'signature'): - raise TypeError('You are decorating a non function: %s' % func) - - def update(self, func, **kw): - "Update the signature of func with the data in self" - func.__name__ = self.name - func.__doc__ = getattr(self, 'doc', None) - func.__dict__ = getattr(self, 'dict', {}) - func.func_defaults = getattr(self, 'defaults', ()) - func.__kwdefaults__ = getattr(self, 'kwonlydefaults', None) - func.__annotations__ = getattr(self, 'annotations', None) - callermodule = sys._getframe(3).f_globals.get('__name__', '?') - func.__module__ = getattr(self, 'module', callermodule) - func.__dict__.update(kw) - - def make(self, src_templ, evaldict=None, addsource=False, **attrs): - "Make a new function from a given template and update the signature" - src = src_templ % vars(self) # expand name and signature - evaldict = evaldict or {} - mo = DEF.match(src) - if mo is None: - raise SyntaxError('not a valid function template\n%s' % src) - name = mo.group(1) # extract the function name - names = set([name] + [arg.strip(' *') for arg in - self.shortsignature.split(',')]) - for n in names: - if n in ('_func_', '_call_'): - raise NameError('%s is overridden in\n%s' % (n, src)) - if not src.endswith('\n'): # add a newline just for safety - src += '\n' # this is needed in old versions of Python - try: - code = compile(src, '', 'single') - # print >> sys.stderr, 'Compiling %s' % src - exec code in evaldict - except: - print >> sys.stderr, 'Error in generated code:' - print >> sys.stderr, src - raise - func = evaldict[name] - if addsource: - attrs['__source__'] = src - self.update(func, **attrs) - return func - - @classmethod - def create(cls, obj, body, evaldict, defaults=None, - doc=None, module=None, addsource=True, **attrs): - """ - Create a function from the strings name, signature and body. - evaldict is the evaluation dictionary. If addsource is true an attribute - __source__ is added to the result. The attributes attrs are added, - if any. - """ - if isinstance(obj, str): # "name(signature)" - name, rest = obj.strip().split('(', 1) - signature = rest[:-1] #strip a right parens - func = None - else: # a function - name = None - signature = None - func = obj - self = cls(func, name, signature, defaults, doc, module) - ibody = '\n'.join(' ' + line for line in body.splitlines()) - return self.make('def %(name)s(%(signature)s):\n' + ibody, - evaldict, addsource, **attrs) - -def decorator(caller, func=None): - """ - decorator(caller) converts a caller function into a decorator; - decorator(caller, func) decorates a function using a caller. - """ - if func is not None: # returns a decorated function - evaldict = func.func_globals.copy() - evaldict['_call_'] = caller - evaldict['_func_'] = func - return FunctionMaker.create( - func, "return _call_(_func_, %(shortsignature)s)", - evaldict, undecorated=func, __wrapped__=func) - else: # returns a decorator - if inspect.isclass(caller): - name = caller.__name__.lower() - callerfunc = get_init(caller) - doc = 'decorator(%s) converts functions/generators into ' \ - 'factories of %s objects' % (caller.__name__, caller.__name__) - fun = getfullargspec(callerfunc).args[1] # second arg - elif inspect.isfunction(caller): - name = '_lambda_' if caller.__name__ == '' \ - else caller.__name__ - callerfunc = caller - doc = caller.__doc__ - fun = getfullargspec(callerfunc).args[0] # first arg - else: # assume caller is an object with a __call__ method - name = caller.__class__.__name__.lower() - callerfunc = caller.__call__.im_func - doc = caller.__call__.__doc__ - fun = getfullargspec(callerfunc).args[1] # second arg - evaldict = callerfunc.func_globals.copy() - evaldict['_call_'] = caller - evaldict['decorator'] = decorator - return FunctionMaker.create( - '%s(%s)' % (name, fun), - 'return decorator(_call_, %s)' % fun, - evaldict, undecorated=caller, __wrapped__=caller, - doc=doc, module=caller.__module__) - -######################### contextmanager ######################## - -def __call__(self, func): - 'Context manager decorator' - return FunctionMaker.create( - func, "with _self_: return _func_(%(shortsignature)s)", - dict(_self_=self, _func_=func), __wrapped__=func) - -try: # Python >= 3.2 - - from contextlib import _GeneratorContextManager - ContextManager = type( - 'ContextManager', (_GeneratorContextManager,), dict(__call__=__call__)) - -except ImportError: # Python >= 2.5 - - from contextlib import GeneratorContextManager - def __init__(self, f, *a, **k): - return GeneratorContextManager.__init__(self, f(*a, **k)) - ContextManager = type( - 'ContextManager', (GeneratorContextManager,), - dict(__call__=__call__, __init__=__init__)) - -contextmanager = decorator(ContextManager) diff --git a/bin/python/ecdsa/__init__.py b/bin/python/ecdsa/__init__.py deleted file mode 100644 index e834b3a850..0000000000 --- a/bin/python/ecdsa/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -__all__ = ["curves", "der", "ecdsa", "ellipticcurve", "keys", "numbertheory", - "test_pyecdsa", "util", "six"] -from .keys import SigningKey, VerifyingKey, BadSignatureError, BadDigestError -from .curves import NIST192p, NIST224p, NIST256p, NIST384p, NIST521p, SECP256k1 - -_hush_pyflakes = [SigningKey, VerifyingKey, BadSignatureError, BadDigestError, - NIST192p, NIST224p, NIST256p, NIST384p, NIST521p, SECP256k1] -del _hush_pyflakes - -# This code comes from http://github.com/warner/python-ecdsa - -from ._version import get_versions -__version__ = get_versions()['version'] -del get_versions diff --git a/bin/python/ecdsa/_version.py b/bin/python/ecdsa/_version.py deleted file mode 100644 index 5cc4bd6b42..0000000000 --- a/bin/python/ecdsa/_version.py +++ /dev/null @@ -1,183 +0,0 @@ - -# This file helps to compute a version number in source trees obtained from -# git-archive tarball (such as those provided by githubs download-from-tag -# feature). Distribution tarballs (built by setup.py sdist) and build -# directories (produced by setup.py build) will contain a much shorter file -# that just contains the computed version number. - -# This file is released into the public domain. Generated by -# versioneer-0.12 (https://github.com/warner/python-versioneer) - -# these strings will be replaced by git during git-archive -git_refnames = " (HEAD, master)" -git_full = "e7a6daff51221b8edd888cff404596ef90432869" - -# these strings are filled in when 'setup.py versioneer' creates _version.py -tag_prefix = "python-ecdsa-" -parentdir_prefix = "ecdsa-" -versionfile_source = "ecdsa/_version.py" - -import os, sys, re, subprocess, errno - -def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False): - assert isinstance(commands, list) - p = None - for c in commands: - try: - # remember shell=False, so use git.cmd on windows, not just git - p = subprocess.Popen([c] + args, cwd=cwd, stdout=subprocess.PIPE, - stderr=(subprocess.PIPE if hide_stderr - else None)) - break - except EnvironmentError: - e = sys.exc_info()[1] - if e.errno == errno.ENOENT: - continue - if verbose: - print("unable to run %s" % args[0]) - print(e) - return None - else: - if verbose: - print("unable to find command, tried %s" % (commands,)) - return None - stdout = p.communicate()[0].strip() - if sys.version >= '3': - stdout = stdout.decode() - if p.returncode != 0: - if verbose: - print("unable to run %s (error)" % args[0]) - return None - return stdout - - -def versions_from_parentdir(parentdir_prefix, root, verbose=False): - # Source tarballs conventionally unpack into a directory that includes - # both the project name and a version string. - dirname = os.path.basename(root) - if not dirname.startswith(parentdir_prefix): - if verbose: - print("guessing rootdir is '%s', but '%s' doesn't start with prefix '%s'" % - (root, dirname, parentdir_prefix)) - return None - return {"version": dirname[len(parentdir_prefix):], "full": ""} - -def git_get_keywords(versionfile_abs): - # the code embedded in _version.py can just fetch the value of these - # keywords. When used from setup.py, we don't want to import _version.py, - # so we do it with a regexp instead. This function is not used from - # _version.py. - keywords = {} - try: - f = open(versionfile_abs,"r") - for line in f.readlines(): - if line.strip().startswith("git_refnames ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["refnames"] = mo.group(1) - if line.strip().startswith("git_full ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["full"] = mo.group(1) - f.close() - except EnvironmentError: - pass - return keywords - -def git_versions_from_keywords(keywords, tag_prefix, verbose=False): - if not keywords: - return {} # keyword-finding function failed to find keywords - refnames = keywords["refnames"].strip() - if refnames.startswith("$Format"): - if verbose: - print("keywords are unexpanded, not using") - return {} # unexpanded, so not in an unpacked git-archive tarball - refs = set([r.strip() for r in refnames.strip("()").split(",")]) - # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of - # just "foo-1.0". If we see a "tag: " prefix, prefer those. - TAG = "tag: " - tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) - if not tags: - # Either we're using git < 1.8.3, or there really are no tags. We use - # a heuristic: assume all version tags have a digit. The old git %d - # expansion behaves like git log --decorate=short and strips out the - # refs/heads/ and refs/tags/ prefixes that would let us distinguish - # between branches and tags. By ignoring refnames without digits, we - # filter out many common branch names like "release" and - # "stabilization", as well as "HEAD" and "master". - tags = set([r for r in refs if re.search(r'\d', r)]) - if verbose: - print("discarding '%s', no digits" % ",".join(refs-tags)) - if verbose: - print("likely tags: %s" % ",".join(sorted(tags))) - for ref in sorted(tags): - # sorting will prefer e.g. "2.0" over "2.0rc1" - if ref.startswith(tag_prefix): - r = ref[len(tag_prefix):] - if verbose: - print("picking %s" % r) - return { "version": r, - "full": keywords["full"].strip() } - # no suitable tags, so we use the full revision id - if verbose: - print("no suitable tags, using full revision id") - return { "version": keywords["full"].strip(), - "full": keywords["full"].strip() } - - -def git_versions_from_vcs(tag_prefix, root, verbose=False): - # this runs 'git' from the root of the source tree. This only gets called - # if the git-archive 'subst' keywords were *not* expanded, and - # _version.py hasn't already been rewritten with a short version string, - # meaning we're inside a checked out source tree. - - if not os.path.exists(os.path.join(root, ".git")): - if verbose: - print("no .git in %s" % root) - return {} - - GITS = ["git"] - if sys.platform == "win32": - GITS = ["git.cmd", "git.exe"] - stdout = run_command(GITS, ["describe", "--tags", "--dirty", "--always"], - cwd=root) - if stdout is None: - return {} - if not stdout.startswith(tag_prefix): - if verbose: - print("tag '%s' doesn't start with prefix '%s'" % (stdout, tag_prefix)) - return {} - tag = stdout[len(tag_prefix):] - stdout = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) - if stdout is None: - return {} - full = stdout.strip() - if tag.endswith("-dirty"): - full += "-dirty" - return {"version": tag, "full": full} - - -def get_versions(default={"version": "unknown", "full": ""}, verbose=False): - # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have - # __file__, we can work backwards from there to the root. Some - # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which - # case we can only use expanded keywords. - - keywords = { "refnames": git_refnames, "full": git_full } - ver = git_versions_from_keywords(keywords, tag_prefix, verbose) - if ver: - return ver - - try: - root = os.path.abspath(__file__) - # versionfile_source is the relative path from the top of the source - # tree (where the .git directory might live) to this file. Invert - # this to find the root from __file__. - for i in range(len(versionfile_source.split(os.sep))): - root = os.path.dirname(root) - except NameError: - return default - - return (git_versions_from_vcs(tag_prefix, root, verbose) - or versions_from_parentdir(parentdir_prefix, root, verbose) - or default) diff --git a/bin/python/ecdsa/curves.py b/bin/python/ecdsa/curves.py deleted file mode 100644 index 60b52043eb..0000000000 --- a/bin/python/ecdsa/curves.py +++ /dev/null @@ -1,53 +0,0 @@ -from __future__ import division - -from . import der, ecdsa - -class UnknownCurveError(Exception): - pass - -def orderlen(order): - return (1+len("%x"%order))//2 # bytes - -# the NIST curves -class Curve: - def __init__(self, name, openssl_name, - curve, generator, oid): - self.name = name - self.openssl_name = openssl_name # maybe None - self.curve = curve - self.generator = generator - self.order = generator.order() - self.baselen = orderlen(self.order) - self.verifying_key_length = 2*self.baselen - self.signature_length = 2*self.baselen - self.oid = oid - self.encoded_oid = der.encode_oid(*oid) - -NIST192p = Curve("NIST192p", "prime192v1", - ecdsa.curve_192, ecdsa.generator_192, - (1, 2, 840, 10045, 3, 1, 1)) -NIST224p = Curve("NIST224p", "secp224r1", - ecdsa.curve_224, ecdsa.generator_224, - (1, 3, 132, 0, 33)) -NIST256p = Curve("NIST256p", "prime256v1", - ecdsa.curve_256, ecdsa.generator_256, - (1, 2, 840, 10045, 3, 1, 7)) -NIST384p = Curve("NIST384p", "secp384r1", - ecdsa.curve_384, ecdsa.generator_384, - (1, 3, 132, 0, 34)) -NIST521p = Curve("NIST521p", "secp521r1", - ecdsa.curve_521, ecdsa.generator_521, - (1, 3, 132, 0, 35)) -SECP256k1 = Curve("SECP256k1", "secp256k1", - ecdsa.curve_secp256k1, ecdsa.generator_secp256k1, - (1, 3, 132, 0, 10)) - -curves = [NIST192p, NIST224p, NIST256p, NIST384p, NIST521p, SECP256k1] - -def find_curve(oid_curve): - for c in curves: - if c.oid == oid_curve: - return c - raise UnknownCurveError("I don't know about the curve with oid %s." - "I only know about these: %s" % - (oid_curve, [c.name for c in curves])) diff --git a/bin/python/ecdsa/der.py b/bin/python/ecdsa/der.py deleted file mode 100644 index b045952f77..0000000000 --- a/bin/python/ecdsa/der.py +++ /dev/null @@ -1,199 +0,0 @@ -from __future__ import division - -import binascii -import base64 -from .six import int2byte, b, integer_types, text_type - -class UnexpectedDER(Exception): - pass - -def encode_constructed(tag, value): - return int2byte(0xa0+tag) + encode_length(len(value)) + value -def encode_integer(r): - assert r >= 0 # can't support negative numbers yet - h = ("%x" % r).encode() - if len(h) % 2: - h = b("0") + h - s = binascii.unhexlify(h) - num = s[0] if isinstance(s[0], integer_types) else ord(s[0]) - if num <= 0x7f: - return b("\x02") + int2byte(len(s)) + s - else: - # DER integers are two's complement, so if the first byte is - # 0x80-0xff then we need an extra 0x00 byte to prevent it from - # looking negative. - return b("\x02") + int2byte(len(s)+1) + b("\x00") + s - -def encode_bitstring(s): - return b("\x03") + encode_length(len(s)) + s -def encode_octet_string(s): - return b("\x04") + encode_length(len(s)) + s -def encode_oid(first, second, *pieces): - assert first <= 2 - assert second <= 39 - encoded_pieces = [int2byte(40*first+second)] + [encode_number(p) - for p in pieces] - body = b('').join(encoded_pieces) - return b('\x06') + encode_length(len(body)) + body -def encode_sequence(*encoded_pieces): - total_len = sum([len(p) for p in encoded_pieces]) - return b('\x30') + encode_length(total_len) + b('').join(encoded_pieces) -def encode_number(n): - b128_digits = [] - while n: - b128_digits.insert(0, (n & 0x7f) | 0x80) - n = n >> 7 - if not b128_digits: - b128_digits.append(0) - b128_digits[-1] &= 0x7f - return b('').join([int2byte(d) for d in b128_digits]) - -def remove_constructed(string): - s0 = string[0] if isinstance(string[0], integer_types) else ord(string[0]) - if (s0 & 0xe0) != 0xa0: - raise UnexpectedDER("wanted constructed tag (0xa0-0xbf), got 0x%02x" - % s0) - tag = s0 & 0x1f - length, llen = read_length(string[1:]) - body = string[1+llen:1+llen+length] - rest = string[1+llen+length:] - return tag, body, rest - -def remove_sequence(string): - if not string.startswith(b("\x30")): - n = string[0] if isinstance(string[0], integer_types) else ord(string[0]) - raise UnexpectedDER("wanted sequence (0x30), got 0x%02x" % n) - length, lengthlength = read_length(string[1:]) - endseq = 1+lengthlength+length - return string[1+lengthlength:endseq], string[endseq:] - -def remove_octet_string(string): - if not string.startswith(b("\x04")): - n = string[0] if isinstance(string[0], integer_types) else ord(string[0]) - raise UnexpectedDER("wanted octetstring (0x04), got 0x%02x" % n) - length, llen = read_length(string[1:]) - body = string[1+llen:1+llen+length] - rest = string[1+llen+length:] - return body, rest - -def remove_object(string): - if not string.startswith(b("\x06")): - n = string[0] if isinstance(string[0], integer_types) else ord(string[0]) - raise UnexpectedDER("wanted object (0x06), got 0x%02x" % n) - length, lengthlength = read_length(string[1:]) - body = string[1+lengthlength:1+lengthlength+length] - rest = string[1+lengthlength+length:] - numbers = [] - while body: - n, ll = read_number(body) - numbers.append(n) - body = body[ll:] - n0 = numbers.pop(0) - first = n0//40 - second = n0-(40*first) - numbers.insert(0, first) - numbers.insert(1, second) - return tuple(numbers), rest - -def remove_integer(string): - if not string.startswith(b("\x02")): - n = string[0] if isinstance(string[0], integer_types) else ord(string[0]) - raise UnexpectedDER("wanted integer (0x02), got 0x%02x" % n) - length, llen = read_length(string[1:]) - numberbytes = string[1+llen:1+llen+length] - rest = string[1+llen+length:] - nbytes = numberbytes[0] if isinstance(numberbytes[0], integer_types) else ord(numberbytes[0]) - assert nbytes < 0x80 # can't support negative numbers yet - return int(binascii.hexlify(numberbytes), 16), rest - -def read_number(string): - number = 0 - llen = 0 - # base-128 big endian, with b7 set in all but the last byte - while True: - if llen > len(string): - raise UnexpectedDER("ran out of length bytes") - number = number << 7 - d = string[llen] if isinstance(string[llen], integer_types) else ord(string[llen]) - number += (d & 0x7f) - llen += 1 - if not d & 0x80: - break - return number, llen - -def encode_length(l): - assert l >= 0 - if l < 0x80: - return int2byte(l) - s = ("%x" % l).encode() - if len(s)%2: - s = b("0")+s - s = binascii.unhexlify(s) - llen = len(s) - return int2byte(0x80|llen) + s - -def read_length(string): - num = string[0] if isinstance(string[0], integer_types) else ord(string[0]) - if not (num & 0x80): - # short form - return (num & 0x7f), 1 - # else long-form: b0&0x7f is number of additional base256 length bytes, - # big-endian - llen = num & 0x7f - if llen > len(string)-1: - raise UnexpectedDER("ran out of length bytes") - return int(binascii.hexlify(string[1:1+llen]), 16), 1+llen - -def remove_bitstring(string): - num = string[0] if isinstance(string[0], integer_types) else ord(string[0]) - if not string.startswith(b("\x03")): - raise UnexpectedDER("wanted bitstring (0x03), got 0x%02x" % num) - length, llen = read_length(string[1:]) - body = string[1+llen:1+llen+length] - rest = string[1+llen+length:] - return body, rest - -# SEQUENCE([1, STRING(secexp), cont[0], OBJECT(curvename), cont[1], BINTSTRING) - - -# signatures: (from RFC3279) -# ansi-X9-62 OBJECT IDENTIFIER ::= { -# iso(1) member-body(2) us(840) 10045 } -# -# id-ecSigType OBJECT IDENTIFIER ::= { -# ansi-X9-62 signatures(4) } -# ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { -# id-ecSigType 1 } -## so 1,2,840,10045,4,1 -## so 0x42, .. .. - -# Ecdsa-Sig-Value ::= SEQUENCE { -# r INTEGER, -# s INTEGER } - -# id-public-key-type OBJECT IDENTIFIER ::= { ansi-X9.62 2 } -# -# id-ecPublicKey OBJECT IDENTIFIER ::= { id-publicKeyType 1 } - -# I think the secp224r1 identifier is (t=06,l=05,v=2b81040021) -# secp224r1 OBJECT IDENTIFIER ::= { -# iso(1) identified-organization(3) certicom(132) curve(0) 33 } -# and the secp384r1 is (t=06,l=05,v=2b81040022) -# secp384r1 OBJECT IDENTIFIER ::= { -# iso(1) identified-organization(3) certicom(132) curve(0) 34 } - -def unpem(pem): - if isinstance(pem, text_type): - pem = pem.encode() - - d = b("").join([l.strip() for l in pem.split(b("\n")) - if l and not l.startswith(b("-----"))]) - return base64.b64decode(d) -def topem(der, name): - b64 = base64.b64encode(der) - lines = [("-----BEGIN %s-----\n" % name).encode()] - lines.extend([b64[start:start+64]+b("\n") - for start in range(0, len(b64), 64)]) - lines.append(("-----END %s-----\n" % name).encode()) - return b("").join(lines) - diff --git a/bin/python/ecdsa/ecdsa.py b/bin/python/ecdsa/ecdsa.py deleted file mode 100644 index 4eb2d39558..0000000000 --- a/bin/python/ecdsa/ecdsa.py +++ /dev/null @@ -1,576 +0,0 @@ -#! /usr/bin/env python - -""" -Implementation of Elliptic-Curve Digital Signatures. - -Classes and methods for elliptic-curve signatures: -private keys, public keys, signatures, -NIST prime-modulus curves with modulus lengths of -192, 224, 256, 384, and 521 bits. - -Example: - - # (In real-life applications, you would probably want to - # protect against defects in SystemRandom.) - from random import SystemRandom - randrange = SystemRandom().randrange - - # Generate a public/private key pair using the NIST Curve P-192: - - g = generator_192 - n = g.order() - secret = randrange( 1, n ) - pubkey = Public_key( g, g * secret ) - privkey = Private_key( pubkey, secret ) - - # Signing a hash value: - - hash = randrange( 1, n ) - signature = privkey.sign( hash, randrange( 1, n ) ) - - # Verifying a signature for a hash value: - - if pubkey.verifies( hash, signature ): - print_("Demo verification succeeded.") - else: - print_("*** Demo verification failed.") - - # Verification fails if the hash value is modified: - - if pubkey.verifies( hash-1, signature ): - print_("**** Demo verification failed to reject tampered hash.") - else: - print_("Demo verification correctly rejected tampered hash.") - -Version of 2009.05.16. - -Revision history: - 2005.12.31 - Initial version. - 2008.11.25 - Substantial revisions introducing new classes. - 2009.05.16 - Warn against using random.randrange in real applications. - 2009.05.17 - Use random.SystemRandom by default. - -Written in 2005 by Peter Pearson and placed in the public domain. -""" - -from .six import int2byte, b, print_ -from . import ellipticcurve -from . import numbertheory -import random - - - -class Signature( object ): - """ECDSA signature. - """ - def __init__( self, r, s ): - self.r = r - self.s = s - - - -class Public_key( object ): - """Public key for ECDSA. - """ - - def __init__( self, generator, point ): - """generator is the Point that generates the group, - point is the Point that defines the public key. - """ - - self.curve = generator.curve() - self.generator = generator - self.point = point - n = generator.order() - if not n: - raise RuntimeError("Generator point must have order.") - if not n * point == ellipticcurve.INFINITY: - raise RuntimeError("Generator point order is bad.") - if point.x() < 0 or n <= point.x() or point.y() < 0 or n <= point.y(): - raise RuntimeError("Generator point has x or y out of range.") - - - def verifies( self, hash, signature ): - """Verify that signature is a valid signature of hash. - Return True if the signature is valid. - """ - - # From X9.62 J.3.1. - - G = self.generator - n = G.order() - r = signature.r - s = signature.s - if r < 1 or r > n-1: return False - if s < 1 or s > n-1: return False - c = numbertheory.inverse_mod( s, n ) - u1 = ( hash * c ) % n - u2 = ( r * c ) % n - xy = u1 * G + u2 * self.point - v = xy.x() % n - return v == r - - - -class Private_key( object ): - """Private key for ECDSA. - """ - - def __init__( self, public_key, secret_multiplier ): - """public_key is of class Public_key; - secret_multiplier is a large integer. - """ - - self.public_key = public_key - self.secret_multiplier = secret_multiplier - - def sign( self, hash, random_k ): - """Return a signature for the provided hash, using the provided - random nonce. It is absolutely vital that random_k be an unpredictable - number in the range [1, self.public_key.point.order()-1]. If - an attacker can guess random_k, he can compute our private key from a - single signature. Also, if an attacker knows a few high-order - bits (or a few low-order bits) of random_k, he can compute our private - key from many signatures. The generation of nonces with adequate - cryptographic strength is very difficult and far beyond the scope - of this comment. - - May raise RuntimeError, in which case retrying with a new - random value k is in order. - """ - - G = self.public_key.generator - n = G.order() - k = random_k % n - p1 = k * G - r = p1.x() - if r == 0: raise RuntimeError("amazingly unlucky random number r") - s = ( numbertheory.inverse_mod( k, n ) * \ - ( hash + ( self.secret_multiplier * r ) % n ) ) % n - if s == 0: raise RuntimeError("amazingly unlucky random number s") - return Signature( r, s ) - - - -def int_to_string( x ): - """Convert integer x into a string of bytes, as per X9.62.""" - assert x >= 0 - if x == 0: return b('\0') - result = [] - while x: - ordinal = x & 0xFF - result.append(int2byte(ordinal)) - x >>= 8 - - result.reverse() - return b('').join(result) - - -def string_to_int( s ): - """Convert a string of bytes into an integer, as per X9.62.""" - result = 0 - for c in s: - if not isinstance(c, int): c = ord( c ) - result = 256 * result + c - return result - - -def digest_integer( m ): - """Convert an integer into a string of bytes, compute - its SHA-1 hash, and convert the result to an integer.""" - # - # I don't expect this function to be used much. I wrote - # it in order to be able to duplicate the examples - # in ECDSAVS. - # - from hashlib import sha1 - return string_to_int( sha1( int_to_string( m ) ).digest() ) - - -def point_is_valid( generator, x, y ): - """Is (x,y) a valid public key based on the specified generator?""" - - # These are the tests specified in X9.62. - - n = generator.order() - curve = generator.curve() - if x < 0 or n <= x or y < 0 or n <= y: - return False - if not curve.contains_point( x, y ): - return False - if not n*ellipticcurve.Point( curve, x, y ) == \ - ellipticcurve.INFINITY: - return False - return True - - - -# NIST Curve P-192: -_p = 6277101735386680763835789423207666416083908700390324961279 -_r = 6277101735386680763835789423176059013767194773182842284081 -# s = 0x3045ae6fc8422f64ed579528d38120eae12196d5L -# c = 0x3099d2bbbfcb2538542dcd5fb078b6ef5f3d6fe2c745de65L -_b = 0x64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1 -_Gx = 0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012 -_Gy = 0x07192b95ffc8da78631011ed6b24cdd573f977a11e794811 - -curve_192 = ellipticcurve.CurveFp( _p, -3, _b ) -generator_192 = ellipticcurve.Point( curve_192, _Gx, _Gy, _r ) - - -# NIST Curve P-224: -_p = 26959946667150639794667015087019630673557916260026308143510066298881 -_r = 26959946667150639794667015087019625940457807714424391721682722368061 -# s = 0xbd71344799d5c7fcdc45b59fa3b9ab8f6a948bc5L -# c = 0x5b056c7e11dd68f40469ee7f3c7a7d74f7d121116506d031218291fbL -_b = 0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4 -_Gx =0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21 -_Gy = 0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34 - -curve_224 = ellipticcurve.CurveFp( _p, -3, _b ) -generator_224 = ellipticcurve.Point( curve_224, _Gx, _Gy, _r ) - -# NIST Curve P-256: -_p = 115792089210356248762697446949407573530086143415290314195533631308867097853951 -_r = 115792089210356248762697446949407573529996955224135760342422259061068512044369 -# s = 0xc49d360886e704936a6678e1139d26b7819f7e90L -# c = 0x7efba1662985be9403cb055c75d4f7e0ce8d84a9c5114abcaf3177680104fa0dL -_b = 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b -_Gx = 0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296 -_Gy = 0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5 - -curve_256 = ellipticcurve.CurveFp( _p, -3, _b ) -generator_256 = ellipticcurve.Point( curve_256, _Gx, _Gy, _r ) - -# NIST Curve P-384: -_p = 39402006196394479212279040100143613805079739270465446667948293404245721771496870329047266088258938001861606973112319 -_r = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942643 -# s = 0xa335926aa319a27a1d00896a6773a4827acdac73L -# c = 0x79d1e655f868f02fff48dcdee14151ddb80643c1406d0ca10dfe6fc52009540a495e8042ea5f744f6e184667cc722483L -_b = 0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef -_Gx = 0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7 -_Gy = 0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f - -curve_384 = ellipticcurve.CurveFp( _p, -3, _b ) -generator_384 = ellipticcurve.Point( curve_384, _Gx, _Gy, _r ) - -# NIST Curve P-521: -_p = 6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151 -_r = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005449 -# s = 0xd09e8800291cb85396cc6717393284aaa0da64baL -# c = 0x0b48bfa5f420a34949539d2bdfc264eeeeb077688e44fbf0ad8f6d0edb37bd6b533281000518e19f1b9ffbe0fe9ed8a3c2200b8f875e523868c70c1e5bf55bad637L -_b = 0x051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00 -_Gx = 0xc6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66 -_Gy = 0x11839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650 - -curve_521 = ellipticcurve.CurveFp( _p, -3, _b ) -generator_521 = ellipticcurve.Point( curve_521, _Gx, _Gy, _r ) - -# Certicom secp256-k1 -_a = 0x0000000000000000000000000000000000000000000000000000000000000000 -_b = 0x0000000000000000000000000000000000000000000000000000000000000007 -_p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f -_Gx = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 -_Gy = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 -_r = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 - -curve_secp256k1 = ellipticcurve.CurveFp( _p, _a, _b) -generator_secp256k1 = ellipticcurve.Point( curve_secp256k1, _Gx, _Gy, _r) - - - -def __main__(): - class TestFailure(Exception): pass - - def test_point_validity( generator, x, y, expected ): - """generator defines the curve; is (x,y) a point on - this curve? "expected" is True if the right answer is Yes.""" - if point_is_valid( generator, x, y ) == expected: - print_("Point validity tested as expected.") - else: - raise TestFailure("*** Point validity test gave wrong result.") - - def test_signature_validity( Msg, Qx, Qy, R, S, expected ): - """Msg = message, Qx and Qy represent the base point on - elliptic curve c192, R and S are the signature, and - "expected" is True iff the signature is expected to be valid.""" - pubk = Public_key( generator_192, - ellipticcurve.Point( curve_192, Qx, Qy ) ) - got = pubk.verifies( digest_integer( Msg ), Signature( R, S ) ) - if got == expected: - print_("Signature tested as expected: got %s, expected %s." % \ - ( got, expected )) - else: - raise TestFailure("*** Signature test failed: got %s, expected %s." % \ - ( got, expected )) - - print_("NIST Curve P-192:") - - p192 = generator_192 - - # From X9.62: - - d = 651056770906015076056810763456358567190100156695615665659 - Q = d * p192 - if Q.x() != 0x62B12D60690CDCF330BABAB6E69763B471F994DD702D16A5: - raise TestFailure("*** p192 * d came out wrong.") - else: - print_("p192 * d came out right.") - - k = 6140507067065001063065065565667405560006161556565665656654 - R = k * p192 - if R.x() != 0x885052380FF147B734C330C43D39B2C4A89F29B0F749FEAD \ - or R.y() != 0x9CF9FA1CBEFEFB917747A3BB29C072B9289C2547884FD835: - raise TestFailure("*** k * p192 came out wrong.") - else: - print_("k * p192 came out right.") - - u1 = 2563697409189434185194736134579731015366492496392189760599 - u2 = 6266643813348617967186477710235785849136406323338782220568 - temp = u1 * p192 + u2 * Q - if temp.x() != 0x885052380FF147B734C330C43D39B2C4A89F29B0F749FEAD \ - or temp.y() != 0x9CF9FA1CBEFEFB917747A3BB29C072B9289C2547884FD835: - raise TestFailure("*** u1 * p192 + u2 * Q came out wrong.") - else: - print_("u1 * p192 + u2 * Q came out right.") - - e = 968236873715988614170569073515315707566766479517 - pubk = Public_key( generator_192, generator_192 * d ) - privk = Private_key( pubk, d ) - sig = privk.sign( e, k ) - r, s = sig.r, sig.s - if r != 3342403536405981729393488334694600415596881826869351677613 \ - or s != 5735822328888155254683894997897571951568553642892029982342: - raise TestFailure("*** r or s came out wrong.") - else: - print_("r and s came out right.") - - valid = pubk.verifies( e, sig ) - if valid: print_("Signature verified OK.") - else: raise TestFailure("*** Signature failed verification.") - - valid = pubk.verifies( e-1, sig ) - if not valid: print_("Forgery was correctly rejected.") - else: raise TestFailure("*** Forgery was erroneously accepted.") - - print_("Testing point validity, as per ECDSAVS.pdf B.2.2:") - - test_point_validity( \ - p192, \ - 0xcd6d0f029a023e9aaca429615b8f577abee685d8257cc83a, \ - 0x00019c410987680e9fb6c0b6ecc01d9a2647c8bae27721bacdfc, \ - False ) - - test_point_validity( - p192, \ - 0x00017f2fce203639e9eaf9fb50b81fc32776b30e3b02af16c73b, \ - 0x95da95c5e72dd48e229d4748d4eee658a9a54111b23b2adb, \ - False ) - - test_point_validity( - p192, \ - 0x4f77f8bc7fccbadd5760f4938746d5f253ee2168c1cf2792, \ - 0x000147156ff824d131629739817edb197717c41aab5c2a70f0f6, \ - False ) - - test_point_validity( - p192, \ - 0xc58d61f88d905293bcd4cd0080bcb1b7f811f2ffa41979f6, \ - 0x8804dc7a7c4c7f8b5d437f5156f3312ca7d6de8a0e11867f, \ - True ) - - test_point_validity( - p192, \ - 0xcdf56c1aa3d8afc53c521adf3ffb96734a6a630a4a5b5a70, \ - 0x97c1c44a5fb229007b5ec5d25f7413d170068ffd023caa4e, \ - True ) - - test_point_validity( - p192, \ - 0x89009c0dc361c81e99280c8e91df578df88cdf4b0cdedced, \ - 0x27be44a529b7513e727251f128b34262a0fd4d8ec82377b9, \ - True ) - - test_point_validity( - p192, \ - 0x6a223d00bd22c52833409a163e057e5b5da1def2a197dd15, \ - 0x7b482604199367f1f303f9ef627f922f97023e90eae08abf, \ - True ) - - test_point_validity( - p192, \ - 0x6dccbde75c0948c98dab32ea0bc59fe125cf0fb1a3798eda, \ - 0x0001171a3e0fa60cf3096f4e116b556198de430e1fbd330c8835, \ - False ) - - test_point_validity( - p192, \ - 0xd266b39e1f491fc4acbbbc7d098430931cfa66d55015af12, \ - 0x193782eb909e391a3148b7764e6b234aa94e48d30a16dbb2, \ - False ) - - test_point_validity( - p192, \ - 0x9d6ddbcd439baa0c6b80a654091680e462a7d1d3f1ffeb43, \ - 0x6ad8efc4d133ccf167c44eb4691c80abffb9f82b932b8caa, \ - False ) - - test_point_validity( - p192, \ - 0x146479d944e6bda87e5b35818aa666a4c998a71f4e95edbc, \ - 0xa86d6fe62bc8fbd88139693f842635f687f132255858e7f6, \ - False ) - - test_point_validity( - p192, \ - 0xe594d4a598046f3598243f50fd2c7bd7d380edb055802253, \ - 0x509014c0c4d6b536e3ca750ec09066af39b4c8616a53a923, \ - False ) - - print_("Trying signature-verification tests from ECDSAVS.pdf B.2.4:") - print_("P-192:") - Msg = 0x84ce72aa8699df436059f052ac51b6398d2511e49631bcb7e71f89c499b9ee425dfbc13a5f6d408471b054f2655617cbbaf7937b7c80cd8865cf02c8487d30d2b0fbd8b2c4e102e16d828374bbc47b93852f212d5043c3ea720f086178ff798cc4f63f787b9c2e419efa033e7644ea7936f54462dc21a6c4580725f7f0e7d158 - Qx = 0xd9dbfb332aa8e5ff091e8ce535857c37c73f6250ffb2e7ac - Qy = 0x282102e364feded3ad15ddf968f88d8321aa268dd483ebc4 - R = 0x64dca58a20787c488d11d6dd96313f1b766f2d8efe122916 - S = 0x1ecba28141e84ab4ecad92f56720e2cc83eb3d22dec72479 - test_signature_validity( Msg, Qx, Qy, R, S, True ) - - Msg = 0x94bb5bacd5f8ea765810024db87f4224ad71362a3c28284b2b9f39fab86db12e8beb94aae899768229be8fdb6c4f12f28912bb604703a79ccff769c1607f5a91450f30ba0460d359d9126cbd6296be6d9c4bb96c0ee74cbb44197c207f6db326ab6f5a659113a9034e54be7b041ced9dcf6458d7fb9cbfb2744d999f7dfd63f4 - Qx = 0x3e53ef8d3112af3285c0e74842090712cd324832d4277ae7 - Qy = 0xcc75f8952d30aec2cbb719fc6aa9934590b5d0ff5a83adb7 - R = 0x8285261607283ba18f335026130bab31840dcfd9c3e555af - S = 0x356d89e1b04541afc9704a45e9c535ce4a50929e33d7e06c - test_signature_validity( Msg, Qx, Qy, R, S, True ) - - Msg = 0xf6227a8eeb34afed1621dcc89a91d72ea212cb2f476839d9b4243c66877911b37b4ad6f4448792a7bbba76c63bdd63414b6facab7dc71c3396a73bd7ee14cdd41a659c61c99b779cecf07bc51ab391aa3252386242b9853ea7da67fd768d303f1b9b513d401565b6f1eb722dfdb96b519fe4f9bd5de67ae131e64b40e78c42dd - Qx = 0x16335dbe95f8e8254a4e04575d736befb258b8657f773cb7 - Qy = 0x421b13379c59bc9dce38a1099ca79bbd06d647c7f6242336 - R = 0x4141bd5d64ea36c5b0bd21ef28c02da216ed9d04522b1e91 - S = 0x159a6aa852bcc579e821b7bb0994c0861fb08280c38daa09 - test_signature_validity( Msg, Qx, Qy, R, S, False ) - - Msg = 0x16b5f93afd0d02246f662761ed8e0dd9504681ed02a253006eb36736b563097ba39f81c8e1bce7a16c1339e345efabbc6baa3efb0612948ae51103382a8ee8bc448e3ef71e9f6f7a9676694831d7f5dd0db5446f179bcb737d4a526367a447bfe2c857521c7f40b6d7d7e01a180d92431fb0bbd29c04a0c420a57b3ed26ccd8a - Qx = 0xfd14cdf1607f5efb7b1793037b15bdf4baa6f7c16341ab0b - Qy = 0x83fa0795cc6c4795b9016dac928fd6bac32f3229a96312c4 - R = 0x8dfdb832951e0167c5d762a473c0416c5c15bc1195667dc1 - S = 0x1720288a2dc13fa1ec78f763f8fe2ff7354a7e6fdde44520 - test_signature_validity( Msg, Qx, Qy, R, S, False ) - - Msg = 0x08a2024b61b79d260e3bb43ef15659aec89e5b560199bc82cf7c65c77d39192e03b9a895d766655105edd9188242b91fbde4167f7862d4ddd61e5d4ab55196683d4f13ceb90d87aea6e07eb50a874e33086c4a7cb0273a8e1c4408f4b846bceae1ebaac1b2b2ea851a9b09de322efe34cebe601653efd6ddc876ce8c2f2072fb - Qx = 0x674f941dc1a1f8b763c9334d726172d527b90ca324db8828 - Qy = 0x65adfa32e8b236cb33a3e84cf59bfb9417ae7e8ede57a7ff - R = 0x9508b9fdd7daf0d8126f9e2bc5a35e4c6d800b5b804d7796 - S = 0x36f2bf6b21b987c77b53bb801b3435a577e3d493744bfab0 - test_signature_validity( Msg, Qx, Qy, R, S, False ) - - Msg = 0x1843aba74b0789d4ac6b0b8923848023a644a7b70afa23b1191829bbe4397ce15b629bf21a8838298653ed0c19222b95fa4f7390d1b4c844d96e645537e0aae98afb5c0ac3bd0e4c37f8daaff25556c64e98c319c52687c904c4de7240a1cc55cd9756b7edaef184e6e23b385726e9ffcba8001b8f574987c1a3fedaaa83ca6d - Qx = 0x10ecca1aad7220b56a62008b35170bfd5e35885c4014a19f - Qy = 0x04eb61984c6c12ade3bc47f3c629ece7aa0a033b9948d686 - R = 0x82bfa4e82c0dfe9274169b86694e76ce993fd83b5c60f325 - S = 0xa97685676c59a65dbde002fe9d613431fb183e8006d05633 - test_signature_validity( Msg, Qx, Qy, R, S, False ) - - Msg = 0x5a478f4084ddd1a7fea038aa9732a822106385797d02311aeef4d0264f824f698df7a48cfb6b578cf3da416bc0799425bb491be5b5ecc37995b85b03420a98f2c4dc5c31a69a379e9e322fbe706bbcaf0f77175e05cbb4fa162e0da82010a278461e3e974d137bc746d1880d6eb02aa95216014b37480d84b87f717bb13f76e1 - Qx = 0x6636653cb5b894ca65c448277b29da3ad101c4c2300f7c04 - Qy = 0xfdf1cbb3fc3fd6a4f890b59e554544175fa77dbdbeb656c1 - R = 0xeac2ddecddfb79931a9c3d49c08de0645c783a24cb365e1c - S = 0x3549fee3cfa7e5f93bc47d92d8ba100e881a2a93c22f8d50 - test_signature_validity( Msg, Qx, Qy, R, S, False ) - - Msg = 0xc598774259a058fa65212ac57eaa4f52240e629ef4c310722088292d1d4af6c39b49ce06ba77e4247b20637174d0bd67c9723feb57b5ead232b47ea452d5d7a089f17c00b8b6767e434a5e16c231ba0efa718a340bf41d67ea2d295812ff1b9277daacb8bc27b50ea5e6443bcf95ef4e9f5468fe78485236313d53d1c68f6ba2 - Qx = 0xa82bd718d01d354001148cd5f69b9ebf38ff6f21898f8aaa - Qy = 0xe67ceede07fc2ebfafd62462a51e4b6c6b3d5b537b7caf3e - R = 0x4d292486c620c3de20856e57d3bb72fcde4a73ad26376955 - S = 0xa85289591a6081d5728825520e62ff1c64f94235c04c7f95 - test_signature_validity( Msg, Qx, Qy, R, S, False ) - - Msg = 0xca98ed9db081a07b7557f24ced6c7b9891269a95d2026747add9e9eb80638a961cf9c71a1b9f2c29744180bd4c3d3db60f2243c5c0b7cc8a8d40a3f9a7fc910250f2187136ee6413ffc67f1a25e1c4c204fa9635312252ac0e0481d89b6d53808f0c496ba87631803f6c572c1f61fa049737fdacce4adff757afed4f05beb658 - Qx = 0x7d3b016b57758b160c4fca73d48df07ae3b6b30225126c2f - Qy = 0x4af3790d9775742bde46f8da876711be1b65244b2b39e7ec - R = 0x95f778f5f656511a5ab49a5d69ddd0929563c29cbc3a9e62 - S = 0x75c87fc358c251b4c83d2dd979faad496b539f9f2ee7a289 - test_signature_validity( Msg, Qx, Qy, R, S, False ) - - Msg = 0x31dd9a54c8338bea06b87eca813d555ad1850fac9742ef0bbe40dad400e10288acc9c11ea7dac79eb16378ebea9490e09536099f1b993e2653cd50240014c90a9c987f64545abc6a536b9bd2435eb5e911fdfde2f13be96ea36ad38df4ae9ea387b29cced599af777338af2794820c9cce43b51d2112380a35802ab7e396c97a - Qx = 0x9362f28c4ef96453d8a2f849f21e881cd7566887da8beb4a - Qy = 0xe64d26d8d74c48a024ae85d982ee74cd16046f4ee5333905 - R = 0xf3923476a296c88287e8de914b0b324ad5a963319a4fe73b - S = 0xf0baeed7624ed00d15244d8ba2aede085517dbdec8ac65f5 - test_signature_validity( Msg, Qx, Qy, R, S, True ) - - Msg = 0xb2b94e4432267c92f9fdb9dc6040c95ffa477652761290d3c7de312283f6450d89cc4aabe748554dfb6056b2d8e99c7aeaad9cdddebdee9dbc099839562d9064e68e7bb5f3a6bba0749ca9a538181fc785553a4000785d73cc207922f63e8ce1112768cb1de7b673aed83a1e4a74592f1268d8e2a4e9e63d414b5d442bd0456d - Qx = 0xcc6fc032a846aaac25533eb033522824f94e670fa997ecef - Qy = 0xe25463ef77a029eccda8b294fd63dd694e38d223d30862f1 - R = 0x066b1d07f3a40e679b620eda7f550842a35c18b80c5ebe06 - S = 0xa0b0fb201e8f2df65e2c4508ef303bdc90d934016f16b2dc - test_signature_validity( Msg, Qx, Qy, R, S, False ) - - Msg = 0x4366fcadf10d30d086911de30143da6f579527036937007b337f7282460eae5678b15cccda853193ea5fc4bc0a6b9d7a31128f27e1214988592827520b214eed5052f7775b750b0c6b15f145453ba3fee24a085d65287e10509eb5d5f602c440341376b95c24e5c4727d4b859bfe1483d20538acdd92c7997fa9c614f0f839d7 - Qx = 0x955c908fe900a996f7e2089bee2f6376830f76a19135e753 - Qy = 0xba0c42a91d3847de4a592a46dc3fdaf45a7cc709b90de520 - R = 0x1f58ad77fc04c782815a1405b0925e72095d906cbf52a668 - S = 0xf2e93758b3af75edf784f05a6761c9b9a6043c66b845b599 - test_signature_validity( Msg, Qx, Qy, R, S, False ) - - Msg = 0x543f8af57d750e33aa8565e0cae92bfa7a1ff78833093421c2942cadf9986670a5ff3244c02a8225e790fbf30ea84c74720abf99cfd10d02d34377c3d3b41269bea763384f372bb786b5846f58932defa68023136cd571863b304886e95e52e7877f445b9364b3f06f3c28da12707673fecb4b8071de06b6e0a3c87da160cef3 - Qx = 0x31f7fa05576d78a949b24812d4383107a9a45bb5fccdd835 - Qy = 0x8dc0eb65994a90f02b5e19bd18b32d61150746c09107e76b - R = 0xbe26d59e4e883dde7c286614a767b31e49ad88789d3a78ff - S = 0x8762ca831c1ce42df77893c9b03119428e7a9b819b619068 - test_signature_validity( Msg, Qx, Qy, R, S, False ) - - Msg = 0xd2e8454143ce281e609a9d748014dcebb9d0bc53adb02443a6aac2ffe6cb009f387c346ecb051791404f79e902ee333ad65e5c8cb38dc0d1d39a8dc90add5023572720e5b94b190d43dd0d7873397504c0c7aef2727e628eb6a74411f2e400c65670716cb4a815dc91cbbfeb7cfe8c929e93184c938af2c078584da045e8f8d1 - Qx = 0x66aa8edbbdb5cf8e28ceb51b5bda891cae2df84819fe25c0 - Qy = 0x0c6bc2f69030a7ce58d4a00e3b3349844784a13b8936f8da - R = 0xa4661e69b1734f4a71b788410a464b71e7ffe42334484f23 - S = 0x738421cf5e049159d69c57a915143e226cac8355e149afe9 - test_signature_validity( Msg, Qx, Qy, R, S, False ) - - Msg = 0x6660717144040f3e2f95a4e25b08a7079c702a8b29babad5a19a87654bc5c5afa261512a11b998a4fb36b5d8fe8bd942792ff0324b108120de86d63f65855e5461184fc96a0a8ffd2ce6d5dfb0230cbbdd98f8543e361b3205f5da3d500fdc8bac6db377d75ebef3cb8f4d1ff738071ad0938917889250b41dd1d98896ca06fb - Qx = 0xbcfacf45139b6f5f690a4c35a5fffa498794136a2353fc77 - Qy = 0x6f4a6c906316a6afc6d98fe1f0399d056f128fe0270b0f22 - R = 0x9db679a3dafe48f7ccad122933acfe9da0970b71c94c21c1 - S = 0x984c2db99827576c0a41a5da41e07d8cc768bc82f18c9da9 - test_signature_validity( Msg, Qx, Qy, R, S, False ) - - - - print_("Testing the example code:") - - # Building a public/private key pair from the NIST Curve P-192: - - g = generator_192 - n = g.order() - - # (random.SystemRandom is supposed to provide - # crypto-quality random numbers, but as Debian recently - # illustrated, a systems programmer can accidentally - # demolish this security, so in serious applications - # further precautions are appropriate.) - - randrange = random.SystemRandom().randrange - - secret = randrange( 1, n ) - pubkey = Public_key( g, g * secret ) - privkey = Private_key( pubkey, secret ) - - # Signing a hash value: - - hash = randrange( 1, n ) - signature = privkey.sign( hash, randrange( 1, n ) ) - - # Verifying a signature for a hash value: - - if pubkey.verifies( hash, signature ): - print_("Demo verification succeeded.") - else: - raise TestFailure("*** Demo verification failed.") - - if pubkey.verifies( hash-1, signature ): - raise TestFailure( "**** Demo verification failed to reject tampered hash.") - else: - print_("Demo verification correctly rejected tampered hash.") - -if __name__ == "__main__": - __main__() diff --git a/bin/python/ecdsa/ellipticcurve.py b/bin/python/ecdsa/ellipticcurve.py deleted file mode 100644 index 390bb355dd..0000000000 --- a/bin/python/ecdsa/ellipticcurve.py +++ /dev/null @@ -1,293 +0,0 @@ -#! /usr/bin/env python -# -# Implementation of elliptic curves, for cryptographic applications. -# -# This module doesn't provide any way to choose a random elliptic -# curve, nor to verify that an elliptic curve was chosen randomly, -# because one can simply use NIST's standard curves. -# -# Notes from X9.62-1998 (draft): -# Nomenclature: -# - Q is a public key. -# The "Elliptic Curve Domain Parameters" include: -# - q is the "field size", which in our case equals p. -# - p is a big prime. -# - G is a point of prime order (5.1.1.1). -# - n is the order of G (5.1.1.1). -# Public-key validation (5.2.2): -# - Verify that Q is not the point at infinity. -# - Verify that X_Q and Y_Q are in [0,p-1]. -# - Verify that Q is on the curve. -# - Verify that nQ is the point at infinity. -# Signature generation (5.3): -# - Pick random k from [1,n-1]. -# Signature checking (5.4.2): -# - Verify that r and s are in [1,n-1]. -# -# Version of 2008.11.25. -# -# Revision history: -# 2005.12.31 - Initial version. -# 2008.11.25 - Change CurveFp.is_on to contains_point. -# -# Written in 2005 by Peter Pearson and placed in the public domain. - -from __future__ import division - -from .six import print_ -from . import numbertheory - -class CurveFp( object ): - """Elliptic Curve over the field of integers modulo a prime.""" - def __init__( self, p, a, b ): - """The curve of points satisfying y^2 = x^3 + a*x + b (mod p).""" - self.__p = p - self.__a = a - self.__b = b - - def p( self ): - return self.__p - - def a( self ): - return self.__a - - def b( self ): - return self.__b - - def contains_point( self, x, y ): - """Is the point (x,y) on this curve?""" - return ( y * y - ( x * x * x + self.__a * x + self.__b ) ) % self.__p == 0 - - - -class Point( object ): - """A point on an elliptic curve. Altering x and y is forbidding, - but they can be read by the x() and y() methods.""" - def __init__( self, curve, x, y, order = None ): - """curve, x, y, order; order (optional) is the order of this point.""" - self.__curve = curve - self.__x = x - self.__y = y - self.__order = order - # self.curve is allowed to be None only for INFINITY: - if self.__curve: assert self.__curve.contains_point( x, y ) - if order: assert self * order == INFINITY - - def __eq__( self, other ): - """Return True if the points are identical, False otherwise.""" - if self.__curve == other.__curve \ - and self.__x == other.__x \ - and self.__y == other.__y: - return True - else: - return False - - def __add__( self, other ): - """Add one point to another point.""" - - # X9.62 B.3: - - if other == INFINITY: return self - if self == INFINITY: return other - assert self.__curve == other.__curve - if self.__x == other.__x: - if ( self.__y + other.__y ) % self.__curve.p() == 0: - return INFINITY - else: - return self.double() - - p = self.__curve.p() - - l = ( ( other.__y - self.__y ) * \ - numbertheory.inverse_mod( other.__x - self.__x, p ) ) % p - - x3 = ( l * l - self.__x - other.__x ) % p - y3 = ( l * ( self.__x - x3 ) - self.__y ) % p - - return Point( self.__curve, x3, y3 ) - - def __mul__( self, other ): - """Multiply a point by an integer.""" - - def leftmost_bit( x ): - assert x > 0 - result = 1 - while result <= x: result = 2 * result - return result // 2 - - e = other - if self.__order: e = e % self.__order - if e == 0: return INFINITY - if self == INFINITY: return INFINITY - assert e > 0 - - # From X9.62 D.3.2: - - e3 = 3 * e - negative_self = Point( self.__curve, self.__x, -self.__y, self.__order ) - i = leftmost_bit( e3 ) // 2 - result = self - # print_("Multiplying %s by %d (e3 = %d):" % ( self, other, e3 )) - while i > 1: - result = result.double() - if ( e3 & i ) != 0 and ( e & i ) == 0: result = result + self - if ( e3 & i ) == 0 and ( e & i ) != 0: result = result + negative_self - # print_(". . . i = %d, result = %s" % ( i, result )) - i = i // 2 - - return result - - def __rmul__( self, other ): - """Multiply a point by an integer.""" - - return self * other - - def __str__( self ): - if self == INFINITY: return "infinity" - return "(%d,%d)" % ( self.__x, self.__y ) - - def double( self ): - """Return a new point that is twice the old.""" - - if self == INFINITY: - return INFINITY - - # X9.62 B.3: - - p = self.__curve.p() - a = self.__curve.a() - - l = ( ( 3 * self.__x * self.__x + a ) * \ - numbertheory.inverse_mod( 2 * self.__y, p ) ) % p - - x3 = ( l * l - 2 * self.__x ) % p - y3 = ( l * ( self.__x - x3 ) - self.__y ) % p - - return Point( self.__curve, x3, y3 ) - - def x( self ): - return self.__x - - def y( self ): - return self.__y - - def curve( self ): - return self.__curve - - def order( self ): - return self.__order - - -# This one point is the Point At Infinity for all purposes: -INFINITY = Point( None, None, None ) - -def __main__(): - - class FailedTest(Exception): pass - def test_add( c, x1, y1, x2, y2, x3, y3 ): - """We expect that on curve c, (x1,y1) + (x2, y2 ) = (x3, y3).""" - p1 = Point( c, x1, y1 ) - p2 = Point( c, x2, y2 ) - p3 = p1 + p2 - print_("%s + %s = %s" % ( p1, p2, p3 ), end=' ') - if p3.x() != x3 or p3.y() != y3: - raise FailedTest("Failure: should give (%d,%d)." % ( x3, y3 )) - else: - print_(" Good.") - - def test_double( c, x1, y1, x3, y3 ): - """We expect that on curve c, 2*(x1,y1) = (x3, y3).""" - p1 = Point( c, x1, y1 ) - p3 = p1.double() - print_("%s doubled = %s" % ( p1, p3 ), end=' ') - if p3.x() != x3 or p3.y() != y3: - raise FailedTest("Failure: should give (%d,%d)." % ( x3, y3 )) - else: - print_(" Good.") - - def test_double_infinity( c ): - """We expect that on curve c, 2*INFINITY = INFINITY.""" - p1 = INFINITY - p3 = p1.double() - print_("%s doubled = %s" % ( p1, p3 ), end=' ') - if p3.x() != INFINITY.x() or p3.y() != INFINITY.y(): - raise FailedTest("Failure: should give (%d,%d)." % ( INFINITY.x(), INFINITY.y() )) - else: - print_(" Good.") - - def test_multiply( c, x1, y1, m, x3, y3 ): - """We expect that on curve c, m*(x1,y1) = (x3,y3).""" - p1 = Point( c, x1, y1 ) - p3 = p1 * m - print_("%s * %d = %s" % ( p1, m, p3 ), end=' ') - if p3.x() != x3 or p3.y() != y3: - raise FailedTest("Failure: should give (%d,%d)." % ( x3, y3 )) - else: - print_(" Good.") - - - # A few tests from X9.62 B.3: - - c = CurveFp( 23, 1, 1 ) - test_add( c, 3, 10, 9, 7, 17, 20 ) - test_double( c, 3, 10, 7, 12 ) - test_add( c, 3, 10, 3, 10, 7, 12 ) # (Should just invoke double.) - test_multiply( c, 3, 10, 2, 7, 12 ) - - test_double_infinity(c) - - # From X9.62 I.1 (p. 96): - - g = Point( c, 13, 7, 7 ) - - check = INFINITY - for i in range( 7 + 1 ): - p = ( i % 7 ) * g - print_("%s * %d = %s, expected %s . . ." % ( g, i, p, check ), end=' ') - if p == check: - print_(" Good.") - else: - raise FailedTest("Bad.") - check = check + g - - # NIST Curve P-192: - p = 6277101735386680763835789423207666416083908700390324961279 - r = 6277101735386680763835789423176059013767194773182842284081 - #s = 0x3045ae6fc8422f64ed579528d38120eae12196d5L - c = 0x3099d2bbbfcb2538542dcd5fb078b6ef5f3d6fe2c745de65 - b = 0x64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1 - Gx = 0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012 - Gy = 0x07192b95ffc8da78631011ed6b24cdd573f977a11e794811 - - c192 = CurveFp( p, -3, b ) - p192 = Point( c192, Gx, Gy, r ) - - # Checking against some sample computations presented - # in X9.62: - - d = 651056770906015076056810763456358567190100156695615665659 - Q = d * p192 - if Q.x() != 0x62B12D60690CDCF330BABAB6E69763B471F994DD702D16A5: - raise FailedTest("p192 * d came out wrong.") - else: - print_("p192 * d came out right.") - - k = 6140507067065001063065065565667405560006161556565665656654 - R = k * p192 - if R.x() != 0x885052380FF147B734C330C43D39B2C4A89F29B0F749FEAD \ - or R.y() != 0x9CF9FA1CBEFEFB917747A3BB29C072B9289C2547884FD835: - raise FailedTest("k * p192 came out wrong.") - else: - print_("k * p192 came out right.") - - u1 = 2563697409189434185194736134579731015366492496392189760599 - u2 = 6266643813348617967186477710235785849136406323338782220568 - temp = u1 * p192 + u2 * Q - if temp.x() != 0x885052380FF147B734C330C43D39B2C4A89F29B0F749FEAD \ - or temp.y() != 0x9CF9FA1CBEFEFB917747A3BB29C072B9289C2547884FD835: - raise FailedTest("u1 * p192 + u2 * Q came out wrong.") - else: - print_("u1 * p192 + u2 * Q came out right.") - -if __name__ == "__main__": - __main__() diff --git a/bin/python/ecdsa/keys.py b/bin/python/ecdsa/keys.py deleted file mode 100644 index 5b5212548c..0000000000 --- a/bin/python/ecdsa/keys.py +++ /dev/null @@ -1,283 +0,0 @@ -import binascii - -from . import ecdsa -from . import der -from . import rfc6979 -from .curves import NIST192p, find_curve -from .util import string_to_number, number_to_string, randrange -from .util import sigencode_string, sigdecode_string -from .util import oid_ecPublicKey, encoded_oid_ecPublicKey -from .six import PY3, b -from hashlib import sha1 - -class BadSignatureError(Exception): - pass -class BadDigestError(Exception): - pass - -class VerifyingKey: - def __init__(self, _error__please_use_generate=None): - if not _error__please_use_generate: - raise TypeError("Please use SigningKey.generate() to construct me") - - @classmethod - def from_public_point(klass, point, curve=NIST192p, hashfunc=sha1): - self = klass(_error__please_use_generate=True) - self.curve = curve - self.default_hashfunc = hashfunc - self.pubkey = ecdsa.Public_key(curve.generator, point) - self.pubkey.order = curve.order - return self - - @classmethod - def from_string(klass, string, curve=NIST192p, hashfunc=sha1, - validate_point=True): - order = curve.order - assert len(string) == curve.verifying_key_length, \ - (len(string), curve.verifying_key_length) - xs = string[:curve.baselen] - ys = string[curve.baselen:] - assert len(xs) == curve.baselen, (len(xs), curve.baselen) - assert len(ys) == curve.baselen, (len(ys), curve.baselen) - x = string_to_number(xs) - y = string_to_number(ys) - if validate_point: - assert ecdsa.point_is_valid(curve.generator, x, y) - from . import ellipticcurve - point = ellipticcurve.Point(curve.curve, x, y, order) - return klass.from_public_point(point, curve, hashfunc) - - @classmethod - def from_pem(klass, string): - return klass.from_der(der.unpem(string)) - - @classmethod - def from_der(klass, string): - # [[oid_ecPublicKey,oid_curve], point_str_bitstring] - s1,empty = der.remove_sequence(string) - if empty != b(""): - raise der.UnexpectedDER("trailing junk after DER pubkey: %s" % - binascii.hexlify(empty)) - s2,point_str_bitstring = der.remove_sequence(s1) - # s2 = oid_ecPublicKey,oid_curve - oid_pk, rest = der.remove_object(s2) - oid_curve, empty = der.remove_object(rest) - if empty != b(""): - raise der.UnexpectedDER("trailing junk after DER pubkey objects: %s" % - binascii.hexlify(empty)) - assert oid_pk == oid_ecPublicKey, (oid_pk, oid_ecPublicKey) - curve = find_curve(oid_curve) - point_str, empty = der.remove_bitstring(point_str_bitstring) - if empty != b(""): - raise der.UnexpectedDER("trailing junk after pubkey pointstring: %s" % - binascii.hexlify(empty)) - assert point_str.startswith(b("\x00\x04")) - return klass.from_string(point_str[2:], curve) - - def to_string(self): - # VerifyingKey.from_string(vk.to_string()) == vk as long as the - # curves are the same: the curve itself is not included in the - # serialized form - order = self.pubkey.order - x_str = number_to_string(self.pubkey.point.x(), order) - y_str = number_to_string(self.pubkey.point.y(), order) - return x_str + y_str - - def to_pem(self): - return der.topem(self.to_der(), "PUBLIC KEY") - - def to_der(self): - order = self.pubkey.order - x_str = number_to_string(self.pubkey.point.x(), order) - y_str = number_to_string(self.pubkey.point.y(), order) - point_str = b("\x00\x04") + x_str + y_str - return der.encode_sequence(der.encode_sequence(encoded_oid_ecPublicKey, - self.curve.encoded_oid), - der.encode_bitstring(point_str)) - - def verify(self, signature, data, hashfunc=None, sigdecode=sigdecode_string): - hashfunc = hashfunc or self.default_hashfunc - digest = hashfunc(data).digest() - return self.verify_digest(signature, digest, sigdecode) - - def verify_digest(self, signature, digest, sigdecode=sigdecode_string): - if len(digest) > self.curve.baselen: - raise BadDigestError("this curve (%s) is too short " - "for your digest (%d)" % (self.curve.name, - 8*len(digest))) - number = string_to_number(digest) - r, s = sigdecode(signature, self.pubkey.order) - sig = ecdsa.Signature(r, s) - if self.pubkey.verifies(number, sig): - return True - raise BadSignatureError - -class SigningKey: - def __init__(self, _error__please_use_generate=None): - if not _error__please_use_generate: - raise TypeError("Please use SigningKey.generate() to construct me") - - @classmethod - def generate(klass, curve=NIST192p, entropy=None, hashfunc=sha1): - secexp = randrange(curve.order, entropy) - return klass.from_secret_exponent(secexp, curve, hashfunc) - - # to create a signing key from a short (arbitrary-length) seed, convert - # that seed into an integer with something like - # secexp=util.randrange_from_seed__X(seed, curve.order), and then pass - # that integer into SigningKey.from_secret_exponent(secexp, curve) - - @classmethod - def from_secret_exponent(klass, secexp, curve=NIST192p, hashfunc=sha1): - self = klass(_error__please_use_generate=True) - self.curve = curve - self.default_hashfunc = hashfunc - self.baselen = curve.baselen - n = curve.order - assert 1 <= secexp < n - pubkey_point = curve.generator*secexp - pubkey = ecdsa.Public_key(curve.generator, pubkey_point) - pubkey.order = n - self.verifying_key = VerifyingKey.from_public_point(pubkey_point, curve, - hashfunc) - self.privkey = ecdsa.Private_key(pubkey, secexp) - self.privkey.order = n - return self - - @classmethod - def from_string(klass, string, curve=NIST192p, hashfunc=sha1): - assert len(string) == curve.baselen, (len(string), curve.baselen) - secexp = string_to_number(string) - return klass.from_secret_exponent(secexp, curve, hashfunc) - - @classmethod - def from_pem(klass, string, hashfunc=sha1): - # the privkey pem file has two sections: "EC PARAMETERS" and "EC - # PRIVATE KEY". The first is redundant. - if PY3 and isinstance(string, str): - string = string.encode() - privkey_pem = string[string.index(b("-----BEGIN EC PRIVATE KEY-----")):] - return klass.from_der(der.unpem(privkey_pem), hashfunc) - @classmethod - def from_der(klass, string, hashfunc=sha1): - # SEQ([int(1), octetstring(privkey),cont[0], oid(secp224r1), - # cont[1],bitstring]) - s, empty = der.remove_sequence(string) - if empty != b(""): - raise der.UnexpectedDER("trailing junk after DER privkey: %s" % - binascii.hexlify(empty)) - one, s = der.remove_integer(s) - if one != 1: - raise der.UnexpectedDER("expected '1' at start of DER privkey," - " got %d" % one) - privkey_str, s = der.remove_octet_string(s) - tag, curve_oid_str, s = der.remove_constructed(s) - if tag != 0: - raise der.UnexpectedDER("expected tag 0 in DER privkey," - " got %d" % tag) - curve_oid, empty = der.remove_object(curve_oid_str) - if empty != b(""): - raise der.UnexpectedDER("trailing junk after DER privkey " - "curve_oid: %s" % binascii.hexlify(empty)) - curve = find_curve(curve_oid) - - # we don't actually care about the following fields - # - #tag, pubkey_bitstring, s = der.remove_constructed(s) - #if tag != 1: - # raise der.UnexpectedDER("expected tag 1 in DER privkey, got %d" - # % tag) - #pubkey_str = der.remove_bitstring(pubkey_bitstring) - #if empty != "": - # raise der.UnexpectedDER("trailing junk after DER privkey " - # "pubkeystr: %s" % binascii.hexlify(empty)) - - # our from_string method likes fixed-length privkey strings - if len(privkey_str) < curve.baselen: - privkey_str = b("\x00")*(curve.baselen-len(privkey_str)) + privkey_str - return klass.from_string(privkey_str, curve, hashfunc) - - def to_string(self): - secexp = self.privkey.secret_multiplier - s = number_to_string(secexp, self.privkey.order) - return s - - def to_pem(self): - # TODO: "BEGIN ECPARAMETERS" - return der.topem(self.to_der(), "EC PRIVATE KEY") - - def to_der(self): - # SEQ([int(1), octetstring(privkey),cont[0], oid(secp224r1), - # cont[1],bitstring]) - encoded_vk = b("\x00\x04") + self.get_verifying_key().to_string() - return der.encode_sequence(der.encode_integer(1), - der.encode_octet_string(self.to_string()), - der.encode_constructed(0, self.curve.encoded_oid), - der.encode_constructed(1, der.encode_bitstring(encoded_vk)), - ) - - def get_verifying_key(self): - return self.verifying_key - - def sign_deterministic(self, data, hashfunc=None, sigencode=sigencode_string): - hashfunc = hashfunc or self.default_hashfunc - digest = hashfunc(data).digest() - - return self.sign_digest_deterministic(digest, hashfunc=hashfunc, sigencode=sigencode) - - def sign_digest_deterministic(self, digest, hashfunc=None, sigencode=sigencode_string): - """ - Calculates 'k' from data itself, removing the need for strong - random generator and producing deterministic (reproducible) signatures. - See RFC 6979 for more details. - """ - secexp = self.privkey.secret_multiplier - k = rfc6979.generate_k( - self.curve.generator.order(), secexp, hashfunc, digest) - - return self.sign_digest(digest, sigencode=sigencode, k=k) - - def sign(self, data, entropy=None, hashfunc=None, sigencode=sigencode_string, k=None): - """ - hashfunc= should behave like hashlib.sha1 . The output length of the - hash (in bytes) must not be longer than the length of the curve order - (rounded up to the nearest byte), so using SHA256 with nist256p is - ok, but SHA256 with nist192p is not. (In the 2**-96ish unlikely event - of a hash output larger than the curve order, the hash will - effectively be wrapped mod n). - - Use hashfunc=hashlib.sha1 to match openssl's -ecdsa-with-SHA1 mode, - or hashfunc=hashlib.sha256 for openssl-1.0.0's -ecdsa-with-SHA256. - """ - - hashfunc = hashfunc or self.default_hashfunc - h = hashfunc(data).digest() - return self.sign_digest(h, entropy, sigencode, k) - - def sign_digest(self, digest, entropy=None, sigencode=sigencode_string, k=None): - if len(digest) > self.curve.baselen: - raise BadDigestError("this curve (%s) is too short " - "for your digest (%d)" % (self.curve.name, - 8*len(digest))) - number = string_to_number(digest) - r, s = self.sign_number(number, entropy, k) - return sigencode(r, s, self.privkey.order) - - def sign_number(self, number, entropy=None, k=None): - # returns a pair of numbers - order = self.privkey.order - # privkey.sign() may raise RuntimeError in the amazingly unlikely - # (2**-192) event that r=0 or s=0, because that would leak the key. - # We could re-try with a different 'k', but we couldn't test that - # code, so I choose to allow the signature to fail instead. - - # If k is set, it is used directly. In other cases - # it is generated using entropy function - if k is not None: - _k = k - else: - _k = randrange(order, entropy) - - assert 1 <= _k < order - sig = self.privkey.sign(number, _k) - return sig.r, sig.s diff --git a/bin/python/ecdsa/numbertheory.py b/bin/python/ecdsa/numbertheory.py deleted file mode 100644 index 7ace0dc342..0000000000 --- a/bin/python/ecdsa/numbertheory.py +++ /dev/null @@ -1,613 +0,0 @@ -#! /usr/bin/env python -# -# Provide some simple capabilities from number theory. -# -# Version of 2008.11.14. -# -# Written in 2005 and 2006 by Peter Pearson and placed in the public domain. -# Revision history: -# 2008.11.14: Use pow( base, exponent, modulus ) for modular_exp. -# Make gcd and lcm accept arbitrarly many arguments. - -from __future__ import division - -from .six import print_, integer_types -from .six.moves import reduce - -import math - - -class Error( Exception ): - """Base class for exceptions in this module.""" - pass - -class SquareRootError( Error ): - pass - -class NegativeExponentError( Error ): - pass - - -def modular_exp( base, exponent, modulus ): - "Raise base to exponent, reducing by modulus" - if exponent < 0: - raise NegativeExponentError( "Negative exponents (%d) not allowed" \ - % exponent ) - return pow( base, exponent, modulus ) -# result = 1L -# x = exponent -# b = base + 0L -# while x > 0: -# if x % 2 > 0: result = (result * b) % modulus -# x = x // 2 -# b = ( b * b ) % modulus -# return result - - -def polynomial_reduce_mod( poly, polymod, p ): - """Reduce poly by polymod, integer arithmetic modulo p. - - Polynomials are represented as lists of coefficients - of increasing powers of x.""" - - # This module has been tested only by extensive use - # in calculating modular square roots. - - # Just to make this easy, require a monic polynomial: - assert polymod[-1] == 1 - - assert len( polymod ) > 1 - - while len( poly ) >= len( polymod ): - if poly[-1] != 0: - for i in range( 2, len( polymod ) + 1 ): - poly[-i] = ( poly[-i] - poly[-1] * polymod[-i] ) % p - poly = poly[0:-1] - - return poly - - - -def polynomial_multiply_mod( m1, m2, polymod, p ): - """Polynomial multiplication modulo a polynomial over ints mod p. - - Polynomials are represented as lists of coefficients - of increasing powers of x.""" - - # This is just a seat-of-the-pants implementation. - - # This module has been tested only by extensive use - # in calculating modular square roots. - - # Initialize the product to zero: - - prod = ( len( m1 ) + len( m2 ) - 1 ) * [0] - - # Add together all the cross-terms: - - for i in range( len( m1 ) ): - for j in range( len( m2 ) ): - prod[i+j] = ( prod[i+j] + m1[i] * m2[j] ) % p - - return polynomial_reduce_mod( prod, polymod, p ) - - -def polynomial_exp_mod( base, exponent, polymod, p ): - """Polynomial exponentiation modulo a polynomial over ints mod p. - - Polynomials are represented as lists of coefficients - of increasing powers of x.""" - - # Based on the Handbook of Applied Cryptography, algorithm 2.227. - - # This module has been tested only by extensive use - # in calculating modular square roots. - - assert exponent < p - - if exponent == 0: return [ 1 ] - - G = base - k = exponent - if k%2 == 1: s = G - else: s = [ 1 ] - - while k > 1: - k = k // 2 - G = polynomial_multiply_mod( G, G, polymod, p ) - if k%2 == 1: s = polynomial_multiply_mod( G, s, polymod, p ) - - return s - - - -def jacobi( a, n ): - """Jacobi symbol""" - - # Based on the Handbook of Applied Cryptography (HAC), algorithm 2.149. - - # This function has been tested by comparison with a small - # table printed in HAC, and by extensive use in calculating - # modular square roots. - - assert n >= 3 - assert n%2 == 1 - a = a % n - if a == 0: return 0 - if a == 1: return 1 - a1, e = a, 0 - while a1%2 == 0: - a1, e = a1//2, e+1 - if e%2 == 0 or n%8 == 1 or n%8 == 7: s = 1 - else: s = -1 - if a1 == 1: return s - if n%4 == 3 and a1%4 == 3: s = -s - return s * jacobi( n % a1, a1 ) - - - -def square_root_mod_prime( a, p ): - """Modular square root of a, mod p, p prime.""" - - # Based on the Handbook of Applied Cryptography, algorithms 3.34 to 3.39. - - # This module has been tested for all values in [0,p-1] for - # every prime p from 3 to 1229. - - assert 0 <= a < p - assert 1 < p - - if a == 0: return 0 - if p == 2: return a - - jac = jacobi( a, p ) - if jac == -1: raise SquareRootError( "%d has no square root modulo %d" \ - % ( a, p ) ) - - if p % 4 == 3: return modular_exp( a, (p+1)//4, p ) - - if p % 8 == 5: - d = modular_exp( a, (p-1)//4, p ) - if d == 1: return modular_exp( a, (p+3)//8, p ) - if d == p-1: return ( 2 * a * modular_exp( 4*a, (p-5)//8, p ) ) % p - raise RuntimeError("Shouldn't get here.") - - for b in range( 2, p ): - if jacobi( b*b-4*a, p ) == -1: - f = ( a, -b, 1 ) - ff = polynomial_exp_mod( ( 0, 1 ), (p+1)//2, f, p ) - assert ff[1] == 0 - return ff[0] - raise RuntimeError("No b found.") - - - -def inverse_mod( a, m ): - """Inverse of a mod m.""" - - if a < 0 or m <= a: a = a % m - - # From Ferguson and Schneier, roughly: - - c, d = a, m - uc, vc, ud, vd = 1, 0, 0, 1 - while c != 0: - q, c, d = divmod( d, c ) + ( c, ) - uc, vc, ud, vd = ud - q*uc, vd - q*vc, uc, vc - - # At this point, d is the GCD, and ud*a+vd*m = d. - # If d == 1, this means that ud is a inverse. - - assert d == 1 - if ud > 0: return ud - else: return ud + m - - -def gcd2(a, b): - """Greatest common divisor using Euclid's algorithm.""" - while a: - a, b = b%a, a - return b - - -def gcd( *a ): - """Greatest common divisor. - - Usage: gcd( [ 2, 4, 6 ] ) - or: gcd( 2, 4, 6 ) - """ - - if len( a ) > 1: return reduce( gcd2, a ) - if hasattr( a[0], "__iter__" ): return reduce( gcd2, a[0] ) - return a[0] - - -def lcm2(a,b): - """Least common multiple of two integers.""" - - return (a*b)//gcd(a,b) - - -def lcm( *a ): - """Least common multiple. - - Usage: lcm( [ 3, 4, 5 ] ) - or: lcm( 3, 4, 5 ) - """ - - if len( a ) > 1: return reduce( lcm2, a ) - if hasattr( a[0], "__iter__" ): return reduce( lcm2, a[0] ) - return a[0] - - - -def factorization( n ): - """Decompose n into a list of (prime,exponent) pairs.""" - - assert isinstance( n, integer_types ) - - if n < 2: return [] - - result = [] - d = 2 - - # Test the small primes: - - for d in smallprimes: - if d > n: break - q, r = divmod( n, d ) - if r == 0: - count = 1 - while d <= n: - n = q - q, r = divmod( n, d ) - if r != 0: break - count = count + 1 - result.append( ( d, count ) ) - - # If n is still greater than the last of our small primes, - # it may require further work: - - if n > smallprimes[-1]: - if is_prime( n ): # If what's left is prime, it's easy: - result.append( ( n, 1 ) ) - else: # Ugh. Search stupidly for a divisor: - d = smallprimes[-1] - while 1: - d = d + 2 # Try the next divisor. - q, r = divmod( n, d ) - if q < d: break # n < d*d means we're done, n = 1 or prime. - if r == 0: # d divides n. How many times? - count = 1 - n = q - while d <= n: # As long as d might still divide n, - q, r = divmod( n, d ) # see if it does. - if r != 0: break - n = q # It does. Reduce n, increase count. - count = count + 1 - result.append( ( d, count ) ) - if n > 1: result.append( ( n, 1 ) ) - - return result - - - -def phi( n ): - """Return the Euler totient function of n.""" - - assert isinstance( n, integer_types ) - - if n < 3: return 1 - - result = 1 - ff = factorization( n ) - for f in ff: - e = f[1] - if e > 1: - result = result * f[0] ** (e-1) * ( f[0] - 1 ) - else: - result = result * ( f[0] - 1 ) - return result - - -def carmichael( n ): - """Return Carmichael function of n. - - Carmichael(n) is the smallest integer x such that - m**x = 1 mod n for all m relatively prime to n. - """ - - return carmichael_of_factorized( factorization( n ) ) - - -def carmichael_of_factorized( f_list ): - """Return the Carmichael function of a number that is - represented as a list of (prime,exponent) pairs. - """ - - if len( f_list ) < 1: return 1 - - result = carmichael_of_ppower( f_list[0] ) - for i in range( 1, len( f_list ) ): - result = lcm( result, carmichael_of_ppower( f_list[i] ) ) - - return result - -def carmichael_of_ppower( pp ): - """Carmichael function of the given power of the given prime. - """ - - p, a = pp - if p == 2 and a > 2: return 2**(a-2) - else: return (p-1) * p**(a-1) - - - -def order_mod( x, m ): - """Return the order of x in the multiplicative group mod m. - """ - - # Warning: this implementation is not very clever, and will - # take a long time if m is very large. - - if m <= 1: return 0 - - assert gcd( x, m ) == 1 - - z = x - result = 1 - while z != 1: - z = ( z * x ) % m - result = result + 1 - return result - - -def largest_factor_relatively_prime( a, b ): - """Return the largest factor of a relatively prime to b. - """ - - while 1: - d = gcd( a, b ) - if d <= 1: break - b = d - while 1: - q, r = divmod( a, d ) - if r > 0: - break - a = q - return a - - -def kinda_order_mod( x, m ): - """Return the order of x in the multiplicative group mod m', - where m' is the largest factor of m relatively prime to x. - """ - - return order_mod( x, largest_factor_relatively_prime( m, x ) ) - - -def is_prime( n ): - """Return True if x is prime, False otherwise. - - We use the Miller-Rabin test, as given in Menezes et al. p. 138. - This test is not exact: there are composite values n for which - it returns True. - - In testing the odd numbers from 10000001 to 19999999, - about 66 composites got past the first test, - 5 got past the second test, and none got past the third. - Since factors of 2, 3, 5, 7, and 11 were detected during - preliminary screening, the number of numbers tested by - Miller-Rabin was (19999999 - 10000001)*(2/3)*(4/5)*(6/7) - = 4.57 million. - """ - - # (This is used to study the risk of false positives:) - global miller_rabin_test_count - - miller_rabin_test_count = 0 - - if n <= smallprimes[-1]: - if n in smallprimes: return True - else: return False - - if gcd( n, 2*3*5*7*11 ) != 1: return False - - # Choose a number of iterations sufficient to reduce the - # probability of accepting a composite below 2**-80 - # (from Menezes et al. Table 4.4): - - t = 40 - n_bits = 1 + int( math.log( n, 2 ) ) - for k, tt in ( ( 100, 27 ), - ( 150, 18 ), - ( 200, 15 ), - ( 250, 12 ), - ( 300, 9 ), - ( 350, 8 ), - ( 400, 7 ), - ( 450, 6 ), - ( 550, 5 ), - ( 650, 4 ), - ( 850, 3 ), - ( 1300, 2 ), - ): - if n_bits < k: break - t = tt - - # Run the test t times: - - s = 0 - r = n - 1 - while ( r % 2 ) == 0: - s = s + 1 - r = r // 2 - for i in range( t ): - a = smallprimes[ i ] - y = modular_exp( a, r, n ) - if y != 1 and y != n-1: - j = 1 - while j <= s - 1 and y != n - 1: - y = modular_exp( y, 2, n ) - if y == 1: - miller_rabin_test_count = i + 1 - return False - j = j + 1 - if y != n-1: - miller_rabin_test_count = i + 1 - return False - return True - - -def next_prime( starting_value ): - "Return the smallest prime larger than the starting value." - - if starting_value < 2: return 2 - result = ( starting_value + 1 ) | 1 - while not is_prime( result ): result = result + 2 - return result - - -smallprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, - 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, - 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, - 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, - 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, - 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, - 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, - 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, - 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, - 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, - 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, - 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, - 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, - 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, - 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, - 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, - 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, - 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, - 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, - 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229] - -miller_rabin_test_count = 0 - -def __main__(): - - # Making sure locally defined exceptions work: - # p = modular_exp( 2, -2, 3 ) - # p = square_root_mod_prime( 2, 3 ) - - - print_("Testing gcd...") - assert gcd( 3*5*7, 3*5*11, 3*5*13 ) == 3*5 - assert gcd( [ 3*5*7, 3*5*11, 3*5*13 ] ) == 3*5 - assert gcd( 3 ) == 3 - - print_("Testing lcm...") - assert lcm( 3, 5*3, 7*3 ) == 3*5*7 - assert lcm( [ 3, 5*3, 7*3 ] ) == 3*5*7 - assert lcm( 3 ) == 3 - - print_("Testing next_prime...") - bigprimes = ( 999671, - 999683, - 999721, - 999727, - 999749, - 999763, - 999769, - 999773, - 999809, - 999853, - 999863, - 999883, - 999907, - 999917, - 999931, - 999953, - 999959, - 999961, - 999979, - 999983 ) - - for i in range( len( bigprimes ) - 1 ): - assert next_prime( bigprimes[i] ) == bigprimes[ i+1 ] - - error_tally = 0 - - # Test the square_root_mod_prime function: - - for p in smallprimes: - print_("Testing square_root_mod_prime for modulus p = %d." % p) - squares = [] - - for root in range( 0, 1+p//2 ): - sq = ( root * root ) % p - squares.append( sq ) - calculated = square_root_mod_prime( sq, p ) - if ( calculated * calculated ) % p != sq: - error_tally = error_tally + 1 - print_("Failed to find %d as sqrt( %d ) mod %d. Said %d." % \ - ( root, sq, p, calculated )) - - for nonsquare in range( 0, p ): - if nonsquare not in squares: - try: - calculated = square_root_mod_prime( nonsquare, p ) - except SquareRootError: - pass - else: - error_tally = error_tally + 1 - print_("Failed to report no root for sqrt( %d ) mod %d." % \ - ( nonsquare, p )) - - # Test the jacobi function: - for m in range( 3, 400, 2 ): - print_("Testing jacobi for modulus m = %d." % m) - if is_prime( m ): - squares = [] - for root in range( 1, m ): - if jacobi( root * root, m ) != 1: - error_tally = error_tally + 1 - print_("jacobi( %d * %d, %d ) != 1" % ( root, root, m )) - squares.append( root * root % m ) - for i in range( 1, m ): - if not i in squares: - if jacobi( i, m ) != -1: - error_tally = error_tally + 1 - print_("jacobi( %d, %d ) != -1" % ( i, m )) - else: # m is not prime. - f = factorization( m ) - for a in range( 1, m ): - c = 1 - for i in f: - c = c * jacobi( a, i[0] ) ** i[1] - if c != jacobi( a, m ): - error_tally = error_tally + 1 - print_("%d != jacobi( %d, %d )" % ( c, a, m )) - - -# Test the inverse_mod function: - print_("Testing inverse_mod . . .") - import random - n_tests = 0 - for i in range( 100 ): - m = random.randint( 20, 10000 ) - for j in range( 100 ): - a = random.randint( 1, m-1 ) - if gcd( a, m ) == 1: - n_tests = n_tests + 1 - inv = inverse_mod( a, m ) - if inv <= 0 or inv >= m or ( a * inv ) % m != 1: - error_tally = error_tally + 1 - print_("%d = inverse_mod( %d, %d ) is wrong." % ( inv, a, m )) - assert n_tests > 1000 - print_(n_tests, " tests of inverse_mod completed.") - - class FailedTest(Exception): pass - print_(error_tally, "errors detected.") - if error_tally != 0: - raise FailedTest("%d errors detected" % error_tally) - -if __name__ == '__main__': - __main__() diff --git a/bin/python/ecdsa/rfc6979.py b/bin/python/ecdsa/rfc6979.py deleted file mode 100644 index 6ea0f53c3f..0000000000 --- a/bin/python/ecdsa/rfc6979.py +++ /dev/null @@ -1,103 +0,0 @@ -''' -RFC 6979: - Deterministic Usage of the Digital Signature Algorithm (DSA) and - Elliptic Curve Digital Signature Algorithm (ECDSA) - - http://tools.ietf.org/html/rfc6979 - -Many thanks to Coda Hale for his implementation in Go language: - https://github.com/codahale/rfc6979 -''' - -import hmac -from binascii import hexlify -from .util import number_to_string, number_to_string_crop -from .six import b - -try: - bin(0) -except NameError: - binmap = {"0": "0000", "1": "0001", "2": "0010", "3": "0011", - "4": "0100", "5": "0101", "6": "0110", "7": "0111", - "8": "1000", "9": "1001", "a": "1010", "b": "1011", - "c": "1100", "d": "1101", "e": "1110", "f": "1111"} - def bin(value): # for python2.5 - v = "".join(binmap[x] for x in "%x"%abs(value)).lstrip("0") - if value < 0: - return "-0b" + v - return "0b" + v - -def bit_length(num): - # http://docs.python.org/dev/library/stdtypes.html#int.bit_length - s = bin(num) # binary representation: bin(-37) --> '-0b100101' - s = s.lstrip('-0b') # remove leading zeros and minus sign - return len(s) # len('100101') --> 6 - -def bits2int(data, qlen): - x = int(hexlify(data), 16) - l = len(data) * 8 - - if l > qlen: - return x >> (l-qlen) - return x - -def bits2octets(data, order): - z1 = bits2int(data, bit_length(order)) - z2 = z1 - order - - if z2 < 0: - z2 = z1 - - return number_to_string_crop(z2, order) - -# https://tools.ietf.org/html/rfc6979#section-3.2 -def generate_k(order, secexp, hash_func, data): - ''' - generator - order of the DSA generator used in the signature - secexp - secure exponent (private key) in numeric form - hash_func - reference to the same hash function used for generating hash - data - hash in binary form of the signing data - ''' - - qlen = bit_length(order) - holen = hash_func().digest_size - rolen = (qlen + 7) / 8 - bx = number_to_string(secexp, order) + bits2octets(data, order) - - # Step B - v = b('\x01') * holen - - # Step C - k = b('\x00') * holen - - # Step D - - k = hmac.new(k, v+b('\x00')+bx, hash_func).digest() - - # Step E - v = hmac.new(k, v, hash_func).digest() - - # Step F - k = hmac.new(k, v+b('\x01')+bx, hash_func).digest() - - # Step G - v = hmac.new(k, v, hash_func).digest() - - # Step H - while True: - # Step H1 - t = b('') - - # Step H2 - while len(t) < rolen: - v = hmac.new(k, v, hash_func).digest() - t += v - - # Step H3 - secret = bits2int(t, qlen) - - if secret >= 1 and secret < order: - return secret - - k = hmac.new(k, v+b('\x00'), hash_func).digest() - v = hmac.new(k, v, hash_func).digest() diff --git a/bin/python/ecdsa/six.py b/bin/python/ecdsa/six.py deleted file mode 100644 index 3003f8f00b..0000000000 --- a/bin/python/ecdsa/six.py +++ /dev/null @@ -1,394 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2012 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of -# this software and associated documentation files (the "Software"), to deal in -# the Software without restriction, including without limitation the rights to -# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -# the Software, and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import operator -import sys -import types - -__author__ = "Benjamin Peterson " -__version__ = "1.2.0" - - -# True if we are running on Python 3. -PY3 = sys.version_info[0] == 3 - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) - # This is a bit ugly, but it avoids running this again. - delattr(tp, self.name) - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - - -class _MovedItems(types.ModuleType): - """Lazy loading of moved objects""" - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("reload_module", "__builtin__", "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("winreg", "_winreg"), -] -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) -del attr - -moves = sys.modules[__name__ + ".moves"] = _MovedItems("moves") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_code = "__code__" - _func_defaults = "__defaults__" - - _iterkeys = "keys" - _itervalues = "values" - _iteritems = "items" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_code = "func_code" - _func_defaults = "func_defaults" - - _iterkeys = "iterkeys" - _itervalues = "itervalues" - _iteritems = "iteritems" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) - - -def iterkeys(d): - """Return an iterator over the keys of a dictionary.""" - return iter(getattr(d, _iterkeys)()) - -def itervalues(d): - """Return an iterator over the values of a dictionary.""" - return iter(getattr(d, _itervalues)()) - -def iteritems(d): - """Return an iterator over the (key, value) pairs of a dictionary.""" - return iter(getattr(d, _iteritems)()) - - -if PY3: - def b(s): - return s.encode("latin-1") - def u(s): - return s - if sys.version_info[1] <= 1: - def int2byte(i): - return bytes((i,)) - else: - # This is about 2x faster than the implementation above on 3.2+ - int2byte = operator.methodcaller("to_bytes", 1, "big") - import io - StringIO = io.StringIO - BytesIO = io.BytesIO -else: - def b(s): - return s - def u(s): - if isinstance(s, unicode): - return s - return unicode(s, "unicode_escape") - int2byte = chr - import StringIO - StringIO = BytesIO = StringIO.StringIO -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -if PY3: - import builtins - exec_ = getattr(builtins, "exec") - - - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - - - print_ = getattr(builtins, "print") - del builtins - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - - exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb -""") - - - def print_(*args, **kwargs): - """The new-style print function.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - def write(data): - if not isinstance(data, basestring): - data = str(data) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) - -_add_doc(reraise, """Reraise an exception.""") - - -def with_metaclass(meta, base=object): - """Create a base class with a metaclass.""" - return meta("NewBase", (base,), {}) diff --git a/bin/python/ecdsa/test_pyecdsa.py b/bin/python/ecdsa/test_pyecdsa.py deleted file mode 100644 index 347edbe8df..0000000000 --- a/bin/python/ecdsa/test_pyecdsa.py +++ /dev/null @@ -1,663 +0,0 @@ -from __future__ import with_statement, division - -import unittest -import os -import time -import shutil -import subprocess -from binascii import hexlify, unhexlify -from hashlib import sha1, sha256, sha512 - -from .six import b, print_, binary_type -from .keys import SigningKey, VerifyingKey -from .keys import BadSignatureError -from . import util -from .util import sigencode_der, sigencode_strings -from .util import sigdecode_der, sigdecode_strings -from .curves import Curve, UnknownCurveError -from .curves import NIST192p, NIST224p, NIST256p, NIST384p, NIST521p, SECP256k1 -from .ellipticcurve import Point -from . import der -from . import rfc6979 - -class SubprocessError(Exception): - pass - -def run_openssl(cmd): - OPENSSL = "openssl" - p = subprocess.Popen([OPENSSL] + cmd.split(), - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - stdout, ignored = p.communicate() - if p.returncode != 0: - raise SubprocessError("cmd '%s %s' failed: rc=%s, stdout/err was %s" % - (OPENSSL, cmd, p.returncode, stdout)) - return stdout.decode() - -BENCH = False - -class ECDSA(unittest.TestCase): - def test_basic(self): - priv = SigningKey.generate() - pub = priv.get_verifying_key() - - data = b("blahblah") - sig = priv.sign(data) - - self.assertTrue(pub.verify(sig, data)) - self.assertRaises(BadSignatureError, pub.verify, sig, data+b("bad")) - - pub2 = VerifyingKey.from_string(pub.to_string()) - self.assertTrue(pub2.verify(sig, data)) - - def test_deterministic(self): - data = b("blahblah") - secexp = int("9d0219792467d7d37b4d43298a7d0c05", 16) - - priv = SigningKey.from_secret_exponent(secexp, SECP256k1, sha256) - pub = priv.get_verifying_key() - - k = rfc6979.generate_k( - SECP256k1.generator.order(), secexp, sha256, sha256(data).digest()) - - sig1 = priv.sign(data, k=k) - self.assertTrue(pub.verify(sig1, data)) - - sig2 = priv.sign(data, k=k) - self.assertTrue(pub.verify(sig2, data)) - - sig3 = priv.sign_deterministic(data, sha256) - self.assertTrue(pub.verify(sig3, data)) - - self.assertEqual(sig1, sig2) - self.assertEqual(sig1, sig3) - - def test_bad_usage(self): - # sk=SigningKey() is wrong - self.assertRaises(TypeError, SigningKey) - self.assertRaises(TypeError, VerifyingKey) - - def test_lengths(self): - default = NIST192p - priv = SigningKey.generate() - pub = priv.get_verifying_key() - self.assertEqual(len(pub.to_string()), default.verifying_key_length) - sig = priv.sign(b("data")) - self.assertEqual(len(sig), default.signature_length) - if BENCH: - print_() - for curve in (NIST192p, NIST224p, NIST256p, NIST384p, NIST521p): - start = time.time() - priv = SigningKey.generate(curve=curve) - pub1 = priv.get_verifying_key() - keygen_time = time.time() - start - pub2 = VerifyingKey.from_string(pub1.to_string(), curve) - self.assertEqual(pub1.to_string(), pub2.to_string()) - self.assertEqual(len(pub1.to_string()), - curve.verifying_key_length) - start = time.time() - sig = priv.sign(b("data")) - sign_time = time.time() - start - self.assertEqual(len(sig), curve.signature_length) - if BENCH: - start = time.time() - pub1.verify(sig, b("data")) - verify_time = time.time() - start - print_("%s: siglen=%d, keygen=%0.3fs, sign=%0.3f, verify=%0.3f" \ - % (curve.name, curve.signature_length, - keygen_time, sign_time, verify_time)) - - def test_serialize(self): - seed = b("secret") - curve = NIST192p - secexp1 = util.randrange_from_seed__trytryagain(seed, curve.order) - secexp2 = util.randrange_from_seed__trytryagain(seed, curve.order) - self.assertEqual(secexp1, secexp2) - priv1 = SigningKey.from_secret_exponent(secexp1, curve) - priv2 = SigningKey.from_secret_exponent(secexp2, curve) - self.assertEqual(hexlify(priv1.to_string()), - hexlify(priv2.to_string())) - self.assertEqual(priv1.to_pem(), priv2.to_pem()) - pub1 = priv1.get_verifying_key() - pub2 = priv2.get_verifying_key() - data = b("data") - sig1 = priv1.sign(data) - sig2 = priv2.sign(data) - self.assertTrue(pub1.verify(sig1, data)) - self.assertTrue(pub2.verify(sig1, data)) - self.assertTrue(pub1.verify(sig2, data)) - self.assertTrue(pub2.verify(sig2, data)) - self.assertEqual(hexlify(pub1.to_string()), - hexlify(pub2.to_string())) - - def test_nonrandom(self): - s = b("all the entropy in the entire world, compressed into one line") - def not_much_entropy(numbytes): - return s[:numbytes] - # we control the entropy source, these two keys should be identical: - priv1 = SigningKey.generate(entropy=not_much_entropy) - priv2 = SigningKey.generate(entropy=not_much_entropy) - self.assertEqual(hexlify(priv1.get_verifying_key().to_string()), - hexlify(priv2.get_verifying_key().to_string())) - # likewise, signatures should be identical. Obviously you'd never - # want to do this with keys you care about, because the secrecy of - # the private key depends upon using different random numbers for - # each signature - sig1 = priv1.sign(b("data"), entropy=not_much_entropy) - sig2 = priv2.sign(b("data"), entropy=not_much_entropy) - self.assertEqual(hexlify(sig1), hexlify(sig2)) - - def assertTruePrivkeysEqual(self, priv1, priv2): - self.assertEqual(priv1.privkey.secret_multiplier, - priv2.privkey.secret_multiplier) - self.assertEqual(priv1.privkey.public_key.generator, - priv2.privkey.public_key.generator) - - def failIfPrivkeysEqual(self, priv1, priv2): - self.failIfEqual(priv1.privkey.secret_multiplier, - priv2.privkey.secret_multiplier) - - def test_privkey_creation(self): - s = b("all the entropy in the entire world, compressed into one line") - def not_much_entropy(numbytes): - return s[:numbytes] - priv1 = SigningKey.generate() - self.assertEqual(priv1.baselen, NIST192p.baselen) - - priv1 = SigningKey.generate(curve=NIST224p) - self.assertEqual(priv1.baselen, NIST224p.baselen) - - priv1 = SigningKey.generate(entropy=not_much_entropy) - self.assertEqual(priv1.baselen, NIST192p.baselen) - priv2 = SigningKey.generate(entropy=not_much_entropy) - self.assertEqual(priv2.baselen, NIST192p.baselen) - self.assertTruePrivkeysEqual(priv1, priv2) - - priv1 = SigningKey.from_secret_exponent(secexp=3) - self.assertEqual(priv1.baselen, NIST192p.baselen) - priv2 = SigningKey.from_secret_exponent(secexp=3) - self.assertTruePrivkeysEqual(priv1, priv2) - - priv1 = SigningKey.from_secret_exponent(secexp=4, curve=NIST224p) - self.assertEqual(priv1.baselen, NIST224p.baselen) - - def test_privkey_strings(self): - priv1 = SigningKey.generate() - s1 = priv1.to_string() - self.assertEqual(type(s1), binary_type) - self.assertEqual(len(s1), NIST192p.baselen) - priv2 = SigningKey.from_string(s1) - self.assertTruePrivkeysEqual(priv1, priv2) - - s1 = priv1.to_pem() - self.assertEqual(type(s1), binary_type) - self.assertTrue(s1.startswith(b("-----BEGIN EC PRIVATE KEY-----"))) - self.assertTrue(s1.strip().endswith(b("-----END EC PRIVATE KEY-----"))) - priv2 = SigningKey.from_pem(s1) - self.assertTruePrivkeysEqual(priv1, priv2) - - s1 = priv1.to_der() - self.assertEqual(type(s1), binary_type) - priv2 = SigningKey.from_der(s1) - self.assertTruePrivkeysEqual(priv1, priv2) - - priv1 = SigningKey.generate(curve=NIST256p) - s1 = priv1.to_pem() - self.assertEqual(type(s1), binary_type) - self.assertTrue(s1.startswith(b("-----BEGIN EC PRIVATE KEY-----"))) - self.assertTrue(s1.strip().endswith(b("-----END EC PRIVATE KEY-----"))) - priv2 = SigningKey.from_pem(s1) - self.assertTruePrivkeysEqual(priv1, priv2) - - s1 = priv1.to_der() - self.assertEqual(type(s1), binary_type) - priv2 = SigningKey.from_der(s1) - self.assertTruePrivkeysEqual(priv1, priv2) - - def assertTruePubkeysEqual(self, pub1, pub2): - self.assertEqual(pub1.pubkey.point, pub2.pubkey.point) - self.assertEqual(pub1.pubkey.generator, pub2.pubkey.generator) - self.assertEqual(pub1.curve, pub2.curve) - - def test_pubkey_strings(self): - priv1 = SigningKey.generate() - pub1 = priv1.get_verifying_key() - s1 = pub1.to_string() - self.assertEqual(type(s1), binary_type) - self.assertEqual(len(s1), NIST192p.verifying_key_length) - pub2 = VerifyingKey.from_string(s1) - self.assertTruePubkeysEqual(pub1, pub2) - - priv1 = SigningKey.generate(curve=NIST256p) - pub1 = priv1.get_verifying_key() - s1 = pub1.to_string() - self.assertEqual(type(s1), binary_type) - self.assertEqual(len(s1), NIST256p.verifying_key_length) - pub2 = VerifyingKey.from_string(s1, curve=NIST256p) - self.assertTruePubkeysEqual(pub1, pub2) - - pub1_der = pub1.to_der() - self.assertEqual(type(pub1_der), binary_type) - pub2 = VerifyingKey.from_der(pub1_der) - self.assertTruePubkeysEqual(pub1, pub2) - - self.assertRaises(der.UnexpectedDER, - VerifyingKey.from_der, pub1_der+b("junk")) - badpub = VerifyingKey.from_der(pub1_der) - class FakeGenerator: - def order(self): return 123456789 - badcurve = Curve("unknown", None, None, FakeGenerator(), (1,2,3,4,5,6)) - badpub.curve = badcurve - badder = badpub.to_der() - self.assertRaises(UnknownCurveError, VerifyingKey.from_der, badder) - - pem = pub1.to_pem() - self.assertEqual(type(pem), binary_type) - self.assertTrue(pem.startswith(b("-----BEGIN PUBLIC KEY-----")), pem) - self.assertTrue(pem.strip().endswith(b("-----END PUBLIC KEY-----")), pem) - pub2 = VerifyingKey.from_pem(pem) - self.assertTruePubkeysEqual(pub1, pub2) - - def test_signature_strings(self): - priv1 = SigningKey.generate() - pub1 = priv1.get_verifying_key() - data = b("data") - - sig = priv1.sign(data) - self.assertEqual(type(sig), binary_type) - self.assertEqual(len(sig), NIST192p.signature_length) - self.assertTrue(pub1.verify(sig, data)) - - sig = priv1.sign(data, sigencode=sigencode_strings) - self.assertEqual(type(sig), tuple) - self.assertEqual(len(sig), 2) - self.assertEqual(type(sig[0]), binary_type) - self.assertEqual(type(sig[1]), binary_type) - self.assertEqual(len(sig[0]), NIST192p.baselen) - self.assertEqual(len(sig[1]), NIST192p.baselen) - self.assertTrue(pub1.verify(sig, data, sigdecode=sigdecode_strings)) - - sig_der = priv1.sign(data, sigencode=sigencode_der) - self.assertEqual(type(sig_der), binary_type) - self.assertTrue(pub1.verify(sig_der, data, sigdecode=sigdecode_der)) - - def test_hashfunc(self): - sk = SigningKey.generate(curve=NIST256p, hashfunc=sha256) - data = b("security level is 128 bits") - sig = sk.sign(data) - vk = VerifyingKey.from_string(sk.get_verifying_key().to_string(), - curve=NIST256p, hashfunc=sha256) - self.assertTrue(vk.verify(sig, data)) - - sk2 = SigningKey.generate(curve=NIST256p) - sig2 = sk2.sign(data, hashfunc=sha256) - vk2 = VerifyingKey.from_string(sk2.get_verifying_key().to_string(), - curve=NIST256p, hashfunc=sha256) - self.assertTrue(vk2.verify(sig2, data)) - - vk3 = VerifyingKey.from_string(sk.get_verifying_key().to_string(), - curve=NIST256p) - self.assertTrue(vk3.verify(sig, data, hashfunc=sha256)) - - -class OpenSSL(unittest.TestCase): - # test interoperability with OpenSSL tools. Note that openssl's ECDSA - # sign/verify arguments changed between 0.9.8 and 1.0.0: the early - # versions require "-ecdsa-with-SHA1", the later versions want just - # "-SHA1" (or to leave out that argument entirely, which means the - # signature will use some default digest algorithm, probably determined - # by the key, probably always SHA1). - # - # openssl ecparam -name secp224r1 -genkey -out privkey.pem - # openssl ec -in privkey.pem -text -noout # get the priv/pub keys - # openssl dgst -ecdsa-with-SHA1 -sign privkey.pem -out data.sig data.txt - # openssl asn1parse -in data.sig -inform DER - # data.sig is 64 bytes, probably 56b plus ASN1 overhead - # openssl dgst -ecdsa-with-SHA1 -prverify privkey.pem -signature data.sig data.txt ; echo $? - # openssl ec -in privkey.pem -pubout -out pubkey.pem - # openssl ec -in privkey.pem -pubout -outform DER -out pubkey.der - - def get_openssl_messagedigest_arg(self): - v = run_openssl("version") - # e.g. "OpenSSL 1.0.0 29 Mar 2010", or "OpenSSL 1.0.0a 1 Jun 2010", - # or "OpenSSL 0.9.8o 01 Jun 2010" - vs = v.split()[1].split(".") - if vs >= ["1","0","0"]: - return "-SHA1" - else: - return "-ecdsa-with-SHA1" - - # sk: 1:OpenSSL->python 2:python->OpenSSL - # vk: 3:OpenSSL->python 4:python->OpenSSL - # sig: 5:OpenSSL->python 6:python->OpenSSL - - def test_from_openssl_nist192p(self): - return self.do_test_from_openssl(NIST192p) - def test_from_openssl_nist224p(self): - return self.do_test_from_openssl(NIST224p) - def test_from_openssl_nist256p(self): - return self.do_test_from_openssl(NIST256p) - def test_from_openssl_nist384p(self): - return self.do_test_from_openssl(NIST384p) - def test_from_openssl_nist521p(self): - return self.do_test_from_openssl(NIST521p) - def test_from_openssl_secp256k1(self): - return self.do_test_from_openssl(SECP256k1) - - def do_test_from_openssl(self, curve): - curvename = curve.openssl_name - assert curvename - # OpenSSL: create sk, vk, sign. - # Python: read vk(3), checksig(5), read sk(1), sign, check - mdarg = self.get_openssl_messagedigest_arg() - if os.path.isdir("t"): - shutil.rmtree("t") - os.mkdir("t") - run_openssl("ecparam -name %s -genkey -out t/privkey.pem" % curvename) - run_openssl("ec -in t/privkey.pem -pubout -out t/pubkey.pem") - data = b("data") - with open("t/data.txt","wb") as e: e.write(data) - run_openssl("dgst %s -sign t/privkey.pem -out t/data.sig t/data.txt" % mdarg) - run_openssl("dgst %s -verify t/pubkey.pem -signature t/data.sig t/data.txt" % mdarg) - with open("t/pubkey.pem","rb") as e: pubkey_pem = e.read() - vk = VerifyingKey.from_pem(pubkey_pem) # 3 - with open("t/data.sig","rb") as e: sig_der = e.read() - self.assertTrue(vk.verify(sig_der, data, # 5 - hashfunc=sha1, sigdecode=sigdecode_der)) - - with open("t/privkey.pem") as e: fp = e.read() - sk = SigningKey.from_pem(fp) # 1 - sig = sk.sign(data) - self.assertTrue(vk.verify(sig, data)) - - def test_to_openssl_nist192p(self): - self.do_test_to_openssl(NIST192p) - def test_to_openssl_nist224p(self): - self.do_test_to_openssl(NIST224p) - def test_to_openssl_nist256p(self): - self.do_test_to_openssl(NIST256p) - def test_to_openssl_nist384p(self): - self.do_test_to_openssl(NIST384p) - def test_to_openssl_nist521p(self): - self.do_test_to_openssl(NIST521p) - def test_to_openssl_secp256k1(self): - self.do_test_to_openssl(SECP256k1) - - def do_test_to_openssl(self, curve): - curvename = curve.openssl_name - assert curvename - # Python: create sk, vk, sign. - # OpenSSL: read vk(4), checksig(6), read sk(2), sign, check - mdarg = self.get_openssl_messagedigest_arg() - if os.path.isdir("t"): - shutil.rmtree("t") - os.mkdir("t") - sk = SigningKey.generate(curve=curve) - vk = sk.get_verifying_key() - data = b("data") - with open("t/pubkey.der","wb") as e: e.write(vk.to_der()) # 4 - with open("t/pubkey.pem","wb") as e: e.write(vk.to_pem()) # 4 - sig_der = sk.sign(data, hashfunc=sha1, sigencode=sigencode_der) - - with open("t/data.sig","wb") as e: e.write(sig_der) # 6 - with open("t/data.txt","wb") as e: e.write(data) - with open("t/baddata.txt","wb") as e: e.write(data+b("corrupt")) - - self.assertRaises(SubprocessError, run_openssl, - "dgst %s -verify t/pubkey.der -keyform DER -signature t/data.sig t/baddata.txt" % mdarg) - run_openssl("dgst %s -verify t/pubkey.der -keyform DER -signature t/data.sig t/data.txt" % mdarg) - - with open("t/privkey.pem","wb") as e: e.write(sk.to_pem()) # 2 - run_openssl("dgst %s -sign t/privkey.pem -out t/data.sig2 t/data.txt" % mdarg) - run_openssl("dgst %s -verify t/pubkey.pem -signature t/data.sig2 t/data.txt" % mdarg) - -class DER(unittest.TestCase): - def test_oids(self): - oid_ecPublicKey = der.encode_oid(1, 2, 840, 10045, 2, 1) - self.assertEqual(hexlify(oid_ecPublicKey), b("06072a8648ce3d0201")) - self.assertEqual(hexlify(NIST224p.encoded_oid), b("06052b81040021")) - self.assertEqual(hexlify(NIST256p.encoded_oid), - b("06082a8648ce3d030107")) - x = oid_ecPublicKey + b("more") - x1, rest = der.remove_object(x) - self.assertEqual(x1, (1, 2, 840, 10045, 2, 1)) - self.assertEqual(rest, b("more")) - - def test_integer(self): - self.assertEqual(der.encode_integer(0), b("\x02\x01\x00")) - self.assertEqual(der.encode_integer(1), b("\x02\x01\x01")) - self.assertEqual(der.encode_integer(127), b("\x02\x01\x7f")) - self.assertEqual(der.encode_integer(128), b("\x02\x02\x00\x80")) - self.assertEqual(der.encode_integer(256), b("\x02\x02\x01\x00")) - #self.assertEqual(der.encode_integer(-1), b("\x02\x01\xff")) - - def s(n): return der.remove_integer(der.encode_integer(n) + b("junk")) - self.assertEqual(s(0), (0, b("junk"))) - self.assertEqual(s(1), (1, b("junk"))) - self.assertEqual(s(127), (127, b("junk"))) - self.assertEqual(s(128), (128, b("junk"))) - self.assertEqual(s(256), (256, b("junk"))) - self.assertEqual(s(1234567890123456789012345678901234567890), - (1234567890123456789012345678901234567890,b("junk"))) - - def test_number(self): - self.assertEqual(der.encode_number(0), b("\x00")) - self.assertEqual(der.encode_number(127), b("\x7f")) - self.assertEqual(der.encode_number(128), b("\x81\x00")) - self.assertEqual(der.encode_number(3*128+7), b("\x83\x07")) - #self.assertEqual(der.read_number("\x81\x9b"+"more"), (155, 2)) - #self.assertEqual(der.encode_number(155), b("\x81\x9b")) - for n in (0, 1, 2, 127, 128, 3*128+7, 840, 10045): #, 155): - x = der.encode_number(n) + b("more") - n1, llen = der.read_number(x) - self.assertEqual(n1, n) - self.assertEqual(x[llen:], b("more")) - - def test_length(self): - self.assertEqual(der.encode_length(0), b("\x00")) - self.assertEqual(der.encode_length(127), b("\x7f")) - self.assertEqual(der.encode_length(128), b("\x81\x80")) - self.assertEqual(der.encode_length(255), b("\x81\xff")) - self.assertEqual(der.encode_length(256), b("\x82\x01\x00")) - self.assertEqual(der.encode_length(3*256+7), b("\x82\x03\x07")) - self.assertEqual(der.read_length(b("\x81\x9b")+b("more")), (155, 2)) - self.assertEqual(der.encode_length(155), b("\x81\x9b")) - for n in (0, 1, 2, 127, 128, 255, 256, 3*256+7, 155): - x = der.encode_length(n) + b("more") - n1, llen = der.read_length(x) - self.assertEqual(n1, n) - self.assertEqual(x[llen:], b("more")) - - def test_sequence(self): - x = der.encode_sequence(b("ABC"), b("DEF")) + b("GHI") - self.assertEqual(x, b("\x30\x06ABCDEFGHI")) - x1, rest = der.remove_sequence(x) - self.assertEqual(x1, b("ABCDEF")) - self.assertEqual(rest, b("GHI")) - - def test_constructed(self): - x = der.encode_constructed(0, NIST224p.encoded_oid) - self.assertEqual(hexlify(x), b("a007") + b("06052b81040021")) - x = der.encode_constructed(1, unhexlify(b("0102030a0b0c"))) - self.assertEqual(hexlify(x), b("a106") + b("0102030a0b0c")) - -class Util(unittest.TestCase): - def test_trytryagain(self): - tta = util.randrange_from_seed__trytryagain - for i in range(1000): - seed = "seed-%d" % i - for order in (2**8-2, 2**8-1, 2**8, 2**8+1, 2**8+2, - 2**16-1, 2**16+1): - n = tta(seed, order) - self.assertTrue(1 <= n < order, (1, n, order)) - # this trytryagain *does* provide long-term stability - self.assertEqual(("%x"%(tta("seed", NIST224p.order))).encode(), - b("6fa59d73bf0446ae8743cf748fc5ac11d5585a90356417e97155c3bc")) - - def test_randrange(self): - # util.randrange does not provide long-term stability: we might - # change the algorithm in the future. - for i in range(1000): - entropy = util.PRNG("seed-%d" % i) - for order in (2**8-2, 2**8-1, 2**8, - 2**16-1, 2**16+1, - ): - # that oddball 2**16+1 takes half our runtime - n = util.randrange(order, entropy=entropy) - self.assertTrue(1 <= n < order, (1, n, order)) - - def OFF_test_prove_uniformity(self): - order = 2**8-2 - counts = dict([(i, 0) for i in range(1, order)]) - assert 0 not in counts - assert order not in counts - for i in range(1000000): - seed = "seed-%d" % i - n = util.randrange_from_seed__trytryagain(seed, order) - counts[n] += 1 - # this technique should use the full range - self.assertTrue(counts[order-1]) - for i in range(1, order): - print_("%3d: %s" % (i, "*"*(counts[i]//100))) - -class RFC6979(unittest.TestCase): - # https://tools.ietf.org/html/rfc6979#appendix-A.1 - def _do(self, generator, secexp, hsh, hash_func, expected): - actual = rfc6979.generate_k(generator.order(), secexp, hash_func, hsh) - self.assertEqual(expected, actual) - - def test_SECP256k1(self): - '''RFC doesn't contain test vectors for SECP256k1 used in bitcoin. - This vector has been computed by Golang reference implementation instead.''' - self._do( - generator = SECP256k1.generator, - secexp = int("9d0219792467d7d37b4d43298a7d0c05", 16), - hsh = sha256(b("sample")).digest(), - hash_func = sha256, - expected = int("8fa1f95d514760e498f28957b824ee6ec39ed64826ff4fecc2b5739ec45b91cd", 16)) - - def test_SECP256k1_2(self): - self._do( - generator=SECP256k1.generator, - secexp=int("cca9fbcc1b41e5a95d369eaa6ddcff73b61a4efaa279cfc6567e8daa39cbaf50", 16), - hsh=sha256(b("sample")).digest(), - hash_func=sha256, - expected=int("2df40ca70e639d89528a6b670d9d48d9165fdc0febc0974056bdce192b8e16a3", 16)) - - def test_SECP256k1_3(self): - self._do( - generator=SECP256k1.generator, - secexp=0x1, - hsh=sha256(b("Satoshi Nakamoto")).digest(), - hash_func=sha256, - expected=0x8F8A276C19F4149656B280621E358CCE24F5F52542772691EE69063B74F15D15) - - def test_SECP256k1_4(self): - self._do( - generator=SECP256k1.generator, - secexp=0x1, - hsh=sha256(b("All those moments will be lost in time, like tears in rain. Time to die...")).digest(), - hash_func=sha256, - expected=0x38AA22D72376B4DBC472E06C3BA403EE0A394DA63FC58D88686C611ABA98D6B3) - - def test_SECP256k1_5(self): - self._do( - generator=SECP256k1.generator, - secexp=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140, - hsh=sha256(b("Satoshi Nakamoto")).digest(), - hash_func=sha256, - expected=0x33A19B60E25FB6F4435AF53A3D42D493644827367E6453928554F43E49AA6F90) - - def test_SECP256k1_6(self): - self._do( - generator=SECP256k1.generator, - secexp=0xf8b8af8ce3c7cca5e300d33939540c10d45ce001b8f252bfbc57ba0342904181, - hsh=sha256(b("Alan Turing")).digest(), - hash_func=sha256, - expected=0x525A82B70E67874398067543FD84C83D30C175FDC45FDEEE082FE13B1D7CFDF1) - - def test_1(self): - # Basic example of the RFC, it also tests 'try-try-again' from Step H of rfc6979 - self._do( - generator = Point(None, 0, 0, int("4000000000000000000020108A2E0CC0D99F8A5EF", 16)), - secexp = int("09A4D6792295A7F730FC3F2B49CBC0F62E862272F", 16), - hsh = unhexlify(b("AF2BDBE1AA9B6EC1E2ADE1D694F41FC71A831D0268E9891562113D8A62ADD1BF")), - hash_func = sha256, - expected = int("23AF4074C90A02B3FE61D286D5C87F425E6BDD81B", 16)) - - def test_2(self): - self._do( - generator=NIST192p.generator, - secexp = int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16), - hsh = sha1(b("sample")).digest(), - hash_func = sha1, - expected = int("37D7CA00D2C7B0E5E412AC03BD44BA837FDD5B28CD3B0021", 16)) - - def test_3(self): - self._do( - generator=NIST192p.generator, - secexp = int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16), - hsh = sha256(b("sample")).digest(), - hash_func = sha256, - expected = int("32B1B6D7D42A05CB449065727A84804FB1A3E34D8F261496", 16)) - - def test_4(self): - self._do( - generator=NIST192p.generator, - secexp = int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16), - hsh = sha512(b("sample")).digest(), - hash_func = sha512, - expected = int("A2AC7AB055E4F20692D49209544C203A7D1F2C0BFBC75DB1", 16)) - - def test_5(self): - self._do( - generator=NIST192p.generator, - secexp = int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16), - hsh = sha1(b("test")).digest(), - hash_func = sha1, - expected = int("D9CF9C3D3297D3260773A1DA7418DB5537AB8DD93DE7FA25", 16)) - - def test_6(self): - self._do( - generator=NIST192p.generator, - secexp = int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16), - hsh = sha256(b("test")).digest(), - hash_func = sha256, - expected = int("5C4CE89CF56D9E7C77C8585339B006B97B5F0680B4306C6C", 16)) - - def test_7(self): - self._do( - generator=NIST192p.generator, - secexp = int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16), - hsh = sha512(b("test")).digest(), - hash_func = sha512, - expected = int("0758753A5254759C7CFBAD2E2D9B0792EEE44136C9480527", 16)) - - def test_8(self): - self._do( - generator=NIST521p.generator, - secexp = int("0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538", 16), - hsh = sha1(b("sample")).digest(), - hash_func = sha1, - expected = int("089C071B419E1C2820962321787258469511958E80582E95D8378E0C2CCDB3CB42BEDE42F50E3FA3C71F5A76724281D31D9C89F0F91FC1BE4918DB1C03A5838D0F9", 16)) - - def test_9(self): - self._do( - generator=NIST521p.generator, - secexp = int("0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538", 16), - hsh = sha256(b("sample")).digest(), - hash_func = sha256, - expected = int("0EDF38AFCAAECAB4383358B34D67C9F2216C8382AAEA44A3DAD5FDC9C32575761793FEF24EB0FC276DFC4F6E3EC476752F043CF01415387470BCBD8678ED2C7E1A0", 16)) - - def test_10(self): - self._do( - generator=NIST521p.generator, - secexp = int("0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538", 16), - hsh = sha512(b("test")).digest(), - hash_func = sha512, - expected = int("16200813020EC986863BEDFC1B121F605C1215645018AEA1A7B215A564DE9EB1B38A67AA1128B80CE391C4FB71187654AAA3431027BFC7F395766CA988C964DC56D", 16)) - -def __main__(): - unittest.main() -if __name__ == "__main__": - __main__() diff --git a/bin/python/ecdsa/util.py b/bin/python/ecdsa/util.py deleted file mode 100644 index c51ed3dd88..0000000000 --- a/bin/python/ecdsa/util.py +++ /dev/null @@ -1,247 +0,0 @@ -from __future__ import division - -import os -import math -import binascii -from hashlib import sha256 -from . import der -from .curves import orderlen -from .six import PY3, int2byte, b, next - -# RFC5480: -# The "unrestricted" algorithm identifier is: -# id-ecPublicKey OBJECT IDENTIFIER ::= { -# iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1 } - -oid_ecPublicKey = (1, 2, 840, 10045, 2, 1) -encoded_oid_ecPublicKey = der.encode_oid(*oid_ecPublicKey) - -def randrange(order, entropy=None): - """Return a random integer k such that 1 <= k < order, uniformly - distributed across that range. For simplicity, this only behaves well if - 'order' is fairly close (but below) a power of 256. The try-try-again - algorithm we use takes longer and longer time (on average) to complete as - 'order' falls, rising to a maximum of avg=512 loops for the worst-case - (256**k)+1 . All of the standard curves behave well. There is a cutoff at - 10k loops (which raises RuntimeError) to prevent an infinite loop when - something is really broken like the entropy function not working. - - Note that this function is not declared to be forwards-compatible: we may - change the behavior in future releases. The entropy= argument (which - should get a callable that behaves like os.urandom) can be used to - achieve stability within a given release (for repeatable unit tests), but - should not be used as a long-term-compatible key generation algorithm. - """ - # we could handle arbitrary orders (even 256**k+1) better if we created - # candidates bit-wise instead of byte-wise, which would reduce the - # worst-case behavior to avg=2 loops, but that would be more complex. The - # change would be to round the order up to a power of 256, subtract one - # (to get 0xffff..), use that to get a byte-long mask for the top byte, - # generate the len-1 entropy bytes, generate one extra byte and mask off - # the top bits, then combine it with the rest. Requires jumping back and - # forth between strings and integers a lot. - - if entropy is None: - entropy = os.urandom - assert order > 1 - bytes = orderlen(order) - dont_try_forever = 10000 # gives about 2**-60 failures for worst case - while dont_try_forever > 0: - dont_try_forever -= 1 - candidate = string_to_number(entropy(bytes)) + 1 - if 1 <= candidate < order: - return candidate - continue - raise RuntimeError("randrange() tried hard but gave up, either something" - " is very wrong or you got realllly unlucky. Order was" - " %x" % order) - -class PRNG: - # this returns a callable which, when invoked with an integer N, will - # return N pseudorandom bytes. Note: this is a short-term PRNG, meant - # primarily for the needs of randrange_from_seed__trytryagain(), which - # only needs to run it a few times per seed. It does not provide - # protection against state compromise (forward security). - def __init__(self, seed): - self.generator = self.block_generator(seed) - - def __call__(self, numbytes): - a = [next(self.generator) for i in range(numbytes)] - - if PY3: - return bytes(a) - else: - return "".join(a) - - - def block_generator(self, seed): - counter = 0 - while True: - for byte in sha256(("prng-%d-%s" % (counter, seed)).encode()).digest(): - yield byte - counter += 1 - -def randrange_from_seed__overshoot_modulo(seed, order): - # hash the data, then turn the digest into a number in [1,order). - # - # We use David-Sarah Hopwood's suggestion: turn it into a number that's - # sufficiently larger than the group order, then modulo it down to fit. - # This should give adequate (but not perfect) uniformity, and simple - # code. There are other choices: try-try-again is the main one. - base = PRNG(seed)(2*orderlen(order)) - number = (int(binascii.hexlify(base), 16) % (order-1)) + 1 - assert 1 <= number < order, (1, number, order) - return number - -def lsb_of_ones(numbits): - return (1 << numbits) - 1 -def bits_and_bytes(order): - bits = int(math.log(order-1, 2)+1) - bytes = bits // 8 - extrabits = bits % 8 - return bits, bytes, extrabits - -# the following randrange_from_seed__METHOD() functions take an -# arbitrarily-sized secret seed and turn it into a number that obeys the same -# range limits as randrange() above. They are meant for deriving consistent -# signing keys from a secret rather than generating them randomly, for -# example a protocol in which three signing keys are derived from a master -# secret. You should use a uniformly-distributed unguessable seed with about -# curve.baselen bytes of entropy. To use one, do this: -# seed = os.urandom(curve.baselen) # or other starting point -# secexp = ecdsa.util.randrange_from_seed__trytryagain(sed, curve.order) -# sk = SigningKey.from_secret_exponent(secexp, curve) - -def randrange_from_seed__truncate_bytes(seed, order, hashmod=sha256): - # hash the seed, then turn the digest into a number in [1,order), but - # don't worry about trying to uniformly fill the range. This will lose, - # on average, four bits of entropy. - bits, bytes, extrabits = bits_and_bytes(order) - if extrabits: - bytes += 1 - base = hashmod(seed).digest()[:bytes] - base = "\x00"*(bytes-len(base)) + base - number = 1+int(binascii.hexlify(base), 16) - assert 1 <= number < order - return number - -def randrange_from_seed__truncate_bits(seed, order, hashmod=sha256): - # like string_to_randrange_truncate_bytes, but only lose an average of - # half a bit - bits = int(math.log(order-1, 2)+1) - maxbytes = (bits+7) // 8 - base = hashmod(seed).digest()[:maxbytes] - base = "\x00"*(maxbytes-len(base)) + base - topbits = 8*maxbytes - bits - if topbits: - base = int2byte(ord(base[0]) & lsb_of_ones(topbits)) + base[1:] - number = 1+int(binascii.hexlify(base), 16) - assert 1 <= number < order - return number - -def randrange_from_seed__trytryagain(seed, order): - # figure out exactly how many bits we need (rounded up to the nearest - # bit), so we can reduce the chance of looping to less than 0.5 . This is - # specified to feed from a byte-oriented PRNG, and discards the - # high-order bits of the first byte as necessary to get the right number - # of bits. The average number of loops will range from 1.0 (when - # order=2**k-1) to 2.0 (when order=2**k+1). - assert order > 1 - bits, bytes, extrabits = bits_and_bytes(order) - generate = PRNG(seed) - while True: - extrabyte = b("") - if extrabits: - extrabyte = int2byte(ord(generate(1)) & lsb_of_ones(extrabits)) - guess = string_to_number(extrabyte + generate(bytes)) + 1 - if 1 <= guess < order: - return guess - - -def number_to_string(num, order): - l = orderlen(order) - fmt_str = "%0" + str(2*l) + "x" - string = binascii.unhexlify((fmt_str % num).encode()) - assert len(string) == l, (len(string), l) - return string - -def number_to_string_crop(num, order): - l = orderlen(order) - fmt_str = "%0" + str(2*l) + "x" - string = binascii.unhexlify((fmt_str % num).encode()) - return string[:l] - -def string_to_number(string): - return int(binascii.hexlify(string), 16) - -def string_to_number_fixedlen(string, order): - l = orderlen(order) - assert len(string) == l, (len(string), l) - return int(binascii.hexlify(string), 16) - -# these methods are useful for the sigencode= argument to SK.sign() and the -# sigdecode= argument to VK.verify(), and control how the signature is packed -# or unpacked. - -def sigencode_strings(r, s, order): - r_str = number_to_string(r, order) - s_str = number_to_string(s, order) - return (r_str, s_str) - -def sigencode_string(r, s, order): - # for any given curve, the size of the signature numbers is - # fixed, so just use simple concatenation - r_str, s_str = sigencode_strings(r, s, order) - return r_str + s_str - -def sigencode_der(r, s, order): - return der.encode_sequence(der.encode_integer(r), der.encode_integer(s)) - -# canonical versions of sigencode methods -# these enforce low S values, by negating the value (modulo the order) if above order/2 -# see CECKey::Sign() https://github.com/bitcoin/bitcoin/blob/master/src/key.cpp#L214 -def sigencode_strings_canonize(r, s, order): - if s > order / 2: - s = order - s - return sigencode_strings(r, s, order) - -def sigencode_string_canonize(r, s, order): - if s > order / 2: - s = order - s - return sigencode_string(r, s, order) - -def sigencode_der_canonize(r, s, order): - if s > order / 2: - s = order - s - return sigencode_der(r, s, order) - - -def sigdecode_string(signature, order): - l = orderlen(order) - assert len(signature) == 2*l, (len(signature), 2*l) - r = string_to_number_fixedlen(signature[:l], order) - s = string_to_number_fixedlen(signature[l:], order) - return r, s - -def sigdecode_strings(rs_strings, order): - (r_str, s_str) = rs_strings - l = orderlen(order) - assert len(r_str) == l, (len(r_str), l) - assert len(s_str) == l, (len(s_str), l) - r = string_to_number_fixedlen(r_str, order) - s = string_to_number_fixedlen(s_str, order) - return r, s - -def sigdecode_der(sig_der, order): - #return der.encode_sequence(der.encode_integer(r), der.encode_integer(s)) - rs_strings, empty = der.remove_sequence(sig_der) - if empty != b(""): - raise der.UnexpectedDER("trailing junk after DER sig: %s" % - binascii.hexlify(empty)) - r, rest = der.remove_integer(rs_strings) - s, empty = der.remove_integer(rest) - if empty != b(""): - raise der.UnexpectedDER("trailing junk after DER numbers: %s" % - binascii.hexlify(empty)) - return r, s - diff --git a/bin/python/ed25519.py b/bin/python/ed25519.py deleted file mode 100644 index c44b7bf504..0000000000 --- a/bin/python/ed25519.py +++ /dev/null @@ -1,105 +0,0 @@ -import hashlib - -b = 256 -q = 2**255 - 19 -l = 2**252 + 27742317777372353535851937790883648493 - -def H(m): - return hashlib.sha512(m).digest() - -def expmod(b,e,m): - if e == 0: return 1 - t = expmod(b,e/2,m)**2 % m - if e & 1: t = (t*b) % m - return t - -def inv(x): - return expmod(x,q-2,q) - -d = -121665 * inv(121666) -I = expmod(2,(q-1)/4,q) - -def xrecover(y): - xx = (y*y-1) * inv(d*y*y+1) - x = expmod(xx,(q+3)/8,q) - if (x*x - xx) % q != 0: x = (x*I) % q - if x % 2 != 0: x = q-x - return x - -By = 4 * inv(5) -Bx = xrecover(By) -B = [Bx % q,By % q] - -def edwards(P,Q): - x1 = P[0] - y1 = P[1] - x2 = Q[0] - y2 = Q[1] - x3 = (x1*y2+x2*y1) * inv(1+d*x1*x2*y1*y2) - y3 = (y1*y2+x1*x2) * inv(1-d*x1*x2*y1*y2) - return [x3 % q,y3 % q] - -def scalarmult(P,e): - if e == 0: return [0,1] - Q = scalarmult(P,e/2) - Q = edwards(Q,Q) - if e & 1: Q = edwards(Q,P) - return Q - -def encodeint(y): - bits = [(y >> i) & 1 for i in range(b)] - return ''.join([chr(sum([bits[i * 8 + j] << j for j in range(8)])) for i in range(b/8)]) - -def encodepoint(P): - x = P[0] - y = P[1] - bits = [(y >> i) & 1 for i in range(b - 1)] + [x & 1] - return ''.join([chr(sum([bits[i * 8 + j] << j for j in range(8)])) for i in range(b/8)]) - -def bit(h,i): - return (ord(h[i/8]) >> (i%8)) & 1 - -def publickey(sk): - h = H(sk) - a = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2)) - A = scalarmult(B,a) - return encodepoint(A) - -def Hint(m): - h = H(m) - return sum(2**i * bit(h,i) for i in range(2*b)) - -def signature(m,sk,pk): - h = H(sk) - a = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2)) - r = Hint(''.join([h[i] for i in range(b/8,b/4)]) + m) - R = scalarmult(B,r) - S = (r + Hint(encodepoint(R) + pk + m) * a) % l - return encodepoint(R) + encodeint(S) - -def isoncurve(P): - x = P[0] - y = P[1] - return (-x*x + y*y - 1 - d*x*x*y*y) % q == 0 - -def decodeint(s): - return sum(2**i * bit(s,i) for i in range(0,b)) - -def decodepoint(s): - y = sum(2**i * bit(s,i) for i in range(0,b-1)) - x = xrecover(y) - if x & 1 != bit(s,b-1): x = q-x - P = [x,y] - if not isoncurve(P): raise Exception("decoding point that is not on curve") - return P - -def checkvalid(s,m,pk): - if len(s) != b/4: raise Exception("signature length is wrong") - if len(pk) != b/8: raise Exception("public-key length is wrong") - R = decodepoint(s[0:b/8]) - A = decodepoint(pk) - S = decodeint(s[b/8:b/4]) - h = Hint(encodepoint(R) + pk + m) - if scalarmult(B,S) != edwards(R,scalarmult(A,h)): - raise Exception("signature does not pass verification") - diff --git a/bin/python/jsonpath_rw/__init__.py b/bin/python/jsonpath_rw/__init__.py deleted file mode 100644 index ab55cf5d58..0000000000 --- a/bin/python/jsonpath_rw/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .jsonpath import * -from .parser import parse - -__version__ = '1.3.0' diff --git a/bin/python/jsonpath_rw/jsonpath.py b/bin/python/jsonpath_rw/jsonpath.py deleted file mode 100644 index 3a3a0637cf..0000000000 --- a/bin/python/jsonpath_rw/jsonpath.py +++ /dev/null @@ -1,510 +0,0 @@ -from __future__ import unicode_literals, print_function, absolute_import, division, generators, nested_scopes -import logging -import six -from six.moves import xrange -from itertools import * - -logger = logging.getLogger(__name__) - -# Turn on/off the automatic creation of id attributes -# ... could be a kwarg pervasively but uses are rare and simple today -auto_id_field = None - -class JSONPath(object): - """ - The base class for JSONPath abstract syntax; those - methods stubbed here are the interface to supported - JSONPath semantics. - """ - - def find(self, data): - """ - All `JSONPath` types support `find()`, which returns an iterable of `DatumInContext`s. - They keep track of the path followed to the current location, so if the calling code - has some opinion about that, it can be passed in here as a starting point. - """ - raise NotImplementedError() - - def update(self, data, val): - "Returns `data` with the specified path replaced by `val`" - raise NotImplementedError() - - def child(self, child): - """ - Equivalent to Child(self, next) but with some canonicalization - """ - if isinstance(self, This) or isinstance(self, Root): - return child - elif isinstance(child, This): - return self - elif isinstance(child, Root): - return child - else: - return Child(self, child) - - def make_datum(self, value): - if isinstance(value, DatumInContext): - return value - else: - return DatumInContext(value, path=Root(), context=None) - -class DatumInContext(object): - """ - Represents a datum along a path from a context. - - Essentially a zipper but with a structure represented by JSONPath, - and where the context is more of a parent pointer than a proper - representation of the context. - - For quick-and-dirty work, this proxies any non-special attributes - to the underlying datum, but the actual datum can (and usually should) - be retrieved via the `value` attribute. - - To place `datum` within another, use `datum.in_context(context=..., path=...)` - which extends the path. If the datum already has a context, it places the entire - context within that passed in, so an object can be built from the inside - out. - """ - @classmethod - def wrap(cls, data): - if isinstance(data, cls): - return data - else: - return cls(data) - - def __init__(self, value, path=None, context=None): - self.value = value - self.path = path or This() - self.context = None if context is None else DatumInContext.wrap(context) - - def in_context(self, context, path): - context = DatumInContext.wrap(context) - - if self.context: - return DatumInContext(value=self.value, path=self.path, context=context.in_context(path=path, context=context)) - else: - return DatumInContext(value=self.value, path=path, context=context) - - @property - def full_path(self): - return self.path if self.context is None else self.context.full_path.child(self.path) - - @property - def id_pseudopath(self): - """ - Looks like a path, but with ids stuck in when available - """ - try: - pseudopath = Fields(str(self.value[auto_id_field])) - except (TypeError, AttributeError, KeyError): # This may not be all the interesting exceptions - pseudopath = self.path - - if self.context: - return self.context.id_pseudopath.child(pseudopath) - else: - return pseudopath - - def __repr__(self): - return '%s(value=%r, path=%r, context=%r)' % (self.__class__.__name__, self.value, self.path, self.context) - - def __eq__(self, other): - return isinstance(other, DatumInContext) and other.value == self.value and other.path == self.path and self.context == other.context - -class AutoIdForDatum(DatumInContext): - """ - This behaves like a DatumInContext, but the value is - always the path leading up to it, not including the "id", - and with any "id" fields along the way replacing the prior - segment of the path - - For example, it will make "foo.bar.id" return a datum - that behaves like DatumInContext(value="foo.bar", path="foo.bar.id"). - - This is disabled by default; it can be turned on by - settings the `auto_id_field` global to a value other - than `None`. - """ - - def __init__(self, datum, id_field=None): - """ - Invariant is that datum.path is the path from context to datum. The auto id - will either be the id in the datum (if present) or the id of the context - followed by the path to the datum. - - The path to this datum is always the path to the context, the path to the - datum, and then the auto id field. - """ - self.datum = datum - self.id_field = id_field or auto_id_field - - @property - def value(self): - return str(self.datum.id_pseudopath) - - @property - def path(self): - return self.id_field - - @property - def context(self): - return self.datum - - def __repr__(self): - return '%s(%r)' % (self.__class__.__name__, self.datum) - - def in_context(self, context, path): - return AutoIdForDatum(self.datum.in_context(context=context, path=path)) - - def __eq__(self, other): - return isinstance(other, AutoIdForDatum) and other.datum == self.datum and self.id_field == other.id_field - - -class Root(JSONPath): - """ - The JSONPath referring to the "root" object. Concrete syntax is '$'. - The root is the topmost datum without any context attached. - """ - - def find(self, data): - if not isinstance(data, DatumInContext): - return [DatumInContext(data, path=Root(), context=None)] - else: - if data.context is None: - return [DatumInContext(data.value, context=None, path=Root())] - else: - return Root().find(data.context) - - def update(self, data, val): - return val - - def __str__(self): - return '$' - - def __repr__(self): - return 'Root()' - - def __eq__(self, other): - return isinstance(other, Root) - -class This(JSONPath): - """ - The JSONPath referring to the current datum. Concrete syntax is '@'. - """ - - def find(self, datum): - return [DatumInContext.wrap(datum)] - - def update(self, data, val): - return val - - def __str__(self): - return '`this`' - - def __repr__(self): - return 'This()' - - def __eq__(self, other): - return isinstance(other, This) - -class Child(JSONPath): - """ - JSONPath that first matches the left, then the right. - Concrete syntax is '.' - """ - - def __init__(self, left, right): - self.left = left - self.right = right - - def find(self, datum): - """ - Extra special case: auto ids do not have children, - so cut it off right now rather than auto id the auto id - """ - - return [submatch - for subdata in self.left.find(datum) - if not isinstance(subdata, AutoIdForDatum) - for submatch in self.right.find(subdata)] - - def __eq__(self, other): - return isinstance(other, Child) and self.left == other.left and self.right == other.right - - def __str__(self): - return '%s.%s' % (self.left, self.right) - - def __repr__(self): - return '%s(%r, %r)' % (self.__class__.__name__, self.left, self.right) - -class Parent(JSONPath): - """ - JSONPath that matches the parent node of the current match. - Will crash if no such parent exists. - Available via named operator `parent`. - """ - - def find(self, datum): - datum = DatumInContext.wrap(datum) - return [datum.context] - - def __eq__(self, other): - return isinstance(other, Parent) - - def __str__(self): - return '`parent`' - - def __repr__(self): - return 'Parent()' - - -class Where(JSONPath): - """ - JSONPath that first matches the left, and then - filters for only those nodes that have - a match on the right. - - WARNING: Subject to change. May want to have "contains" - or some other better word for it. - """ - - def __init__(self, left, right): - self.left = left - self.right = right - - def find(self, data): - return [subdata for subdata in self.left.find(data) if self.right.find(data)] - - def __str__(self): - return '%s where %s' % (self.left, self.right) - - def __eq__(self, other): - return isinstance(other, Where) and other.left == self.left and other.right == self.right - -class Descendants(JSONPath): - """ - JSONPath that matches first the left expression then any descendant - of it which matches the right expression. - """ - - def __init__(self, left, right): - self.left = left - self.right = right - - def find(self, datum): - # .. ==> . ( | *.. | [*]..) - # - # With with a wonky caveat that since Slice() has funky coercions - # we cannot just delegate to that equivalence or we'll hit an - # infinite loop. So right here we implement the coercion-free version. - - # Get all left matches into a list - left_matches = self.left.find(datum) - if not isinstance(left_matches, list): - left_matches = [left_matches] - - def match_recursively(datum): - right_matches = self.right.find(datum) - - # Manually do the * or [*] to avoid coercion and recurse just the right-hand pattern - if isinstance(datum.value, list): - recursive_matches = [submatch - for i in range(0, len(datum.value)) - for submatch in match_recursively(DatumInContext(datum.value[i], context=datum, path=Index(i)))] - - elif isinstance(datum.value, dict): - recursive_matches = [submatch - for field in datum.value.keys() - for submatch in match_recursively(DatumInContext(datum.value[field], context=datum, path=Fields(field)))] - - else: - recursive_matches = [] - - return right_matches + list(recursive_matches) - - # TODO: repeatable iterator instead of list? - return [submatch - for left_match in left_matches - for submatch in match_recursively(left_match)] - - def is_singular(): - return False - - def __str__(self): - return '%s..%s' % (self.left, self.right) - - def __eq__(self, other): - return isinstance(other, Descendants) and self.left == other.left and self.right == other.right - -class Union(JSONPath): - """ - JSONPath that returns the union of the results of each match. - This is pretty shoddily implemented for now. The nicest semantics - in case of mismatched bits (list vs atomic) is to put - them all in a list, but I haven't done that yet. - - WARNING: Any appearance of this being the _concatenation_ is - coincidence. It may even be a bug! (or laziness) - """ - def __init__(self, left, right): - self.left = left - self.right = right - - def is_singular(self): - return False - - def find(self, data): - return self.left.find(data) + self.right.find(data) - -class Intersect(JSONPath): - """ - JSONPath for bits that match *both* patterns. - - This can be accomplished a couple of ways. The most - efficient is to actually build the intersected - AST as in building a state machine for matching the - intersection of regular languages. The next - idea is to build a filtered data and match against - that. - """ - def __init__(self, left, right): - self.left = left - self.right = right - - def is_singular(self): - return False - - def find(self, data): - raise NotImplementedError() - -class Fields(JSONPath): - """ - JSONPath referring to some field of the current object. - Concrete syntax ix comma-separated field names. - - WARNING: If '*' is any of the field names, then they will - all be returned. - """ - - def __init__(self, *fields): - self.fields = fields - - def get_field_datum(self, datum, field): - if field == auto_id_field: - return AutoIdForDatum(datum) - else: - try: - field_value = datum.value[field] # Do NOT use `val.get(field)` since that confuses None as a value and None due to `get` - return DatumInContext(value=field_value, path=Fields(field), context=datum) - except (TypeError, KeyError, AttributeError): - return None - - def reified_fields(self, datum): - if '*' not in self.fields: - return self.fields - else: - try: - fields = tuple(datum.value.keys()) - return fields if auto_id_field is None else fields + (auto_id_field,) - except AttributeError: - return () - - def find(self, datum): - datum = DatumInContext.wrap(datum) - - return [field_datum - for field_datum in [self.get_field_datum(datum, field) for field in self.reified_fields(datum)] - if field_datum is not None] - - def __str__(self): - return ','.join(self.fields) - - def __repr__(self): - return '%s(%s)' % (self.__class__.__name__, ','.join(map(repr, self.fields))) - - def __eq__(self, other): - return isinstance(other, Fields) and tuple(self.fields) == tuple(other.fields) - - -class Index(JSONPath): - """ - JSONPath that matches indices of the current datum, or none if not large enough. - Concrete syntax is brackets. - - WARNING: If the datum is not long enough, it will not crash but will not match anything. - NOTE: For the concrete syntax of `[*]`, the abstract syntax is a Slice() with no parameters (equiv to `[:]` - """ - - def __init__(self, index): - self.index = index - - def find(self, datum): - datum = DatumInContext.wrap(datum) - - if len(datum.value) > self.index: - return [DatumInContext(datum.value[self.index], path=self, context=datum)] - else: - return [] - - def __eq__(self, other): - return isinstance(other, Index) and self.index == other.index - - def __str__(self): - return '[%i]' % self.index - -class Slice(JSONPath): - """ - JSONPath matching a slice of an array. - - Because of a mismatch between JSON and XML when schema-unaware, - this always returns an iterable; if the incoming data - was not a list, then it returns a one element list _containing_ that - data. - - Consider these two docs, and their schema-unaware translation to JSON: - - hello ==> {"a": {"b": "hello"}} - hellogoodbye ==> {"a": {"b": ["hello", "goodbye"]}} - - If there were a schema, it would be known that "b" should always be an - array (unless the schema were wonky, but that is too much to fix here) - so when querying with JSON if the one writing the JSON knows that it - should be an array, they can write a slice operator and it will coerce - a non-array value to an array. - - This may be a bit unfortunate because it would be nice to always have - an iterator, but dictionaries and other objects may also be iterable, - so this is the compromise. - """ - def __init__(self, start=None, end=None, step=None): - self.start = start - self.end = end - self.step = step - - def find(self, datum): - datum = DatumInContext.wrap(datum) - - # Here's the hack. If it is a dictionary or some kind of constant, - # put it in a single-element list - if (isinstance(datum.value, dict) or isinstance(datum.value, six.integer_types) or isinstance(datum.value, six.string_types)): - return self.find(DatumInContext([datum.value], path=datum.path, context=datum.context)) - - # Some iterators do not support slicing but we can still - # at least work for '*' - if self.start == None and self.end == None and self.step == None: - return [DatumInContext(datum.value[i], path=Index(i), context=datum) for i in xrange(0, len(datum.value))] - else: - return [DatumInContext(datum.value[i], path=Index(i), context=datum) for i in range(0, len(datum.value))[self.start:self.end:self.step]] - - def __str__(self): - if self.start == None and self.end == None and self.step == None: - return '[*]' - else: - return '[%s%s%s]' % (self.start or '', - ':%d'%self.end if self.end else '', - ':%d'%self.step if self.step else '') - - def __repr__(self): - return '%s(start=%r,end=%r,step=%r)' % (self.__class__.__name__, self.start, self.end, self.step) - - def __eq__(self, other): - return isinstance(other, Slice) and other.start == self.start and self.end == other.end and other.step == self.step diff --git a/bin/python/jsonpath_rw/lexer.py b/bin/python/jsonpath_rw/lexer.py deleted file mode 100644 index aa28ff5067..0000000000 --- a/bin/python/jsonpath_rw/lexer.py +++ /dev/null @@ -1,171 +0,0 @@ -from __future__ import unicode_literals, print_function, absolute_import, division, generators, nested_scopes -import sys -import logging - -import ply.lex - -logger = logging.getLogger(__name__) - -class JsonPathLexerError(Exception): - pass - -class JsonPathLexer(object): - ''' - A Lexical analyzer for JsonPath. - ''' - - def __init__(self, debug=False): - self.debug = debug - if self.__doc__ == None: - raise JsonPathLexerError('Docstrings have been removed! By design of PLY, jsonpath-rw requires docstrings. You must not use PYTHONOPTIMIZE=2 or python -OO.') - - def tokenize(self, string): - ''' - Maps a string to an iterator over tokens. In other words: [char] -> [token] - ''' - - new_lexer = ply.lex.lex(module=self, debug=self.debug, errorlog=logger) - new_lexer.latest_newline = 0 - new_lexer.string_value = None - new_lexer.input(string) - - while True: - t = new_lexer.token() - if t is None: break - t.col = t.lexpos - new_lexer.latest_newline - yield t - - if new_lexer.string_value is not None: - raise JsonPathLexerError('Unexpected EOF in string literal or identifier') - - # ============== PLY Lexer specification ================== - # - # This probably should be private but: - # - the parser requires access to `tokens` (perhaps they should be defined in a third, shared dependency) - # - things like `literals` might be a legitimate part of the public interface. - # - # Anyhow, it is pythonic to give some rope to hang oneself with :-) - - literals = ['*', '.', '[', ']', '(', ')', '$', ',', ':', '|', '&'] - - reserved_words = { 'where': 'WHERE' } - - tokens = ['DOUBLEDOT', 'NUMBER', 'ID', 'NAMED_OPERATOR'] + list(reserved_words.values()) - - states = [ ('singlequote', 'exclusive'), - ('doublequote', 'exclusive'), - ('backquote', 'exclusive') ] - - # Normal lexing, rather easy - t_DOUBLEDOT = r'\.\.' - t_ignore = ' \t' - - def t_ID(self, t): - r'[a-zA-Z_@][a-zA-Z0-9_@\-]*' - t.type = self.reserved_words.get(t.value, 'ID') - return t - - def t_NUMBER(self, t): - r'-?\d+' - t.value = int(t.value) - return t - - - # Single-quoted strings - t_singlequote_ignore = '' - def t_singlequote(self, t): - r"'" - t.lexer.string_start = t.lexer.lexpos - t.lexer.string_value = '' - t.lexer.push_state('singlequote') - - def t_singlequote_content(self, t): - r"[^'\\]+" - t.lexer.string_value += t.value - - def t_singlequote_escape(self, t): - r'\\.' - t.lexer.string_value += t.value[1] - - def t_singlequote_end(self, t): - r"'" - t.value = t.lexer.string_value - t.type = 'ID' - t.lexer.string_value = None - t.lexer.pop_state() - return t - - def t_singlequote_error(self, t): - raise JsonPathLexerError('Error on line %s, col %s while lexing singlequoted field: Unexpected character: %s ' % (t.lexer.lineno, t.lexpos - t.lexer.latest_newline, t.value[0])) - - - # Double-quoted strings - t_doublequote_ignore = '' - def t_doublequote(self, t): - r'"' - t.lexer.string_start = t.lexer.lexpos - t.lexer.string_value = '' - t.lexer.push_state('doublequote') - - def t_doublequote_content(self, t): - r'[^"\\]+' - t.lexer.string_value += t.value - - def t_doublequote_escape(self, t): - r'\\.' - t.lexer.string_value += t.value[1] - - def t_doublequote_end(self, t): - r'"' - t.value = t.lexer.string_value - t.type = 'ID' - t.lexer.string_value = None - t.lexer.pop_state() - return t - - def t_doublequote_error(self, t): - raise JsonPathLexerError('Error on line %s, col %s while lexing doublequoted field: Unexpected character: %s ' % (t.lexer.lineno, t.lexpos - t.lexer.latest_newline, t.value[0])) - - - # Back-quoted "magic" operators - t_backquote_ignore = '' - def t_backquote(self, t): - r'`' - t.lexer.string_start = t.lexer.lexpos - t.lexer.string_value = '' - t.lexer.push_state('backquote') - - def t_backquote_escape(self, t): - r'\\.' - t.lexer.string_value += t.value[1] - - def t_backquote_content(self, t): - r"[^`\\]+" - t.lexer.string_value += t.value - - def t_backquote_end(self, t): - r'`' - t.value = t.lexer.string_value - t.type = 'NAMED_OPERATOR' - t.lexer.string_value = None - t.lexer.pop_state() - return t - - def t_backquote_error(self, t): - raise JsonPathLexerError('Error on line %s, col %s while lexing backquoted operator: Unexpected character: %s ' % (t.lexer.lineno, t.lexpos - t.lexer.latest_newline, t.value[0])) - - - # Counting lines, handling errors - def t_newline(self, t): - r'\n' - t.lexer.lineno += 1 - t.lexer.latest_newline = t.lexpos - - def t_error(self, t): - raise JsonPathLexerError('Error on line %s, col %s: Unexpected character: %s ' % (t.lexer.lineno, t.lexpos - t.lexer.latest_newline, t.value[0])) - -if __name__ == '__main__': - logging.basicConfig() - lexer = JsonPathLexer(debug=True) - for token in lexer.tokenize(sys.stdin.read()): - print('%-20s%s' % (token.value, token.type)) diff --git a/bin/python/jsonpath_rw/parser.py b/bin/python/jsonpath_rw/parser.py deleted file mode 100644 index fe5a6cb5ef..0000000000 --- a/bin/python/jsonpath_rw/parser.py +++ /dev/null @@ -1,187 +0,0 @@ -from __future__ import print_function, absolute_import, division, generators, nested_scopes -import sys -import os.path -import logging - -import ply.yacc - -from jsonpath_rw.jsonpath import * -from jsonpath_rw.lexer import JsonPathLexer - -logger = logging.getLogger(__name__) - -def parse(string): - return JsonPathParser().parse(string) - -class JsonPathParser(object): - ''' - An LALR-parser for JsonPath - ''' - - tokens = JsonPathLexer.tokens - - def __init__(self, debug=False, lexer_class=None): - if self.__doc__ == None: - raise Exception('Docstrings have been removed! By design of PLY, jsonpath-rw requires docstrings. You must not use PYTHONOPTIMIZE=2 or python -OO.') - - self.debug = debug - self.lexer_class = lexer_class or JsonPathLexer # Crufty but works around statefulness in PLY - - def parse(self, string, lexer = None): - lexer = lexer or self.lexer_class() - return self.parse_token_stream(lexer.tokenize(string)) - - def parse_token_stream(self, token_iterator, start_symbol='jsonpath'): - - # Since PLY has some crufty aspects and dumps files, we try to keep them local - # However, we need to derive the name of the output Python file :-/ - output_directory = os.path.dirname(__file__) - try: - module_name = os.path.splitext(os.path.split(__file__)[1])[0] - except: - module_name = __name__ - - parsing_table_module = '_'.join([module_name, start_symbol, 'parsetab']) - - # And we regenerate the parse table every time; it doesn't actually take that long! - new_parser = ply.yacc.yacc(module=self, - debug=self.debug, - tabmodule = parsing_table_module, - outputdir = output_directory, - write_tables=0, - start = start_symbol, - errorlog = logger) - - return new_parser.parse(lexer = IteratorToTokenStream(token_iterator)) - - # ===================== PLY Parser specification ===================== - - precedence = [ - ('left', ','), - ('left', 'DOUBLEDOT'), - ('left', '.'), - ('left', '|'), - ('left', '&'), - ('left', 'WHERE'), - ] - - def p_error(self, t): - raise Exception('Parse error at %s:%s near token %s (%s)' % (t.lineno, t.col, t.value, t.type)) - - def p_jsonpath_binop(self, p): - """jsonpath : jsonpath '.' jsonpath - | jsonpath DOUBLEDOT jsonpath - | jsonpath WHERE jsonpath - | jsonpath '|' jsonpath - | jsonpath '&' jsonpath""" - op = p[2] - - if op == '.': - p[0] = Child(p[1], p[3]) - elif op == '..': - p[0] = Descendants(p[1], p[3]) - elif op == 'where': - p[0] = Where(p[1], p[3]) - elif op == '|': - p[0] = Union(p[1], p[3]) - elif op == '&': - p[0] = Intersect(p[1], p[3]) - - def p_jsonpath_fields(self, p): - "jsonpath : fields_or_any" - p[0] = Fields(*p[1]) - - def p_jsonpath_named_operator(self, p): - "jsonpath : NAMED_OPERATOR" - if p[1] == 'this': - p[0] = This() - elif p[1] == 'parent': - p[0] = Parent() - else: - raise Exception('Unknown named operator `%s` at %s:%s' % (p[1], p.lineno(1), p.lexpos(1))) - - def p_jsonpath_root(self, p): - "jsonpath : '$'" - p[0] = Root() - - def p_jsonpath_idx(self, p): - "jsonpath : '[' idx ']'" - p[0] = p[2] - - def p_jsonpath_slice(self, p): - "jsonpath : '[' slice ']'" - p[0] = p[2] - - def p_jsonpath_fieldbrackets(self, p): - "jsonpath : '[' fields ']'" - p[0] = Fields(*p[2]) - - def p_jsonpath_child_fieldbrackets(self, p): - "jsonpath : jsonpath '[' fields ']'" - p[0] = Child(p[1], Fields(*p[3])) - - def p_jsonpath_child_idxbrackets(self, p): - "jsonpath : jsonpath '[' idx ']'" - p[0] = Child(p[1], p[3]) - - def p_jsonpath_child_slicebrackets(self, p): - "jsonpath : jsonpath '[' slice ']'" - p[0] = Child(p[1], p[3]) - - def p_jsonpath_parens(self, p): - "jsonpath : '(' jsonpath ')'" - p[0] = p[2] - - # Because fields in brackets cannot be '*' - that is reserved for array indices - def p_fields_or_any(self, p): - """fields_or_any : fields - | '*' """ - if p[1] == '*': - p[0] = ['*'] - else: - p[0] = p[1] - - def p_fields_id(self, p): - "fields : ID" - p[0] = [p[1]] - - def p_fields_comma(self, p): - "fields : fields ',' fields" - p[0] = p[1] + p[3] - - def p_idx(self, p): - "idx : NUMBER" - p[0] = Index(p[1]) - - def p_slice_any(self, p): - "slice : '*'" - p[0] = Slice() - - def p_slice(self, p): # Currently does not support `step` - "slice : maybe_int ':' maybe_int" - p[0] = Slice(start=p[1], end=p[3]) - - def p_maybe_int(self, p): - """maybe_int : NUMBER - | empty""" - p[0] = p[1] - - def p_empty(self, p): - 'empty :' - p[0] = None - -class IteratorToTokenStream(object): - def __init__(self, iterator): - self.iterator = iterator - - def token(self): - try: - return next(self.iterator) - except StopIteration: - return None - - -if __name__ == '__main__': - logging.basicConfig() - parser = JsonPathParser(debug=True) - print(parser.parse(sys.stdin.read())) diff --git a/bin/python/ply/__init__.py b/bin/python/ply/__init__.py deleted file mode 100644 index 853a985542..0000000000 --- a/bin/python/ply/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# PLY package -# Author: David Beazley (dave@dabeaz.com) - -__all__ = ['lex','yacc'] diff --git a/bin/python/ply/cpp.py b/bin/python/ply/cpp.py deleted file mode 100644 index 5cad68200b..0000000000 --- a/bin/python/ply/cpp.py +++ /dev/null @@ -1,898 +0,0 @@ -# ----------------------------------------------------------------------------- -# cpp.py -# -# Author: David Beazley (http://www.dabeaz.com) -# Copyright (C) 2007 -# All rights reserved -# -# This module implements an ANSI-C style lexical preprocessor for PLY. -# ----------------------------------------------------------------------------- -from __future__ import generators - -# ----------------------------------------------------------------------------- -# Default preprocessor lexer definitions. These tokens are enough to get -# a basic preprocessor working. Other modules may import these if they want -# ----------------------------------------------------------------------------- - -tokens = ( - 'CPP_ID','CPP_INTEGER', 'CPP_FLOAT', 'CPP_STRING', 'CPP_CHAR', 'CPP_WS', 'CPP_COMMENT', 'CPP_POUND','CPP_DPOUND' -) - -literals = "+-*/%|&~^<>=!?()[]{}.,;:\\\'\"" - -# Whitespace -def t_CPP_WS(t): - r'\s+' - t.lexer.lineno += t.value.count("\n") - return t - -t_CPP_POUND = r'\#' -t_CPP_DPOUND = r'\#\#' - -# Identifier -t_CPP_ID = r'[A-Za-z_][\w_]*' - -# Integer literal -def CPP_INTEGER(t): - r'(((((0x)|(0X))[0-9a-fA-F]+)|(\d+))([uU]|[lL]|[uU][lL]|[lL][uU])?)' - return t - -t_CPP_INTEGER = CPP_INTEGER - -# Floating literal -t_CPP_FLOAT = r'((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?' - -# String literal -def t_CPP_STRING(t): - r'\"([^\\\n]|(\\(.|\n)))*?\"' - t.lexer.lineno += t.value.count("\n") - return t - -# Character constant 'c' or L'c' -def t_CPP_CHAR(t): - r'(L)?\'([^\\\n]|(\\(.|\n)))*?\'' - t.lexer.lineno += t.value.count("\n") - return t - -# Comment -def t_CPP_COMMENT(t): - r'(/\*(.|\n)*?\*/)|(//.*?\n)' - t.lexer.lineno += t.value.count("\n") - return t - -def t_error(t): - t.type = t.value[0] - t.value = t.value[0] - t.lexer.skip(1) - return t - -import re -import copy -import time -import os.path - -# ----------------------------------------------------------------------------- -# trigraph() -# -# Given an input string, this function replaces all trigraph sequences. -# The following mapping is used: -# -# ??= # -# ??/ \ -# ??' ^ -# ??( [ -# ??) ] -# ??! | -# ??< { -# ??> } -# ??- ~ -# ----------------------------------------------------------------------------- - -_trigraph_pat = re.compile(r'''\?\?[=/\'\(\)\!<>\-]''') -_trigraph_rep = { - '=':'#', - '/':'\\', - "'":'^', - '(':'[', - ')':']', - '!':'|', - '<':'{', - '>':'}', - '-':'~' -} - -def trigraph(input): - return _trigraph_pat.sub(lambda g: _trigraph_rep[g.group()[-1]],input) - -# ------------------------------------------------------------------ -# Macro object -# -# This object holds information about preprocessor macros -# -# .name - Macro name (string) -# .value - Macro value (a list of tokens) -# .arglist - List of argument names -# .variadic - Boolean indicating whether or not variadic macro -# .vararg - Name of the variadic parameter -# -# When a macro is created, the macro replacement token sequence is -# pre-scanned and used to create patch lists that are later used -# during macro expansion -# ------------------------------------------------------------------ - -class Macro(object): - def __init__(self,name,value,arglist=None,variadic=False): - self.name = name - self.value = value - self.arglist = arglist - self.variadic = variadic - if variadic: - self.vararg = arglist[-1] - self.source = None - -# ------------------------------------------------------------------ -# Preprocessor object -# -# Object representing a preprocessor. Contains macro definitions, -# include directories, and other information -# ------------------------------------------------------------------ - -class Preprocessor(object): - def __init__(self,lexer=None): - if lexer is None: - lexer = lex.lexer - self.lexer = lexer - self.macros = { } - self.path = [] - self.temp_path = [] - - # Probe the lexer for selected tokens - self.lexprobe() - - tm = time.localtime() - self.define("__DATE__ \"%s\"" % time.strftime("%b %d %Y",tm)) - self.define("__TIME__ \"%s\"" % time.strftime("%H:%M:%S",tm)) - self.parser = None - - # ----------------------------------------------------------------------------- - # tokenize() - # - # Utility function. Given a string of text, tokenize into a list of tokens - # ----------------------------------------------------------------------------- - - def tokenize(self,text): - tokens = [] - self.lexer.input(text) - while True: - tok = self.lexer.token() - if not tok: break - tokens.append(tok) - return tokens - - # --------------------------------------------------------------------- - # error() - # - # Report a preprocessor error/warning of some kind - # ---------------------------------------------------------------------- - - def error(self,file,line,msg): - print("%s:%d %s" % (file,line,msg)) - - # ---------------------------------------------------------------------- - # lexprobe() - # - # This method probes the preprocessor lexer object to discover - # the token types of symbols that are important to the preprocessor. - # If this works right, the preprocessor will simply "work" - # with any suitable lexer regardless of how tokens have been named. - # ---------------------------------------------------------------------- - - def lexprobe(self): - - # Determine the token type for identifiers - self.lexer.input("identifier") - tok = self.lexer.token() - if not tok or tok.value != "identifier": - print("Couldn't determine identifier type") - else: - self.t_ID = tok.type - - # Determine the token type for integers - self.lexer.input("12345") - tok = self.lexer.token() - if not tok or int(tok.value) != 12345: - print("Couldn't determine integer type") - else: - self.t_INTEGER = tok.type - self.t_INTEGER_TYPE = type(tok.value) - - # Determine the token type for strings enclosed in double quotes - self.lexer.input("\"filename\"") - tok = self.lexer.token() - if not tok or tok.value != "\"filename\"": - print("Couldn't determine string type") - else: - self.t_STRING = tok.type - - # Determine the token type for whitespace--if any - self.lexer.input(" ") - tok = self.lexer.token() - if not tok or tok.value != " ": - self.t_SPACE = None - else: - self.t_SPACE = tok.type - - # Determine the token type for newlines - self.lexer.input("\n") - tok = self.lexer.token() - if not tok or tok.value != "\n": - self.t_NEWLINE = None - print("Couldn't determine token for newlines") - else: - self.t_NEWLINE = tok.type - - self.t_WS = (self.t_SPACE, self.t_NEWLINE) - - # Check for other characters used by the preprocessor - chars = [ '<','>','#','##','\\','(',')',',','.'] - for c in chars: - self.lexer.input(c) - tok = self.lexer.token() - if not tok or tok.value != c: - print("Unable to lex '%s' required for preprocessor" % c) - - # ---------------------------------------------------------------------- - # add_path() - # - # Adds a search path to the preprocessor. - # ---------------------------------------------------------------------- - - def add_path(self,path): - self.path.append(path) - - # ---------------------------------------------------------------------- - # group_lines() - # - # Given an input string, this function splits it into lines. Trailing whitespace - # is removed. Any line ending with \ is grouped with the next line. This - # function forms the lowest level of the preprocessor---grouping into text into - # a line-by-line format. - # ---------------------------------------------------------------------- - - def group_lines(self,input): - lex = self.lexer.clone() - lines = [x.rstrip() for x in input.splitlines()] - for i in xrange(len(lines)): - j = i+1 - while lines[i].endswith('\\') and (j < len(lines)): - lines[i] = lines[i][:-1]+lines[j] - lines[j] = "" - j += 1 - - input = "\n".join(lines) - lex.input(input) - lex.lineno = 1 - - current_line = [] - while True: - tok = lex.token() - if not tok: - break - current_line.append(tok) - if tok.type in self.t_WS and '\n' in tok.value: - yield current_line - current_line = [] - - if current_line: - yield current_line - - # ---------------------------------------------------------------------- - # tokenstrip() - # - # Remove leading/trailing whitespace tokens from a token list - # ---------------------------------------------------------------------- - - def tokenstrip(self,tokens): - i = 0 - while i < len(tokens) and tokens[i].type in self.t_WS: - i += 1 - del tokens[:i] - i = len(tokens)-1 - while i >= 0 and tokens[i].type in self.t_WS: - i -= 1 - del tokens[i+1:] - return tokens - - - # ---------------------------------------------------------------------- - # collect_args() - # - # Collects comma separated arguments from a list of tokens. The arguments - # must be enclosed in parenthesis. Returns a tuple (tokencount,args,positions) - # where tokencount is the number of tokens consumed, args is a list of arguments, - # and positions is a list of integers containing the starting index of each - # argument. Each argument is represented by a list of tokens. - # - # When collecting arguments, leading and trailing whitespace is removed - # from each argument. - # - # This function properly handles nested parenthesis and commas---these do not - # define new arguments. - # ---------------------------------------------------------------------- - - def collect_args(self,tokenlist): - args = [] - positions = [] - current_arg = [] - nesting = 1 - tokenlen = len(tokenlist) - - # Search for the opening '('. - i = 0 - while (i < tokenlen) and (tokenlist[i].type in self.t_WS): - i += 1 - - if (i < tokenlen) and (tokenlist[i].value == '('): - positions.append(i+1) - else: - self.error(self.source,tokenlist[0].lineno,"Missing '(' in macro arguments") - return 0, [], [] - - i += 1 - - while i < tokenlen: - t = tokenlist[i] - if t.value == '(': - current_arg.append(t) - nesting += 1 - elif t.value == ')': - nesting -= 1 - if nesting == 0: - if current_arg: - args.append(self.tokenstrip(current_arg)) - positions.append(i) - return i+1,args,positions - current_arg.append(t) - elif t.value == ',' and nesting == 1: - args.append(self.tokenstrip(current_arg)) - positions.append(i+1) - current_arg = [] - else: - current_arg.append(t) - i += 1 - - # Missing end argument - self.error(self.source,tokenlist[-1].lineno,"Missing ')' in macro arguments") - return 0, [],[] - - # ---------------------------------------------------------------------- - # macro_prescan() - # - # Examine the macro value (token sequence) and identify patch points - # This is used to speed up macro expansion later on---we'll know - # right away where to apply patches to the value to form the expansion - # ---------------------------------------------------------------------- - - def macro_prescan(self,macro): - macro.patch = [] # Standard macro arguments - macro.str_patch = [] # String conversion expansion - macro.var_comma_patch = [] # Variadic macro comma patch - i = 0 - while i < len(macro.value): - if macro.value[i].type == self.t_ID and macro.value[i].value in macro.arglist: - argnum = macro.arglist.index(macro.value[i].value) - # Conversion of argument to a string - if i > 0 and macro.value[i-1].value == '#': - macro.value[i] = copy.copy(macro.value[i]) - macro.value[i].type = self.t_STRING - del macro.value[i-1] - macro.str_patch.append((argnum,i-1)) - continue - # Concatenation - elif (i > 0 and macro.value[i-1].value == '##'): - macro.patch.append(('c',argnum,i-1)) - del macro.value[i-1] - continue - elif ((i+1) < len(macro.value) and macro.value[i+1].value == '##'): - macro.patch.append(('c',argnum,i)) - i += 1 - continue - # Standard expansion - else: - macro.patch.append(('e',argnum,i)) - elif macro.value[i].value == '##': - if macro.variadic and (i > 0) and (macro.value[i-1].value == ',') and \ - ((i+1) < len(macro.value)) and (macro.value[i+1].type == self.t_ID) and \ - (macro.value[i+1].value == macro.vararg): - macro.var_comma_patch.append(i-1) - i += 1 - macro.patch.sort(key=lambda x: x[2],reverse=True) - - # ---------------------------------------------------------------------- - # macro_expand_args() - # - # Given a Macro and list of arguments (each a token list), this method - # returns an expanded version of a macro. The return value is a token sequence - # representing the replacement macro tokens - # ---------------------------------------------------------------------- - - def macro_expand_args(self,macro,args): - # Make a copy of the macro token sequence - rep = [copy.copy(_x) for _x in macro.value] - - # Make string expansion patches. These do not alter the length of the replacement sequence - - str_expansion = {} - for argnum, i in macro.str_patch: - if argnum not in str_expansion: - str_expansion[argnum] = ('"%s"' % "".join([x.value for x in args[argnum]])).replace("\\","\\\\") - rep[i] = copy.copy(rep[i]) - rep[i].value = str_expansion[argnum] - - # Make the variadic macro comma patch. If the variadic macro argument is empty, we get rid - comma_patch = False - if macro.variadic and not args[-1]: - for i in macro.var_comma_patch: - rep[i] = None - comma_patch = True - - # Make all other patches. The order of these matters. It is assumed that the patch list - # has been sorted in reverse order of patch location since replacements will cause the - # size of the replacement sequence to expand from the patch point. - - expanded = { } - for ptype, argnum, i in macro.patch: - # Concatenation. Argument is left unexpanded - if ptype == 'c': - rep[i:i+1] = args[argnum] - # Normal expansion. Argument is macro expanded first - elif ptype == 'e': - if argnum not in expanded: - expanded[argnum] = self.expand_macros(args[argnum]) - rep[i:i+1] = expanded[argnum] - - # Get rid of removed comma if necessary - if comma_patch: - rep = [_i for _i in rep if _i] - - return rep - - - # ---------------------------------------------------------------------- - # expand_macros() - # - # Given a list of tokens, this function performs macro expansion. - # The expanded argument is a dictionary that contains macros already - # expanded. This is used to prevent infinite recursion. - # ---------------------------------------------------------------------- - - def expand_macros(self,tokens,expanded=None): - if expanded is None: - expanded = {} - i = 0 - while i < len(tokens): - t = tokens[i] - if t.type == self.t_ID: - if t.value in self.macros and t.value not in expanded: - # Yes, we found a macro match - expanded[t.value] = True - - m = self.macros[t.value] - if not m.arglist: - # A simple macro - ex = self.expand_macros([copy.copy(_x) for _x in m.value],expanded) - for e in ex: - e.lineno = t.lineno - tokens[i:i+1] = ex - i += len(ex) - else: - # A macro with arguments - j = i + 1 - while j < len(tokens) and tokens[j].type in self.t_WS: - j += 1 - if tokens[j].value == '(': - tokcount,args,positions = self.collect_args(tokens[j:]) - if not m.variadic and len(args) != len(m.arglist): - self.error(self.source,t.lineno,"Macro %s requires %d arguments" % (t.value,len(m.arglist))) - i = j + tokcount - elif m.variadic and len(args) < len(m.arglist)-1: - if len(m.arglist) > 2: - self.error(self.source,t.lineno,"Macro %s must have at least %d arguments" % (t.value, len(m.arglist)-1)) - else: - self.error(self.source,t.lineno,"Macro %s must have at least %d argument" % (t.value, len(m.arglist)-1)) - i = j + tokcount - else: - if m.variadic: - if len(args) == len(m.arglist)-1: - args.append([]) - else: - args[len(m.arglist)-1] = tokens[j+positions[len(m.arglist)-1]:j+tokcount-1] - del args[len(m.arglist):] - - # Get macro replacement text - rep = self.macro_expand_args(m,args) - rep = self.expand_macros(rep,expanded) - for r in rep: - r.lineno = t.lineno - tokens[i:j+tokcount] = rep - i += len(rep) - del expanded[t.value] - continue - elif t.value == '__LINE__': - t.type = self.t_INTEGER - t.value = self.t_INTEGER_TYPE(t.lineno) - - i += 1 - return tokens - - # ---------------------------------------------------------------------- - # evalexpr() - # - # Evaluate an expression token sequence for the purposes of evaluating - # integral expressions. - # ---------------------------------------------------------------------- - - def evalexpr(self,tokens): - # tokens = tokenize(line) - # Search for defined macros - i = 0 - while i < len(tokens): - if tokens[i].type == self.t_ID and tokens[i].value == 'defined': - j = i + 1 - needparen = False - result = "0L" - while j < len(tokens): - if tokens[j].type in self.t_WS: - j += 1 - continue - elif tokens[j].type == self.t_ID: - if tokens[j].value in self.macros: - result = "1L" - else: - result = "0L" - if not needparen: break - elif tokens[j].value == '(': - needparen = True - elif tokens[j].value == ')': - break - else: - self.error(self.source,tokens[i].lineno,"Malformed defined()") - j += 1 - tokens[i].type = self.t_INTEGER - tokens[i].value = self.t_INTEGER_TYPE(result) - del tokens[i+1:j+1] - i += 1 - tokens = self.expand_macros(tokens) - for i,t in enumerate(tokens): - if t.type == self.t_ID: - tokens[i] = copy.copy(t) - tokens[i].type = self.t_INTEGER - tokens[i].value = self.t_INTEGER_TYPE("0L") - elif t.type == self.t_INTEGER: - tokens[i] = copy.copy(t) - # Strip off any trailing suffixes - tokens[i].value = str(tokens[i].value) - while tokens[i].value[-1] not in "0123456789abcdefABCDEF": - tokens[i].value = tokens[i].value[:-1] - - expr = "".join([str(x.value) for x in tokens]) - expr = expr.replace("&&"," and ") - expr = expr.replace("||"," or ") - expr = expr.replace("!"," not ") - try: - result = eval(expr) - except StandardError: - self.error(self.source,tokens[0].lineno,"Couldn't evaluate expression") - result = 0 - return result - - # ---------------------------------------------------------------------- - # parsegen() - # - # Parse an input string/ - # ---------------------------------------------------------------------- - def parsegen(self,input,source=None): - - # Replace trigraph sequences - t = trigraph(input) - lines = self.group_lines(t) - - if not source: - source = "" - - self.define("__FILE__ \"%s\"" % source) - - self.source = source - chunk = [] - enable = True - iftrigger = False - ifstack = [] - - for x in lines: - for i,tok in enumerate(x): - if tok.type not in self.t_WS: break - if tok.value == '#': - # Preprocessor directive - - for tok in x: - if tok in self.t_WS and '\n' in tok.value: - chunk.append(tok) - - dirtokens = self.tokenstrip(x[i+1:]) - if dirtokens: - name = dirtokens[0].value - args = self.tokenstrip(dirtokens[1:]) - else: - name = "" - args = [] - - if name == 'define': - if enable: - for tok in self.expand_macros(chunk): - yield tok - chunk = [] - self.define(args) - elif name == 'include': - if enable: - for tok in self.expand_macros(chunk): - yield tok - chunk = [] - oldfile = self.macros['__FILE__'] - for tok in self.include(args): - yield tok - self.macros['__FILE__'] = oldfile - self.source = source - elif name == 'undef': - if enable: - for tok in self.expand_macros(chunk): - yield tok - chunk = [] - self.undef(args) - elif name == 'ifdef': - ifstack.append((enable,iftrigger)) - if enable: - if not args[0].value in self.macros: - enable = False - iftrigger = False - else: - iftrigger = True - elif name == 'ifndef': - ifstack.append((enable,iftrigger)) - if enable: - if args[0].value in self.macros: - enable = False - iftrigger = False - else: - iftrigger = True - elif name == 'if': - ifstack.append((enable,iftrigger)) - if enable: - result = self.evalexpr(args) - if not result: - enable = False - iftrigger = False - else: - iftrigger = True - elif name == 'elif': - if ifstack: - if ifstack[-1][0]: # We only pay attention if outer "if" allows this - if enable: # If already true, we flip enable False - enable = False - elif not iftrigger: # If False, but not triggered yet, we'll check expression - result = self.evalexpr(args) - if result: - enable = True - iftrigger = True - else: - self.error(self.source,dirtokens[0].lineno,"Misplaced #elif") - - elif name == 'else': - if ifstack: - if ifstack[-1][0]: - if enable: - enable = False - elif not iftrigger: - enable = True - iftrigger = True - else: - self.error(self.source,dirtokens[0].lineno,"Misplaced #else") - - elif name == 'endif': - if ifstack: - enable,iftrigger = ifstack.pop() - else: - self.error(self.source,dirtokens[0].lineno,"Misplaced #endif") - else: - # Unknown preprocessor directive - pass - - else: - # Normal text - if enable: - chunk.extend(x) - - for tok in self.expand_macros(chunk): - yield tok - chunk = [] - - # ---------------------------------------------------------------------- - # include() - # - # Implementation of file-inclusion - # ---------------------------------------------------------------------- - - def include(self,tokens): - # Try to extract the filename and then process an include file - if not tokens: - return - if tokens: - if tokens[0].value != '<' and tokens[0].type != self.t_STRING: - tokens = self.expand_macros(tokens) - - if tokens[0].value == '<': - # Include <...> - i = 1 - while i < len(tokens): - if tokens[i].value == '>': - break - i += 1 - else: - print("Malformed #include <...>") - return - filename = "".join([x.value for x in tokens[1:i]]) - path = self.path + [""] + self.temp_path - elif tokens[0].type == self.t_STRING: - filename = tokens[0].value[1:-1] - path = self.temp_path + [""] + self.path - else: - print("Malformed #include statement") - return - for p in path: - iname = os.path.join(p,filename) - try: - data = open(iname,"r").read() - dname = os.path.dirname(iname) - if dname: - self.temp_path.insert(0,dname) - for tok in self.parsegen(data,filename): - yield tok - if dname: - del self.temp_path[0] - break - except IOError: - pass - else: - print("Couldn't find '%s'" % filename) - - # ---------------------------------------------------------------------- - # define() - # - # Define a new macro - # ---------------------------------------------------------------------- - - def define(self,tokens): - if isinstance(tokens,(str,unicode)): - tokens = self.tokenize(tokens) - - linetok = tokens - try: - name = linetok[0] - if len(linetok) > 1: - mtype = linetok[1] - else: - mtype = None - if not mtype: - m = Macro(name.value,[]) - self.macros[name.value] = m - elif mtype.type in self.t_WS: - # A normal macro - m = Macro(name.value,self.tokenstrip(linetok[2:])) - self.macros[name.value] = m - elif mtype.value == '(': - # A macro with arguments - tokcount, args, positions = self.collect_args(linetok[1:]) - variadic = False - for a in args: - if variadic: - print("No more arguments may follow a variadic argument") - break - astr = "".join([str(_i.value) for _i in a]) - if astr == "...": - variadic = True - a[0].type = self.t_ID - a[0].value = '__VA_ARGS__' - variadic = True - del a[1:] - continue - elif astr[-3:] == "..." and a[0].type == self.t_ID: - variadic = True - del a[1:] - # If, for some reason, "." is part of the identifier, strip off the name for the purposes - # of macro expansion - if a[0].value[-3:] == '...': - a[0].value = a[0].value[:-3] - continue - if len(a) > 1 or a[0].type != self.t_ID: - print("Invalid macro argument") - break - else: - mvalue = self.tokenstrip(linetok[1+tokcount:]) - i = 0 - while i < len(mvalue): - if i+1 < len(mvalue): - if mvalue[i].type in self.t_WS and mvalue[i+1].value == '##': - del mvalue[i] - continue - elif mvalue[i].value == '##' and mvalue[i+1].type in self.t_WS: - del mvalue[i+1] - i += 1 - m = Macro(name.value,mvalue,[x[0].value for x in args],variadic) - self.macro_prescan(m) - self.macros[name.value] = m - else: - print("Bad macro definition") - except LookupError: - print("Bad macro definition") - - # ---------------------------------------------------------------------- - # undef() - # - # Undefine a macro - # ---------------------------------------------------------------------- - - def undef(self,tokens): - id = tokens[0].value - try: - del self.macros[id] - except LookupError: - pass - - # ---------------------------------------------------------------------- - # parse() - # - # Parse input text. - # ---------------------------------------------------------------------- - def parse(self,input,source=None,ignore={}): - self.ignore = ignore - self.parser = self.parsegen(input,source) - - # ---------------------------------------------------------------------- - # token() - # - # Method to return individual tokens - # ---------------------------------------------------------------------- - def token(self): - try: - while True: - tok = next(self.parser) - if tok.type not in self.ignore: return tok - except StopIteration: - self.parser = None - return None - -if __name__ == '__main__': - import ply.lex as lex - lexer = lex.lex() - - # Run a preprocessor - import sys - f = open(sys.argv[1]) - input = f.read() - - p = Preprocessor(lexer) - p.parse(input,sys.argv[1]) - while True: - tok = p.token() - if not tok: break - print(p.source, tok) - - - - - - - - - - - diff --git a/bin/python/ply/ctokens.py b/bin/python/ply/ctokens.py deleted file mode 100644 index dd5f102dc8..0000000000 --- a/bin/python/ply/ctokens.py +++ /dev/null @@ -1,133 +0,0 @@ -# ---------------------------------------------------------------------- -# ctokens.py -# -# Token specifications for symbols in ANSI C and C++. This file is -# meant to be used as a library in other tokenizers. -# ---------------------------------------------------------------------- - -# Reserved words - -tokens = [ - # Literals (identifier, integer constant, float constant, string constant, char const) - 'ID', 'TYPEID', 'ICONST', 'FCONST', 'SCONST', 'CCONST', - - # Operators (+,-,*,/,%,|,&,~,^,<<,>>, ||, &&, !, <, <=, >, >=, ==, !=) - 'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'MOD', - 'OR', 'AND', 'NOT', 'XOR', 'LSHIFT', 'RSHIFT', - 'LOR', 'LAND', 'LNOT', - 'LT', 'LE', 'GT', 'GE', 'EQ', 'NE', - - # Assignment (=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=) - 'EQUALS', 'TIMESEQUAL', 'DIVEQUAL', 'MODEQUAL', 'PLUSEQUAL', 'MINUSEQUAL', - 'LSHIFTEQUAL','RSHIFTEQUAL', 'ANDEQUAL', 'XOREQUAL', 'OREQUAL', - - # Increment/decrement (++,--) - 'PLUSPLUS', 'MINUSMINUS', - - # Structure dereference (->) - 'ARROW', - - # Ternary operator (?) - 'TERNARY', - - # Delimeters ( ) [ ] { } , . ; : - 'LPAREN', 'RPAREN', - 'LBRACKET', 'RBRACKET', - 'LBRACE', 'RBRACE', - 'COMMA', 'PERIOD', 'SEMI', 'COLON', - - # Ellipsis (...) - 'ELLIPSIS', -] - -# Operators -t_PLUS = r'\+' -t_MINUS = r'-' -t_TIMES = r'\*' -t_DIVIDE = r'/' -t_MODULO = r'%' -t_OR = r'\|' -t_AND = r'&' -t_NOT = r'~' -t_XOR = r'\^' -t_LSHIFT = r'<<' -t_RSHIFT = r'>>' -t_LOR = r'\|\|' -t_LAND = r'&&' -t_LNOT = r'!' -t_LT = r'<' -t_GT = r'>' -t_LE = r'<=' -t_GE = r'>=' -t_EQ = r'==' -t_NE = r'!=' - -# Assignment operators - -t_EQUALS = r'=' -t_TIMESEQUAL = r'\*=' -t_DIVEQUAL = r'/=' -t_MODEQUAL = r'%=' -t_PLUSEQUAL = r'\+=' -t_MINUSEQUAL = r'-=' -t_LSHIFTEQUAL = r'<<=' -t_RSHIFTEQUAL = r'>>=' -t_ANDEQUAL = r'&=' -t_OREQUAL = r'\|=' -t_XOREQUAL = r'^=' - -# Increment/decrement -t_INCREMENT = r'\+\+' -t_DECREMENT = r'--' - -# -> -t_ARROW = r'->' - -# ? -t_TERNARY = r'\?' - -# Delimeters -t_LPAREN = r'\(' -t_RPAREN = r'\)' -t_LBRACKET = r'\[' -t_RBRACKET = r'\]' -t_LBRACE = r'\{' -t_RBRACE = r'\}' -t_COMMA = r',' -t_PERIOD = r'\.' -t_SEMI = r';' -t_COLON = r':' -t_ELLIPSIS = r'\.\.\.' - -# Identifiers -t_ID = r'[A-Za-z_][A-Za-z0-9_]*' - -# Integer literal -t_INTEGER = r'\d+([uU]|[lL]|[uU][lL]|[lL][uU])?' - -# Floating literal -t_FLOAT = r'((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?' - -# String literal -t_STRING = r'\"([^\\\n]|(\\.))*?\"' - -# Character constant 'c' or L'c' -t_CHARACTER = r'(L)?\'([^\\\n]|(\\.))*?\'' - -# Comment (C-Style) -def t_COMMENT(t): - r'/\*(.|\n)*?\*/' - t.lexer.lineno += t.value.count('\n') - return t - -# Comment (C++-Style) -def t_CPPCOMMENT(t): - r'//.*\n' - t.lexer.lineno += 1 - return t - - - - - - diff --git a/bin/python/ply/lex.py b/bin/python/ply/lex.py deleted file mode 100644 index bd32da9327..0000000000 --- a/bin/python/ply/lex.py +++ /dev/null @@ -1,1058 +0,0 @@ -# ----------------------------------------------------------------------------- -# ply: lex.py -# -# Copyright (C) 2001-2011, -# David M. Beazley (Dabeaz LLC) -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * Neither the name of the David Beazley or Dabeaz LLC may be used to -# endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# ----------------------------------------------------------------------------- - -__version__ = "3.4" -__tabversion__ = "3.2" # Version of table file used - -import re, sys, types, copy, os - -# This tuple contains known string types -try: - # Python 2.6 - StringTypes = (types.StringType, types.UnicodeType) -except AttributeError: - # Python 3.0 - StringTypes = (str, bytes) - -# Extract the code attribute of a function. Different implementations -# are for Python 2/3 compatibility. - -if sys.version_info[0] < 3: - def func_code(f): - return f.func_code -else: - def func_code(f): - return f.__code__ - -# This regular expression is used to match valid token names -_is_identifier = re.compile(r'^[a-zA-Z0-9_]+$') - -# Exception thrown when invalid token encountered and no default error -# handler is defined. - -class LexError(Exception): - def __init__(self,message,s): - self.args = (message,) - self.text = s - -# Token class. This class is used to represent the tokens produced. -class LexToken(object): - def __str__(self): - return "LexToken(%s,%r,%d,%d)" % (self.type,self.value,self.lineno,self.lexpos) - def __repr__(self): - return str(self) - -# This object is a stand-in for a logging object created by the -# logging module. - -class PlyLogger(object): - def __init__(self,f): - self.f = f - def critical(self,msg,*args,**kwargs): - self.f.write((msg % args) + "\n") - - def warning(self,msg,*args,**kwargs): - self.f.write("WARNING: "+ (msg % args) + "\n") - - def error(self,msg,*args,**kwargs): - self.f.write("ERROR: " + (msg % args) + "\n") - - info = critical - debug = critical - -# Null logger is used when no output is generated. Does nothing. -class NullLogger(object): - def __getattribute__(self,name): - return self - def __call__(self,*args,**kwargs): - return self - -# ----------------------------------------------------------------------------- -# === Lexing Engine === -# -# The following Lexer class implements the lexer runtime. There are only -# a few public methods and attributes: -# -# input() - Store a new string in the lexer -# token() - Get the next token -# clone() - Clone the lexer -# -# lineno - Current line number -# lexpos - Current position in the input string -# ----------------------------------------------------------------------------- - -class Lexer: - def __init__(self): - self.lexre = None # Master regular expression. This is a list of - # tuples (re,findex) where re is a compiled - # regular expression and findex is a list - # mapping regex group numbers to rules - self.lexretext = None # Current regular expression strings - self.lexstatere = {} # Dictionary mapping lexer states to master regexs - self.lexstateretext = {} # Dictionary mapping lexer states to regex strings - self.lexstaterenames = {} # Dictionary mapping lexer states to symbol names - self.lexstate = "INITIAL" # Current lexer state - self.lexstatestack = [] # Stack of lexer states - self.lexstateinfo = None # State information - self.lexstateignore = {} # Dictionary of ignored characters for each state - self.lexstateerrorf = {} # Dictionary of error functions for each state - self.lexreflags = 0 # Optional re compile flags - self.lexdata = None # Actual input data (as a string) - self.lexpos = 0 # Current position in input text - self.lexlen = 0 # Length of the input text - self.lexerrorf = None # Error rule (if any) - self.lextokens = None # List of valid tokens - self.lexignore = "" # Ignored characters - self.lexliterals = "" # Literal characters that can be passed through - self.lexmodule = None # Module - self.lineno = 1 # Current line number - self.lexoptimize = 0 # Optimized mode - - def clone(self,object=None): - c = copy.copy(self) - - # If the object parameter has been supplied, it means we are attaching the - # lexer to a new object. In this case, we have to rebind all methods in - # the lexstatere and lexstateerrorf tables. - - if object: - newtab = { } - for key, ritem in self.lexstatere.items(): - newre = [] - for cre, findex in ritem: - newfindex = [] - for f in findex: - if not f or not f[0]: - newfindex.append(f) - continue - newfindex.append((getattr(object,f[0].__name__),f[1])) - newre.append((cre,newfindex)) - newtab[key] = newre - c.lexstatere = newtab - c.lexstateerrorf = { } - for key, ef in self.lexstateerrorf.items(): - c.lexstateerrorf[key] = getattr(object,ef.__name__) - c.lexmodule = object - return c - - # ------------------------------------------------------------ - # writetab() - Write lexer information to a table file - # ------------------------------------------------------------ - def writetab(self,tabfile,outputdir=""): - if isinstance(tabfile,types.ModuleType): - return - basetabfilename = tabfile.split(".")[-1] - filename = os.path.join(outputdir,basetabfilename)+".py" - tf = open(filename,"w") - tf.write("# %s.py. This file automatically created by PLY (version %s). Don't edit!\n" % (tabfile,__version__)) - tf.write("_tabversion = %s\n" % repr(__version__)) - tf.write("_lextokens = %s\n" % repr(self.lextokens)) - tf.write("_lexreflags = %s\n" % repr(self.lexreflags)) - tf.write("_lexliterals = %s\n" % repr(self.lexliterals)) - tf.write("_lexstateinfo = %s\n" % repr(self.lexstateinfo)) - - tabre = { } - # Collect all functions in the initial state - initial = self.lexstatere["INITIAL"] - initialfuncs = [] - for part in initial: - for f in part[1]: - if f and f[0]: - initialfuncs.append(f) - - for key, lre in self.lexstatere.items(): - titem = [] - for i in range(len(lre)): - titem.append((self.lexstateretext[key][i],_funcs_to_names(lre[i][1],self.lexstaterenames[key][i]))) - tabre[key] = titem - - tf.write("_lexstatere = %s\n" % repr(tabre)) - tf.write("_lexstateignore = %s\n" % repr(self.lexstateignore)) - - taberr = { } - for key, ef in self.lexstateerrorf.items(): - if ef: - taberr[key] = ef.__name__ - else: - taberr[key] = None - tf.write("_lexstateerrorf = %s\n" % repr(taberr)) - tf.close() - - # ------------------------------------------------------------ - # readtab() - Read lexer information from a tab file - # ------------------------------------------------------------ - def readtab(self,tabfile,fdict): - if isinstance(tabfile,types.ModuleType): - lextab = tabfile - else: - if sys.version_info[0] < 3: - exec("import %s as lextab" % tabfile) - else: - env = { } - exec("import %s as lextab" % tabfile, env,env) - lextab = env['lextab'] - - if getattr(lextab,"_tabversion","0.0") != __version__: - raise ImportError("Inconsistent PLY version") - - self.lextokens = lextab._lextokens - self.lexreflags = lextab._lexreflags - self.lexliterals = lextab._lexliterals - self.lexstateinfo = lextab._lexstateinfo - self.lexstateignore = lextab._lexstateignore - self.lexstatere = { } - self.lexstateretext = { } - for key,lre in lextab._lexstatere.items(): - titem = [] - txtitem = [] - for i in range(len(lre)): - titem.append((re.compile(lre[i][0],lextab._lexreflags | re.VERBOSE),_names_to_funcs(lre[i][1],fdict))) - txtitem.append(lre[i][0]) - self.lexstatere[key] = titem - self.lexstateretext[key] = txtitem - self.lexstateerrorf = { } - for key,ef in lextab._lexstateerrorf.items(): - self.lexstateerrorf[key] = fdict[ef] - self.begin('INITIAL') - - # ------------------------------------------------------------ - # input() - Push a new string into the lexer - # ------------------------------------------------------------ - def input(self,s): - # Pull off the first character to see if s looks like a string - c = s[:1] - if not isinstance(c,StringTypes): - raise ValueError("Expected a string") - self.lexdata = s - self.lexpos = 0 - self.lexlen = len(s) - - # ------------------------------------------------------------ - # begin() - Changes the lexing state - # ------------------------------------------------------------ - def begin(self,state): - if not state in self.lexstatere: - raise ValueError("Undefined state") - self.lexre = self.lexstatere[state] - self.lexretext = self.lexstateretext[state] - self.lexignore = self.lexstateignore.get(state,"") - self.lexerrorf = self.lexstateerrorf.get(state,None) - self.lexstate = state - - # ------------------------------------------------------------ - # push_state() - Changes the lexing state and saves old on stack - # ------------------------------------------------------------ - def push_state(self,state): - self.lexstatestack.append(self.lexstate) - self.begin(state) - - # ------------------------------------------------------------ - # pop_state() - Restores the previous state - # ------------------------------------------------------------ - def pop_state(self): - self.begin(self.lexstatestack.pop()) - - # ------------------------------------------------------------ - # current_state() - Returns the current lexing state - # ------------------------------------------------------------ - def current_state(self): - return self.lexstate - - # ------------------------------------------------------------ - # skip() - Skip ahead n characters - # ------------------------------------------------------------ - def skip(self,n): - self.lexpos += n - - # ------------------------------------------------------------ - # opttoken() - Return the next token from the Lexer - # - # Note: This function has been carefully implemented to be as fast - # as possible. Don't make changes unless you really know what - # you are doing - # ------------------------------------------------------------ - def token(self): - # Make local copies of frequently referenced attributes - lexpos = self.lexpos - lexlen = self.lexlen - lexignore = self.lexignore - lexdata = self.lexdata - - while lexpos < lexlen: - # This code provides some short-circuit code for whitespace, tabs, and other ignored characters - if lexdata[lexpos] in lexignore: - lexpos += 1 - continue - - # Look for a regular expression match - for lexre,lexindexfunc in self.lexre: - m = lexre.match(lexdata,lexpos) - if not m: continue - - # Create a token for return - tok = LexToken() - tok.value = m.group() - tok.lineno = self.lineno - tok.lexpos = lexpos - - i = m.lastindex - func,tok.type = lexindexfunc[i] - - if not func: - # If no token type was set, it's an ignored token - if tok.type: - self.lexpos = m.end() - return tok - else: - lexpos = m.end() - break - - lexpos = m.end() - - # If token is processed by a function, call it - - tok.lexer = self # Set additional attributes useful in token rules - self.lexmatch = m - self.lexpos = lexpos - - newtok = func(tok) - - # Every function must return a token, if nothing, we just move to next token - if not newtok: - lexpos = self.lexpos # This is here in case user has updated lexpos. - lexignore = self.lexignore # This is here in case there was a state change - break - - # Verify type of the token. If not in the token map, raise an error - if not self.lexoptimize: - if not newtok.type in self.lextokens: - raise LexError("%s:%d: Rule '%s' returned an unknown token type '%s'" % ( - func_code(func).co_filename, func_code(func).co_firstlineno, - func.__name__, newtok.type),lexdata[lexpos:]) - - return newtok - else: - # No match, see if in literals - if lexdata[lexpos] in self.lexliterals: - tok = LexToken() - tok.value = lexdata[lexpos] - tok.lineno = self.lineno - tok.type = tok.value - tok.lexpos = lexpos - self.lexpos = lexpos + 1 - return tok - - # No match. Call t_error() if defined. - if self.lexerrorf: - tok = LexToken() - tok.value = self.lexdata[lexpos:] - tok.lineno = self.lineno - tok.type = "error" - tok.lexer = self - tok.lexpos = lexpos - self.lexpos = lexpos - newtok = self.lexerrorf(tok) - if lexpos == self.lexpos: - # Error method didn't change text position at all. This is an error. - raise LexError("Scanning error. Illegal character '%s'" % (lexdata[lexpos]), lexdata[lexpos:]) - lexpos = self.lexpos - if not newtok: continue - return newtok - - self.lexpos = lexpos - raise LexError("Illegal character '%s' at index %d" % (lexdata[lexpos],lexpos), lexdata[lexpos:]) - - self.lexpos = lexpos + 1 - if self.lexdata is None: - raise RuntimeError("No input string given with input()") - return None - - # Iterator interface - def __iter__(self): - return self - - def next(self): - t = self.token() - if t is None: - raise StopIteration - return t - - __next__ = next - -# ----------------------------------------------------------------------------- -# ==== Lex Builder === -# -# The functions and classes below are used to collect lexing information -# and build a Lexer object from it. -# ----------------------------------------------------------------------------- - -# ----------------------------------------------------------------------------- -# get_caller_module_dict() -# -# This function returns a dictionary containing all of the symbols defined within -# a caller further down the call stack. This is used to get the environment -# associated with the yacc() call if none was provided. -# ----------------------------------------------------------------------------- - -def get_caller_module_dict(levels): - try: - raise RuntimeError - except RuntimeError: - e,b,t = sys.exc_info() - f = t.tb_frame - while levels > 0: - f = f.f_back - levels -= 1 - ldict = f.f_globals.copy() - if f.f_globals != f.f_locals: - ldict.update(f.f_locals) - - return ldict - -# ----------------------------------------------------------------------------- -# _funcs_to_names() -# -# Given a list of regular expression functions, this converts it to a list -# suitable for output to a table file -# ----------------------------------------------------------------------------- - -def _funcs_to_names(funclist,namelist): - result = [] - for f,name in zip(funclist,namelist): - if f and f[0]: - result.append((name, f[1])) - else: - result.append(f) - return result - -# ----------------------------------------------------------------------------- -# _names_to_funcs() -# -# Given a list of regular expression function names, this converts it back to -# functions. -# ----------------------------------------------------------------------------- - -def _names_to_funcs(namelist,fdict): - result = [] - for n in namelist: - if n and n[0]: - result.append((fdict[n[0]],n[1])) - else: - result.append(n) - return result - -# ----------------------------------------------------------------------------- -# _form_master_re() -# -# This function takes a list of all of the regex components and attempts to -# form the master regular expression. Given limitations in the Python re -# module, it may be necessary to break the master regex into separate expressions. -# ----------------------------------------------------------------------------- - -def _form_master_re(relist,reflags,ldict,toknames): - if not relist: return [] - regex = "|".join(relist) - try: - lexre = re.compile(regex,re.VERBOSE | reflags) - - # Build the index to function map for the matching engine - lexindexfunc = [ None ] * (max(lexre.groupindex.values())+1) - lexindexnames = lexindexfunc[:] - - for f,i in lexre.groupindex.items(): - handle = ldict.get(f,None) - if type(handle) in (types.FunctionType, types.MethodType): - lexindexfunc[i] = (handle,toknames[f]) - lexindexnames[i] = f - elif handle is not None: - lexindexnames[i] = f - if f.find("ignore_") > 0: - lexindexfunc[i] = (None,None) - else: - lexindexfunc[i] = (None, toknames[f]) - - return [(lexre,lexindexfunc)],[regex],[lexindexnames] - except Exception: - m = int(len(relist)/2) - if m == 0: m = 1 - llist, lre, lnames = _form_master_re(relist[:m],reflags,ldict,toknames) - rlist, rre, rnames = _form_master_re(relist[m:],reflags,ldict,toknames) - return llist+rlist, lre+rre, lnames+rnames - -# ----------------------------------------------------------------------------- -# def _statetoken(s,names) -# -# Given a declaration name s of the form "t_" and a dictionary whose keys are -# state names, this function returns a tuple (states,tokenname) where states -# is a tuple of state names and tokenname is the name of the token. For example, -# calling this with s = "t_foo_bar_SPAM" might return (('foo','bar'),'SPAM') -# ----------------------------------------------------------------------------- - -def _statetoken(s,names): - nonstate = 1 - parts = s.split("_") - for i in range(1,len(parts)): - if not parts[i] in names and parts[i] != 'ANY': break - if i > 1: - states = tuple(parts[1:i]) - else: - states = ('INITIAL',) - - if 'ANY' in states: - states = tuple(names) - - tokenname = "_".join(parts[i:]) - return (states,tokenname) - - -# ----------------------------------------------------------------------------- -# LexerReflect() -# -# This class represents information needed to build a lexer as extracted from a -# user's input file. -# ----------------------------------------------------------------------------- -class LexerReflect(object): - def __init__(self,ldict,log=None,reflags=0): - self.ldict = ldict - self.error_func = None - self.tokens = [] - self.reflags = reflags - self.stateinfo = { 'INITIAL' : 'inclusive'} - self.files = {} - self.error = 0 - - if log is None: - self.log = PlyLogger(sys.stderr) - else: - self.log = log - - # Get all of the basic information - def get_all(self): - self.get_tokens() - self.get_literals() - self.get_states() - self.get_rules() - - # Validate all of the information - def validate_all(self): - self.validate_tokens() - self.validate_literals() - self.validate_rules() - return self.error - - # Get the tokens map - def get_tokens(self): - tokens = self.ldict.get("tokens",None) - if not tokens: - self.log.error("No token list is defined") - self.error = 1 - return - - if not isinstance(tokens,(list, tuple)): - self.log.error("tokens must be a list or tuple") - self.error = 1 - return - - if not tokens: - self.log.error("tokens is empty") - self.error = 1 - return - - self.tokens = tokens - - # Validate the tokens - def validate_tokens(self): - terminals = {} - for n in self.tokens: - if not _is_identifier.match(n): - self.log.error("Bad token name '%s'",n) - self.error = 1 - if n in terminals: - self.log.warning("Token '%s' multiply defined", n) - terminals[n] = 1 - - # Get the literals specifier - def get_literals(self): - self.literals = self.ldict.get("literals","") - - # Validate literals - def validate_literals(self): - try: - for c in self.literals: - if not isinstance(c,StringTypes) or len(c) > 1: - self.log.error("Invalid literal %s. Must be a single character", repr(c)) - self.error = 1 - continue - - except TypeError: - self.log.error("Invalid literals specification. literals must be a sequence of characters") - self.error = 1 - - def get_states(self): - self.states = self.ldict.get("states",None) - # Build statemap - if self.states: - if not isinstance(self.states,(tuple,list)): - self.log.error("states must be defined as a tuple or list") - self.error = 1 - else: - for s in self.states: - if not isinstance(s,tuple) or len(s) != 2: - self.log.error("Invalid state specifier %s. Must be a tuple (statename,'exclusive|inclusive')",repr(s)) - self.error = 1 - continue - name, statetype = s - if not isinstance(name,StringTypes): - self.log.error("State name %s must be a string", repr(name)) - self.error = 1 - continue - if not (statetype == 'inclusive' or statetype == 'exclusive'): - self.log.error("State type for state %s must be 'inclusive' or 'exclusive'",name) - self.error = 1 - continue - if name in self.stateinfo: - self.log.error("State '%s' already defined",name) - self.error = 1 - continue - self.stateinfo[name] = statetype - - # Get all of the symbols with a t_ prefix and sort them into various - # categories (functions, strings, error functions, and ignore characters) - - def get_rules(self): - tsymbols = [f for f in self.ldict if f[:2] == 't_' ] - - # Now build up a list of functions and a list of strings - - self.toknames = { } # Mapping of symbols to token names - self.funcsym = { } # Symbols defined as functions - self.strsym = { } # Symbols defined as strings - self.ignore = { } # Ignore strings by state - self.errorf = { } # Error functions by state - - for s in self.stateinfo: - self.funcsym[s] = [] - self.strsym[s] = [] - - if len(tsymbols) == 0: - self.log.error("No rules of the form t_rulename are defined") - self.error = 1 - return - - for f in tsymbols: - t = self.ldict[f] - states, tokname = _statetoken(f,self.stateinfo) - self.toknames[f] = tokname - - if hasattr(t,"__call__"): - if tokname == 'error': - for s in states: - self.errorf[s] = t - elif tokname == 'ignore': - line = func_code(t).co_firstlineno - file = func_code(t).co_filename - self.log.error("%s:%d: Rule '%s' must be defined as a string",file,line,t.__name__) - self.error = 1 - else: - for s in states: - self.funcsym[s].append((f,t)) - elif isinstance(t, StringTypes): - if tokname == 'ignore': - for s in states: - self.ignore[s] = t - if "\\" in t: - self.log.warning("%s contains a literal backslash '\\'",f) - - elif tokname == 'error': - self.log.error("Rule '%s' must be defined as a function", f) - self.error = 1 - else: - for s in states: - self.strsym[s].append((f,t)) - else: - self.log.error("%s not defined as a function or string", f) - self.error = 1 - - # Sort the functions by line number - for f in self.funcsym.values(): - if sys.version_info[0] < 3: - f.sort(lambda x,y: cmp(func_code(x[1]).co_firstlineno,func_code(y[1]).co_firstlineno)) - else: - # Python 3.0 - f.sort(key=lambda x: func_code(x[1]).co_firstlineno) - - # Sort the strings by regular expression length - for s in self.strsym.values(): - if sys.version_info[0] < 3: - s.sort(lambda x,y: (len(x[1]) < len(y[1])) - (len(x[1]) > len(y[1]))) - else: - # Python 3.0 - s.sort(key=lambda x: len(x[1]),reverse=True) - - # Validate all of the t_rules collected - def validate_rules(self): - for state in self.stateinfo: - # Validate all rules defined by functions - - - - for fname, f in self.funcsym[state]: - line = func_code(f).co_firstlineno - file = func_code(f).co_filename - self.files[file] = 1 - - tokname = self.toknames[fname] - if isinstance(f, types.MethodType): - reqargs = 2 - else: - reqargs = 1 - nargs = func_code(f).co_argcount - if nargs > reqargs: - self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,f.__name__) - self.error = 1 - continue - - if nargs < reqargs: - self.log.error("%s:%d: Rule '%s' requires an argument", file,line,f.__name__) - self.error = 1 - continue - - if not f.__doc__: - self.log.error("%s:%d: No regular expression defined for rule '%s'",file,line,f.__name__) - self.error = 1 - continue - - try: - c = re.compile("(?P<%s>%s)" % (fname,f.__doc__), re.VERBOSE | self.reflags) - if c.match(""): - self.log.error("%s:%d: Regular expression for rule '%s' matches empty string", file,line,f.__name__) - self.error = 1 - except re.error: - _etype, e, _etrace = sys.exc_info() - self.log.error("%s:%d: Invalid regular expression for rule '%s'. %s", file,line,f.__name__,e) - if '#' in f.__doc__: - self.log.error("%s:%d. Make sure '#' in rule '%s' is escaped with '\\#'",file,line, f.__name__) - self.error = 1 - - # Validate all rules defined by strings - for name,r in self.strsym[state]: - tokname = self.toknames[name] - if tokname == 'error': - self.log.error("Rule '%s' must be defined as a function", name) - self.error = 1 - continue - - if not tokname in self.tokens and tokname.find("ignore_") < 0: - self.log.error("Rule '%s' defined for an unspecified token %s",name,tokname) - self.error = 1 - continue - - try: - c = re.compile("(?P<%s>%s)" % (name,r),re.VERBOSE | self.reflags) - if (c.match("")): - self.log.error("Regular expression for rule '%s' matches empty string",name) - self.error = 1 - except re.error: - _etype, e, _etrace = sys.exc_info() - self.log.error("Invalid regular expression for rule '%s'. %s",name,e) - if '#' in r: - self.log.error("Make sure '#' in rule '%s' is escaped with '\\#'",name) - self.error = 1 - - if not self.funcsym[state] and not self.strsym[state]: - self.log.error("No rules defined for state '%s'",state) - self.error = 1 - - # Validate the error function - efunc = self.errorf.get(state,None) - if efunc: - f = efunc - line = func_code(f).co_firstlineno - file = func_code(f).co_filename - self.files[file] = 1 - - if isinstance(f, types.MethodType): - reqargs = 2 - else: - reqargs = 1 - nargs = func_code(f).co_argcount - if nargs > reqargs: - self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,f.__name__) - self.error = 1 - - if nargs < reqargs: - self.log.error("%s:%d: Rule '%s' requires an argument", file,line,f.__name__) - self.error = 1 - - for f in self.files: - self.validate_file(f) - - - # ----------------------------------------------------------------------------- - # validate_file() - # - # This checks to see if there are duplicated t_rulename() functions or strings - # in the parser input file. This is done using a simple regular expression - # match on each line in the given file. - # ----------------------------------------------------------------------------- - - def validate_file(self,filename): - import os.path - base,ext = os.path.splitext(filename) - if ext != '.py': return # No idea what the file is. Return OK - - try: - f = open(filename) - lines = f.readlines() - f.close() - except IOError: - return # Couldn't find the file. Don't worry about it - - fre = re.compile(r'\s*def\s+(t_[a-zA-Z_0-9]*)\(') - sre = re.compile(r'\s*(t_[a-zA-Z_0-9]*)\s*=') - - counthash = { } - linen = 1 - for l in lines: - m = fre.match(l) - if not m: - m = sre.match(l) - if m: - name = m.group(1) - prev = counthash.get(name) - if not prev: - counthash[name] = linen - else: - self.log.error("%s:%d: Rule %s redefined. Previously defined on line %d",filename,linen,name,prev) - self.error = 1 - linen += 1 - -# ----------------------------------------------------------------------------- -# lex(module) -# -# Build all of the regular expression rules from definitions in the supplied module -# ----------------------------------------------------------------------------- -def lex(module=None,object=None,debug=0,optimize=0,lextab="lextab",reflags=0,nowarn=0,outputdir="", debuglog=None, errorlog=None): - global lexer - ldict = None - stateinfo = { 'INITIAL' : 'inclusive'} - lexobj = Lexer() - lexobj.lexoptimize = optimize - global token,input - - if errorlog is None: - errorlog = PlyLogger(sys.stderr) - - if debug: - if debuglog is None: - debuglog = PlyLogger(sys.stderr) - - # Get the module dictionary used for the lexer - if object: module = object - - if module: - _items = [(k,getattr(module,k)) for k in dir(module)] - ldict = dict(_items) - else: - ldict = get_caller_module_dict(2) - - # Collect parser information from the dictionary - linfo = LexerReflect(ldict,log=errorlog,reflags=reflags) - linfo.get_all() - if not optimize: - if linfo.validate_all(): - raise SyntaxError("Can't build lexer") - - if optimize and lextab: - try: - lexobj.readtab(lextab,ldict) - token = lexobj.token - input = lexobj.input - lexer = lexobj - return lexobj - - except ImportError: - pass - - # Dump some basic debugging information - if debug: - debuglog.info("lex: tokens = %r", linfo.tokens) - debuglog.info("lex: literals = %r", linfo.literals) - debuglog.info("lex: states = %r", linfo.stateinfo) - - # Build a dictionary of valid token names - lexobj.lextokens = { } - for n in linfo.tokens: - lexobj.lextokens[n] = 1 - - # Get literals specification - if isinstance(linfo.literals,(list,tuple)): - lexobj.lexliterals = type(linfo.literals[0])().join(linfo.literals) - else: - lexobj.lexliterals = linfo.literals - - # Get the stateinfo dictionary - stateinfo = linfo.stateinfo - - regexs = { } - # Build the master regular expressions - for state in stateinfo: - regex_list = [] - - # Add rules defined by functions first - for fname, f in linfo.funcsym[state]: - line = func_code(f).co_firstlineno - file = func_code(f).co_filename - regex_list.append("(?P<%s>%s)" % (fname,f.__doc__)) - if debug: - debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",fname,f.__doc__, state) - - # Now add all of the simple rules - for name,r in linfo.strsym[state]: - regex_list.append("(?P<%s>%s)" % (name,r)) - if debug: - debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",name,r, state) - - regexs[state] = regex_list - - # Build the master regular expressions - - if debug: - debuglog.info("lex: ==== MASTER REGEXS FOLLOW ====") - - for state in regexs: - lexre, re_text, re_names = _form_master_re(regexs[state],reflags,ldict,linfo.toknames) - lexobj.lexstatere[state] = lexre - lexobj.lexstateretext[state] = re_text - lexobj.lexstaterenames[state] = re_names - if debug: - for i in range(len(re_text)): - debuglog.info("lex: state '%s' : regex[%d] = '%s'",state, i, re_text[i]) - - # For inclusive states, we need to add the regular expressions from the INITIAL state - for state,stype in stateinfo.items(): - if state != "INITIAL" and stype == 'inclusive': - lexobj.lexstatere[state].extend(lexobj.lexstatere['INITIAL']) - lexobj.lexstateretext[state].extend(lexobj.lexstateretext['INITIAL']) - lexobj.lexstaterenames[state].extend(lexobj.lexstaterenames['INITIAL']) - - lexobj.lexstateinfo = stateinfo - lexobj.lexre = lexobj.lexstatere["INITIAL"] - lexobj.lexretext = lexobj.lexstateretext["INITIAL"] - lexobj.lexreflags = reflags - - # Set up ignore variables - lexobj.lexstateignore = linfo.ignore - lexobj.lexignore = lexobj.lexstateignore.get("INITIAL","") - - # Set up error functions - lexobj.lexstateerrorf = linfo.errorf - lexobj.lexerrorf = linfo.errorf.get("INITIAL",None) - if not lexobj.lexerrorf: - errorlog.warning("No t_error rule is defined") - - # Check state information for ignore and error rules - for s,stype in stateinfo.items(): - if stype == 'exclusive': - if not s in linfo.errorf: - errorlog.warning("No error rule is defined for exclusive state '%s'", s) - if not s in linfo.ignore and lexobj.lexignore: - errorlog.warning("No ignore rule is defined for exclusive state '%s'", s) - elif stype == 'inclusive': - if not s in linfo.errorf: - linfo.errorf[s] = linfo.errorf.get("INITIAL",None) - if not s in linfo.ignore: - linfo.ignore[s] = linfo.ignore.get("INITIAL","") - - # Create global versions of the token() and input() functions - token = lexobj.token - input = lexobj.input - lexer = lexobj - - # If in optimize mode, we write the lextab - if lextab and optimize: - lexobj.writetab(lextab,outputdir) - - return lexobj - -# ----------------------------------------------------------------------------- -# runmain() -# -# This runs the lexer as a main program -# ----------------------------------------------------------------------------- - -def runmain(lexer=None,data=None): - if not data: - try: - filename = sys.argv[1] - f = open(filename) - data = f.read() - f.close() - except IndexError: - sys.stdout.write("Reading from standard input (type EOF to end):\n") - data = sys.stdin.read() - - if lexer: - _input = lexer.input - else: - _input = input - _input(data) - if lexer: - _token = lexer.token - else: - _token = token - - while 1: - tok = _token() - if not tok: break - sys.stdout.write("(%s,%r,%d,%d)\n" % (tok.type, tok.value, tok.lineno,tok.lexpos)) - -# ----------------------------------------------------------------------------- -# @TOKEN(regex) -# -# This decorator function can be used to set the regex expression on a function -# when its docstring might need to be set in an alternative way -# ----------------------------------------------------------------------------- - -def TOKEN(r): - def set_doc(f): - if hasattr(r,"__call__"): - f.__doc__ = r.__doc__ - else: - f.__doc__ = r - return f - return set_doc - -# Alternative spelling of the TOKEN decorator -Token = TOKEN - diff --git a/bin/python/ply/yacc.py b/bin/python/ply/yacc.py deleted file mode 100644 index f70439ea5e..0000000000 --- a/bin/python/ply/yacc.py +++ /dev/null @@ -1,3276 +0,0 @@ -# ----------------------------------------------------------------------------- -# ply: yacc.py -# -# Copyright (C) 2001-2011, -# David M. Beazley (Dabeaz LLC) -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * Neither the name of the David Beazley or Dabeaz LLC may be used to -# endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# ----------------------------------------------------------------------------- -# -# This implements an LR parser that is constructed from grammar rules defined -# as Python functions. The grammer is specified by supplying the BNF inside -# Python documentation strings. The inspiration for this technique was borrowed -# from John Aycock's Spark parsing system. PLY might be viewed as cross between -# Spark and the GNU bison utility. -# -# The current implementation is only somewhat object-oriented. The -# LR parser itself is defined in terms of an object (which allows multiple -# parsers to co-exist). However, most of the variables used during table -# construction are defined in terms of global variables. Users shouldn't -# notice unless they are trying to define multiple parsers at the same -# time using threads (in which case they should have their head examined). -# -# This implementation supports both SLR and LALR(1) parsing. LALR(1) -# support was originally implemented by Elias Ioup (ezioup@alumni.uchicago.edu), -# using the algorithm found in Aho, Sethi, and Ullman "Compilers: Principles, -# Techniques, and Tools" (The Dragon Book). LALR(1) has since been replaced -# by the more efficient DeRemer and Pennello algorithm. -# -# :::::::: WARNING ::::::: -# -# Construction of LR parsing tables is fairly complicated and expensive. -# To make this module run fast, a *LOT* of work has been put into -# optimization---often at the expensive of readability and what might -# consider to be good Python "coding style." Modify the code at your -# own risk! -# ---------------------------------------------------------------------------- - -__version__ = "3.4" -__tabversion__ = "3.2" # Table version - -#----------------------------------------------------------------------------- -# === User configurable parameters === -# -# Change these to modify the default behavior of yacc (if you wish) -#----------------------------------------------------------------------------- - -yaccdebug = 1 # Debugging mode. If set, yacc generates a - # a 'parser.out' file in the current directory - -debug_file = 'parser.out' # Default name of the debugging file -tab_module = 'parsetab' # Default name of the table module -default_lr = 'LALR' # Default LR table generation method - -error_count = 3 # Number of symbols that must be shifted to leave recovery mode - -yaccdevel = 0 # Set to True if developing yacc. This turns off optimized - # implementations of certain functions. - -resultlimit = 40 # Size limit of results when running in debug mode. - -pickle_protocol = 0 # Protocol to use when writing pickle files - -import re, types, sys, os.path - -# Compatibility function for python 2.6/3.0 -if sys.version_info[0] < 3: - def func_code(f): - return f.func_code -else: - def func_code(f): - return f.__code__ - -# Compatibility -try: - MAXINT = sys.maxint -except AttributeError: - MAXINT = sys.maxsize - -# Python 2.x/3.0 compatibility. -def load_ply_lex(): - if sys.version_info[0] < 3: - import lex - else: - import ply.lex as lex - return lex - -# This object is a stand-in for a logging object created by the -# logging module. PLY will use this by default to create things -# such as the parser.out file. If a user wants more detailed -# information, they can create their own logging object and pass -# it into PLY. - -class PlyLogger(object): - def __init__(self,f): - self.f = f - def debug(self,msg,*args,**kwargs): - self.f.write((msg % args) + "\n") - info = debug - - def warning(self,msg,*args,**kwargs): - self.f.write("WARNING: "+ (msg % args) + "\n") - - def error(self,msg,*args,**kwargs): - self.f.write("ERROR: " + (msg % args) + "\n") - - critical = debug - -# Null logger is used when no output is generated. Does nothing. -class NullLogger(object): - def __getattribute__(self,name): - return self - def __call__(self,*args,**kwargs): - return self - -# Exception raised for yacc-related errors -class YaccError(Exception): pass - -# Format the result message that the parser produces when running in debug mode. -def format_result(r): - repr_str = repr(r) - if '\n' in repr_str: repr_str = repr(repr_str) - if len(repr_str) > resultlimit: - repr_str = repr_str[:resultlimit]+" ..." - result = "<%s @ 0x%x> (%s)" % (type(r).__name__,id(r),repr_str) - return result - - -# Format stack entries when the parser is running in debug mode -def format_stack_entry(r): - repr_str = repr(r) - if '\n' in repr_str: repr_str = repr(repr_str) - if len(repr_str) < 16: - return repr_str - else: - return "<%s @ 0x%x>" % (type(r).__name__,id(r)) - -#----------------------------------------------------------------------------- -# === LR Parsing Engine === -# -# The following classes are used for the LR parser itself. These are not -# used during table construction and are independent of the actual LR -# table generation algorithm -#----------------------------------------------------------------------------- - -# This class is used to hold non-terminal grammar symbols during parsing. -# It normally has the following attributes set: -# .type = Grammar symbol type -# .value = Symbol value -# .lineno = Starting line number -# .endlineno = Ending line number (optional, set automatically) -# .lexpos = Starting lex position -# .endlexpos = Ending lex position (optional, set automatically) - -class YaccSymbol: - def __str__(self): return self.type - def __repr__(self): return str(self) - -# This class is a wrapper around the objects actually passed to each -# grammar rule. Index lookup and assignment actually assign the -# .value attribute of the underlying YaccSymbol object. -# The lineno() method returns the line number of a given -# item (or 0 if not defined). The linespan() method returns -# a tuple of (startline,endline) representing the range of lines -# for a symbol. The lexspan() method returns a tuple (lexpos,endlexpos) -# representing the range of positional information for a symbol. - -class YaccProduction: - def __init__(self,s,stack=None): - self.slice = s - self.stack = stack - self.lexer = None - self.parser= None - def __getitem__(self,n): - if n >= 0: return self.slice[n].value - else: return self.stack[n].value - - def __setitem__(self,n,v): - self.slice[n].value = v - - def __getslice__(self,i,j): - return [s.value for s in self.slice[i:j]] - - def __len__(self): - return len(self.slice) - - def lineno(self,n): - return getattr(self.slice[n],"lineno",0) - - def set_lineno(self,n,lineno): - self.slice[n].lineno = lineno - - def linespan(self,n): - startline = getattr(self.slice[n],"lineno",0) - endline = getattr(self.slice[n],"endlineno",startline) - return startline,endline - - def lexpos(self,n): - return getattr(self.slice[n],"lexpos",0) - - def lexspan(self,n): - startpos = getattr(self.slice[n],"lexpos",0) - endpos = getattr(self.slice[n],"endlexpos",startpos) - return startpos,endpos - - def error(self): - raise SyntaxError - - -# ----------------------------------------------------------------------------- -# == LRParser == -# -# The LR Parsing engine. -# ----------------------------------------------------------------------------- - -class LRParser: - def __init__(self,lrtab,errorf): - self.productions = lrtab.lr_productions - self.action = lrtab.lr_action - self.goto = lrtab.lr_goto - self.errorfunc = errorf - - def errok(self): - self.errorok = 1 - - def restart(self): - del self.statestack[:] - del self.symstack[:] - sym = YaccSymbol() - sym.type = '$end' - self.symstack.append(sym) - self.statestack.append(0) - - def parse(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None): - if debug or yaccdevel: - if isinstance(debug,int): - debug = PlyLogger(sys.stderr) - return self.parsedebug(input,lexer,debug,tracking,tokenfunc) - elif tracking: - return self.parseopt(input,lexer,debug,tracking,tokenfunc) - else: - return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc) - - - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # parsedebug(). - # - # This is the debugging enabled version of parse(). All changes made to the - # parsing engine should be made here. For the non-debugging version, - # copy this code to a method parseopt() and delete all of the sections - # enclosed in: - # - # #--! DEBUG - # statements - # #--! DEBUG - # - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - def parsedebug(self,input=None,lexer=None,debug=None,tracking=0,tokenfunc=None): - lookahead = None # Current lookahead symbol - lookaheadstack = [ ] # Stack of lookahead symbols - actions = self.action # Local reference to action table (to avoid lookup on self.) - goto = self.goto # Local reference to goto table (to avoid lookup on self.) - prod = self.productions # Local reference to production list (to avoid lookup on self.) - pslice = YaccProduction(None) # Production object passed to grammar rules - errorcount = 0 # Used during error recovery - - # --! DEBUG - debug.info("PLY: PARSE DEBUG START") - # --! DEBUG - - # If no lexer was given, we will try to use the lex module - if not lexer: - lex = load_ply_lex() - lexer = lex.lexer - - # Set up the lexer and parser objects on pslice - pslice.lexer = lexer - pslice.parser = self - - # If input was supplied, pass to lexer - if input is not None: - lexer.input(input) - - if tokenfunc is None: - # Tokenize function - get_token = lexer.token - else: - get_token = tokenfunc - - # Set up the state and symbol stacks - - statestack = [ ] # Stack of parsing states - self.statestack = statestack - symstack = [ ] # Stack of grammar symbols - self.symstack = symstack - - pslice.stack = symstack # Put in the production - errtoken = None # Err token - - # The start state is assumed to be (0,$end) - - statestack.append(0) - sym = YaccSymbol() - sym.type = "$end" - symstack.append(sym) - state = 0 - while 1: - # Get the next symbol on the input. If a lookahead symbol - # is already set, we just use that. Otherwise, we'll pull - # the next token off of the lookaheadstack or from the lexer - - # --! DEBUG - debug.debug('') - debug.debug('State : %s', state) - # --! DEBUG - - if not lookahead: - if not lookaheadstack: - lookahead = get_token() # Get the next token - else: - lookahead = lookaheadstack.pop() - if not lookahead: - lookahead = YaccSymbol() - lookahead.type = "$end" - - # --! DEBUG - debug.debug('Stack : %s', - ("%s . %s" % (" ".join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip()) - # --! DEBUG - - # Check the action table - ltype = lookahead.type - t = actions[state].get(ltype) - - if t is not None: - if t > 0: - # shift a symbol on the stack - statestack.append(t) - state = t - - # --! DEBUG - debug.debug("Action : Shift and goto state %s", t) - # --! DEBUG - - symstack.append(lookahead) - lookahead = None - - # Decrease error count on successful shift - if errorcount: errorcount -=1 - continue - - if t < 0: - # reduce a symbol on the stack, emit a production - p = prod[-t] - pname = p.name - plen = p.len - - # Get production function - sym = YaccSymbol() - sym.type = pname # Production name - sym.value = None - - # --! DEBUG - if plen: - debug.info("Action : Reduce rule [%s] with %s and goto state %d", p.str, "["+",".join([format_stack_entry(_v.value) for _v in symstack[-plen:]])+"]",-t) - else: - debug.info("Action : Reduce rule [%s] with %s and goto state %d", p.str, [],-t) - - # --! DEBUG - - if plen: - targ = symstack[-plen-1:] - targ[0] = sym - - # --! TRACKING - if tracking: - t1 = targ[1] - sym.lineno = t1.lineno - sym.lexpos = t1.lexpos - t1 = targ[-1] - sym.endlineno = getattr(t1,"endlineno",t1.lineno) - sym.endlexpos = getattr(t1,"endlexpos",t1.lexpos) - - # --! TRACKING - - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # The code enclosed in this section is duplicated - # below as a performance optimization. Make sure - # changes get made in both locations. - - pslice.slice = targ - - try: - # Call the grammar rule with our special slice object - del symstack[-plen:] - del statestack[-plen:] - p.callable(pslice) - # --! DEBUG - debug.info("Result : %s", format_result(pslice[0])) - # --! DEBUG - symstack.append(sym) - state = goto[statestack[-1]][pname] - statestack.append(state) - except SyntaxError: - # If an error was set. Enter error recovery state - lookaheadstack.append(lookahead) - symstack.pop() - statestack.pop() - state = statestack[-1] - sym.type = 'error' - lookahead = sym - errorcount = error_count - self.errorok = 0 - continue - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - else: - - # --! TRACKING - if tracking: - sym.lineno = lexer.lineno - sym.lexpos = lexer.lexpos - # --! TRACKING - - targ = [ sym ] - - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # The code enclosed in this section is duplicated - # above as a performance optimization. Make sure - # changes get made in both locations. - - pslice.slice = targ - - try: - # Call the grammar rule with our special slice object - p.callable(pslice) - # --! DEBUG - debug.info("Result : %s", format_result(pslice[0])) - # --! DEBUG - symstack.append(sym) - state = goto[statestack[-1]][pname] - statestack.append(state) - except SyntaxError: - # If an error was set. Enter error recovery state - lookaheadstack.append(lookahead) - symstack.pop() - statestack.pop() - state = statestack[-1] - sym.type = 'error' - lookahead = sym - errorcount = error_count - self.errorok = 0 - continue - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - if t == 0: - n = symstack[-1] - result = getattr(n,"value",None) - # --! DEBUG - debug.info("Done : Returning %s", format_result(result)) - debug.info("PLY: PARSE DEBUG END") - # --! DEBUG - return result - - if t == None: - - # --! DEBUG - debug.error('Error : %s', - ("%s . %s" % (" ".join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip()) - # --! DEBUG - - # We have some kind of parsing error here. To handle - # this, we are going to push the current token onto - # the tokenstack and replace it with an 'error' token. - # If there are any synchronization rules, they may - # catch it. - # - # In addition to pushing the error token, we call call - # the user defined p_error() function if this is the - # first syntax error. This function is only called if - # errorcount == 0. - if errorcount == 0 or self.errorok: - errorcount = error_count - self.errorok = 0 - errtoken = lookahead - if errtoken.type == "$end": - errtoken = None # End of file! - if self.errorfunc: - global errok,token,restart - errok = self.errok # Set some special functions available in error recovery - token = get_token - restart = self.restart - if errtoken and not hasattr(errtoken,'lexer'): - errtoken.lexer = lexer - tok = self.errorfunc(errtoken) - del errok, token, restart # Delete special functions - - if self.errorok: - # User must have done some kind of panic - # mode recovery on their own. The - # returned token is the next lookahead - lookahead = tok - errtoken = None - continue - else: - if errtoken: - if hasattr(errtoken,"lineno"): lineno = lookahead.lineno - else: lineno = 0 - if lineno: - sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type)) - else: - sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type) - else: - sys.stderr.write("yacc: Parse error in input. EOF\n") - return - - else: - errorcount = error_count - - # case 1: the statestack only has 1 entry on it. If we're in this state, the - # entire parse has been rolled back and we're completely hosed. The token is - # discarded and we just keep going. - - if len(statestack) <= 1 and lookahead.type != "$end": - lookahead = None - errtoken = None - state = 0 - # Nuke the pushback stack - del lookaheadstack[:] - continue - - # case 2: the statestack has a couple of entries on it, but we're - # at the end of the file. nuke the top entry and generate an error token - - # Start nuking entries on the stack - if lookahead.type == "$end": - # Whoa. We're really hosed here. Bail out - return - - if lookahead.type != 'error': - sym = symstack[-1] - if sym.type == 'error': - # Hmmm. Error is on top of stack, we'll just nuke input - # symbol and continue - lookahead = None - continue - t = YaccSymbol() - t.type = 'error' - if hasattr(lookahead,"lineno"): - t.lineno = lookahead.lineno - t.value = lookahead - lookaheadstack.append(lookahead) - lookahead = t - else: - symstack.pop() - statestack.pop() - state = statestack[-1] # Potential bug fix - - continue - - # Call an error function here - raise RuntimeError("yacc: internal parser error!!!\n") - - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # parseopt(). - # - # Optimized version of parse() method. DO NOT EDIT THIS CODE DIRECTLY. - # Edit the debug version above, then copy any modifications to the method - # below while removing #--! DEBUG sections. - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - - def parseopt(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None): - lookahead = None # Current lookahead symbol - lookaheadstack = [ ] # Stack of lookahead symbols - actions = self.action # Local reference to action table (to avoid lookup on self.) - goto = self.goto # Local reference to goto table (to avoid lookup on self.) - prod = self.productions # Local reference to production list (to avoid lookup on self.) - pslice = YaccProduction(None) # Production object passed to grammar rules - errorcount = 0 # Used during error recovery - - # If no lexer was given, we will try to use the lex module - if not lexer: - lex = load_ply_lex() - lexer = lex.lexer - - # Set up the lexer and parser objects on pslice - pslice.lexer = lexer - pslice.parser = self - - # If input was supplied, pass to lexer - if input is not None: - lexer.input(input) - - if tokenfunc is None: - # Tokenize function - get_token = lexer.token - else: - get_token = tokenfunc - - # Set up the state and symbol stacks - - statestack = [ ] # Stack of parsing states - self.statestack = statestack - symstack = [ ] # Stack of grammar symbols - self.symstack = symstack - - pslice.stack = symstack # Put in the production - errtoken = None # Err token - - # The start state is assumed to be (0,$end) - - statestack.append(0) - sym = YaccSymbol() - sym.type = '$end' - symstack.append(sym) - state = 0 - while 1: - # Get the next symbol on the input. If a lookahead symbol - # is already set, we just use that. Otherwise, we'll pull - # the next token off of the lookaheadstack or from the lexer - - if not lookahead: - if not lookaheadstack: - lookahead = get_token() # Get the next token - else: - lookahead = lookaheadstack.pop() - if not lookahead: - lookahead = YaccSymbol() - lookahead.type = '$end' - - # Check the action table - ltype = lookahead.type - t = actions[state].get(ltype) - - if t is not None: - if t > 0: - # shift a symbol on the stack - statestack.append(t) - state = t - - symstack.append(lookahead) - lookahead = None - - # Decrease error count on successful shift - if errorcount: errorcount -=1 - continue - - if t < 0: - # reduce a symbol on the stack, emit a production - p = prod[-t] - pname = p.name - plen = p.len - - # Get production function - sym = YaccSymbol() - sym.type = pname # Production name - sym.value = None - - if plen: - targ = symstack[-plen-1:] - targ[0] = sym - - # --! TRACKING - if tracking: - t1 = targ[1] - sym.lineno = t1.lineno - sym.lexpos = t1.lexpos - t1 = targ[-1] - sym.endlineno = getattr(t1,"endlineno",t1.lineno) - sym.endlexpos = getattr(t1,"endlexpos",t1.lexpos) - - # --! TRACKING - - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # The code enclosed in this section is duplicated - # below as a performance optimization. Make sure - # changes get made in both locations. - - pslice.slice = targ - - try: - # Call the grammar rule with our special slice object - del symstack[-plen:] - del statestack[-plen:] - p.callable(pslice) - symstack.append(sym) - state = goto[statestack[-1]][pname] - statestack.append(state) - except SyntaxError: - # If an error was set. Enter error recovery state - lookaheadstack.append(lookahead) - symstack.pop() - statestack.pop() - state = statestack[-1] - sym.type = 'error' - lookahead = sym - errorcount = error_count - self.errorok = 0 - continue - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - else: - - # --! TRACKING - if tracking: - sym.lineno = lexer.lineno - sym.lexpos = lexer.lexpos - # --! TRACKING - - targ = [ sym ] - - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # The code enclosed in this section is duplicated - # above as a performance optimization. Make sure - # changes get made in both locations. - - pslice.slice = targ - - try: - # Call the grammar rule with our special slice object - p.callable(pslice) - symstack.append(sym) - state = goto[statestack[-1]][pname] - statestack.append(state) - except SyntaxError: - # If an error was set. Enter error recovery state - lookaheadstack.append(lookahead) - symstack.pop() - statestack.pop() - state = statestack[-1] - sym.type = 'error' - lookahead = sym - errorcount = error_count - self.errorok = 0 - continue - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - if t == 0: - n = symstack[-1] - return getattr(n,"value",None) - - if t == None: - - # We have some kind of parsing error here. To handle - # this, we are going to push the current token onto - # the tokenstack and replace it with an 'error' token. - # If there are any synchronization rules, they may - # catch it. - # - # In addition to pushing the error token, we call call - # the user defined p_error() function if this is the - # first syntax error. This function is only called if - # errorcount == 0. - if errorcount == 0 or self.errorok: - errorcount = error_count - self.errorok = 0 - errtoken = lookahead - if errtoken.type == '$end': - errtoken = None # End of file! - if self.errorfunc: - global errok,token,restart - errok = self.errok # Set some special functions available in error recovery - token = get_token - restart = self.restart - if errtoken and not hasattr(errtoken,'lexer'): - errtoken.lexer = lexer - tok = self.errorfunc(errtoken) - del errok, token, restart # Delete special functions - - if self.errorok: - # User must have done some kind of panic - # mode recovery on their own. The - # returned token is the next lookahead - lookahead = tok - errtoken = None - continue - else: - if errtoken: - if hasattr(errtoken,"lineno"): lineno = lookahead.lineno - else: lineno = 0 - if lineno: - sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type)) - else: - sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type) - else: - sys.stderr.write("yacc: Parse error in input. EOF\n") - return - - else: - errorcount = error_count - - # case 1: the statestack only has 1 entry on it. If we're in this state, the - # entire parse has been rolled back and we're completely hosed. The token is - # discarded and we just keep going. - - if len(statestack) <= 1 and lookahead.type != '$end': - lookahead = None - errtoken = None - state = 0 - # Nuke the pushback stack - del lookaheadstack[:] - continue - - # case 2: the statestack has a couple of entries on it, but we're - # at the end of the file. nuke the top entry and generate an error token - - # Start nuking entries on the stack - if lookahead.type == '$end': - # Whoa. We're really hosed here. Bail out - return - - if lookahead.type != 'error': - sym = symstack[-1] - if sym.type == 'error': - # Hmmm. Error is on top of stack, we'll just nuke input - # symbol and continue - lookahead = None - continue - t = YaccSymbol() - t.type = 'error' - if hasattr(lookahead,"lineno"): - t.lineno = lookahead.lineno - t.value = lookahead - lookaheadstack.append(lookahead) - lookahead = t - else: - symstack.pop() - statestack.pop() - state = statestack[-1] # Potential bug fix - - continue - - # Call an error function here - raise RuntimeError("yacc: internal parser error!!!\n") - - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # parseopt_notrack(). - # - # Optimized version of parseopt() with line number tracking removed. - # DO NOT EDIT THIS CODE DIRECTLY. Copy the optimized version and remove - # code in the #--! TRACKING sections - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - def parseopt_notrack(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None): - lookahead = None # Current lookahead symbol - lookaheadstack = [ ] # Stack of lookahead symbols - actions = self.action # Local reference to action table (to avoid lookup on self.) - goto = self.goto # Local reference to goto table (to avoid lookup on self.) - prod = self.productions # Local reference to production list (to avoid lookup on self.) - pslice = YaccProduction(None) # Production object passed to grammar rules - errorcount = 0 # Used during error recovery - - # If no lexer was given, we will try to use the lex module - if not lexer: - lex = load_ply_lex() - lexer = lex.lexer - - # Set up the lexer and parser objects on pslice - pslice.lexer = lexer - pslice.parser = self - - # If input was supplied, pass to lexer - if input is not None: - lexer.input(input) - - if tokenfunc is None: - # Tokenize function - get_token = lexer.token - else: - get_token = tokenfunc - - # Set up the state and symbol stacks - - statestack = [ ] # Stack of parsing states - self.statestack = statestack - symstack = [ ] # Stack of grammar symbols - self.symstack = symstack - - pslice.stack = symstack # Put in the production - errtoken = None # Err token - - # The start state is assumed to be (0,$end) - - statestack.append(0) - sym = YaccSymbol() - sym.type = '$end' - symstack.append(sym) - state = 0 - while 1: - # Get the next symbol on the input. If a lookahead symbol - # is already set, we just use that. Otherwise, we'll pull - # the next token off of the lookaheadstack or from the lexer - - if not lookahead: - if not lookaheadstack: - lookahead = get_token() # Get the next token - else: - lookahead = lookaheadstack.pop() - if not lookahead: - lookahead = YaccSymbol() - lookahead.type = '$end' - - # Check the action table - ltype = lookahead.type - t = actions[state].get(ltype) - - if t is not None: - if t > 0: - # shift a symbol on the stack - statestack.append(t) - state = t - - symstack.append(lookahead) - lookahead = None - - # Decrease error count on successful shift - if errorcount: errorcount -=1 - continue - - if t < 0: - # reduce a symbol on the stack, emit a production - p = prod[-t] - pname = p.name - plen = p.len - - # Get production function - sym = YaccSymbol() - sym.type = pname # Production name - sym.value = None - - if plen: - targ = symstack[-plen-1:] - targ[0] = sym - - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # The code enclosed in this section is duplicated - # below as a performance optimization. Make sure - # changes get made in both locations. - - pslice.slice = targ - - try: - # Call the grammar rule with our special slice object - del symstack[-plen:] - del statestack[-plen:] - p.callable(pslice) - symstack.append(sym) - state = goto[statestack[-1]][pname] - statestack.append(state) - except SyntaxError: - # If an error was set. Enter error recovery state - lookaheadstack.append(lookahead) - symstack.pop() - statestack.pop() - state = statestack[-1] - sym.type = 'error' - lookahead = sym - errorcount = error_count - self.errorok = 0 - continue - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - else: - - targ = [ sym ] - - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # The code enclosed in this section is duplicated - # above as a performance optimization. Make sure - # changes get made in both locations. - - pslice.slice = targ - - try: - # Call the grammar rule with our special slice object - p.callable(pslice) - symstack.append(sym) - state = goto[statestack[-1]][pname] - statestack.append(state) - except SyntaxError: - # If an error was set. Enter error recovery state - lookaheadstack.append(lookahead) - symstack.pop() - statestack.pop() - state = statestack[-1] - sym.type = 'error' - lookahead = sym - errorcount = error_count - self.errorok = 0 - continue - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - if t == 0: - n = symstack[-1] - return getattr(n,"value",None) - - if t == None: - - # We have some kind of parsing error here. To handle - # this, we are going to push the current token onto - # the tokenstack and replace it with an 'error' token. - # If there are any synchronization rules, they may - # catch it. - # - # In addition to pushing the error token, we call call - # the user defined p_error() function if this is the - # first syntax error. This function is only called if - # errorcount == 0. - if errorcount == 0 or self.errorok: - errorcount = error_count - self.errorok = 0 - errtoken = lookahead - if errtoken.type == '$end': - errtoken = None # End of file! - if self.errorfunc: - global errok,token,restart - errok = self.errok # Set some special functions available in error recovery - token = get_token - restart = self.restart - if errtoken and not hasattr(errtoken,'lexer'): - errtoken.lexer = lexer - tok = self.errorfunc(errtoken) - del errok, token, restart # Delete special functions - - if self.errorok: - # User must have done some kind of panic - # mode recovery on their own. The - # returned token is the next lookahead - lookahead = tok - errtoken = None - continue - else: - if errtoken: - if hasattr(errtoken,"lineno"): lineno = lookahead.lineno - else: lineno = 0 - if lineno: - sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type)) - else: - sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type) - else: - sys.stderr.write("yacc: Parse error in input. EOF\n") - return - - else: - errorcount = error_count - - # case 1: the statestack only has 1 entry on it. If we're in this state, the - # entire parse has been rolled back and we're completely hosed. The token is - # discarded and we just keep going. - - if len(statestack) <= 1 and lookahead.type != '$end': - lookahead = None - errtoken = None - state = 0 - # Nuke the pushback stack - del lookaheadstack[:] - continue - - # case 2: the statestack has a couple of entries on it, but we're - # at the end of the file. nuke the top entry and generate an error token - - # Start nuking entries on the stack - if lookahead.type == '$end': - # Whoa. We're really hosed here. Bail out - return - - if lookahead.type != 'error': - sym = symstack[-1] - if sym.type == 'error': - # Hmmm. Error is on top of stack, we'll just nuke input - # symbol and continue - lookahead = None - continue - t = YaccSymbol() - t.type = 'error' - if hasattr(lookahead,"lineno"): - t.lineno = lookahead.lineno - t.value = lookahead - lookaheadstack.append(lookahead) - lookahead = t - else: - symstack.pop() - statestack.pop() - state = statestack[-1] # Potential bug fix - - continue - - # Call an error function here - raise RuntimeError("yacc: internal parser error!!!\n") - -# ----------------------------------------------------------------------------- -# === Grammar Representation === -# -# The following functions, classes, and variables are used to represent and -# manipulate the rules that make up a grammar. -# ----------------------------------------------------------------------------- - -import re - -# regex matching identifiers -_is_identifier = re.compile(r'^[a-zA-Z0-9_-]+$') - -# ----------------------------------------------------------------------------- -# class Production: -# -# This class stores the raw information about a single production or grammar rule. -# A grammar rule refers to a specification such as this: -# -# expr : expr PLUS term -# -# Here are the basic attributes defined on all productions -# -# name - Name of the production. For example 'expr' -# prod - A list of symbols on the right side ['expr','PLUS','term'] -# prec - Production precedence level -# number - Production number. -# func - Function that executes on reduce -# file - File where production function is defined -# lineno - Line number where production function is defined -# -# The following attributes are defined or optional. -# -# len - Length of the production (number of symbols on right hand side) -# usyms - Set of unique symbols found in the production -# ----------------------------------------------------------------------------- - -class Production(object): - reduced = 0 - def __init__(self,number,name,prod,precedence=('right',0),func=None,file='',line=0): - self.name = name - self.prod = tuple(prod) - self.number = number - self.func = func - self.callable = None - self.file = file - self.line = line - self.prec = precedence - - # Internal settings used during table construction - - self.len = len(self.prod) # Length of the production - - # Create a list of unique production symbols used in the production - self.usyms = [ ] - for s in self.prod: - if s not in self.usyms: - self.usyms.append(s) - - # List of all LR items for the production - self.lr_items = [] - self.lr_next = None - - # Create a string representation - if self.prod: - self.str = "%s -> %s" % (self.name," ".join(self.prod)) - else: - self.str = "%s -> " % self.name - - def __str__(self): - return self.str - - def __repr__(self): - return "Production("+str(self)+")" - - def __len__(self): - return len(self.prod) - - def __nonzero__(self): - return 1 - - def __getitem__(self,index): - return self.prod[index] - - # Return the nth lr_item from the production (or None if at the end) - def lr_item(self,n): - if n > len(self.prod): return None - p = LRItem(self,n) - - # Precompute the list of productions immediately following. Hack. Remove later - try: - p.lr_after = Prodnames[p.prod[n+1]] - except (IndexError,KeyError): - p.lr_after = [] - try: - p.lr_before = p.prod[n-1] - except IndexError: - p.lr_before = None - - return p - - # Bind the production function name to a callable - def bind(self,pdict): - if self.func: - self.callable = pdict[self.func] - -# This class serves as a minimal standin for Production objects when -# reading table data from files. It only contains information -# actually used by the LR parsing engine, plus some additional -# debugging information. -class MiniProduction(object): - def __init__(self,str,name,len,func,file,line): - self.name = name - self.len = len - self.func = func - self.callable = None - self.file = file - self.line = line - self.str = str - def __str__(self): - return self.str - def __repr__(self): - return "MiniProduction(%s)" % self.str - - # Bind the production function name to a callable - def bind(self,pdict): - if self.func: - self.callable = pdict[self.func] - - -# ----------------------------------------------------------------------------- -# class LRItem -# -# This class represents a specific stage of parsing a production rule. For -# example: -# -# expr : expr . PLUS term -# -# In the above, the "." represents the current location of the parse. Here -# basic attributes: -# -# name - Name of the production. For example 'expr' -# prod - A list of symbols on the right side ['expr','.', 'PLUS','term'] -# number - Production number. -# -# lr_next Next LR item. Example, if we are ' expr -> expr . PLUS term' -# then lr_next refers to 'expr -> expr PLUS . term' -# lr_index - LR item index (location of the ".") in the prod list. -# lookaheads - LALR lookahead symbols for this item -# len - Length of the production (number of symbols on right hand side) -# lr_after - List of all productions that immediately follow -# lr_before - Grammar symbol immediately before -# ----------------------------------------------------------------------------- - -class LRItem(object): - def __init__(self,p,n): - self.name = p.name - self.prod = list(p.prod) - self.number = p.number - self.lr_index = n - self.lookaheads = { } - self.prod.insert(n,".") - self.prod = tuple(self.prod) - self.len = len(self.prod) - self.usyms = p.usyms - - def __str__(self): - if self.prod: - s = "%s -> %s" % (self.name," ".join(self.prod)) - else: - s = "%s -> " % self.name - return s - - def __repr__(self): - return "LRItem("+str(self)+")" - -# ----------------------------------------------------------------------------- -# rightmost_terminal() -# -# Return the rightmost terminal from a list of symbols. Used in add_production() -# ----------------------------------------------------------------------------- -def rightmost_terminal(symbols, terminals): - i = len(symbols) - 1 - while i >= 0: - if symbols[i] in terminals: - return symbols[i] - i -= 1 - return None - -# ----------------------------------------------------------------------------- -# === GRAMMAR CLASS === -# -# The following class represents the contents of the specified grammar along -# with various computed properties such as first sets, follow sets, LR items, etc. -# This data is used for critical parts of the table generation process later. -# ----------------------------------------------------------------------------- - -class GrammarError(YaccError): pass - -class Grammar(object): - def __init__(self,terminals): - self.Productions = [None] # A list of all of the productions. The first - # entry is always reserved for the purpose of - # building an augmented grammar - - self.Prodnames = { } # A dictionary mapping the names of nonterminals to a list of all - # productions of that nonterminal. - - self.Prodmap = { } # A dictionary that is only used to detect duplicate - # productions. - - self.Terminals = { } # A dictionary mapping the names of terminal symbols to a - # list of the rules where they are used. - - for term in terminals: - self.Terminals[term] = [] - - self.Terminals['error'] = [] - - self.Nonterminals = { } # A dictionary mapping names of nonterminals to a list - # of rule numbers where they are used. - - self.First = { } # A dictionary of precomputed FIRST(x) symbols - - self.Follow = { } # A dictionary of precomputed FOLLOW(x) symbols - - self.Precedence = { } # Precedence rules for each terminal. Contains tuples of the - # form ('right',level) or ('nonassoc', level) or ('left',level) - - self.UsedPrecedence = { } # Precedence rules that were actually used by the grammer. - # This is only used to provide error checking and to generate - # a warning about unused precedence rules. - - self.Start = None # Starting symbol for the grammar - - - def __len__(self): - return len(self.Productions) - - def __getitem__(self,index): - return self.Productions[index] - - # ----------------------------------------------------------------------------- - # set_precedence() - # - # Sets the precedence for a given terminal. assoc is the associativity such as - # 'left','right', or 'nonassoc'. level is a numeric level. - # - # ----------------------------------------------------------------------------- - - def set_precedence(self,term,assoc,level): - assert self.Productions == [None],"Must call set_precedence() before add_production()" - if term in self.Precedence: - raise GrammarError("Precedence already specified for terminal '%s'" % term) - if assoc not in ['left','right','nonassoc']: - raise GrammarError("Associativity must be one of 'left','right', or 'nonassoc'") - self.Precedence[term] = (assoc,level) - - # ----------------------------------------------------------------------------- - # add_production() - # - # Given an action function, this function assembles a production rule and - # computes its precedence level. - # - # The production rule is supplied as a list of symbols. For example, - # a rule such as 'expr : expr PLUS term' has a production name of 'expr' and - # symbols ['expr','PLUS','term']. - # - # Precedence is determined by the precedence of the right-most non-terminal - # or the precedence of a terminal specified by %prec. - # - # A variety of error checks are performed to make sure production symbols - # are valid and that %prec is used correctly. - # ----------------------------------------------------------------------------- - - def add_production(self,prodname,syms,func=None,file='',line=0): - - if prodname in self.Terminals: - raise GrammarError("%s:%d: Illegal rule name '%s'. Already defined as a token" % (file,line,prodname)) - if prodname == 'error': - raise GrammarError("%s:%d: Illegal rule name '%s'. error is a reserved word" % (file,line,prodname)) - if not _is_identifier.match(prodname): - raise GrammarError("%s:%d: Illegal rule name '%s'" % (file,line,prodname)) - - # Look for literal tokens - for n,s in enumerate(syms): - if s[0] in "'\"": - try: - c = eval(s) - if (len(c) > 1): - raise GrammarError("%s:%d: Literal token %s in rule '%s' may only be a single character" % (file,line,s, prodname)) - if not c in self.Terminals: - self.Terminals[c] = [] - syms[n] = c - continue - except SyntaxError: - pass - if not _is_identifier.match(s) and s != '%prec': - raise GrammarError("%s:%d: Illegal name '%s' in rule '%s'" % (file,line,s, prodname)) - - # Determine the precedence level - if '%prec' in syms: - if syms[-1] == '%prec': - raise GrammarError("%s:%d: Syntax error. Nothing follows %%prec" % (file,line)) - if syms[-2] != '%prec': - raise GrammarError("%s:%d: Syntax error. %%prec can only appear at the end of a grammar rule" % (file,line)) - precname = syms[-1] - prodprec = self.Precedence.get(precname,None) - if not prodprec: - raise GrammarError("%s:%d: Nothing known about the precedence of '%s'" % (file,line,precname)) - else: - self.UsedPrecedence[precname] = 1 - del syms[-2:] # Drop %prec from the rule - else: - # If no %prec, precedence is determined by the rightmost terminal symbol - precname = rightmost_terminal(syms,self.Terminals) - prodprec = self.Precedence.get(precname,('right',0)) - - # See if the rule is already in the rulemap - map = "%s -> %s" % (prodname,syms) - if map in self.Prodmap: - m = self.Prodmap[map] - raise GrammarError("%s:%d: Duplicate rule %s. " % (file,line, m) + - "Previous definition at %s:%d" % (m.file, m.line)) - - # From this point on, everything is valid. Create a new Production instance - pnumber = len(self.Productions) - if not prodname in self.Nonterminals: - self.Nonterminals[prodname] = [ ] - - # Add the production number to Terminals and Nonterminals - for t in syms: - if t in self.Terminals: - self.Terminals[t].append(pnumber) - else: - if not t in self.Nonterminals: - self.Nonterminals[t] = [ ] - self.Nonterminals[t].append(pnumber) - - # Create a production and add it to the list of productions - p = Production(pnumber,prodname,syms,prodprec,func,file,line) - self.Productions.append(p) - self.Prodmap[map] = p - - # Add to the global productions list - try: - self.Prodnames[prodname].append(p) - except KeyError: - self.Prodnames[prodname] = [ p ] - return 0 - - # ----------------------------------------------------------------------------- - # set_start() - # - # Sets the starting symbol and creates the augmented grammar. Production - # rule 0 is S' -> start where start is the start symbol. - # ----------------------------------------------------------------------------- - - def set_start(self,start=None): - if not start: - start = self.Productions[1].name - if start not in self.Nonterminals: - raise GrammarError("start symbol %s undefined" % start) - self.Productions[0] = Production(0,"S'",[start]) - self.Nonterminals[start].append(0) - self.Start = start - - # ----------------------------------------------------------------------------- - # find_unreachable() - # - # Find all of the nonterminal symbols that can't be reached from the starting - # symbol. Returns a list of nonterminals that can't be reached. - # ----------------------------------------------------------------------------- - - def find_unreachable(self): - - # Mark all symbols that are reachable from a symbol s - def mark_reachable_from(s): - if reachable[s]: - # We've already reached symbol s. - return - reachable[s] = 1 - for p in self.Prodnames.get(s,[]): - for r in p.prod: - mark_reachable_from(r) - - reachable = { } - for s in list(self.Terminals) + list(self.Nonterminals): - reachable[s] = 0 - - mark_reachable_from( self.Productions[0].prod[0] ) - - return [s for s in list(self.Nonterminals) - if not reachable[s]] - - # ----------------------------------------------------------------------------- - # infinite_cycles() - # - # This function looks at the various parsing rules and tries to detect - # infinite recursion cycles (grammar rules where there is no possible way - # to derive a string of only terminals). - # ----------------------------------------------------------------------------- - - def infinite_cycles(self): - terminates = {} - - # Terminals: - for t in self.Terminals: - terminates[t] = 1 - - terminates['$end'] = 1 - - # Nonterminals: - - # Initialize to false: - for n in self.Nonterminals: - terminates[n] = 0 - - # Then propagate termination until no change: - while 1: - some_change = 0 - for (n,pl) in self.Prodnames.items(): - # Nonterminal n terminates iff any of its productions terminates. - for p in pl: - # Production p terminates iff all of its rhs symbols terminate. - for s in p.prod: - if not terminates[s]: - # The symbol s does not terminate, - # so production p does not terminate. - p_terminates = 0 - break - else: - # didn't break from the loop, - # so every symbol s terminates - # so production p terminates. - p_terminates = 1 - - if p_terminates: - # symbol n terminates! - if not terminates[n]: - terminates[n] = 1 - some_change = 1 - # Don't need to consider any more productions for this n. - break - - if not some_change: - break - - infinite = [] - for (s,term) in terminates.items(): - if not term: - if not s in self.Prodnames and not s in self.Terminals and s != 'error': - # s is used-but-not-defined, and we've already warned of that, - # so it would be overkill to say that it's also non-terminating. - pass - else: - infinite.append(s) - - return infinite - - - # ----------------------------------------------------------------------------- - # undefined_symbols() - # - # Find all symbols that were used the grammar, but not defined as tokens or - # grammar rules. Returns a list of tuples (sym, prod) where sym in the symbol - # and prod is the production where the symbol was used. - # ----------------------------------------------------------------------------- - def undefined_symbols(self): - result = [] - for p in self.Productions: - if not p: continue - - for s in p.prod: - if not s in self.Prodnames and not s in self.Terminals and s != 'error': - result.append((s,p)) - return result - - # ----------------------------------------------------------------------------- - # unused_terminals() - # - # Find all terminals that were defined, but not used by the grammar. Returns - # a list of all symbols. - # ----------------------------------------------------------------------------- - def unused_terminals(self): - unused_tok = [] - for s,v in self.Terminals.items(): - if s != 'error' and not v: - unused_tok.append(s) - - return unused_tok - - # ------------------------------------------------------------------------------ - # unused_rules() - # - # Find all grammar rules that were defined, but not used (maybe not reachable) - # Returns a list of productions. - # ------------------------------------------------------------------------------ - - def unused_rules(self): - unused_prod = [] - for s,v in self.Nonterminals.items(): - if not v: - p = self.Prodnames[s][0] - unused_prod.append(p) - return unused_prod - - # ----------------------------------------------------------------------------- - # unused_precedence() - # - # Returns a list of tuples (term,precedence) corresponding to precedence - # rules that were never used by the grammar. term is the name of the terminal - # on which precedence was applied and precedence is a string such as 'left' or - # 'right' corresponding to the type of precedence. - # ----------------------------------------------------------------------------- - - def unused_precedence(self): - unused = [] - for termname in self.Precedence: - if not (termname in self.Terminals or termname in self.UsedPrecedence): - unused.append((termname,self.Precedence[termname][0])) - - return unused - - # ------------------------------------------------------------------------- - # _first() - # - # Compute the value of FIRST1(beta) where beta is a tuple of symbols. - # - # During execution of compute_first1, the result may be incomplete. - # Afterward (e.g., when called from compute_follow()), it will be complete. - # ------------------------------------------------------------------------- - def _first(self,beta): - - # We are computing First(x1,x2,x3,...,xn) - result = [ ] - for x in beta: - x_produces_empty = 0 - - # Add all the non- symbols of First[x] to the result. - for f in self.First[x]: - if f == '': - x_produces_empty = 1 - else: - if f not in result: result.append(f) - - if x_produces_empty: - # We have to consider the next x in beta, - # i.e. stay in the loop. - pass - else: - # We don't have to consider any further symbols in beta. - break - else: - # There was no 'break' from the loop, - # so x_produces_empty was true for all x in beta, - # so beta produces empty as well. - result.append('') - - return result - - # ------------------------------------------------------------------------- - # compute_first() - # - # Compute the value of FIRST1(X) for all symbols - # ------------------------------------------------------------------------- - def compute_first(self): - if self.First: - return self.First - - # Terminals: - for t in self.Terminals: - self.First[t] = [t] - - self.First['$end'] = ['$end'] - - # Nonterminals: - - # Initialize to the empty set: - for n in self.Nonterminals: - self.First[n] = [] - - # Then propagate symbols until no change: - while 1: - some_change = 0 - for n in self.Nonterminals: - for p in self.Prodnames[n]: - for f in self._first(p.prod): - if f not in self.First[n]: - self.First[n].append( f ) - some_change = 1 - if not some_change: - break - - return self.First - - # --------------------------------------------------------------------- - # compute_follow() - # - # Computes all of the follow sets for every non-terminal symbol. The - # follow set is the set of all symbols that might follow a given - # non-terminal. See the Dragon book, 2nd Ed. p. 189. - # --------------------------------------------------------------------- - def compute_follow(self,start=None): - # If already computed, return the result - if self.Follow: - return self.Follow - - # If first sets not computed yet, do that first. - if not self.First: - self.compute_first() - - # Add '$end' to the follow list of the start symbol - for k in self.Nonterminals: - self.Follow[k] = [ ] - - if not start: - start = self.Productions[1].name - - self.Follow[start] = [ '$end' ] - - while 1: - didadd = 0 - for p in self.Productions[1:]: - # Here is the production set - for i in range(len(p.prod)): - B = p.prod[i] - if B in self.Nonterminals: - # Okay. We got a non-terminal in a production - fst = self._first(p.prod[i+1:]) - hasempty = 0 - for f in fst: - if f != '' and f not in self.Follow[B]: - self.Follow[B].append(f) - didadd = 1 - if f == '': - hasempty = 1 - if hasempty or i == (len(p.prod)-1): - # Add elements of follow(a) to follow(b) - for f in self.Follow[p.name]: - if f not in self.Follow[B]: - self.Follow[B].append(f) - didadd = 1 - if not didadd: break - return self.Follow - - - # ----------------------------------------------------------------------------- - # build_lritems() - # - # This function walks the list of productions and builds a complete set of the - # LR items. The LR items are stored in two ways: First, they are uniquely - # numbered and placed in the list _lritems. Second, a linked list of LR items - # is built for each production. For example: - # - # E -> E PLUS E - # - # Creates the list - # - # [E -> . E PLUS E, E -> E . PLUS E, E -> E PLUS . E, E -> E PLUS E . ] - # ----------------------------------------------------------------------------- - - def build_lritems(self): - for p in self.Productions: - lastlri = p - i = 0 - lr_items = [] - while 1: - if i > len(p): - lri = None - else: - lri = LRItem(p,i) - # Precompute the list of productions immediately following - try: - lri.lr_after = self.Prodnames[lri.prod[i+1]] - except (IndexError,KeyError): - lri.lr_after = [] - try: - lri.lr_before = lri.prod[i-1] - except IndexError: - lri.lr_before = None - - lastlri.lr_next = lri - if not lri: break - lr_items.append(lri) - lastlri = lri - i += 1 - p.lr_items = lr_items - -# ----------------------------------------------------------------------------- -# == Class LRTable == -# -# This basic class represents a basic table of LR parsing information. -# Methods for generating the tables are not defined here. They are defined -# in the derived class LRGeneratedTable. -# ----------------------------------------------------------------------------- - -class VersionError(YaccError): pass - -class LRTable(object): - def __init__(self): - self.lr_action = None - self.lr_goto = None - self.lr_productions = None - self.lr_method = None - - def read_table(self,module): - if isinstance(module,types.ModuleType): - parsetab = module - else: - if sys.version_info[0] < 3: - exec("import %s as parsetab" % module) - else: - env = { } - exec("import %s as parsetab" % module, env, env) - parsetab = env['parsetab'] - - if parsetab._tabversion != __tabversion__: - raise VersionError("yacc table file version is out of date") - - self.lr_action = parsetab._lr_action - self.lr_goto = parsetab._lr_goto - - self.lr_productions = [] - for p in parsetab._lr_productions: - self.lr_productions.append(MiniProduction(*p)) - - self.lr_method = parsetab._lr_method - return parsetab._lr_signature - - def read_pickle(self,filename): - try: - import cPickle as pickle - except ImportError: - import pickle - - in_f = open(filename,"rb") - - tabversion = pickle.load(in_f) - if tabversion != __tabversion__: - raise VersionError("yacc table file version is out of date") - self.lr_method = pickle.load(in_f) - signature = pickle.load(in_f) - self.lr_action = pickle.load(in_f) - self.lr_goto = pickle.load(in_f) - productions = pickle.load(in_f) - - self.lr_productions = [] - for p in productions: - self.lr_productions.append(MiniProduction(*p)) - - in_f.close() - return signature - - # Bind all production function names to callable objects in pdict - def bind_callables(self,pdict): - for p in self.lr_productions: - p.bind(pdict) - -# ----------------------------------------------------------------------------- -# === LR Generator === -# -# The following classes and functions are used to generate LR parsing tables on -# a grammar. -# ----------------------------------------------------------------------------- - -# ----------------------------------------------------------------------------- -# digraph() -# traverse() -# -# The following two functions are used to compute set valued functions -# of the form: -# -# F(x) = F'(x) U U{F(y) | x R y} -# -# This is used to compute the values of Read() sets as well as FOLLOW sets -# in LALR(1) generation. -# -# Inputs: X - An input set -# R - A relation -# FP - Set-valued function -# ------------------------------------------------------------------------------ - -def digraph(X,R,FP): - N = { } - for x in X: - N[x] = 0 - stack = [] - F = { } - for x in X: - if N[x] == 0: traverse(x,N,stack,F,X,R,FP) - return F - -def traverse(x,N,stack,F,X,R,FP): - stack.append(x) - d = len(stack) - N[x] = d - F[x] = FP(x) # F(X) <- F'(x) - - rel = R(x) # Get y's related to x - for y in rel: - if N[y] == 0: - traverse(y,N,stack,F,X,R,FP) - N[x] = min(N[x],N[y]) - for a in F.get(y,[]): - if a not in F[x]: F[x].append(a) - if N[x] == d: - N[stack[-1]] = MAXINT - F[stack[-1]] = F[x] - element = stack.pop() - while element != x: - N[stack[-1]] = MAXINT - F[stack[-1]] = F[x] - element = stack.pop() - -class LALRError(YaccError): pass - -# ----------------------------------------------------------------------------- -# == LRGeneratedTable == -# -# This class implements the LR table generation algorithm. There are no -# public methods except for write() -# ----------------------------------------------------------------------------- - -class LRGeneratedTable(LRTable): - def __init__(self,grammar,method='LALR',log=None): - if method not in ['SLR','LALR']: - raise LALRError("Unsupported method %s" % method) - - self.grammar = grammar - self.lr_method = method - - # Set up the logger - if not log: - log = NullLogger() - self.log = log - - # Internal attributes - self.lr_action = {} # Action table - self.lr_goto = {} # Goto table - self.lr_productions = grammar.Productions # Copy of grammar Production array - self.lr_goto_cache = {} # Cache of computed gotos - self.lr0_cidhash = {} # Cache of closures - - self._add_count = 0 # Internal counter used to detect cycles - - # Diagonistic information filled in by the table generator - self.sr_conflict = 0 - self.rr_conflict = 0 - self.conflicts = [] # List of conflicts - - self.sr_conflicts = [] - self.rr_conflicts = [] - - # Build the tables - self.grammar.build_lritems() - self.grammar.compute_first() - self.grammar.compute_follow() - self.lr_parse_table() - - # Compute the LR(0) closure operation on I, where I is a set of LR(0) items. - - def lr0_closure(self,I): - self._add_count += 1 - - # Add everything in I to J - J = I[:] - didadd = 1 - while didadd: - didadd = 0 - for j in J: - for x in j.lr_after: - if getattr(x,"lr0_added",0) == self._add_count: continue - # Add B --> .G to J - J.append(x.lr_next) - x.lr0_added = self._add_count - didadd = 1 - - return J - - # Compute the LR(0) goto function goto(I,X) where I is a set - # of LR(0) items and X is a grammar symbol. This function is written - # in a way that guarantees uniqueness of the generated goto sets - # (i.e. the same goto set will never be returned as two different Python - # objects). With uniqueness, we can later do fast set comparisons using - # id(obj) instead of element-wise comparison. - - def lr0_goto(self,I,x): - # First we look for a previously cached entry - g = self.lr_goto_cache.get((id(I),x),None) - if g: return g - - # Now we generate the goto set in a way that guarantees uniqueness - # of the result - - s = self.lr_goto_cache.get(x,None) - if not s: - s = { } - self.lr_goto_cache[x] = s - - gs = [ ] - for p in I: - n = p.lr_next - if n and n.lr_before == x: - s1 = s.get(id(n),None) - if not s1: - s1 = { } - s[id(n)] = s1 - gs.append(n) - s = s1 - g = s.get('$end',None) - if not g: - if gs: - g = self.lr0_closure(gs) - s['$end'] = g - else: - s['$end'] = gs - self.lr_goto_cache[(id(I),x)] = g - return g - - # Compute the LR(0) sets of item function - def lr0_items(self): - - C = [ self.lr0_closure([self.grammar.Productions[0].lr_next]) ] - i = 0 - for I in C: - self.lr0_cidhash[id(I)] = i - i += 1 - - # Loop over the items in C and each grammar symbols - i = 0 - while i < len(C): - I = C[i] - i += 1 - - # Collect all of the symbols that could possibly be in the goto(I,X) sets - asyms = { } - for ii in I: - for s in ii.usyms: - asyms[s] = None - - for x in asyms: - g = self.lr0_goto(I,x) - if not g: continue - if id(g) in self.lr0_cidhash: continue - self.lr0_cidhash[id(g)] = len(C) - C.append(g) - - return C - - # ----------------------------------------------------------------------------- - # ==== LALR(1) Parsing ==== - # - # LALR(1) parsing is almost exactly the same as SLR except that instead of - # relying upon Follow() sets when performing reductions, a more selective - # lookahead set that incorporates the state of the LR(0) machine is utilized. - # Thus, we mainly just have to focus on calculating the lookahead sets. - # - # The method used here is due to DeRemer and Pennelo (1982). - # - # DeRemer, F. L., and T. J. Pennelo: "Efficient Computation of LALR(1) - # Lookahead Sets", ACM Transactions on Programming Languages and Systems, - # Vol. 4, No. 4, Oct. 1982, pp. 615-649 - # - # Further details can also be found in: - # - # J. Tremblay and P. Sorenson, "The Theory and Practice of Compiler Writing", - # McGraw-Hill Book Company, (1985). - # - # ----------------------------------------------------------------------------- - - # ----------------------------------------------------------------------------- - # compute_nullable_nonterminals() - # - # Creates a dictionary containing all of the non-terminals that might produce - # an empty production. - # ----------------------------------------------------------------------------- - - def compute_nullable_nonterminals(self): - nullable = {} - num_nullable = 0 - while 1: - for p in self.grammar.Productions[1:]: - if p.len == 0: - nullable[p.name] = 1 - continue - for t in p.prod: - if not t in nullable: break - else: - nullable[p.name] = 1 - if len(nullable) == num_nullable: break - num_nullable = len(nullable) - return nullable - - # ----------------------------------------------------------------------------- - # find_nonterminal_trans(C) - # - # Given a set of LR(0) items, this functions finds all of the non-terminal - # transitions. These are transitions in which a dot appears immediately before - # a non-terminal. Returns a list of tuples of the form (state,N) where state - # is the state number and N is the nonterminal symbol. - # - # The input C is the set of LR(0) items. - # ----------------------------------------------------------------------------- - - def find_nonterminal_transitions(self,C): - trans = [] - for state in range(len(C)): - for p in C[state]: - if p.lr_index < p.len - 1: - t = (state,p.prod[p.lr_index+1]) - if t[1] in self.grammar.Nonterminals: - if t not in trans: trans.append(t) - state = state + 1 - return trans - - # ----------------------------------------------------------------------------- - # dr_relation() - # - # Computes the DR(p,A) relationships for non-terminal transitions. The input - # is a tuple (state,N) where state is a number and N is a nonterminal symbol. - # - # Returns a list of terminals. - # ----------------------------------------------------------------------------- - - def dr_relation(self,C,trans,nullable): - dr_set = { } - state,N = trans - terms = [] - - g = self.lr0_goto(C[state],N) - for p in g: - if p.lr_index < p.len - 1: - a = p.prod[p.lr_index+1] - if a in self.grammar.Terminals: - if a not in terms: terms.append(a) - - # This extra bit is to handle the start state - if state == 0 and N == self.grammar.Productions[0].prod[0]: - terms.append('$end') - - return terms - - # ----------------------------------------------------------------------------- - # reads_relation() - # - # Computes the READS() relation (p,A) READS (t,C). - # ----------------------------------------------------------------------------- - - def reads_relation(self,C, trans, empty): - # Look for empty transitions - rel = [] - state, N = trans - - g = self.lr0_goto(C[state],N) - j = self.lr0_cidhash.get(id(g),-1) - for p in g: - if p.lr_index < p.len - 1: - a = p.prod[p.lr_index + 1] - if a in empty: - rel.append((j,a)) - - return rel - - # ----------------------------------------------------------------------------- - # compute_lookback_includes() - # - # Determines the lookback and includes relations - # - # LOOKBACK: - # - # This relation is determined by running the LR(0) state machine forward. - # For example, starting with a production "N : . A B C", we run it forward - # to obtain "N : A B C ." We then build a relationship between this final - # state and the starting state. These relationships are stored in a dictionary - # lookdict. - # - # INCLUDES: - # - # Computes the INCLUDE() relation (p,A) INCLUDES (p',B). - # - # This relation is used to determine non-terminal transitions that occur - # inside of other non-terminal transition states. (p,A) INCLUDES (p', B) - # if the following holds: - # - # B -> LAT, where T -> epsilon and p' -L-> p - # - # L is essentially a prefix (which may be empty), T is a suffix that must be - # able to derive an empty string. State p' must lead to state p with the string L. - # - # ----------------------------------------------------------------------------- - - def compute_lookback_includes(self,C,trans,nullable): - - lookdict = {} # Dictionary of lookback relations - includedict = {} # Dictionary of include relations - - # Make a dictionary of non-terminal transitions - dtrans = {} - for t in trans: - dtrans[t] = 1 - - # Loop over all transitions and compute lookbacks and includes - for state,N in trans: - lookb = [] - includes = [] - for p in C[state]: - if p.name != N: continue - - # Okay, we have a name match. We now follow the production all the way - # through the state machine until we get the . on the right hand side - - lr_index = p.lr_index - j = state - while lr_index < p.len - 1: - lr_index = lr_index + 1 - t = p.prod[lr_index] - - # Check to see if this symbol and state are a non-terminal transition - if (j,t) in dtrans: - # Yes. Okay, there is some chance that this is an includes relation - # the only way to know for certain is whether the rest of the - # production derives empty - - li = lr_index + 1 - while li < p.len: - if p.prod[li] in self.grammar.Terminals: break # No forget it - if not p.prod[li] in nullable: break - li = li + 1 - else: - # Appears to be a relation between (j,t) and (state,N) - includes.append((j,t)) - - g = self.lr0_goto(C[j],t) # Go to next set - j = self.lr0_cidhash.get(id(g),-1) # Go to next state - - # When we get here, j is the final state, now we have to locate the production - for r in C[j]: - if r.name != p.name: continue - if r.len != p.len: continue - i = 0 - # This look is comparing a production ". A B C" with "A B C ." - while i < r.lr_index: - if r.prod[i] != p.prod[i+1]: break - i = i + 1 - else: - lookb.append((j,r)) - for i in includes: - if not i in includedict: includedict[i] = [] - includedict[i].append((state,N)) - lookdict[(state,N)] = lookb - - return lookdict,includedict - - # ----------------------------------------------------------------------------- - # compute_read_sets() - # - # Given a set of LR(0) items, this function computes the read sets. - # - # Inputs: C = Set of LR(0) items - # ntrans = Set of nonterminal transitions - # nullable = Set of empty transitions - # - # Returns a set containing the read sets - # ----------------------------------------------------------------------------- - - def compute_read_sets(self,C, ntrans, nullable): - FP = lambda x: self.dr_relation(C,x,nullable) - R = lambda x: self.reads_relation(C,x,nullable) - F = digraph(ntrans,R,FP) - return F - - # ----------------------------------------------------------------------------- - # compute_follow_sets() - # - # Given a set of LR(0) items, a set of non-terminal transitions, a readset, - # and an include set, this function computes the follow sets - # - # Follow(p,A) = Read(p,A) U U {Follow(p',B) | (p,A) INCLUDES (p',B)} - # - # Inputs: - # ntrans = Set of nonterminal transitions - # readsets = Readset (previously computed) - # inclsets = Include sets (previously computed) - # - # Returns a set containing the follow sets - # ----------------------------------------------------------------------------- - - def compute_follow_sets(self,ntrans,readsets,inclsets): - FP = lambda x: readsets[x] - R = lambda x: inclsets.get(x,[]) - F = digraph(ntrans,R,FP) - return F - - # ----------------------------------------------------------------------------- - # add_lookaheads() - # - # Attaches the lookahead symbols to grammar rules. - # - # Inputs: lookbacks - Set of lookback relations - # followset - Computed follow set - # - # This function directly attaches the lookaheads to productions contained - # in the lookbacks set - # ----------------------------------------------------------------------------- - - def add_lookaheads(self,lookbacks,followset): - for trans,lb in lookbacks.items(): - # Loop over productions in lookback - for state,p in lb: - if not state in p.lookaheads: - p.lookaheads[state] = [] - f = followset.get(trans,[]) - for a in f: - if a not in p.lookaheads[state]: p.lookaheads[state].append(a) - - # ----------------------------------------------------------------------------- - # add_lalr_lookaheads() - # - # This function does all of the work of adding lookahead information for use - # with LALR parsing - # ----------------------------------------------------------------------------- - - def add_lalr_lookaheads(self,C): - # Determine all of the nullable nonterminals - nullable = self.compute_nullable_nonterminals() - - # Find all non-terminal transitions - trans = self.find_nonterminal_transitions(C) - - # Compute read sets - readsets = self.compute_read_sets(C,trans,nullable) - - # Compute lookback/includes relations - lookd, included = self.compute_lookback_includes(C,trans,nullable) - - # Compute LALR FOLLOW sets - followsets = self.compute_follow_sets(trans,readsets,included) - - # Add all of the lookaheads - self.add_lookaheads(lookd,followsets) - - # ----------------------------------------------------------------------------- - # lr_parse_table() - # - # This function constructs the parse tables for SLR or LALR - # ----------------------------------------------------------------------------- - def lr_parse_table(self): - Productions = self.grammar.Productions - Precedence = self.grammar.Precedence - goto = self.lr_goto # Goto array - action = self.lr_action # Action array - log = self.log # Logger for output - - actionp = { } # Action production array (temporary) - - log.info("Parsing method: %s", self.lr_method) - - # Step 1: Construct C = { I0, I1, ... IN}, collection of LR(0) items - # This determines the number of states - - C = self.lr0_items() - - if self.lr_method == 'LALR': - self.add_lalr_lookaheads(C) - - # Build the parser table, state by state - st = 0 - for I in C: - # Loop over each production in I - actlist = [ ] # List of actions - st_action = { } - st_actionp = { } - st_goto = { } - log.info("") - log.info("state %d", st) - log.info("") - for p in I: - log.info(" (%d) %s", p.number, str(p)) - log.info("") - - for p in I: - if p.len == p.lr_index + 1: - if p.name == "S'": - # Start symbol. Accept! - st_action["$end"] = 0 - st_actionp["$end"] = p - else: - # We are at the end of a production. Reduce! - if self.lr_method == 'LALR': - laheads = p.lookaheads[st] - else: - laheads = self.grammar.Follow[p.name] - for a in laheads: - actlist.append((a,p,"reduce using rule %d (%s)" % (p.number,p))) - r = st_action.get(a,None) - if r is not None: - # Whoa. Have a shift/reduce or reduce/reduce conflict - if r > 0: - # Need to decide on shift or reduce here - # By default we favor shifting. Need to add - # some precedence rules here. - sprec,slevel = Productions[st_actionp[a].number].prec - rprec,rlevel = Precedence.get(a,('right',0)) - if (slevel < rlevel) or ((slevel == rlevel) and (rprec == 'left')): - # We really need to reduce here. - st_action[a] = -p.number - st_actionp[a] = p - if not slevel and not rlevel: - log.info(" ! shift/reduce conflict for %s resolved as reduce",a) - self.sr_conflicts.append((st,a,'reduce')) - Productions[p.number].reduced += 1 - elif (slevel == rlevel) and (rprec == 'nonassoc'): - st_action[a] = None - else: - # Hmmm. Guess we'll keep the shift - if not rlevel: - log.info(" ! shift/reduce conflict for %s resolved as shift",a) - self.sr_conflicts.append((st,a,'shift')) - elif r < 0: - # Reduce/reduce conflict. In this case, we favor the rule - # that was defined first in the grammar file - oldp = Productions[-r] - pp = Productions[p.number] - if oldp.line > pp.line: - st_action[a] = -p.number - st_actionp[a] = p - chosenp,rejectp = pp,oldp - Productions[p.number].reduced += 1 - Productions[oldp.number].reduced -= 1 - else: - chosenp,rejectp = oldp,pp - self.rr_conflicts.append((st,chosenp,rejectp)) - log.info(" ! reduce/reduce conflict for %s resolved using rule %d (%s)", a,st_actionp[a].number, st_actionp[a]) - else: - raise LALRError("Unknown conflict in state %d" % st) - else: - st_action[a] = -p.number - st_actionp[a] = p - Productions[p.number].reduced += 1 - else: - i = p.lr_index - a = p.prod[i+1] # Get symbol right after the "." - if a in self.grammar.Terminals: - g = self.lr0_goto(I,a) - j = self.lr0_cidhash.get(id(g),-1) - if j >= 0: - # We are in a shift state - actlist.append((a,p,"shift and go to state %d" % j)) - r = st_action.get(a,None) - if r is not None: - # Whoa have a shift/reduce or shift/shift conflict - if r > 0: - if r != j: - raise LALRError("Shift/shift conflict in state %d" % st) - elif r < 0: - # Do a precedence check. - # - if precedence of reduce rule is higher, we reduce. - # - if precedence of reduce is same and left assoc, we reduce. - # - otherwise we shift - rprec,rlevel = Productions[st_actionp[a].number].prec - sprec,slevel = Precedence.get(a,('right',0)) - if (slevel > rlevel) or ((slevel == rlevel) and (rprec == 'right')): - # We decide to shift here... highest precedence to shift - Productions[st_actionp[a].number].reduced -= 1 - st_action[a] = j - st_actionp[a] = p - if not rlevel: - log.info(" ! shift/reduce conflict for %s resolved as shift",a) - self.sr_conflicts.append((st,a,'shift')) - elif (slevel == rlevel) and (rprec == 'nonassoc'): - st_action[a] = None - else: - # Hmmm. Guess we'll keep the reduce - if not slevel and not rlevel: - log.info(" ! shift/reduce conflict for %s resolved as reduce",a) - self.sr_conflicts.append((st,a,'reduce')) - - else: - raise LALRError("Unknown conflict in state %d" % st) - else: - st_action[a] = j - st_actionp[a] = p - - # Print the actions associated with each terminal - _actprint = { } - for a,p,m in actlist: - if a in st_action: - if p is st_actionp[a]: - log.info(" %-15s %s",a,m) - _actprint[(a,m)] = 1 - log.info("") - # Print the actions that were not used. (debugging) - not_used = 0 - for a,p,m in actlist: - if a in st_action: - if p is not st_actionp[a]: - if not (a,m) in _actprint: - log.debug(" ! %-15s [ %s ]",a,m) - not_used = 1 - _actprint[(a,m)] = 1 - if not_used: - log.debug("") - - # Construct the goto table for this state - - nkeys = { } - for ii in I: - for s in ii.usyms: - if s in self.grammar.Nonterminals: - nkeys[s] = None - for n in nkeys: - g = self.lr0_goto(I,n) - j = self.lr0_cidhash.get(id(g),-1) - if j >= 0: - st_goto[n] = j - log.info(" %-30s shift and go to state %d",n,j) - - action[st] = st_action - actionp[st] = st_actionp - goto[st] = st_goto - st += 1 - - - # ----------------------------------------------------------------------------- - # write() - # - # This function writes the LR parsing tables to a file - # ----------------------------------------------------------------------------- - - def write_table(self,modulename,outputdir='',signature=""): - basemodulename = modulename.split(".")[-1] - filename = os.path.join(outputdir,basemodulename) + ".py" - try: - f = open(filename,"w") - - f.write(""" -# %s -# This file is automatically generated. Do not edit. -_tabversion = %r - -_lr_method = %r - -_lr_signature = %r - """ % (filename, __tabversion__, self.lr_method, signature)) - - # Change smaller to 0 to go back to original tables - smaller = 1 - - # Factor out names to try and make smaller - if smaller: - items = { } - - for s,nd in self.lr_action.items(): - for name,v in nd.items(): - i = items.get(name) - if not i: - i = ([],[]) - items[name] = i - i[0].append(s) - i[1].append(v) - - f.write("\n_lr_action_items = {") - for k,v in items.items(): - f.write("%r:([" % k) - for i in v[0]: - f.write("%r," % i) - f.write("],[") - for i in v[1]: - f.write("%r," % i) - - f.write("]),") - f.write("}\n") - - f.write(""" -_lr_action = { } -for _k, _v in _lr_action_items.items(): - for _x,_y in zip(_v[0],_v[1]): - if not _x in _lr_action: _lr_action[_x] = { } - _lr_action[_x][_k] = _y -del _lr_action_items -""") - - else: - f.write("\n_lr_action = { "); - for k,v in self.lr_action.items(): - f.write("(%r,%r):%r," % (k[0],k[1],v)) - f.write("}\n"); - - if smaller: - # Factor out names to try and make smaller - items = { } - - for s,nd in self.lr_goto.items(): - for name,v in nd.items(): - i = items.get(name) - if not i: - i = ([],[]) - items[name] = i - i[0].append(s) - i[1].append(v) - - f.write("\n_lr_goto_items = {") - for k,v in items.items(): - f.write("%r:([" % k) - for i in v[0]: - f.write("%r," % i) - f.write("],[") - for i in v[1]: - f.write("%r," % i) - - f.write("]),") - f.write("}\n") - - f.write(""" -_lr_goto = { } -for _k, _v in _lr_goto_items.items(): - for _x,_y in zip(_v[0],_v[1]): - if not _x in _lr_goto: _lr_goto[_x] = { } - _lr_goto[_x][_k] = _y -del _lr_goto_items -""") - else: - f.write("\n_lr_goto = { "); - for k,v in self.lr_goto.items(): - f.write("(%r,%r):%r," % (k[0],k[1],v)) - f.write("}\n"); - - # Write production table - f.write("_lr_productions = [\n") - for p in self.lr_productions: - if p.func: - f.write(" (%r,%r,%d,%r,%r,%d),\n" % (p.str,p.name, p.len, p.func,p.file,p.line)) - else: - f.write(" (%r,%r,%d,None,None,None),\n" % (str(p),p.name, p.len)) - f.write("]\n") - f.close() - - except IOError: - e = sys.exc_info()[1] - sys.stderr.write("Unable to create '%s'\n" % filename) - sys.stderr.write(str(e)+"\n") - return - - - # ----------------------------------------------------------------------------- - # pickle_table() - # - # This function pickles the LR parsing tables to a supplied file object - # ----------------------------------------------------------------------------- - - def pickle_table(self,filename,signature=""): - try: - import cPickle as pickle - except ImportError: - import pickle - outf = open(filename,"wb") - pickle.dump(__tabversion__,outf,pickle_protocol) - pickle.dump(self.lr_method,outf,pickle_protocol) - pickle.dump(signature,outf,pickle_protocol) - pickle.dump(self.lr_action,outf,pickle_protocol) - pickle.dump(self.lr_goto,outf,pickle_protocol) - - outp = [] - for p in self.lr_productions: - if p.func: - outp.append((p.str,p.name, p.len, p.func,p.file,p.line)) - else: - outp.append((str(p),p.name,p.len,None,None,None)) - pickle.dump(outp,outf,pickle_protocol) - outf.close() - -# ----------------------------------------------------------------------------- -# === INTROSPECTION === -# -# The following functions and classes are used to implement the PLY -# introspection features followed by the yacc() function itself. -# ----------------------------------------------------------------------------- - -# ----------------------------------------------------------------------------- -# get_caller_module_dict() -# -# This function returns a dictionary containing all of the symbols defined within -# a caller further down the call stack. This is used to get the environment -# associated with the yacc() call if none was provided. -# ----------------------------------------------------------------------------- - -def get_caller_module_dict(levels): - try: - raise RuntimeError - except RuntimeError: - e,b,t = sys.exc_info() - f = t.tb_frame - while levels > 0: - f = f.f_back - levels -= 1 - ldict = f.f_globals.copy() - if f.f_globals != f.f_locals: - ldict.update(f.f_locals) - - return ldict - -# ----------------------------------------------------------------------------- -# parse_grammar() -# -# This takes a raw grammar rule string and parses it into production data -# ----------------------------------------------------------------------------- -def parse_grammar(doc,file,line): - grammar = [] - # Split the doc string into lines - pstrings = doc.splitlines() - lastp = None - dline = line - for ps in pstrings: - dline += 1 - p = ps.split() - if not p: continue - try: - if p[0] == '|': - # This is a continuation of a previous rule - if not lastp: - raise SyntaxError("%s:%d: Misplaced '|'" % (file,dline)) - prodname = lastp - syms = p[1:] - else: - prodname = p[0] - lastp = prodname - syms = p[2:] - assign = p[1] - if assign != ':' and assign != '::=': - raise SyntaxError("%s:%d: Syntax error. Expected ':'" % (file,dline)) - - grammar.append((file,dline,prodname,syms)) - except SyntaxError: - raise - except Exception: - raise SyntaxError("%s:%d: Syntax error in rule '%s'" % (file,dline,ps.strip())) - - return grammar - -# ----------------------------------------------------------------------------- -# ParserReflect() -# -# This class represents information extracted for building a parser including -# start symbol, error function, tokens, precedence list, action functions, -# etc. -# ----------------------------------------------------------------------------- -class ParserReflect(object): - def __init__(self,pdict,log=None): - self.pdict = pdict - self.start = None - self.error_func = None - self.tokens = None - self.files = {} - self.grammar = [] - self.error = 0 - - if log is None: - self.log = PlyLogger(sys.stderr) - else: - self.log = log - - # Get all of the basic information - def get_all(self): - self.get_start() - self.get_error_func() - self.get_tokens() - self.get_precedence() - self.get_pfunctions() - - # Validate all of the information - def validate_all(self): - self.validate_start() - self.validate_error_func() - self.validate_tokens() - self.validate_precedence() - self.validate_pfunctions() - self.validate_files() - return self.error - - # Compute a signature over the grammar - def signature(self): - try: - from hashlib import md5 - except ImportError: - from md5 import md5 - try: - sig = md5() - if self.start: - sig.update(self.start.encode('latin-1')) - if self.prec: - sig.update("".join(["".join(p) for p in self.prec]).encode('latin-1')) - if self.tokens: - sig.update(" ".join(self.tokens).encode('latin-1')) - for f in self.pfuncs: - if f[3]: - sig.update(f[3].encode('latin-1')) - except (TypeError,ValueError): - pass - return sig.digest() - - # ----------------------------------------------------------------------------- - # validate_file() - # - # This method checks to see if there are duplicated p_rulename() functions - # in the parser module file. Without this function, it is really easy for - # users to make mistakes by cutting and pasting code fragments (and it's a real - # bugger to try and figure out why the resulting parser doesn't work). Therefore, - # we just do a little regular expression pattern matching of def statements - # to try and detect duplicates. - # ----------------------------------------------------------------------------- - - def validate_files(self): - # Match def p_funcname( - fre = re.compile(r'\s*def\s+(p_[a-zA-Z_0-9]*)\(') - - for filename in self.files.keys(): - base,ext = os.path.splitext(filename) - if ext != '.py': return 1 # No idea. Assume it's okay. - - try: - f = open(filename) - lines = f.readlines() - f.close() - except IOError: - continue - - counthash = { } - for linen,l in enumerate(lines): - linen += 1 - m = fre.match(l) - if m: - name = m.group(1) - prev = counthash.get(name) - if not prev: - counthash[name] = linen - else: - self.log.warning("%s:%d: Function %s redefined. Previously defined on line %d", filename,linen,name,prev) - - # Get the start symbol - def get_start(self): - self.start = self.pdict.get('start') - - # Validate the start symbol - def validate_start(self): - if self.start is not None: - if not isinstance(self.start,str): - self.log.error("'start' must be a string") - - # Look for error handler - def get_error_func(self): - self.error_func = self.pdict.get('p_error') - - # Validate the error function - def validate_error_func(self): - if self.error_func: - if isinstance(self.error_func,types.FunctionType): - ismethod = 0 - elif isinstance(self.error_func, types.MethodType): - ismethod = 1 - else: - self.log.error("'p_error' defined, but is not a function or method") - self.error = 1 - return - - eline = func_code(self.error_func).co_firstlineno - efile = func_code(self.error_func).co_filename - self.files[efile] = 1 - - if (func_code(self.error_func).co_argcount != 1+ismethod): - self.log.error("%s:%d: p_error() requires 1 argument",efile,eline) - self.error = 1 - - # Get the tokens map - def get_tokens(self): - tokens = self.pdict.get("tokens",None) - if not tokens: - self.log.error("No token list is defined") - self.error = 1 - return - - if not isinstance(tokens,(list, tuple)): - self.log.error("tokens must be a list or tuple") - self.error = 1 - return - - if not tokens: - self.log.error("tokens is empty") - self.error = 1 - return - - self.tokens = tokens - - # Validate the tokens - def validate_tokens(self): - # Validate the tokens. - if 'error' in self.tokens: - self.log.error("Illegal token name 'error'. Is a reserved word") - self.error = 1 - return - - terminals = {} - for n in self.tokens: - if n in terminals: - self.log.warning("Token '%s' multiply defined", n) - terminals[n] = 1 - - # Get the precedence map (if any) - def get_precedence(self): - self.prec = self.pdict.get("precedence",None) - - # Validate and parse the precedence map - def validate_precedence(self): - preclist = [] - if self.prec: - if not isinstance(self.prec,(list,tuple)): - self.log.error("precedence must be a list or tuple") - self.error = 1 - return - for level,p in enumerate(self.prec): - if not isinstance(p,(list,tuple)): - self.log.error("Bad precedence table") - self.error = 1 - return - - if len(p) < 2: - self.log.error("Malformed precedence entry %s. Must be (assoc, term, ..., term)",p) - self.error = 1 - return - assoc = p[0] - if not isinstance(assoc,str): - self.log.error("precedence associativity must be a string") - self.error = 1 - return - for term in p[1:]: - if not isinstance(term,str): - self.log.error("precedence items must be strings") - self.error = 1 - return - preclist.append((term,assoc,level+1)) - self.preclist = preclist - - # Get all p_functions from the grammar - def get_pfunctions(self): - p_functions = [] - for name, item in self.pdict.items(): - if name[:2] != 'p_': continue - if name == 'p_error': continue - if isinstance(item,(types.FunctionType,types.MethodType)): - line = func_code(item).co_firstlineno - file = func_code(item).co_filename - p_functions.append((line,file,name,item.__doc__)) - - # Sort all of the actions by line number - p_functions.sort() - self.pfuncs = p_functions - - - # Validate all of the p_functions - def validate_pfunctions(self): - grammar = [] - # Check for non-empty symbols - if len(self.pfuncs) == 0: - self.log.error("no rules of the form p_rulename are defined") - self.error = 1 - return - - for line, file, name, doc in self.pfuncs: - func = self.pdict[name] - if isinstance(func, types.MethodType): - reqargs = 2 - else: - reqargs = 1 - if func_code(func).co_argcount > reqargs: - self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,func.__name__) - self.error = 1 - elif func_code(func).co_argcount < reqargs: - self.log.error("%s:%d: Rule '%s' requires an argument",file,line,func.__name__) - self.error = 1 - elif not func.__doc__: - self.log.warning("%s:%d: No documentation string specified in function '%s' (ignored)",file,line,func.__name__) - else: - try: - parsed_g = parse_grammar(doc,file,line) - for g in parsed_g: - grammar.append((name, g)) - except SyntaxError: - e = sys.exc_info()[1] - self.log.error(str(e)) - self.error = 1 - - # Looks like a valid grammar rule - # Mark the file in which defined. - self.files[file] = 1 - - # Secondary validation step that looks for p_ definitions that are not functions - # or functions that look like they might be grammar rules. - - for n,v in self.pdict.items(): - if n[0:2] == 'p_' and isinstance(v, (types.FunctionType, types.MethodType)): continue - if n[0:2] == 't_': continue - if n[0:2] == 'p_' and n != 'p_error': - self.log.warning("'%s' not defined as a function", n) - if ((isinstance(v,types.FunctionType) and func_code(v).co_argcount == 1) or - (isinstance(v,types.MethodType) and func_code(v).co_argcount == 2)): - try: - doc = v.__doc__.split(" ") - if doc[1] == ':': - self.log.warning("%s:%d: Possible grammar rule '%s' defined without p_ prefix", - func_code(v).co_filename, func_code(v).co_firstlineno,n) - except Exception: - pass - - self.grammar = grammar - -# ----------------------------------------------------------------------------- -# yacc(module) -# -# Build a parser -# ----------------------------------------------------------------------------- - -def yacc(method='LALR', debug=yaccdebug, module=None, tabmodule=tab_module, start=None, - check_recursion=1, optimize=0, write_tables=1, debugfile=debug_file,outputdir='', - debuglog=None, errorlog = None, picklefile=None): - - global parse # Reference to the parsing method of the last built parser - - # If pickling is enabled, table files are not created - - if picklefile: - write_tables = 0 - - if errorlog is None: - errorlog = PlyLogger(sys.stderr) - - # Get the module dictionary used for the parser - if module: - _items = [(k,getattr(module,k)) for k in dir(module)] - pdict = dict(_items) - else: - pdict = get_caller_module_dict(2) - - # Collect parser information from the dictionary - pinfo = ParserReflect(pdict,log=errorlog) - pinfo.get_all() - - if pinfo.error: - raise YaccError("Unable to build parser") - - # Check signature against table files (if any) - signature = pinfo.signature() - - # Read the tables - try: - lr = LRTable() - if picklefile: - read_signature = lr.read_pickle(picklefile) - else: - read_signature = lr.read_table(tabmodule) - if optimize or (read_signature == signature): - try: - lr.bind_callables(pinfo.pdict) - parser = LRParser(lr,pinfo.error_func) - parse = parser.parse - return parser - except Exception: - e = sys.exc_info()[1] - errorlog.warning("There was a problem loading the table file: %s", repr(e)) - except VersionError: - e = sys.exc_info() - errorlog.warning(str(e)) - except Exception: - pass - - if debuglog is None: - if debug: - debuglog = PlyLogger(open(debugfile,"w")) - else: - debuglog = NullLogger() - - debuglog.info("Created by PLY version %s (http://www.dabeaz.com/ply)", __version__) - - - errors = 0 - - # Validate the parser information - if pinfo.validate_all(): - raise YaccError("Unable to build parser") - - if not pinfo.error_func: - errorlog.warning("no p_error() function is defined") - - # Create a grammar object - grammar = Grammar(pinfo.tokens) - - # Set precedence level for terminals - for term, assoc, level in pinfo.preclist: - try: - grammar.set_precedence(term,assoc,level) - except GrammarError: - e = sys.exc_info()[1] - errorlog.warning("%s",str(e)) - - # Add productions to the grammar - for funcname, gram in pinfo.grammar: - file, line, prodname, syms = gram - try: - grammar.add_production(prodname,syms,funcname,file,line) - except GrammarError: - e = sys.exc_info()[1] - errorlog.error("%s",str(e)) - errors = 1 - - # Set the grammar start symbols - try: - if start is None: - grammar.set_start(pinfo.start) - else: - grammar.set_start(start) - except GrammarError: - e = sys.exc_info()[1] - errorlog.error(str(e)) - errors = 1 - - if errors: - raise YaccError("Unable to build parser") - - # Verify the grammar structure - undefined_symbols = grammar.undefined_symbols() - for sym, prod in undefined_symbols: - errorlog.error("%s:%d: Symbol '%s' used, but not defined as a token or a rule",prod.file,prod.line,sym) - errors = 1 - - unused_terminals = grammar.unused_terminals() - if unused_terminals: - debuglog.info("") - debuglog.info("Unused terminals:") - debuglog.info("") - for term in unused_terminals: - errorlog.warning("Token '%s' defined, but not used", term) - debuglog.info(" %s", term) - - # Print out all productions to the debug log - if debug: - debuglog.info("") - debuglog.info("Grammar") - debuglog.info("") - for n,p in enumerate(grammar.Productions): - debuglog.info("Rule %-5d %s", n, p) - - # Find unused non-terminals - unused_rules = grammar.unused_rules() - for prod in unused_rules: - errorlog.warning("%s:%d: Rule '%s' defined, but not used", prod.file, prod.line, prod.name) - - if len(unused_terminals) == 1: - errorlog.warning("There is 1 unused token") - if len(unused_terminals) > 1: - errorlog.warning("There are %d unused tokens", len(unused_terminals)) - - if len(unused_rules) == 1: - errorlog.warning("There is 1 unused rule") - if len(unused_rules) > 1: - errorlog.warning("There are %d unused rules", len(unused_rules)) - - if debug: - debuglog.info("") - debuglog.info("Terminals, with rules where they appear") - debuglog.info("") - terms = list(grammar.Terminals) - terms.sort() - for term in terms: - debuglog.info("%-20s : %s", term, " ".join([str(s) for s in grammar.Terminals[term]])) - - debuglog.info("") - debuglog.info("Nonterminals, with rules where they appear") - debuglog.info("") - nonterms = list(grammar.Nonterminals) - nonterms.sort() - for nonterm in nonterms: - debuglog.info("%-20s : %s", nonterm, " ".join([str(s) for s in grammar.Nonterminals[nonterm]])) - debuglog.info("") - - if check_recursion: - unreachable = grammar.find_unreachable() - for u in unreachable: - errorlog.warning("Symbol '%s' is unreachable",u) - - infinite = grammar.infinite_cycles() - for inf in infinite: - errorlog.error("Infinite recursion detected for symbol '%s'", inf) - errors = 1 - - unused_prec = grammar.unused_precedence() - for term, assoc in unused_prec: - errorlog.error("Precedence rule '%s' defined for unknown symbol '%s'", assoc, term) - errors = 1 - - if errors: - raise YaccError("Unable to build parser") - - # Run the LRGeneratedTable on the grammar - if debug: - errorlog.debug("Generating %s tables", method) - - lr = LRGeneratedTable(grammar,method,debuglog) - - if debug: - num_sr = len(lr.sr_conflicts) - - # Report shift/reduce and reduce/reduce conflicts - if num_sr == 1: - errorlog.warning("1 shift/reduce conflict") - elif num_sr > 1: - errorlog.warning("%d shift/reduce conflicts", num_sr) - - num_rr = len(lr.rr_conflicts) - if num_rr == 1: - errorlog.warning("1 reduce/reduce conflict") - elif num_rr > 1: - errorlog.warning("%d reduce/reduce conflicts", num_rr) - - # Write out conflicts to the output file - if debug and (lr.sr_conflicts or lr.rr_conflicts): - debuglog.warning("") - debuglog.warning("Conflicts:") - debuglog.warning("") - - for state, tok, resolution in lr.sr_conflicts: - debuglog.warning("shift/reduce conflict for %s in state %d resolved as %s", tok, state, resolution) - - already_reported = {} - for state, rule, rejected in lr.rr_conflicts: - if (state,id(rule),id(rejected)) in already_reported: - continue - debuglog.warning("reduce/reduce conflict in state %d resolved using rule (%s)", state, rule) - debuglog.warning("rejected rule (%s) in state %d", rejected,state) - errorlog.warning("reduce/reduce conflict in state %d resolved using rule (%s)", state, rule) - errorlog.warning("rejected rule (%s) in state %d", rejected, state) - already_reported[state,id(rule),id(rejected)] = 1 - - warned_never = [] - for state, rule, rejected in lr.rr_conflicts: - if not rejected.reduced and (rejected not in warned_never): - debuglog.warning("Rule (%s) is never reduced", rejected) - errorlog.warning("Rule (%s) is never reduced", rejected) - warned_never.append(rejected) - - # Write the table file if requested - if write_tables: - lr.write_table(tabmodule,outputdir,signature) - - # Write a pickled version of the tables - if picklefile: - lr.pickle_table(picklefile,signature) - - # Build the parser - lr.bind_callables(pinfo.pdict) - parser = LRParser(lr,pinfo.error_func) - - parse = parser.parse - return parser diff --git a/bin/python/ripple/__init__.py b/bin/python/ripple/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/bin/python/ripple/ledger/Args.py b/bin/python/ripple/ledger/Args.py deleted file mode 100644 index 9c1b04d341..0000000000 --- a/bin/python/ripple/ledger/Args.py +++ /dev/null @@ -1,187 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -import argparse -import importlib -import os - -from ripple.ledger import LedgerNumber -from ripple.util import File -from ripple.util import Log -from ripple.util import PrettyPrint -from ripple.util import Range -from ripple.util.Function import Function - -NAME = 'LedgerTool' -VERSION = '0.1' -NONE = '(none)' - -_parser = argparse.ArgumentParser( - prog=NAME, - description='Retrieve and process Ripple ledgers.', - epilog=LedgerNumber.HELP, - ) - -# Positional arguments. -_parser.add_argument( - 'command', - nargs='*', - help='Command to execute.' -) - -# Flag arguments. -_parser.add_argument( - '--binary', - action='store_true', - help='If true, searches are binary - by default linear search is used.', - ) - -_parser.add_argument( - '--cache', - default='~/.local/share/ripple/ledger', - help='The cache directory.', - ) - -_parser.add_argument( - '--complete', - action='store_true', - help='If set, only match complete ledgers.', - ) - -_parser.add_argument( - '--condition', '-c', - help='The name of a condition function used to match ledgers.', - ) - -_parser.add_argument( - '--config', - help='The rippled configuration file name.', - ) - -_parser.add_argument( - '--database', '-d', - nargs='*', - default=NONE, - help='Specify a database.', - ) - -_parser.add_argument( - '--display', - help='Specify a function to display ledgers.', - ) - -_parser.add_argument( - '--full', '-f', - action='store_true', - help='If true, request full ledgers.', - ) - -_parser.add_argument( - '--indent', '-i', - type=int, - default=2, - help='How many spaces to indent when display in JSON.', - ) - -_parser.add_argument( - '--offline', '-o', - action='store_true', - help='If true, work entirely from cache, do not try to contact the server.', - ) - -_parser.add_argument( - '--position', '-p', - choices=['all', 'first', 'last'], - default='last', - help='Select which ledgers to display.', - ) - -_parser.add_argument( - '--rippled', '-r', - help='The filename of a rippled binary for retrieving ledgers.', - ) - -_parser.add_argument( - '--server', '-s', - help='IP address of a rippled JSON server.', - ) - -_parser.add_argument( - '--utc', '-u', - action='store_true', - help='If true, display times in UTC rather than local time.', - ) - -_parser.add_argument( - '--validations', - default=3, - help='The number of validations needed before considering a ledger valid.', - ) - -_parser.add_argument( - '--version', - action='version', - version='%(prog)s ' + VERSION, - help='Print the current version of %(prog)s', - ) - -_parser.add_argument( - '--verbose', '-v', - action='store_true', - help='If true, give status messages on stderr.', - ) - -_parser.add_argument( - '--window', '-w', - type=int, - default=0, - help='How many ledgers to display around the matching ledger.', - ) - -_parser.add_argument( - '--yes', '-y', - action='store_true', - help='If true, don\'t ask for confirmation on large commands.', -) - -# Read the arguments from the command line. -ARGS = _parser.parse_args() -ARGS.NONE = NONE - -Log.VERBOSE = ARGS.verbose - -# Now remove any items that look like ledger numbers from the command line. -_command = ARGS.command -_parts = (ARGS.command, ARGS.ledgers) = ([], []) - -for c in _command: - _parts[Range.is_range(c, *LedgerNumber.LEDGERS)].append(c) - -ARGS.command = ARGS.command or ['print' if ARGS.ledgers else 'info'] - -ARGS.cache = File.normalize(ARGS.cache) - -if not ARGS.ledgers: - if ARGS.condition: - Log.warn('--condition needs a range of ledgers') - if ARGS.display: - Log.warn('--display needs a range of ledgers') - -ARGS.condition = Function( - ARGS.condition or 'all_ledgers', 'ripple.ledger.conditions') -ARGS.display = Function( - ARGS.display or 'ledger_number', 'ripple.ledger.displays') - -if ARGS.window < 0: - raise ValueError('Window cannot be negative: --window=%d' % - ARGS.window) - -PrettyPrint.INDENT = (ARGS.indent * ' ') - -_loaders = (ARGS.database != NONE) + bool(ARGS.rippled) + bool(ARGS.server) - -if not _loaders: - ARGS.rippled = 'rippled' - -elif _loaders > 1: - raise ValueError('At most one of --database, --rippled and --server ' - 'may be specified') diff --git a/bin/python/ripple/ledger/DatabaseReader.py b/bin/python/ripple/ledger/DatabaseReader.py deleted file mode 100644 index fe8b52e8c1..0000000000 --- a/bin/python/ripple/ledger/DatabaseReader.py +++ /dev/null @@ -1,78 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -import json -import os -import subprocess - -from ripple.ledger.Args import ARGS -from ripple.util import ConfigFile -from ripple.util import Database -from ripple.util import File -from ripple.util import Log -from ripple.util import Range - -LEDGER_QUERY = """ -SELECT - L.*, count(1) validations -FROM - (select LedgerHash, LedgerSeq from Ledgers ORDER BY LedgerSeq DESC) L - JOIN Validations V - ON (V.LedgerHash = L.LedgerHash) - GROUP BY L.LedgerHash - HAVING validations >= {validation_quorum} - ORDER BY 2; -""" - -COMPLETE_QUERY = """ -SELECT - L.LedgerSeq, count(*) validations -FROM - (select LedgerHash, LedgerSeq from Ledgers ORDER BY LedgerSeq) L - JOIN Validations V - ON (V.LedgerHash = L.LedgerHash) - GROUP BY L.LedgerHash - HAVING validations >= :validation_quorum - ORDER BY 2; -""" - -_DATABASE_NAME = 'ledger.db' - -USE_PLACEHOLDERS = False - -class DatabaseReader(object): - def __init__(self, config): - assert ARGS.database != ARGS.NONE - database = ARGS.database or config['database_path'] - if not database.endswith(_DATABASE_NAME): - database = os.path.join(database, _DATABASE_NAME) - if USE_PLACEHOLDERS: - cursor = Database.fetchall( - database, COMPLETE_QUERY, config) - else: - cursor = Database.fetchall( - database, LEDGER_QUERY.format(**config), {}) - self.complete = [c[1] for c in cursor] - - def name_to_ledger_index(self, ledger_name, is_full=False): - if not self.complete: - return None - if ledger_name == 'closed': - return self.complete[-1] - if ledger_name == 'current': - return None - if ledger_name == 'validated': - return self.complete[-1] - - def get_ledger(self, name, is_full=False): - cmd = ['ledger', str(name)] - if is_full: - cmd.append('full') - response = self._command(*cmd) - result = response.get('ledger') - if result: - return result - error = response['error'] - etext = _ERROR_TEXT.get(error) - if etext: - error = '%s (%s)' % (etext, error) - Log.fatal(_ERROR_TEXT.get(error, error)) diff --git a/bin/python/ripple/ledger/LedgerNumber.py b/bin/python/ripple/ledger/LedgerNumber.py deleted file mode 100644 index cc6aee7d0c..0000000000 --- a/bin/python/ripple/ledger/LedgerNumber.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -from ripple.util import Range - -FIRST_EVER = 32570 - -LEDGERS = { - 'closed': 'the most recently closed ledger', - 'current': 'the current ledger', - 'first': 'the first complete ledger on this server', - 'last': 'the last complete ledger on this server', - 'validated': 'the most recently validated ledger', - } - -HELP = """ -Ledgers are either represented by a number, or one of the special ledgers; -""" + ',\n'.join('%s, %s' % (k, v) for k, v in sorted(LEDGERS.items()) -) diff --git a/bin/python/ripple/ledger/RippledReader.py b/bin/python/ripple/ledger/RippledReader.py deleted file mode 100644 index 5c970cc072..0000000000 --- a/bin/python/ripple/ledger/RippledReader.py +++ /dev/null @@ -1,68 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -import json -import os -import subprocess - -from ripple.ledger.Args import ARGS -from ripple.util import File -from ripple.util import Log -from ripple.util import Range - -_ERROR_CODE_REASON = { - 62: 'No rippled server is running.', -} - -_ERROR_TEXT = { - 'lgrNotFound': 'The ledger you requested was not found.', - 'noCurrent': 'The server has no current ledger.', - 'noNetwork': 'The server did not respond to your request.', -} - -_DEFAULT_ERROR_ = "Couldn't connect to server." - -class RippledReader(object): - def __init__(self, config): - fname = File.normalize(ARGS.rippled) - if not os.path.exists(fname): - raise Exception('No rippled found at %s.' % fname) - self.cmd = [fname] - if ARGS.config: - self.cmd.extend(['--conf', File.normalize(ARGS.config)]) - self.info = self._command('server_info')['info'] - c = self.info.get('complete_ledgers') - if c == 'empty': - self.complete = [] - else: - self.complete = sorted(Range.from_string(c)) - - def name_to_ledger_index(self, ledger_name, is_full=False): - return self.get_ledger(ledger_name, is_full)['ledger_index'] - - def get_ledger(self, name, is_full=False): - cmd = ['ledger', str(name)] - if is_full: - cmd.append('full') - response = self._command(*cmd) - result = response.get('ledger') - if result: - return result - error = response['error'] - etext = _ERROR_TEXT.get(error) - if etext: - error = '%s (%s)' % (etext, error) - Log.fatal(_ERROR_TEXT.get(error, error)) - - def _command(self, *cmds): - cmd = self.cmd + list(cmds) - try: - data = subprocess.check_output(cmd, stderr=subprocess.PIPE) - except subprocess.CalledProcessError as e: - raise Exception(_ERROR_CODE_REASON.get( - e.returncode, _DEFAULT_ERROR_)) - - part = json.loads(data) - try: - return part['result'] - except: - raise ValueError(part.get('error', 'unknown error')) diff --git a/bin/python/ripple/ledger/SField.py b/bin/python/ripple/ledger/SField.py deleted file mode 100644 index 513e36a661..0000000000 --- a/bin/python/ripple/ledger/SField.py +++ /dev/null @@ -1,52 +0,0 @@ -# Constants from ripple/protocol/SField.h - -# special types -STI_UNKNOWN = -2 -STI_DONE = -1 -STI_NOTPRESENT = 0 - -# # types (common) -STI_UINT16 = 1 -STI_UINT32 = 2 -STI_UINT64 = 3 -STI_HASH128 = 4 -STI_HASH256 = 5 -STI_AMOUNT = 6 -STI_VL = 7 -STI_ACCOUNT = 8 -# 9-13 are reserved -STI_OBJECT = 14 -STI_ARRAY = 15 - -# types (uncommon) -STI_UINT8 = 16 -STI_HASH160 = 17 -STI_PATHSET = 18 -STI_VECTOR256 = 19 - -# high level types -# cannot be serialized inside other types -STI_TRANSACTION = 10001 -STI_LEDGERENTRY = 10002 -STI_VALIDATION = 10003 -STI_METADATA = 10004 - -def field_code(sti, name): - if sti < 16: - if name < 16: - bytes = [(sti << 4) + name] - else: - bytes = [sti << 4, name] - elif name < 16: - bytes = [name, sti] - else: - bytes = [0, sti, name] - return ''.join(chr(i) for i in bytes) - -# Selected constants from SField.cpp - -sfSequence = field_code(STI_UINT32, 4) -sfPublicKey = field_code(STI_VL, 1) -sfSigningPubKey = field_code(STI_VL, 3) -sfSignature = field_code(STI_VL, 6) -sfMasterSignature = field_code(STI_VL, 18) diff --git a/bin/python/ripple/ledger/SearchLedgers.py b/bin/python/ripple/ledger/SearchLedgers.py deleted file mode 100644 index 8200366281..0000000000 --- a/bin/python/ripple/ledger/SearchLedgers.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -import sys - -from ripple.ledger.Args import ARGS -from ripple.util import Log -from ripple.util import Range -from ripple.util import Search - -def search(server): - """Yields a stream of ledger numbers that match the given condition.""" - condition = lambda number: ARGS.condition(server, number) - ledgers = server.ledgers - if ARGS.binary: - try: - position = Search.FIRST if ARGS.position == 'first' else Search.LAST - yield Search.binary_search( - ledgers[0], ledgers[-1], condition, position) - except: - Log.fatal('No ledgers matching condition "%s".' % condition, - file=sys.stderr) - else: - for x in Search.linear_search(ledgers, condition): - yield x diff --git a/bin/python/ripple/ledger/Server.py b/bin/python/ripple/ledger/Server.py deleted file mode 100644 index 7a489d5465..0000000000 --- a/bin/python/ripple/ledger/Server.py +++ /dev/null @@ -1,55 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -import json -import os - -from ripple.ledger import DatabaseReader, RippledReader -from ripple.ledger.Args import ARGS -from ripple.util.FileCache import FileCache -from ripple.util import ConfigFile -from ripple.util import File -from ripple.util import Range - -class Server(object): - def __init__(self): - cfg_file = File.normalize(ARGS.config or 'rippled.cfg') - self.config = ConfigFile.read(open(cfg_file)) - if ARGS.database != ARGS.NONE: - reader = DatabaseReader.DatabaseReader(self.config) - else: - reader = RippledReader.RippledReader(self.config) - - self.reader = reader - self.complete = reader.complete - - names = { - 'closed': reader.name_to_ledger_index('closed'), - 'current': reader.name_to_ledger_index('current'), - 'validated': reader.name_to_ledger_index('validated'), - 'first': self.complete[0] if self.complete else None, - 'last': self.complete[-1] if self.complete else None, - } - self.__dict__.update(names) - self.ledgers = sorted(Range.join_ranges(*ARGS.ledgers, **names)) - - def make_cache(is_full): - name = 'full' if is_full else 'summary' - filepath = os.path.join(ARGS.cache, name) - creator = lambda n: reader.get_ledger(n, is_full) - return FileCache(filepath, creator) - self._caches = [make_cache(False), make_cache(True)] - - def info(self): - return self.reader.info - - def cache(self, is_full): - return self._caches[is_full] - - def get_ledger(self, number, is_full=False): - num = int(number) - save_in_cache = num in self.complete - can_create = (not ARGS.offline and - self.complete and - self.complete[0] <= num - 1) - cache = self.cache(is_full) - return cache.get_data(number, save_in_cache, can_create) diff --git a/bin/python/ripple/ledger/ServerReader.py b/bin/python/ripple/ledger/ServerReader.py deleted file mode 100644 index 161560ad6f..0000000000 --- a/bin/python/ripple/ledger/ServerReader.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -class ServerReader(object): - def __init__(self, config): - raise ValueError('Direct server connections are not yet implemented.') diff --git a/bin/python/ripple/ledger/__init__.py b/bin/python/ripple/ledger/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/bin/python/ripple/ledger/commands/Cache.py b/bin/python/ripple/ledger/commands/Cache.py deleted file mode 100644 index 33e51c12c8..0000000000 --- a/bin/python/ripple/ledger/commands/Cache.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -from ripple.ledger.Args import ARGS -from ripple.util import Log -from ripple.util import Range -from ripple.util.PrettyPrint import pretty_print - -SAFE = True - -HELP = """cache -return server_info""" - -def cache(server, clear=False): - cache = server.cache(ARGS.full) - name = ['summary', 'full'][ARGS.full] - files = cache.file_count() - if not files: - Log.error('No files in %s cache.' % name) - - elif clear: - if not clear.strip() == 'clear': - raise Exception("Don't understand 'clear %s'." % clear) - if not ARGS.yes: - yes = raw_input('OK to clear %s cache? (y/N) ' % name) - if not yes.lower().startswith('y'): - Log.out('Cancelled.') - return - cache.clear(ARGS.full) - Log.out('%s cache cleared - %d file%s deleted.' % - (name.capitalize(), files, '' if files == 1 else 's')) - - else: - caches = (int(c) for c in cache.cache_list()) - Log.out(Range.to_string(caches)) diff --git a/bin/python/ripple/ledger/commands/Info.py b/bin/python/ripple/ledger/commands/Info.py deleted file mode 100644 index cf1d5685e2..0000000000 --- a/bin/python/ripple/ledger/commands/Info.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -from ripple.ledger.Args import ARGS -from ripple.util import Log -from ripple.util import Range -from ripple.util.PrettyPrint import pretty_print - -SAFE = True - -HELP = 'info - return server_info' - -def info(server): - Log.out('first =', server.first) - Log.out('last =', server.last) - Log.out('closed =', server.closed) - Log.out('current =', server.current) - Log.out('validated =', server.validated) - Log.out('complete =', Range.to_string(server.complete)) - - if ARGS.full: - Log.out(pretty_print(server.info())) diff --git a/bin/python/ripple/ledger/commands/Print.py b/bin/python/ripple/ledger/commands/Print.py deleted file mode 100644 index 77b65aa9fd..0000000000 --- a/bin/python/ripple/ledger/commands/Print.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -from ripple.ledger.Args import ARGS -from ripple.ledger import SearchLedgers - -import json - -SAFE = True - -HELP = """print - -Print the ledgers to stdout. The default command.""" - -def run_print(server): - ARGS.display(print, server, SearchLedgers.search(server)) diff --git a/bin/python/ripple/ledger/commands/__init__.py b/bin/python/ripple/ledger/commands/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/bin/python/ripple/ledger/conditions/__init__.py b/bin/python/ripple/ledger/conditions/__init__.py deleted file mode 100644 index ab3af2a2ef..0000000000 --- a/bin/python/ripple/ledger/conditions/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -def all_ledgers(server, ledger_number): - return True diff --git a/bin/python/ripple/ledger/displays/__init__.py b/bin/python/ripple/ledger/displays/__init__.py deleted file mode 100644 index b91a6c1c0a..0000000000 --- a/bin/python/ripple/ledger/displays/__init__.py +++ /dev/null @@ -1,89 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -from functools import wraps - -import jsonpath_rw - -from ripple.ledger.Args import ARGS -from ripple.util import Dict -from ripple.util import Log -from ripple.util import Range -from ripple.util.Decimal import Decimal -from ripple.util.PrettyPrint import pretty_print, Streamer - -TRANSACT_FIELDS = ( - 'accepted', - 'close_time_human', - 'closed', - 'ledger_index', - 'total_coins', - 'transactions', -) - -LEDGER_FIELDS = ( - 'accepted', - 'accountState', - 'close_time_human', - 'closed', - 'ledger_index', - 'total_coins', - 'transactions', -) - -def _dict_filter(d, keys): - return dict((k, v) for (k, v) in d.items() if k in keys) - -def ledger_number(print, server, numbers): - print(Range.to_string(numbers)) - -def display(f): - @wraps(f) - def wrapper(printer, server, numbers, *args): - streamer = Streamer(printer=printer) - for number in numbers: - ledger = server.get_ledger(number, ARGS.full) - if ledger: - streamer.add(number, f(ledger, *args)) - streamer.finish() - return wrapper - -def extractor(f): - @wraps(f) - def wrapper(printer, server, numbers, *paths): - try: - find = jsonpath_rw.parse('|'.join(paths)).find - except: - raise ValueError("Can't understand jsonpath '%s'." % path) - def fn(ledger, *args): - return f(find(ledger), *args) - display(fn)(printer, server, numbers) - return wrapper - -@display -def ledger(ledger, full=False): - if ARGS.full: - if full: - return ledger - - ledger = Dict.prune(ledger, 1, False) - - return _dict_filter(ledger, LEDGER_FIELDS) - -@display -def prune(ledger, level=1): - return Dict.prune(ledger, level, False) - -@display -def transact(ledger): - return _dict_filter(ledger, TRANSACT_FIELDS) - -@extractor -def extract(finds): - return dict((str(f.full_path), str(f.value)) for f in finds) - -@extractor -def sum(finds): - d = Decimal() - for f in finds: - d.accumulate(f.value) - return [str(d), len(finds)] diff --git a/bin/python/ripple/util/Base58.py b/bin/python/ripple/util/Base58.py deleted file mode 100644 index f7e392416f..0000000000 --- a/bin/python/ripple/util/Base58.py +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/env python - -from hashlib import sha256 - -# -# Human strings are base-58 with a -# version prefix and a checksum suffix. -# -# Copied from ripple/protocol/RippleAddress.h -# - -VER_NONE = 1 -VER_NODE_PUBLIC = 28 -VER_NODE_PRIVATE = 32 -VER_ACCOUNT_ID = 0 -VER_ACCOUNT_PUBLIC = 35 -VER_ACCOUNT_PRIVATE = 34 -VER_FAMILY_GENERATOR = 41 -VER_FAMILY_SEED = 33 - -ALPHABET = 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz' - -VERSION_NAME = { - VER_NONE: 'VER_NONE', - VER_NODE_PUBLIC: 'VER_NODE_PUBLIC', - VER_NODE_PRIVATE: 'VER_NODE_PRIVATE', - VER_ACCOUNT_ID: 'VER_ACCOUNT_ID', - VER_ACCOUNT_PUBLIC: 'VER_ACCOUNT_PUBLIC', - VER_ACCOUNT_PRIVATE: 'VER_ACCOUNT_PRIVATE', - VER_FAMILY_GENERATOR: 'VER_FAMILY_GENERATOR', - VER_FAMILY_SEED: 'VER_FAMILY_SEED' -} - -class Alphabet(object): - def __init__(self, radix, digit_to_char, char_to_digit): - self.radix = radix - self.digit_to_char = digit_to_char - self.char_to_digit = char_to_digit - - def transcode_from(self, s, source_alphabet): - n, zero_count = source_alphabet._digits_to_number(s) - digits = [] - while n > 0: - n, digit = divmod(n, self.radix) - digits.append(self.digit_to_char(digit)) - - s = ''.join(digits) - return self.digit_to_char(0) * zero_count + s[::-1] - - def _digits_to_number(self, digits): - stripped = digits.lstrip(self.digit_to_char(0)) - n = 0 - for d in stripped: - n *= self.radix - n += self.char_to_digit(d) - return n, len(digits) - len(stripped) - -_INVERSE_INDEX = dict((c, i) for (i, c) in enumerate(ALPHABET)) - -# In base 58 encoding, the digits come from the ALPHABET string. -BASE58 = Alphabet(len(ALPHABET), ALPHABET.__getitem__, _INVERSE_INDEX.get) - -# In base 256 encoding, each digit is just a character between 0 and 255. -BASE256 = Alphabet(256, chr, ord) - -def encode(b): - return BASE58.transcode_from(b, BASE256) - -def decode(b): - return BASE256.transcode_from(b, BASE58) - -def checksum(b): - """Returns a 4-byte checksum of a binary.""" - return sha256(sha256(b).digest()).digest()[:4] - -def encode_version(ver, b): - """Encodes a version encoding and a binary as human string.""" - b = chr(ver) + b - return encode(b + checksum(b)) - -def decode_version(s): - """Decodes a human base-58 string into its version encoding and binary.""" - b = decode(s) - body, check = b[:-4], b[-4:] - assert check == checksum(body), ('Bad checksum for', s) - return ord(body[0]), body[1:] - -def version_name(ver): - return VERSION_NAME.get(ver) or ('(unknown version %s)' % ver) - -def check_version(version, expected): - if version != expected: - raise ValueError('Expected version %s but got %s' % ( - version_name(version), version_name(expected))) diff --git a/bin/python/ripple/util/Cache.py b/bin/python/ripple/util/Cache.py deleted file mode 100644 index 68f50e0270..0000000000 --- a/bin/python/ripple/util/Cache.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -from collections import defaultdict - -class Cache(object): - def __init__(self): - self._value_to_index = {} - self._index_to_value = [] - - def value_to_index(self, value, **kwds): - index = self._value_to_index.get(value, None) - if index is None: - index = len(self._index_to_value) - self._index_to_value.append((value, kwds)) - self._value_to_index[value] = index - return index - - def index_to_value(self, index): - return self._index_to_value[index] - -def NamedCache(): - return defaultdict(Cache) - -def cache_by_key(d, keyfunc=None, exclude=None): - cache = defaultdict(Cache) - exclude = exclude or None - keyfunc = keyfunc or (lambda x: x) - - def visit(item): - if isinstance(item, list): - for i, x in enumerate(item): - item[i] = visit(x) - - elif isinstance(item, dict): - for k, v in item.items(): - item[k] = visit(v) - - return item - - return cache diff --git a/bin/python/ripple/util/CommandList.py b/bin/python/ripple/util/CommandList.py deleted file mode 100644 index df7abf8945..0000000000 --- a/bin/python/ripple/util/CommandList.py +++ /dev/null @@ -1,77 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -# Code taken from github/rec/grit. - -import os -import sys - -from collections import namedtuple - -from ripple.ledger.Args import ARGS -from ripple.util import Log - -Command = namedtuple('Command', 'function help safe') - -def make_command(module): - name = module.__name__.split('.')[-1].lower() - return name, Command(getattr(module, name, None) or - getattr(module, 'run_' + name), - getattr(module, 'HELP'), - getattr(module, 'SAFE', False)) - -class CommandList(object): - def __init__(self, *args, **kwds): - self.registry = {} - self.register(*args, **kwds) - - def register(self, *modules, **kwds): - for module in modules: - name, command = make_command(module) - self.registry[name] = command - - for k, v in kwds.items(): - if not isinstance(v, (list, tuple)): - v = [v] - self.register_one(k, *v) - - def keys(self): - return self.registry.keys() - - def register_one(self, name, function, help='', safe=False): - assert name not in self.registry - self.registry[name] = Command(function, help, safe) - - def _get(self, command): - command = command.lower() - c = self.registry.get(command) - if c: - return command, c - commands = [c for c in self.registry if c.startswith(command)] - if len(commands) == 1: - command = commands[0] - return command, self.registry[command] - if not commands: - raise ValueError('No such command: %s. Commands are %s.' % - (command, ', '.join(sorted(self.registry)))) - if len(commands) > 1: - raise ValueError('Command %s was ambiguous: %s.' % - (command, ', '.join(commands))) - - def get(self, command): - return self._get(command)[1] - - def run(self, command, *args): - return self.get(command).function(*args) - - def run_safe(self, command, *args): - name, cmd = self._get(command) - if not (ARGS.yes or cmd.safe): - confirm = raw_input('OK to execute "rl %s %s"? (y/N) ' % - (name, ' '.join(args))) - if not confirm.lower().startswith('y'): - Log.error('Cancelled.') - return - cmd.function(*args) - - def help(self, command): - return self.get(command).help() diff --git a/bin/python/ripple/util/ConfigFile.py b/bin/python/ripple/util/ConfigFile.py deleted file mode 100644 index 2816216593..0000000000 --- a/bin/python/ripple/util/ConfigFile.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -import json - -"""Ripple has a proprietary format for their .cfg files, so we need a reader for -them.""" - -def read(lines): - sections = [] - section = [] - for line in lines: - line = line.strip() - if (not line) or line[0] == '#': - continue - if line.startswith('['): - if section: - sections.append(section) - section = [] - section.append(line) - if section: - sections.append(section) - - result = {} - for section in sections: - option = section.pop(0) - assert section, ('No value for option "%s".' % option) - assert option.startswith('[') and option.endswith(']'), ( - 'No option name in block "%s"' % p[0]) - option = option[1:-1] - assert option not in result, 'Duplicate option "%s".' % option - - subdict = {} - items = [] - for part in section: - if '=' in part: - assert not items, 'Dictionary mixed with list.' - k, v = part.split('=', 1) - assert k not in subdict, 'Repeated dictionary entry ' + k - subdict[k] = v - else: - assert not subdict, 'List mixed with dictionary.' - if part.startswith('{'): - items.append(json.loads(part)) - else: - words = part.split() - if len(words) > 1: - items.append(words) - else: - items.append(part) - if len(items) == 1: - result[option] = items[0] - else: - result[option] = items or subdict - return result diff --git a/bin/python/ripple/util/Database.py b/bin/python/ripple/util/Database.py deleted file mode 100644 index 689b058710..0000000000 --- a/bin/python/ripple/util/Database.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -import sqlite3 - -def fetchall(database, query, kwds): - conn = sqlite3.connect(database) - try: - cursor = conn.execute(query, kwds) - return cursor.fetchall() - - finally: - conn.close() diff --git a/bin/python/ripple/util/Decimal.py b/bin/python/ripple/util/Decimal.py deleted file mode 100644 index db4b01cb5c..0000000000 --- a/bin/python/ripple/util/Decimal.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -"""Fixed point numbers.""" - -POSITIONS = 10 -POSITIONS_SHIFT = 10 ** POSITIONS - -class Decimal(object): - def __init__(self, desc='0'): - if isinstance(desc, int): - self.value = desc - return - if desc.startswith('-'): - sign = -1 - desc = desc[1:] - else: - sign = 1 - parts = desc.split('.') - if len(parts) == 1: - parts.append('0') - elif len(parts) > 2: - raise Exception('Too many decimals in "%s"' % desc) - number, decimal = parts - # Fix the number of positions. - decimal = (decimal + POSITIONS * '0')[:POSITIONS] - self.value = sign * int(number + decimal) - - def accumulate(self, item): - if not isinstance(item, Decimal): - item = Decimal(item) - self.value += item.value - - def __str__(self): - if self.value >= 0: - sign = '' - value = self.value - else: - sign = '-' - value = -self.value - number = value // POSITIONS_SHIFT - decimal = (value % POSITIONS_SHIFT) * POSITIONS_SHIFT - - if decimal: - return '%s%s.%s' % (sign, number, str(decimal).rstrip('0')) - else: - return '%s%s' % (sign, number) diff --git a/bin/python/ripple/util/Dict.py b/bin/python/ripple/util/Dict.py deleted file mode 100644 index d1710078f7..0000000000 --- a/bin/python/ripple/util/Dict.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -def count_all_subitems(x): - """Count the subitems of a Python object, including the object itself.""" - if isinstance(x, list): - return 1 + sum(count_all_subitems(i) for i in x) - if isinstance(x, dict): - return 1 + sum(count_all_subitems(i) for i in x.itervalues()) - return 1 - -def prune(item, level, count_recursively=True): - def subitems(x): - i = count_all_subitems(x) - 1 if count_recursively else len(x) - return '1 subitem' if i == 1 else '%d subitems' % i - - assert level >= 0 - if not item: - return item - - if isinstance(item, list): - if level: - return [prune(i, level - 1, count_recursively) for i in item] - else: - return '[list with %s]' % subitems(item) - - if isinstance(item, dict): - if level: - return dict((k, prune(v, level - 1, count_recursively)) - for k, v in item.iteritems()) - else: - return '{dict with %s}' % subitems(item) - - return item diff --git a/bin/python/ripple/util/File.py b/bin/python/ripple/util/File.py deleted file mode 100644 index 90ffa72bdf..0000000000 --- a/bin/python/ripple/util/File.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -import os - -def normalize(f): - f = os.path.join(*f.split('/')) # For Windows users. - return os.path.abspath(os.path.expanduser(f)) diff --git a/bin/python/ripple/util/FileCache.py b/bin/python/ripple/util/FileCache.py deleted file mode 100644 index 259e42020f..0000000000 --- a/bin/python/ripple/util/FileCache.py +++ /dev/null @@ -1,56 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -import gzip -import json -import os - -_NONE = object() - -class FileCache(object): - """A two-level cache, which stores expensive results in memory and on disk. - """ - def __init__(self, cache_directory, creator, open=gzip.open, suffix='.gz'): - self.cache_directory = cache_directory - self.creator = creator - self.open = open - self.suffix = suffix - self.cached_data = {} - if not os.path.exists(self.cache_directory): - os.makedirs(self.cache_directory) - - def get_file_data(self, name): - if os.path.exists(filename): - return json.load(self.open(filename)) - - result = self.creator(name) - return result - - def get_data(self, name, save_in_cache, can_create, default=None): - name = str(name) - result = self.cached_data.get(name, _NONE) - if result is _NONE: - filename = os.path.join(self.cache_directory, name) + self.suffix - if os.path.exists(filename): - result = json.load(self.open(filename)) or _NONE - if result is _NONE and can_create: - result = self.creator(name) - if save_in_cache: - json.dump(result, self.open(filename, 'w')) - return default if result is _NONE else result - - def _files(self): - return os.listdir(self.cache_directory) - - def cache_list(self): - for f in self._files(): - if f.endswith(self.suffix): - yield f[:-len(self.suffix)] - - def file_count(self): - return len(self._files()) - - def clear(self): - """Clears both local files and memory.""" - self.cached_data = {} - for f in self._files(): - os.remove(os.path.join(self.cache_directory, f)) diff --git a/bin/python/ripple/util/Function.py b/bin/python/ripple/util/Function.py deleted file mode 100644 index d6fe864533..0000000000 --- a/bin/python/ripple/util/Function.py +++ /dev/null @@ -1,82 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -"""A function that can be specified at the command line, with an argument.""" - -import importlib -import re -import tokenize - -from StringIO import StringIO - -MATCHER = re.compile(r'([\w.]+)(.*)') - -REMAPPINGS = { - 'false': False, - 'true': True, - 'null': None, - 'False': False, - 'True': True, - 'None': None, -} - -def eval_arguments(args): - args = args.strip() - if not args or (args == '()'): - return () - tokens = list(tokenize.generate_tokens(StringIO(args).readline)) - def remap(): - for type, name, _, _, _ in tokens: - if type == tokenize.NAME and name not in REMAPPINGS: - yield tokenize.STRING, '"%s"' % name - else: - yield type, name - untok = tokenize.untokenize(remap()) - if untok[1:-1].strip(): - untok = untok[:-1] + ',)' # Force a tuple. - try: - return eval(untok, REMAPPINGS) - except Exception as e: - raise ValueError('Couldn\'t evaluate expression "%s" (became "%s"), ' - 'error "%s"' % (args, untok, str(e))) - -class Function(object): - def __init__(self, desc='', default_path=''): - self.desc = desc.strip() - if not self.desc: - # Make an empty function that does nothing. - self.args = () - self.function = lambda *args, **kwds: None - return - - m = MATCHER.match(desc) - if not m: - raise ValueError('"%s" is not a function' % desc) - self.function, self.args = (g.strip() for g in m.groups()) - self.args = eval_arguments(self.args) - - if '.' not in self.function: - if default_path and not default_path.endswith('.'): - default_path += '.' - self.function = default_path + self.function - p, m = self.function.rsplit('.', 1) - mod = importlib.import_module(p) - # Errors in modules are swallowed here. - # except: - # raise ValueError('Can\'t find Python module "%s"' % p) - - try: - self.function = getattr(mod, m) - except: - raise ValueError('No function "%s" in module "%s"' % (m, p)) - - def __str__(self): - return self.desc - - def __call__(self, *args, **kwds): - return self.function(*(args + self.args), **kwds) - - def __eq__(self, other): - return self.function == other.function and self.args == other.args - - def __ne__(self, other): - return not (self == other) diff --git a/bin/python/ripple/util/Log.py b/bin/python/ripple/util/Log.py deleted file mode 100644 index 8283f709d2..0000000000 --- a/bin/python/ripple/util/Log.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -import sys - -VERBOSE = False - -def out(*args, **kwds): - kwds.get('print', print)(*args, file=sys.stdout, **kwds) - -def info(*args, **kwds): - if VERBOSE: - out(*args, **kwds) - -def warn(*args, **kwds): - out('WARNING:', *args, **kwds) - -def error(*args, **kwds): - out('ERROR:', *args, **kwds) - -def fatal(*args, **kwds): - raise Exception('FATAL: ' + ' '.join(str(a) for a in args)) diff --git a/bin/python/ripple/util/PrettyPrint.py b/bin/python/ripple/util/PrettyPrint.py deleted file mode 100644 index 54f0eee6c8..0000000000 --- a/bin/python/ripple/util/PrettyPrint.py +++ /dev/null @@ -1,42 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -from functools import wraps -import json - -SEPARATORS = ',', ': ' -INDENT = ' ' - -def pretty_print(item): - return json.dumps(item, - sort_keys=True, - indent=len(INDENT), - separators=SEPARATORS) - -class Streamer(object): - def __init__(self, printer=print): - # No automatic spacing or carriage returns. - self.printer = lambda *args: printer(*args, end='', sep='') - self.first_key = True - - def add(self, key, value): - if self.first_key: - self.first_key = False - self.printer('{') - else: - self.printer(',') - - self.printer('\n', INDENT, '"', str(key), '": ') - - pp = pretty_print(value).splitlines() - if len(pp) > 1: - for i, line in enumerate(pp): - if i > 0: - self.printer('\n', INDENT) - self.printer(line) - else: - self.printer(pp[0]) - - def finish(self): - if not self.first_key: - self.first_key = True - self.printer('\n}') diff --git a/bin/python/ripple/util/Range.py b/bin/python/ripple/util/Range.py deleted file mode 100644 index b3ea709679..0000000000 --- a/bin/python/ripple/util/Range.py +++ /dev/null @@ -1,53 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -""" -Convert a discontiguous range of integers to and from a human-friendly form. - -Real world example is the server_info.complete_ledgers: - 8252899-8403772,8403824,8403827-8403830,8403834-8403876 - -""" - -def from_string(desc, **aliases): - if not desc: - return [] - result = set() - for d in desc.split(','): - nums = [int(aliases.get(x) or x) for x in d.split('-')] - if len(nums) == 1: - result.add(nums[0]) - elif len(nums) == 2: - result.update(range(nums[0], nums[1] + 1)) - return result - -def to_string(r): - groups = [] - next_group = [] - for i, x in enumerate(sorted(r)): - if next_group and (x - next_group[-1]) > 1: - groups.append(next_group) - next_group = [] - next_group.append(x) - if next_group: - groups.append(next_group) - - def display(g): - if len(g) == 1: - return str(g[0]) - else: - return '%s-%s' % (g[0], g[-1]) - - return ','.join(display(g) for g in groups) - -def is_range(desc, *names): - try: - from_string(desc, **dict((n, 1) for n in names)) - return True; - except ValueError: - return False - -def join_ranges(*ranges, **aliases): - result = set() - for r in ranges: - result.update(from_string(r, **aliases)) - return result diff --git a/bin/python/ripple/util/Search.py b/bin/python/ripple/util/Search.py deleted file mode 100644 index ae86270360..0000000000 --- a/bin/python/ripple/util/Search.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -FIRST, LAST = range(2) - -def binary_search(begin, end, condition, location=FIRST): - """Search for an i in the interval [begin, end] where condition(i) is true. - If location is FIRST, return the first such i. - If location is LAST, return the last such i. - If there is no such i, then throw an exception. - """ - b = condition(begin) - e = condition(end) - if b and e: - return begin if location == FIRST else end - - if not (b or e): - raise ValueError('%d/%d' % (begin, end)) - - if b and location is FIRST: - return begin - - if e and location is LAST: - return end - - width = end - begin + 1 - if width == 1: - if not b: - raise ValueError('%d/%d' % (begin, end)) - return begin - if width == 2: - return begin if b else end - - mid = (begin + end) // 2 - m = condition(mid) - - if m == b: - return binary_search(mid, end, condition, location) - else: - return binary_search(begin, mid, condition, location) - -def linear_search(items, condition): - """Yields each i in the interval [begin, end] where condition(i) is true. - """ - for i in items: - if condition(i): - yield i diff --git a/bin/python/ripple/util/Sign.py b/bin/python/ripple/util/Sign.py deleted file mode 100644 index e0eda78f37..0000000000 --- a/bin/python/ripple/util/Sign.py +++ /dev/null @@ -1,233 +0,0 @@ -#!/usr/bin/env python - -from __future__ import print_function - -import base64, os, random, struct, sys -import ed25519 -import ecdsa -import hashlib -from ripple.util import Base58 -from ripple.ledger import SField - -ED25519_BYTE = chr(0xed) -WRAP_COLUMNS = 72 - -USAGE = """\ -Usage: - create - Create a new master public/secret key pair. - - create - Generate master key pair using provided secret. - - check - Check an existing key for validity. - - sign - Create a new signed manifest with the given sequence - number and keys. - """ - -def prepend_length_byte(b): - assert len(b) <= 192, 'Too long' - return chr(len(b)) + b - -def to_int32(i): - return struct.pack('>I', i) - -#----------------------------------------------------------- - -def make_seed(urandom=os.urandom): - # This is not used. - return urandom(16) - -def make_ed25519_keypair(urandom=os.urandom): - sk = urandom(32) - return sk, ed25519.publickey(sk) - -def make_ecdsa_keypair(urandom=None): - # This is not used. - sk = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1, entropy=urandom) - # Can't be unit tested easily - need a mock for ecdsa. - vk = sk.get_verifying_key() - sig = sk.sign('message') - assert vk.verify(sig, 'message') - return sk, vk - -def make_seed_from_passphrase(passphrase): - # For convenience, like say testing against rippled we can hash a passphrase - # to get the seed. validation_create (Josh may have killed it by now) takes - # an optional arg, which can be a base58 encoded seed, or a passphrase. - return hashlib.sha512(passphrase).digest()[:16] - -def make_manifest(master_pk, validation_pk, seq): - """create a manifest - - Parameters - ---------- - master_pk : string - validator's master public key (binary, _not_ BASE58 encoded) - validation_pk : string - validator's validation public key (binary, _not_ BASE58 encoded) - seq : int - manifest sequence number - - Returns - ---------- - string - String with fields for seq, master_pk, validation_pk - """ - return ''.join([ - SField.sfSequence, - to_int32(seq), - SField.sfPublicKey, - prepend_length_byte(master_pk), - SField.sfSigningPubKey, - prepend_length_byte(validation_pk)]) - -def sign_manifest(manifest, validation_sk, master_sk, master_pk): - """sign a validator manifest - - Parameters - ---------- - manifest : string - manifest to sign - validation_sk : string - validator's validation secret key (binary, _not_ BASE58 encoded) - This is one of the keys that will sign the manifest. - master_sk : string - validator's master secret key (binary, _not_ BASE58 encoded) - This is one of the keys that will sign the manifest. - master_pk : string - validator's master public key (binary, _not_ BASE58 encoded) - - Returns - ---------- - string - manifest signed by both the validation and master keys - """ - man_hash = hashlib.sha512('MAN\0' + manifest).digest()[:32] - validation_sig = validation_sk.sign_digest_deterministic( - man_hash, hashfunc=hashlib.sha256, sigencode=ecdsa.util.sigencode_der_canonize) - master_sig = ed25519.signature('MAN\0' + manifest, master_sk, master_pk) - return manifest + SField.sfSignature + prepend_length_byte(validation_sig) + \ - SField.sfMasterSignature + prepend_length_byte(master_sig) - -def wrap(s, cols=WRAP_COLUMNS): - if s: - size = max((len(s) + cols - 1) / cols, 1) - w = len(s) / size - s = '\n'.join(s[i:i + w] for i in range(0, len(s), w)) - return s - -def create_ed_keys(urandom=os.urandom): - sk, pk = make_ed25519_keypair(urandom) - pk_human = Base58.encode_version( - Base58.VER_NODE_PUBLIC, ED25519_BYTE + pk) - sk_human = Base58.encode_version( - Base58.VER_NODE_PRIVATE, sk) - return pk_human, sk_human - -def create_ed_public_key(sk_human): - v, sk = Base58.decode_version(sk_human) - check_secret_key(v, sk) - - pk = ed25519.publickey(sk) - pk_human = Base58.encode_version( - Base58.VER_NODE_PUBLIC, ED25519_BYTE + pk) - return pk_human - -def check_validation_public_key(v, pk): - Base58.check_version(v, Base58.VER_NODE_PUBLIC) - if len(pk) != 33: - raise ValueError('Validation public key should be length 33, is %s' % - len(pk)) - b = ord(pk[0]) - if b not in (2, 3): - raise ValueError('First validation public key byte must be 2 or 3, is %d' % b) - -def check_secret_key(v, sk): - Base58.check_version(v, Base58.VER_NODE_PRIVATE) - if len(sk) != 32: - raise ValueError('Length of master secret should be 32, is %s' % - len(sk)) - -def get_signature(seq, validation_pk_human, validation_sk_human, master_sk_human): - v, validation_pk = Base58.decode_version(validation_pk_human) - check_validation_public_key(v, validation_pk) - - v, validation_sk_str = Base58.decode_version(validation_sk_human) - check_secret_key(v, validation_sk_str) - validation_sk = ecdsa.SigningKey.from_string(validation_sk_str, curve=ecdsa.SECP256k1) - - v, master_sk = Base58.decode_version(master_sk_human) - check_secret_key(v, master_sk) - - pk = ed25519.publickey(master_sk) - apk = ED25519_BYTE + pk - m = make_manifest(apk, validation_pk, seq) - m1 = sign_manifest(m, validation_sk, master_sk, pk) - return base64.b64encode(m1) - -# Testable versions of functions. -def perform_create(urandom=os.urandom, print=print): - pk, sk = create_ed_keys(urandom) - print('[validator_keys]', pk, '', '[master_secret]', sk, sep='\n') - -def perform_create_public(sk_human, print=print): - pk_human = create_ed_public_key(sk_human) - print( - '[validator_keys]',pk_human, '', - '[master_secret]', sk_human, sep='\n') - -def perform_check(s, print=print): - version, b = Base58.decode_version(s) - print('version = ' + Base58.version_name(version)) - print('decoded length = ' + str(len(b))) - assert Base58.encode_version(version, b) == s - -def perform_sign( - seq, validation_pk_human, validation_sk_human, master_sk_human, print=print): - print('[validation_manifest]') - print(wrap(get_signature( - int(seq), validation_pk_human, validation_sk_human, master_sk_human))) - -def perform_verify( - seq, validation_pk_human, master_pk_human, signature, print=print): - verify_signature( - int(seq), validation_pk_human, master_pk_human, signature) - print('Signature valid for', master_pk_human) - -# Externally visible versions of functions. -def create(sk_human=None): - if sk_human: - perform_create_public(sk_human) - else: - perform_create() - -def check(s): - perform_check(s) - -def sign(seq, validation_pk_human, validation_sk_human, master_sk_human): - perform_sign(seq, validation_pk_human, validation_sk_human, master_sk_human) - -def usage(*errors): - if errors: - print(*errors) - print(USAGE) - return not errors - -_COMMANDS = dict((f.__name__, f) for f in (create, check, sign)) - -def run_command(args): - if not args: - return usage() - name = args[0] - command = _COMMANDS.get(name) - if not command: - return usage('No such command:', command) - try: - command(*args[1:]) - except TypeError: - return usage('Wrong number of arguments for:', command) - return True diff --git a/bin/python/ripple/util/Time.py b/bin/python/ripple/util/Time.py deleted file mode 100644 index bd434df114..0000000000 --- a/bin/python/ripple/util/Time.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -import datetime - -# Format for human-readable dates in rippled -_DATE_FORMAT = '%Y-%b-%d' -_TIME_FORMAT = '%H:%M:%S' -_DATETIME_FORMAT = '%s %s' % (_DATE_FORMAT, _TIME_FORMAT) - -_FORMATS = _DATE_FORMAT, _TIME_FORMAT, _DATETIME_FORMAT - -def parse_datetime(desc): - for fmt in _FORMATS: - try: - return datetime.date.strptime(desc, fmt) - except: - pass - raise ValueError("Can't understand date '%s'." % date) - -def format_datetime(dt): - return dt.strftime(_DATETIME_FORMAT) diff --git a/bin/python/ripple/util/ValidatorManifestTest.py b/bin/python/ripple/util/ValidatorManifestTest.py deleted file mode 100755 index 3907fb80f2..0000000000 --- a/bin/python/ripple/util/ValidatorManifestTest.py +++ /dev/null @@ -1,682 +0,0 @@ -#!/usr/bin/env python -""" -Test for setting ephemeral keys for the validator manifest. -""" - -from __future__ import ( - absolute_import, division, print_function, unicode_literals -) - -import argparse -import contextlib -from contextlib import contextmanager -import json -import os -import platform -import shutil -import subprocess -import time - -DELAY_WHILE_PROCESS_STARTS_UP = 1.5 -ARGS = None - -NOT_FOUND = -1 # not in log -ACCEPTED_NEW = 0 # added new manifest -ACCEPTED_UPDATE = 1 # replaced old manifest with new -UNTRUSTED = 2 # don't trust master key -STALE = 3 # seq is too old -REVOKED = 4 # revoked validator key -INVALID = 5 # invalid signature - -MANIFEST_ACTION_STR_TO_ID = { - 'NotFound': NOT_FOUND, # not found in log - 'AcceptedNew': ACCEPTED_NEW, - 'AcceptedUpdate': ACCEPTED_UPDATE, - 'Untrusted': UNTRUSTED, - 'Stale': STALE, - 'Revoked': REVOKED, - 'Invalid': INVALID, -} - -MANIFEST_ACTION_ID_TO_STR = { - v: k for k, v in MANIFEST_ACTION_STR_TO_ID.items() -} - -CONF_TEMPLATE = """ -[server] -port_rpc -port_peer -port_wss_admin - -[port_rpc] -port = {rpc_port} -ip = 127.0.0.1 -admin = 127.0.0.1 -protocol = https - -[port_peer] -port = {peer_port} -ip = 0.0.0.0 -protocol = peer - -[port_wss_admin] -port = {wss_port} -ip = 127.0.0.1 -admin = 127.0.0.1 -protocol = wss - -[node_size] -medium - -[node_db] -type={node_db_type} -path={node_db_path} -open_files=2000 -filter_bits=12 -cache_mb=256 -file_size_mb=8 -file_size_mult=2 -online_delete=256 -advisory_delete=0 - -[database_path] -{db_path} - -[debug_logfile] -{debug_logfile} - -[sntp_servers] -time.windows.com -time.apple.com -time.nist.gov -pool.ntp.org - -[ips] -r.ripple.com 51235 - -[ips_fixed] -{sibling_ip} {sibling_port} - -[validators] -n949f75evCHwgyP4fPVgaHqNHxUVN15PsJEZ3B3HnXPcPjcZAoy7 RL1 -n9MD5h24qrQqiyBC8aeqqCWvpiBiYQ3jxSr91uiDvmrkyHRdYLUj RL2 -n9L81uNCaPgtUJfaHh89gmdvXKAmSt5Gdsw2g1iPWaPkAHW5Nm4C RL3 -n9KiYM9CgngLvtRCQHZwgC2gjpdaZcCcbt3VboxiNFcKuwFVujzS RL4 -n9LdgEtkmGB9E2h3K4Vp7iGUaKuq23Zr32ehxiU8FWY7xoxbWTSA RL5 - -[validation_quorum] -3 - -[validation_seed] -{validation_seed} -#vaidation_public_key: {validation_public_key} - -# Other rippled's trusting this validator need this key -[validator_keys] -{all_validator_keys} - -[peer_private] -1 - -[overlay] -expire = 1 -auto_connect = 1 - -[validation_manifest] -{validation_manifest} - -[rpc_startup] -{{ "command": "log_level", "severity": "debug" }} - -[ssl_verify] -0 -""" -# End config template - - -def static_vars(**kwargs): - def decorate(func): - for k in kwargs: - setattr(func, k, kwargs[k]) - return func - return decorate - - -@static_vars(rpc=5005, peer=51235, wss=6006) -def checkout_port_nums(): - """Returns a tuple of port nums for rpc, peer, and wss_admin""" - checkout_port_nums.rpc += 1 - checkout_port_nums.peer += 1 - checkout_port_nums.wss += 1 - return ( - checkout_port_nums.rpc, - checkout_port_nums.peer, - checkout_port_nums.wss - ) - - -def is_windows(): - return platform.system() == 'Windows' - - -def manifest_create(): - """returns dict with keys: 'validator_keys', 'master_secret'""" - to_run = ['python', ARGS.ripple_home + '/bin/python/Manifest.py', 'create'] - r = subprocess.check_output(to_run) - result = {} - k = None - for l in r.splitlines(): - l = l.strip() - if not l: - continue - elif l == '[validator_keys]': - k = l[1:-1] - elif l == '[master_secret]': - k = l[1:-1] - elif l.startswith('['): - raise ValueError( - 'Unexpected key: {} from `manifest create`'.format(l)) - else: - if not k: - raise ValueError('Value with no key') - result[k] = l - k = None - - if k in result: - raise ValueError('Repeat key from `manifest create`: ' + k) - if len(result) != 2: - raise ValueError( - 'Expected 2 keys from `manifest create` but got {} keys instead ({})'. - format(len(result), result)) - - return result - - -def sign_manifest(seq, validation_pk, master_secret): - """returns the signed manifest as a string""" - to_run = ['python', ARGS.ripple_home + '/bin/python/Manifest.py', 'sign', - str(seq), validation_pk, master_secret] - try: - r = subprocess.check_output(to_run) - except subprocess.CalledProcessError as e: - print('Error in sign_manifest: ', e.output) - raise e - result = [] - for l in r.splitlines(): - l.strip() - if not l or l == '[validation_manifest]': - continue - result.append(l) - return '\n'.join(result) - - -def get_ripple_exe(): - """Find the rippled executable""" - prefix = ARGS.ripple_home + '/build/' - exe = ['rippled', 'RippleD.exe'] - to_test = [prefix + t + '.debug/' + e - for t in ['clang', 'gcc', 'msvc'] for e in exe] - for e in exe: - to_test.append(prefix + '/' + e) - for t in to_test: - if os.path.isfile(t): - return t - - -class RippledServer(object): - def __init__(self, exe, config_file, server_out): - self.config_file = config_file - self.exe = exe - self.process = None - self.server_out = server_out - self.reinit(config_file) - - def reinit(self, config_file): - self.config_file = config_file - self.to_run = [self.exe, '--verbose', '--conf', self.config_file] - - @property - def config_root(self): - return os.path.dirname(self.config_file) - - @property - def master_secret_file(self): - return self.config_root + '/master_secret.txt' - - def startup(self): - if ARGS.verbose: - print('starting rippled:' + self.config_file) - fout = open(self.server_out, 'w') - self.process = subprocess.Popen( - self.to_run, stdout=fout, stderr=subprocess.STDOUT) - - def shutdown(self): - if not self.process: - return - fout = open(os.devnull, 'w') - subprocess.Popen( - self.to_run + ['stop'], stdout=fout, stderr=subprocess.STDOUT) - self.process.wait() - self.process = None - - def rotate_logfile(self): - if self.server_out == os.devnull: - return - for i in range(100): - backup_name = '{}.{}'.format(self.server_out, i) - if not os.path.exists(backup_name): - os.rename(self.server_out, backup_name) - return - raise ValueError('Could not rotate logfile: {}'. - format(self.server_out)) - - def validation_create(self): - """returns dict with keys: - 'validation_key', 'validation_public_key', 'validation_seed' - """ - to_run = [self.exe, '-q', '--conf', self.config_file, - '--', 'validation_create'] - try: - return json.loads(subprocess.check_output(to_run))['result'] - except subprocess.CalledProcessError as e: - print('Error in validation_create: ', e.output) - raise e - - -@contextmanager -def rippled_server(config_file, server_out=os.devnull): - """Start a ripple server""" - try: - server = None - server = RippledServer(ARGS.ripple_exe, config_file, server_out) - server.startup() - yield server - finally: - if server: - server.shutdown() - - -@contextmanager -def pause_server(server, config_file): - """Shutdown and then restart a ripple server""" - try: - server.shutdown() - server.rotate_logfile() - yield server - finally: - server.reinit(config_file) - server.startup() - - -def parse_date(d, t): - """Return the timestamp of a line, or none if the line has no timestamp""" - try: - return time.strptime(d+' '+t, '%Y-%B-%d %H:%M:%S') - except: - return None - - -def to_dict(l): - """Given a line of the form Key0: Value0;Key2: Valuue2; Return a dict""" - fields = l.split(';') - result = {} - for f in fields: - if f: - v = f.split(':') - assert len(v) == 2 - result[v[0].strip()] = v[1].strip() - return result - - -def check_ephemeral_key(validator_key, - log_file, - seq, - change_time): - """ - Detect when a server is informed of a validator's ephemeral key change. - `change_time` and `seq` may be None, in which case they are ignored. - """ - manifest_prefix = 'Manifest:' - # a manifest line has the form Manifest: action; Key: value; - # Key can be Pk (public key), Seq, OldSeq, - for l in open(log_file): - sa = l.split() - if len(sa) < 5 or sa[4] != manifest_prefix: - continue - - d = to_dict(' '.join(sa[4:])) - # check the seq number and validator_key - if d['Pk'] != validator_key: - continue - if seq is not None and int(d['Seq']) != seq: - continue - - if change_time: - t = parse_date(sa[0], sa[1]) - if not t or t < change_time: - continue - action = d['Manifest'] - return MANIFEST_ACTION_STR_TO_ID[action] - return NOT_FOUND - - -def check_ephemeral_keys(validator_key, - log_files, - seq, - change_time=None, - timeout_s=60): - result = [NOT_FOUND for i in range(len(log_files))] - if timeout_s < 10: - sleep_time = 1 - elif timeout_s < 60: - sleep_time = 5 - else: - sleep_time = 10 - n = timeout_s//sleep_time - if n == 0: - n = 1 - start_time = time.time() - for _ in range(n): - for i, lf in enumerate(log_files): - if result[i] != NOT_FOUND: - continue - result[i] = check_ephemeral_key(validator_key, - lf, - seq, - change_time) - if result[i] != NOT_FOUND: - if all(r != NOT_FOUND for r in result): - return result - else: - server_dir = os.path.basename(os.path.dirname(log_files[i])) - if ARGS.verbose: - print('Check for {}: {}'.format( - server_dir, MANIFEST_ACTION_ID_TO_STR[result[i]])) - tsf = time.time() - start_time - if tsf > 20: - if ARGS.verbose: - print('Waiting for key to propigate: ', tsf) - time.sleep(sleep_time) - return result - - -def get_validator_key(config_file): - in_validator_keys = False - for l in open(config_file): - sl = l.strip() - if not in_validator_keys and sl == '[validator_keys]': - in_validator_keys = True - continue - if in_validator_keys: - if sl.startswith('['): - raise ValueError('ThisServer validator key not found') - if sl.startswith('#'): - continue - s = sl.split() - if len(s) == 2 and s[1] == 'ThisServer': - return s[0] - - -def new_config_ephemeral_key( - server, seq, rm_dbs=False, master_secret_file=None): - """Generate a new ephemeral key, add to config, restart server""" - config_root = server.config_root - config_file = config_root + '/rippled.cfg' - db_dir = config_root + '/db' - if not master_secret_file: - master_secret_file = server.master_secret_file - with open(master_secret_file) as f: - master_secret = f.read() - v = server.validation_create() - signed = sign_manifest(seq, v['validation_public_key'], master_secret) - with pause_server(server, config_file): - if rm_dbs and os.path.exists(db_dir): - shutil.rmtree(db_dir) - os.makedirs(db_dir) - # replace the validation_manifest section with `signed` - bak = config_file + '.bak' - if is_windows() and os.path.isfile(bak): - os.remove(bak) - os.rename(config_file, bak) - in_manifest = False - with open(bak, 'r') as src: - with open(config_file, 'w') as out: - for l in src: - sl = l.strip() - if not in_manifest and sl == '[validation_manifest]': - in_manifest = True - elif in_manifest: - if sl.startswith('[') or sl.startswith('#'): - in_manifest = False - out.write(signed) - out.write('\n\n') - else: - continue - out.write(l) - return (bak, config_file) - - -def parse_args(): - parser = argparse.ArgumentParser( - description=('Create config files for n validators') - ) - - parser.add_argument( - '--ripple_home', '-r', - default=os.sep.join(os.path.realpath(__file__).split(os.sep)[:-5]), - help=('Root directory of the ripple repo'), ) - parser.add_argument('--num_validators', '-n', - default=2, - help=('Number of validators'), ) - parser.add_argument('--conf', '-c', help=('rippled config file'), ) - parser.add_argument('--out', '-o', - default='test_output', - help=('config root directory'), ) - parser.add_argument( - '--existing', '-e', - action='store_true', - help=('use existing config files'), ) - parser.add_argument( - '--generate', '-g', - action='store_true', - help=('generate conf files only'), ) - parser.add_argument( - '--verbose', '-v', - action='store_true', - help=('verbose status reporting'), ) - parser.add_argument( - '--quiet', '-q', - action='store_true', - help=('quiet status reporting'), ) - - return parser.parse_args() - - -def get_configs(manifest_seq): - global ARGS - ARGS.ripple_home = os.path.expanduser(ARGS.ripple_home) - - n = int(ARGS.num_validators) - if n<2: - raise ValueError( - 'Need at least 2 rippled servers. Specified: {}'.format(n)) - config_root = ARGS.out - ARGS.ripple_exe = get_ripple_exe() - if not ARGS.ripple_exe: - raise ValueError('No Exe Found') - - if ARGS.existing: - return [ - os.path.abspath('{}/validator_{}/rippled.cfg'.format(config_root, i)) - for i in range(n) - ] - - initial_config = ARGS.conf - - manifests = [manifest_create() for i in range(n)] - port_nums = [checkout_port_nums() for i in range(n)] - with rippled_server(initial_config) as server: - time.sleep(DELAY_WHILE_PROCESS_STARTS_UP) - validations = [server.validation_create() for i in range(n)] - - signed_manifests = [sign_manifest(manifest_seq, - v['validation_public_key'], - m['master_secret']) - for m, v in zip(manifests, validations)] - node_db_type = 'RocksDB' if not is_windows() else 'NuDB' - node_db_filename = node_db_type.lower() - - config_files = [] - for i, (m, v, s) in enumerate(zip(manifests, validations, signed_manifests)): - sibling_index = (i - 1) % len(manifests) - all_validator_keys = '\n'.join([ - m['validator_keys'] + ' ThisServer', - manifests[sibling_index]['validator_keys'] + ' NextInRing']) - this_validator_dir = os.path.abspath( - '{}/validator_{}'.format(config_root, i)) - db_path = this_validator_dir + '/db' - node_db_path = db_path + '/' + node_db_filename - log_path = this_validator_dir + '/log' - debug_logfile = log_path + '/debug.log' - rpc_port, peer_port, wss_port = port_nums[i] - sibling_ip = '127.0.0.1' - sibling_port = port_nums[sibling_index][1] - d = { - 'validation_manifest': s, - 'all_validator_keys': all_validator_keys, - 'node_db_type': node_db_type, - 'node_db_path': node_db_path, - 'db_path': db_path, - 'debug_logfile': debug_logfile, - 'rpc_port': rpc_port, - 'peer_port': peer_port, - 'wss_port': wss_port, - 'sibling_ip': sibling_ip, - 'sibling_port': sibling_port, - } - d.update(m) - d.update(v) - - for p in [this_validator_dir, db_path, log_path]: - if not os.path.exists(p): - os.makedirs(p) - - config_files.append('{}/rippled.cfg'.format(this_validator_dir)) - with open(config_files[-1], 'w') as f: - f.write(CONF_TEMPLATE.format(**d)) - - with open('{}/master_secret.txt'.format(this_validator_dir), 'w') as f: - f.write(m['master_secret']) - - return config_files - - -def update_ephemeral_key( - server, new_seq, log_files, - expected=None, rm_dbs=False, master_secret_file=None, - restore_origional_conf=False, timeout_s=300): - if not expected: - expected = {} - - change_time = time.gmtime() - back_conf, new_conf = new_config_ephemeral_key( - server, - new_seq, - rm_dbs, - master_secret_file - ) - validator_key = get_validator_key(server.config_file) - start_time = time.time() - ck = check_ephemeral_keys(validator_key, - log_files, - seq=new_seq, - change_time=change_time, - timeout_s=timeout_s) - if ARGS.verbose: - print('Check finished: {} secs.'.format(int(time.time() - start_time))) - all_success = True - for i, r in enumerate(ck): - e = expected.get(i, UNTRUSTED) - server_dir = os.path.basename(os.path.dirname(log_files[i])) - status = 'OK' if e == r else 'FAIL' - print('{}: Server: {} Expected: {} Got: {}'. - format(status, server_dir, - MANIFEST_ACTION_ID_TO_STR[e], MANIFEST_ACTION_ID_TO_STR[r])) - all_success = all_success and (e == r) - if restore_origional_conf: - if is_windows() and os.path.isfile(new_conf): - os.remove(new_conf) - os.rename(back_conf, new_conf) - return all_success - - -def run_main(): - global ARGS - ARGS = parse_args() - manifest_seq = 1 - config_files = get_configs(manifest_seq) - if ARGS.generate: - return - if len(config_files) <= 1: - print('Script requires at least 2 servers. Actual #: {}'. - format(len(config_files))) - return - with contextlib.nested(*(rippled_server(c, os.path.dirname(c)+'/log.txt') - for c in config_files)) as servers: - log_files = [os.path.dirname(cf)+'/log.txt' for cf in config_files[1:]] - validator_key = get_validator_key(config_files[0]) - start_time = time.time() - ck = check_ephemeral_keys(validator_key, - [log_files[0]], - seq=None, - timeout_s=60) - if ARGS.verbose: - print('Check finished: {} secs.'.format( - int(time.time() - start_time))) - if any(r == NOT_FOUND for r in ck): - print('FAIL: Initial key did not propigate to all servers') - return - - manifest_seq += 2 - expected = {i: UNTRUSTED for i in range(len(log_files))} - expected[0] = ACCEPTED_UPDATE - if not ARGS.quiet: - print('Testing key update') - kr = update_ephemeral_key(servers[0], manifest_seq, log_files, expected) - if not kr: - print('\nFail: Key Update Test. Exiting') - return - - expected = {i: UNTRUSTED for i in range(len(log_files))} - expected[0] = STALE - if not ARGS.quiet: - print('Testing stale key') - kr = update_ephemeral_key( - servers[0], manifest_seq-1, log_files, expected, rm_dbs=True) - if not kr: - print('\nFail: Stale Key Test. Exiting') - return - - expected = {i: UNTRUSTED for i in range(len(log_files))} - expected[0] = STALE - if not ARGS.quiet: - print('Testing stale key 2') - kr = update_ephemeral_key( - servers[0], manifest_seq, log_files, expected, rm_dbs=True) - if not kr: - print('\nFail: Stale Key Test. Exiting') - return - - expected = {i: UNTRUSTED for i in range(len(log_files))} - expected[0] = REVOKED - if not ARGS.quiet: - print('Testing revoked key') - kr = update_ephemeral_key( - servers[0], 0xffffffff, log_files, expected, rm_dbs=True) - if not kr: - print('\nFail: Revoked Key Text. Exiting') - return - print('\nOK: All tests passed') - -if __name__ == '__main__': - run_main() diff --git a/bin/python/ripple/util/__init__.py b/bin/python/ripple/util/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/bin/python/ripple/util/test_Base58.py b/bin/python/ripple/util/test_Base58.py deleted file mode 100644 index 40bcd1b9c6..0000000000 --- a/bin/python/ripple/util/test_Base58.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import absolute_import, division, print_function - -from ripple.util import Base58 - -from unittest import TestCase - -BINARY = 'nN9kfUnKTf7PpgLG' - -class test_Base58(TestCase): - def run_test(self, before, after): - self.assertEquals(Base58.decode(before), after) - self.assertEquals(Base58.encode(after), before) - - def test_trivial(self): - self.run_test('', '') - - def test_zeroes(self): - for before, after in (('', ''), ('abc', 'I\x8b')): - for i in range(1, 257): - self.run_test('r' * i + before, '\0' * i + after) - - def test_single_digits(self): - for i, c in enumerate(Base58.ALPHABET): - self.run_test(c, chr(i)) - - def test_various(self): - # Test three random numbers. - self.run_test('88Mw', '\x88L\xed') - self.run_test( - 'nN9kfUnKTf7PpgLG', '\x03\xdc\x9co\xdea\xefn\xd3\xb8\xe2\xc1') - self.run_test( - 'zzWWb4C5p6kNrVa4fEBoZpZKd3XQLXch7QJbLCuLdoS1CWr8qdAZHEmwMiJy8Hwp', - 'xN\x82\xfcQ\x1f\xb3~\xdf\xc7\xb37#\xc6~A\xe9\xf6-\x1f\xcb"\xfab' - '(\'\xccv\x9e\x85\xc3\xd1\x19\x941{\x8et\xfbS}\x86.k\x07\xb5\xb3') - - def test_check(self): - self.assertEquals(Base58.checksum(BINARY), '\xaa\xaar\x9d') - - def test_encode(self): - self.assertEquals( - Base58.encode_version(Base58.VER_ACCOUNT_PUBLIC, BINARY), - 'sB49XwJgmdEZDo8LmYwki7FYkiaN7') - - def test_decode(self): - ver, b = Base58.decode_version('sB49XwJgmdEZDo8LmYwki7FYkiaN7') - self.assertEquals(ver, Base58.VER_ACCOUNT_PUBLIC) - self.assertEquals(b, BINARY) diff --git a/bin/python/ripple/util/test_Cache.py b/bin/python/ripple/util/test_Cache.py deleted file mode 100644 index 55adfce904..0000000000 --- a/bin/python/ripple/util/test_Cache.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -from ripple.util.Cache import NamedCache - -from unittest import TestCase - -class test_Cache(TestCase): - def setUp(self): - self.cache = NamedCache() - - def test_trivial(self): - pass diff --git a/bin/python/ripple/util/test_ConfigFile.py b/bin/python/ripple/util/test_ConfigFile.py deleted file mode 100644 index 8b6d040505..0000000000 --- a/bin/python/ripple/util/test_ConfigFile.py +++ /dev/null @@ -1,163 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -from ripple.util import ConfigFile - -from unittest import TestCase - -class test_ConfigFile(TestCase): - def test_trivial(self): - self.assertEquals(ConfigFile.read(''), {}) - - def test_full(self): - self.assertEquals(ConfigFile.read(FULL.splitlines()), RESULT) - -RESULT = { - 'websocket_port': '6206', - 'database_path': '/development/alpha/db', - 'sntp_servers': - ['time.windows.com', 'time.apple.com', 'time.nist.gov', 'pool.ntp.org'], - 'validation_seed': 'sh1T8T9yGuV7Jb6DPhqSzdU2s5LcV', - 'node_size': 'medium', - 'rpc_startup': { - 'command': 'log_level', - 'severity': 'debug'}, - 'ips': ['r.ripple.com', '51235'], - 'node_db': { - 'file_size_mult': '2', - 'file_size_mb': '8', - 'cache_mb': '256', - 'path': '/development/alpha/db/rocksdb', - 'open_files': '2000', - 'type': 'RocksDB', - 'filter_bits': '12'}, - 'peer_port': '53235', - 'ledger_history': 'full', - 'rpc_ip': '127.0.0.1', - 'websocket_public_ip': '0.0.0.0', - 'rpc_allow_remote': '0', - 'validators': - [['n949f75evCHwgyP4fPVgaHqNHxUVN15PsJEZ3B3HnXPcPjcZAoy7', 'RL1'], - ['n9MD5h24qrQqiyBC8aeqqCWvpiBiYQ3jxSr91uiDvmrkyHRdYLUj', 'RL2'], - ['n9L81uNCaPgtUJfaHh89gmdvXKAmSt5Gdsw2g1iPWaPkAHW5Nm4C', 'RL3'], - ['n9KiYM9CgngLvtRCQHZwgC2gjpdaZcCcbt3VboxiNFcKuwFVujzS', 'RL4'], - ['n9LdgEtkmGB9E2h3K4Vp7iGUaKuq23Zr32ehxiU8FWY7xoxbWTSA', 'RL5']], - 'debug_logfile': '/development/alpha/debug.log', - 'websocket_public_port': '5206', - 'peer_ip': '0.0.0.0', - 'rpc_port': '5205', - 'validation_quorum': '3', - 'websocket_ip': '127.0.0.1'} - -FULL = """ -[ledger_history] -full - -# Allow other peers to connect to this server. -# -[peer_ip] -0.0.0.0 - -[peer_port] -53235 - -# Allow untrusted clients to connect to this server. -# -[websocket_public_ip] -0.0.0.0 - -[websocket_public_port] -5206 - -# Provide trusted websocket ADMIN access to the localhost. -# -[websocket_ip] -127.0.0.1 - -[websocket_port] -6206 - -# Provide trusted json-rpc ADMIN access to the localhost. -# -[rpc_ip] -127.0.0.1 - -[rpc_port] -5205 - -[rpc_allow_remote] -0 - -[node_size] -medium - -# This is primary persistent datastore for rippled. This includes transaction -# metadata, account states, and ledger headers. Helpful information can be -# found here: https://ripple.com/wiki/NodeBackEnd -[node_db] -type=RocksDB -path=/development/alpha/db/rocksdb -open_files=2000 -filter_bits=12 -cache_mb=256 -file_size_mb=8 -file_size_mult=2 - -[database_path] -/development/alpha/db - -# This needs to be an absolute directory reference, not a relative one. -# Modify this value as required. -[debug_logfile] -/development/alpha/debug.log - -[sntp_servers] -time.windows.com -time.apple.com -time.nist.gov -pool.ntp.org - -# Where to find some other servers speaking the Ripple protocol. -# -[ips] -r.ripple.com 51235 - -# The latest validators can be obtained from -# https://ripple.com/ripple.txt -# -[validators] -n949f75evCHwgyP4fPVgaHqNHxUVN15PsJEZ3B3HnXPcPjcZAoy7 RL1 -n9MD5h24qrQqiyBC8aeqqCWvpiBiYQ3jxSr91uiDvmrkyHRdYLUj RL2 -n9L81uNCaPgtUJfaHh89gmdvXKAmSt5Gdsw2g1iPWaPkAHW5Nm4C RL3 -n9KiYM9CgngLvtRCQHZwgC2gjpdaZcCcbt3VboxiNFcKuwFVujzS RL4 -n9LdgEtkmGB9E2h3K4Vp7iGUaKuq23Zr32ehxiU8FWY7xoxbWTSA RL5 - -# Ditto. -[validation_quorum] -3 - -[validation_seed] -sh1T8T9yGuV7Jb6DPhqSzdU2s5LcV - -# Turn down default logging to save disk space in the long run. -# Valid values here are trace, debug, info, warning, error, and fatal -[rpc_startup] -{ "command": "log_level", "severity": "debug" } - -# Configure SSL for WebSockets. Not enabled by default because not everybody -# has an SSL cert on their server, but if you uncomment the following lines and -# set the path to the SSL certificate and private key the WebSockets protocol -# will be protected by SSL/TLS. -#[websocket_secure] -#1 - -#[websocket_ssl_cert] -#/etc/ssl/certs/server.crt - -#[websocket_ssl_key] -#/etc/ssl/private/server.key - -# Defaults to 0 ("no") so that you can use self-signed SSL certificates for -# development, or internally. -#[ssl_verify] -#0 -""".strip() diff --git a/bin/python/ripple/util/test_Decimal.py b/bin/python/ripple/util/test_Decimal.py deleted file mode 100644 index f429642403..0000000000 --- a/bin/python/ripple/util/test_Decimal.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -from ripple.util.Decimal import Decimal - -from unittest import TestCase - -class test_Decimal(TestCase): - def test_construct(self): - self.assertEquals(str(Decimal('')), '0') - self.assertEquals(str(Decimal('0')), '0') - self.assertEquals(str(Decimal('0.2')), '0.2') - self.assertEquals(str(Decimal('-0.2')), '-0.2') - self.assertEquals(str(Decimal('3.1416')), '3.1416') - - def test_accumulate(self): - d = Decimal() - d.accumulate('0.5') - d.accumulate('3.1416') - d.accumulate('-23.34234') - self.assertEquals(str(d), '-19.70074') diff --git a/bin/python/ripple/util/test_Dict.py b/bin/python/ripple/util/test_Dict.py deleted file mode 100644 index 8c09f8298a..0000000000 --- a/bin/python/ripple/util/test_Dict.py +++ /dev/null @@ -1,56 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -from ripple.util import Dict - -from unittest import TestCase - -class test_Dict(TestCase): - def test_count_all_subitems(self): - self.assertEquals(Dict.count_all_subitems({}), 1) - self.assertEquals(Dict.count_all_subitems({'a': {}}), 2) - self.assertEquals(Dict.count_all_subitems([1]), 2) - self.assertEquals(Dict.count_all_subitems([1, 2]), 3) - self.assertEquals(Dict.count_all_subitems([1, {2: 3}]), 4) - self.assertEquals(Dict.count_all_subitems([1, {2: [3]}]), 5) - self.assertEquals(Dict.count_all_subitems([1, {2: [3, 4]}]), 6) - - def test_prune(self): - self.assertEquals(Dict.prune({}, 0), {}) - self.assertEquals(Dict.prune({}, 1), {}) - - self.assertEquals(Dict.prune({1: 2}, 0), '{dict with 1 subitem}') - self.assertEquals(Dict.prune({1: 2}, 1), {1: 2}) - self.assertEquals(Dict.prune({1: 2}, 2), {1: 2}) - - self.assertEquals(Dict.prune([1, 2, 3], 0), '[list with 3 subitems]') - self.assertEquals(Dict.prune([1, 2, 3], 1), [1, 2, 3]) - - self.assertEquals(Dict.prune([{1: [2, 3]}], 0), - '[list with 4 subitems]') - self.assertEquals(Dict.prune([{1: [2, 3]}], 1), - ['{dict with 3 subitems}']) - self.assertEquals(Dict.prune([{1: [2, 3]}], 2), - [{1: u'[list with 2 subitems]'}]) - self.assertEquals(Dict.prune([{1: [2, 3]}], 3), - [{1: [2, 3]}]) - - def test_prune_nosub(self): - self.assertEquals(Dict.prune({}, 0, False), {}) - self.assertEquals(Dict.prune({}, 1, False), {}) - - self.assertEquals(Dict.prune({1: 2}, 0, False), '{dict with 1 subitem}') - self.assertEquals(Dict.prune({1: 2}, 1, False), {1: 2}) - self.assertEquals(Dict.prune({1: 2}, 2, False), {1: 2}) - - self.assertEquals(Dict.prune([1, 2, 3], 0, False), - '[list with 3 subitems]') - self.assertEquals(Dict.prune([1, 2, 3], 1, False), [1, 2, 3]) - - self.assertEquals(Dict.prune([{1: [2, 3]}], 0, False), - '[list with 1 subitem]') - self.assertEquals(Dict.prune([{1: [2, 3]}], 1, False), - ['{dict with 1 subitem}']) - self.assertEquals(Dict.prune([{1: [2, 3]}], 2, False), - [{1: u'[list with 2 subitems]'}]) - self.assertEquals(Dict.prune([{1: [2, 3]}], 3, False), - [{1: [2, 3]}]) diff --git a/bin/python/ripple/util/test_Function.py b/bin/python/ripple/util/test_Function.py deleted file mode 100644 index 9da880a7ef..0000000000 --- a/bin/python/ripple/util/test_Function.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -from ripple.util.Function import Function, MATCHER - -from unittest import TestCase - -def FN(*args, **kwds): - return args, kwds - -class test_Function(TestCase): - def match_test(self, item, *results): - self.assertEquals(MATCHER.match(item).groups(), results) - - def test_simple(self): - self.match_test('function', 'function', '') - self.match_test('f(x)', 'f', '(x)') - - def test_empty_function(self): - self.assertEquals(Function()(), None) - - def test_empty_args(self): - f = Function('ripple.util.test_Function.FN()') - self.assertEquals(f(), ((), {})) - - def test_function(self): - f = Function('ripple.util.test_Function.FN(True, {1: 2}, None)') - self.assertEquals(f(), ((True, {1: 2}, None), {})) - self.assertEquals(f('hello', foo='bar'), - (('hello', True, {1: 2}, None), {'foo':'bar'})) - self.assertEquals( - f, Function('ripple.util.test_Function.FN(true, {1: 2}, null)')) - - def test_quoting(self): - f = Function('ripple.util.test_Function.FN(testing)') - self.assertEquals(f(), (('testing',), {})) - f = Function('ripple.util.test_Function.FN(testing, true, false, null)') - self.assertEquals(f(), (('testing', True, False, None), {})) diff --git a/bin/python/ripple/util/test_PrettyPrint.py b/bin/python/ripple/util/test_PrettyPrint.py deleted file mode 100644 index 8b9bbcd246..0000000000 --- a/bin/python/ripple/util/test_PrettyPrint.py +++ /dev/null @@ -1,56 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -from ripple.util import PrettyPrint - -from unittest import TestCase - -class test_PrettyPrint(TestCase): - def setUp(self): - self._results = [] - self.printer = PrettyPrint.Streamer(printer=self.printer) - - def printer(self, *args, **kwds): - self._results.extend(args) - - def run_test(self, expected, *args): - for i in range(0, len(args), 2): - self.printer.add(args[i], args[i + 1]) - self.printer.finish() - self.assertEquals(''.join(self._results), expected) - - def test_simple_printer(self): - self.run_test( - '{\n "foo": "bar"\n}', - 'foo', 'bar') - - def test_multiple_lines(self): - self.run_test( - '{\n "foo": "bar",\n "baz": 5\n}', - 'foo', 'bar', 'baz', 5) - - def test_multiple_lines(self): - self.run_test( - """ -{ - "foo": { - "bar": 1, - "baz": true - }, - "bang": "bing" -} - """.strip(), 'foo', {'bar': 1, 'baz': True}, 'bang', 'bing') - - def test_multiple_lines_with_list(self): - self.run_test( - """ -{ - "foo": [ - "bar", - 1 - ], - "baz": [ - 23, - 42 - ] -} - """.strip(), 'foo', ['bar', 1], 'baz', [23, 42]) diff --git a/bin/python/ripple/util/test_Range.py b/bin/python/ripple/util/test_Range.py deleted file mode 100644 index c18aa19ad7..0000000000 --- a/bin/python/ripple/util/test_Range.py +++ /dev/null @@ -1,28 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -from ripple.util import Range - -from unittest import TestCase - -class test_Range(TestCase): - def round_trip(self, s, *items): - self.assertEquals(Range.from_string(s), set(items)) - self.assertEquals(Range.to_string(items), s) - - def test_complete(self): - self.round_trip('10,19', 10, 19) - self.round_trip('10', 10) - self.round_trip('10-12', 10, 11, 12) - self.round_trip('10,19,42-45', 10, 19, 42, 43, 44, 45) - - def test_names(self): - self.assertEquals( - Range.from_string('first,last,current', first=1, last=3, current=5), - set([1, 3, 5])) - - def test_is_range(self): - self.assertTrue(Range.is_range('')) - self.assertTrue(Range.is_range('10')) - self.assertTrue(Range.is_range('10,12')) - self.assertFalse(Range.is_range('10,12,fred')) - self.assertTrue(Range.is_range('10,12,fred', 'fred')) diff --git a/bin/python/ripple/util/test_Search.py b/bin/python/ripple/util/test_Search.py deleted file mode 100644 index 2b1eac0cd7..0000000000 --- a/bin/python/ripple/util/test_Search.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -from ripple.util.Search import binary_search, linear_search, FIRST, LAST - -from unittest import TestCase - -class test_Search(TestCase): - def condition(self, i): - return 10 <= i < 15; - - def test_linear_full(self): - self.assertEquals(list(linear_search(range(21), self.condition)), - [10, 11, 12, 13, 14]) - - def test_linear_partial(self): - self.assertEquals(list(linear_search(range(8, 14), self.condition)), - [10, 11, 12, 13]) - self.assertEquals(list(linear_search(range(11, 14), self.condition)), - [11, 12, 13]) - self.assertEquals(list(linear_search(range(12, 18), self.condition)), - [12, 13, 14]) - - def test_linear_empty(self): - self.assertEquals(list(linear_search(range(1, 4), self.condition)), []) - - def test_binary_first(self): - self.assertEquals(binary_search(0, 14, self.condition, FIRST), 10) - self.assertEquals(binary_search(10, 19, self.condition, FIRST), 10) - self.assertEquals(binary_search(14, 14, self.condition, FIRST), 14) - self.assertEquals(binary_search(14, 15, self.condition, FIRST), 14) - self.assertEquals(binary_search(13, 15, self.condition, FIRST), 13) - - def test_binary_last(self): - self.assertEquals(binary_search(10, 20, self.condition, LAST), 14) - self.assertEquals(binary_search(0, 14, self.condition, LAST), 14) - self.assertEquals(binary_search(14, 14, self.condition, LAST), 14) - self.assertEquals(binary_search(14, 15, self.condition, LAST), 14) - self.assertEquals(binary_search(13, 15, self.condition, LAST), 14) - - def test_binary_throws(self): - self.assertRaises( - ValueError, binary_search, 0, 20, self.condition, LAST) - self.assertRaises( - ValueError, binary_search, 0, 20, self.condition, FIRST) diff --git a/bin/python/ripple/util/test_Sign.py b/bin/python/ripple/util/test_Sign.py deleted file mode 100644 index 06ab00df76..0000000000 --- a/bin/python/ripple/util/test_Sign.py +++ /dev/null @@ -1,149 +0,0 @@ -from __future__ import absolute_import, division, print_function - -from ripple.util import Sign -from ripple.util import Base58 -from ripple.ledger import SField - -from unittest import TestCase - -BINARY = 'nN9kfUnKTf7PpgLG' - -class test_Sign(TestCase): - SEQUENCE = 23 - VALIDATOR_KEY_HUMAN = 'n9JijuoCv8ubEy5ag3LiX3hyq27GaLJsitZPbQ6APkwx2MkUXq8E' - - def setUp(self): - self.results = [] - - def print(self, *args, **kwds): - self.results.append([list(args), kwds]) - - def test_field_code(self): - self.assertEquals(SField.field_code(SField.STI_UINT32, 4), '$') - self.assertEquals(SField.field_code(SField.STI_VL, 1), 'q') - self.assertEquals(SField.field_code(SField.STI_VL, 3), 's') - self.assertEquals(SField.field_code(SField.STI_VL, 6), 'v') - - def test_strvl(self): - self.assertEquals(Sign.prepend_length_byte(BINARY), - '\x10nN9kfUnKTf7PpgLG') - - def urandom(self, bytes): - return '\5' * bytes - - def test_make_seed(self): - self.assertEquals(Sign.make_seed(self.urandom), - '\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5') - - def test_make_ed(self): - private, public = Sign.make_ed25519_keypair(self.urandom) - self.assertEquals(private, - '\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5' - '\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5') - self.assertEquals(public, - 'nz\x1c\xdd)\xb0\xb7\x8f\xd1:\xf4\xc5Y\x8f\xef\xf4' - '\xef*\x97\x16n<\xa6\xf2\xe4\xfb\xfc\xcd\x80P[\xf1') - - def test_make_manifest(self): - _, pk = Sign.make_ed25519_keypair(self.urandom) - m = Sign.make_manifest(pk, 'verify', 12345) - self.assertEquals( - m, '$\x00\x0009q nz\x1c\xdd)\xb0\xb7\x8f\xd1:\xf4\xc5Y\x8f\xef\xf4' - '\xef*\x97\x16n<\xa6\xf2\xe4\xfb\xfc\xcd\x80P[\xf1s\x06verify') - - def test_sign_manifest(self): - ssk, spk = Sign.make_ecdsa_keypair(self.urandom) - sk, pk = Sign.make_ed25519_keypair(self.urandom) - s = Sign.sign_manifest('manifest', ssk, sk, pk) - self.assertEquals( - s, 'manifestvF0D\x02 \x04\x85\x95p\x0f\xb8\x17\x7f\xdf\xdd\x04' - '\xaa+\x16q1W\xf6\xfd\xe8X\xb12l\xd5\xc3\xf1\xd6\x05\x1b\x1c\x9a' - '\x02 \x18\\.(o\xa8 \xeb\x87\xfa&~\xbd\xe6,\xfb\xa61\xd1\xcd\xcd' - '\xc8\r\x16[\x81\x9a\x19\xda\x93i\xcdp\x12@\xe5\x84\xbe\xc4\x80N' - '\xa0v"\xb2\x80A\x88\x06\xc0\xd2\xbae\x92\x89\xa8\'!\xdd\x00\x88' - '\x06s\xe0\xf74\xe3Yg\xad{$\x17\xd3\x99\xaa\x16\xb0\xeaZ\xd7]\r' - '\xb3\xdc\x1b\x8f\xc1Z\xdfHU\xb5\x92\xac\x82jI\x02') - - def test_wrap(self): - wrap = lambda s: Sign.wrap(s, 5) - self.assertEquals(wrap(''), '') - self.assertEquals(wrap('12345'), '12345') - self.assertEquals(wrap('123456'), '123\n456') - self.assertEquals(wrap('12345678'), '1234\n5678') - self.assertEquals(wrap('1234567890'), '12345\n67890') - self.assertEquals(wrap('12345678901'), '123\n456\n789\n01') - - def test_create_ed_keys(self): - pkh, skh = Sign.create_ed_keys(self.urandom) - self.assertEquals( - pkh, 'nHUUaKHpxyRP4TZZ79tTpXuTpoM8pRNs5crZpGVA5jdrjib5easY') - self.assertEquals( - skh, 'pnEp13Zu7xTeKQVQ2RZVaUraE9GXKqFtnXQVUFKXbTE6wsP4wne') - - def test_create_ed_public_key(self): - pkh = Sign.create_ed_public_key( - 'pnEp13Zu7xTeKQVQ2RZVaUraE9GXKqFtnXQVUFKXbTE6wsP4wne') - self.assertEquals( - pkh, 'nHUUaKHpxyRP4TZZ79tTpXuTpoM8pRNs5crZpGVA5jdrjib5easY') - - def get_test_keypair(self): - public = (Base58.VER_NODE_PUBLIC, '\x02' + (32 * 'v')) - private = (Base58.VER_NODE_PRIVATE, 32 * 'k') - - Sign.check_validation_public_key(*public) - Sign.check_secret_key(*private) - - return (Base58.encode_version(*public), Base58.encode_version(*private)) - - def test_get_signature(self): - pk, sk = self.get_test_keypair() - signature = Sign.get_signature(self.SEQUENCE, pk, sk, sk) - self.assertEquals( - signature, - 'JAAAABdxIe2DIKUZd9jDjKikknxnDfWCHkSXYZReFenvsmoVCdIw6nMhAnZ2dnZ2' - 'dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dkYwRAIgXyobHA8sDQxmDJNLE6HI' - 'aARlzvcd79/wT068e113gUkCIHkI540JQT2LHwAD7/y3wFE5X3lEXMfgZRkpLZTx' - 'kpticBJAzo5VrUEr0U47sHvuIjbrINLCTM6pAScA899G9kpMWexbXv1ceIbTP5JH' - '1HyQmsZsROTeHR0irojvYgx7JLaiAA==') - - def test_check(self): - public = Base58.encode_version(Base58.VER_NODE_PRIVATE, 32 * 'k') - Sign.perform_check(public, self.print) - self.assertEquals(self.results, - [[['version = VER_NODE_PRIVATE'], {}], - [['decoded length = 32'], {}]]) - - def test_create(self): - Sign.perform_create(self.urandom, self.print) - self.assertEquals( - self.results, - [[['[validator_keys]', - 'nHUUaKHpxyRP4TZZ79tTpXuTpoM8pRNs5crZpGVA5jdrjib5easY', - '', - '[master_secret]', - 'pnEp13Zu7xTeKQVQ2RZVaUraE9GXKqFtnXQVUFKXbTE6wsP4wne'], - {'sep': '\n'}]]) - - def test_create_public(self): - Sign.perform_create_public( - 'pnEp13Zu7xTeKQVQ2RZVaUraE9GXKqFtnXQVUFKXbTE6wsP4wne', self.print) - self.assertEquals( - self.results, - [[['[validator_keys]', - 'nHUUaKHpxyRP4TZZ79tTpXuTpoM8pRNs5crZpGVA5jdrjib5easY', - '', - '[master_secret]', - 'pnEp13Zu7xTeKQVQ2RZVaUraE9GXKqFtnXQVUFKXbTE6wsP4wne'], - {'sep': '\n'}]]) - - def test_sign(self): - public, private = self.get_test_keypair() - Sign.perform_sign(self.SEQUENCE, public, private, private, print=self.print) - self.assertEquals( - self.results, - [[['[validation_manifest]'], {}], - [['JAAAABdxIe2DIKUZd9jDjKikknxnDfWCHkSXYZReFenvsmoVCdIw6nMhAnZ2dnZ2dnZ2dnZ2\n' - 'dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dkYwRAIgXyobHA8sDQxmDJNLE6HIaARlzvcd79/wT068\n' - 'e113gUkCIHkI540JQT2LHwAD7/y3wFE5X3lEXMfgZRkpLZTxkpticBJAzo5VrUEr0U47sHvu\n' - 'IjbrINLCTM6pAScA899G9kpMWexbXv1ceIbTP5JH1HyQmsZsROTeHR0irojvYgx7JLaiAA=='], - {}]]) diff --git a/bin/python/six.py b/bin/python/six.py deleted file mode 100644 index f8f7d402ff..0000000000 --- a/bin/python/six.py +++ /dev/null @@ -1,747 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2014 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import functools -import operator -import sys -import types - -__author__ = "Benjamin Peterson " -__version__ = "1.7.3" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - # This is a bit ugly, but it avoids running this again. - delattr(obj.__class__, self.name) - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - get_source = get_code # same as get_code - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - """Lazy loading of moved objects""" - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), - MovedModule("winreg", "_winreg"), -] -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", "moves.urllib.parse") - - -class Module_six_moves_urllib_error(_LazyModule): - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", "moves.urllib.error") - - -class Module_six_moves_urllib_request(_LazyModule): - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", "moves.urllib.request") - - -class Module_six_moves_urllib_response(_LazyModule): - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", "moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(_LazyModule): - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes - -_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", "moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ['parse', 'error', 'request', 'response', 'robotparser'] - -_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), - "moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) -else: - def iterkeys(d, **kw): - return iter(d.iterkeys(**kw)) - - def itervalues(d, **kw): - return iter(d.itervalues(**kw)) - - def iteritems(d, **kw): - return iter(d.iteritems(**kw)) - - def iterlists(d, **kw): - return iter(d.iterlists(**kw)) - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, - "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc(iterlists, - "Return an iterator over the (key, [values]) pairs of a dictionary.") - - -if PY3: - def b(s): - return s.encode("latin-1") - def u(s): - return s - unichr = chr - if sys.version_info[1] <= 1: - def int2byte(i): - return bytes((i,)) - else: - # This is about 2x faster than the implementation above on 3.2+ - int2byte = operator.methodcaller("to_bytes", 1, "big") - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO -else: - def b(s): - return s - # Workaround for standalone backslash - def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") - unichr = unichr - int2byte = chr - def byte2int(bs): - return ord(bs[0]) - def indexbytes(buf, i): - return ord(buf[i]) - def iterbytes(buf): - return (ord(byte) for byte in buf) - import StringIO - StringIO = BytesIO = StringIO.StringIO -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - - exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb -""") - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if (isinstance(fp, file) and - isinstance(data, unicode) and - fp.encoding is not None): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - def wraps(wrapped): - def wrapper(f): - f = functools.wraps(wrapped)(f) - f.__wrapped__ = wrapped - return f - return wrapper -else: - wraps = functools.wraps - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(meta): - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - slots = orig_vars.get('__slots__') - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if (type(importer).__name__ == "_SixMetaPathImporter" and - importer.name == __name__): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/bin/rlint.js b/bin/rlint.js deleted file mode 100755 index ce12e9560a..0000000000 --- a/bin/rlint.js +++ /dev/null @@ -1,252 +0,0 @@ -#!/usr/bin/node - -var async = require('async'); -var Remote = require('ripple-lib').Remote; -var Transaction = require('ripple-lib').Transaction; -var UInt160 = require('ripple-lib').UInt160; -var Amount = require('ripple-lib').Amount; - -var book_key = function (book) { - return book.taker_pays.currency - + ":" + book.taker_pays.issuer - + ":" + book.taker_gets.currency - + ":" + book.taker_gets.issuer; -}; - -var book_key_cross = function (book) { - return book.taker_gets.currency - + ":" + book.taker_gets.issuer - + ":" + book.taker_pays.currency - + ":" + book.taker_pays.issuer; -}; - -var ledger_verify = function (ledger) { - var dir_nodes = ledger.accountState.filter(function (entry) { - return entry.LedgerEntryType === 'DirectoryNode' // Only directories - && entry.index === entry.RootIndex // Only root nodes - && 'TakerGetsCurrency' in entry; // Only offer directories - }); - - var books = {}; - - dir_nodes.forEach(function (node) { - var book = { - taker_gets: { - currency: UInt160.from_generic(node.TakerGetsCurrency).to_json(), - issuer: UInt160.from_generic(node.TakerGetsIssuer).to_json() - }, - taker_pays: { - currency: UInt160.from_generic(node.TakerPaysCurrency).to_json(), - issuer: UInt160.from_generic(node.TakerPaysIssuer).to_json() - }, - quality: Amount.from_quality(node.RootIndex), - index: node.RootIndex - }; - - books[book_key(book)] = book; - -// console.log(JSON.stringify(node, undefined, 2)); - }); - -// console.log(JSON.stringify(dir_entry, undefined, 2)); - console.log("#%s books: %s", ledger.ledger_index, Object.keys(books).length); - - Object.keys(books).forEach(function (key) { - var book = books[key]; - var key_cross = book_key_cross(book); - var book_cross = books[key_cross]; - - if (book && book_cross && !book_cross.done) - { - var book_cross_quality_inverted = Amount.from_json("1.0/1/1").divide(book_cross.quality); - - if (book_cross_quality_inverted.compareTo(book.quality) >= 0) - { - // Crossing books - console.log("crossing: #%s :: %s :: %s :: %s :: %s :: %s :: %s", ledger.ledger_index, key, book.quality.to_text(), book_cross.quality.to_text(), book_cross_quality_inverted.to_text(), - book.index, book_cross.index); - } - - book_cross.done = true; - } - }); - - var ripple_selfs = {}; - - var accounts = {}; - var counts = {}; - - ledger.accountState.forEach(function (entry) { - if (entry.LedgerEntryType === 'Offer') - { - counts[entry.Account] = (counts[entry.Account] || 0) + 1; - } - else if (entry.LedgerEntryType === 'RippleState') - { - if (entry.Flags & (0x10000 | 0x40000)) - { - counts[entry.LowLimit.issuer] = (counts[entry.LowLimit.issuer] || 0) + 1; - } - - if (entry.Flags & (0x20000 | 0x80000)) - { - counts[entry.HighLimit.issuer] = (counts[entry.HighLimit.issuer] || 0) + 1; - } - - if (entry.HighLimit.issuer === entry.LowLimit.issuer) - ripple_selfs[entry.Account] = entry; - } - else if (entry.LedgerEntryType == 'AccountRoot') - { - accounts[entry.Account] = entry; - } - }); - - var low = 0; // Accounts with too low a count. - var high = 0; - var missing_accounts = 0; // Objects with no referencing account. - var missing_objects = 0; // Accounts specifying an object but having none. - - Object.keys(counts).forEach(function (account) { - if (account in accounts) - { - if (counts[account] !== accounts[account].OwnerCount) - { - if (counts[account] < accounts[account].OwnerCount) - { - high += 1; - console.log("%s: high count %s/%s", account, counts[account], accounts[account].OwnerCount); - } - else - { - low += 1; - console.log("%s: low count %s/%s", account, counts[account], accounts[account].OwnerCount); - } - } - } - else - { - missing_accounts += 1; - - console.log("%s: missing : count %s", account, counts[account]); - } - }); - - Object.keys(accounts).forEach(function (account) { - if (!('OwnerCount' in accounts[account])) - { - console.log("%s: bad entry : %s", account, JSON.stringify(accounts[account], undefined, 2)); - } - else if (!(account in counts) && accounts[account].OwnerCount) - { - missing_objects += 1; - - console.log("%s: no objects : %s/%s", account, 0, accounts[account].OwnerCount); - } - }); - - if (low) - console.log("counts too low = %s", low); - - if (high) - console.log("counts too high = %s", high); - - if (missing_objects) - console.log("missing_objects = %s", missing_objects); - - if (missing_accounts) - console.log("missing_accounts = %s", missing_accounts); - - if (Object.keys(ripple_selfs).length) - console.log("RippleState selfs = %s", Object.keys(ripple_selfs).length); - -}; - -var ledger_request = function (remote, ledger_index, done) { - remote.request_ledger(undefined, { - accounts: true, - expand: true, - }) - .ledger_index(ledger_index) - .on('success', function (m) { - // console.log("ledger: ", ledger_index); - // console.log("ledger: ", JSON.stringify(m, undefined, 2)); - done(m.ledger); - }) - .on('error', function (m) { - console.log("error"); - done(); - }) - .request(); -}; - -var usage = function () { - console.log("rlint.js _websocket_ip_ _websocket_port_ "); -}; - -var finish = function (remote) { - remote.disconnect(); - - // XXX Because remote.disconnect() doesn't work: - process.exit(); -}; - -console.log("args: ", process.argv.length); -console.log("args: ", process.argv); - -if (process.argv.length < 4) { - usage(); -} -else { - var remote = Remote.from_config({ - websocket_ip: process.argv[2], - websocket_port: process.argv[3], - }) - .once('ledger_closed', function (m) { - console.log("ledger_closed: ", JSON.stringify(m, undefined, 2)); - - if (process.argv.length === 5) { - var ledger_index = process.argv[4]; - - ledger_request(remote, ledger_index, function (l) { - if (l) { - ledger_verify(l); - } - - finish(remote); - }); - - } else if (process.argv.length === 6) { - var ledger_start = Number(process.argv[4]); - var ledger_end = Number(process.argv[5]); - var ledger_cursor = ledger_end; - - async.whilst( - function () { - return ledger_start <= ledger_cursor && ledger_cursor <=ledger_end; - }, - function (callback) { - // console.log(ledger_cursor); - - ledger_request(remote, ledger_cursor, function (l) { - if (l) { - ledger_verify(l); - } - - --ledger_cursor; - - callback(); - }); - }, - function (error) { - finish(remote); - }); - - } else { - finish(remote); - } - }) - .connect(); -} - -// vim:sw=2:sts=2:ts=8:et diff --git a/bin/sh/install-boost.sh b/bin/sh/install-boost.sh deleted file mode 100644 index 1f609c53ba..0000000000 --- a/bin/sh/install-boost.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Assumptions: -# 1) BOOST_ROOT and BOOST_URL are already defined, -# and contain valid values. -# 2) The last namepart of BOOST_ROOT matches the -# folder name internal to boost's .tar.gz -# When testing you can force a boost build by clearing travis caches: -# https://travis-ci.org/ripple/rippled/caches -set -e - -if [ ! -d "$BOOST_ROOT/lib" ] -then - wget $BOOST_URL -O /tmp/boost.tar.gz - cd `dirname $BOOST_ROOT` - rm -fr ${BOOST_ROOT} - tar xzf /tmp/boost.tar.gz - cd $BOOST_ROOT && \ - ./bootstrap.sh --prefix=$BOOST_ROOT && \ - ./b2 -d1 define=_GLIBCXX_USE_CXX11_ABI=0 -j${NUM_PROCESSORS:-2} &&\ - ./b2 -d0 define=_GLIBCXX_USE_CXX11_ABI=0 install -else - echo "Using cached boost at $BOOST_ROOT" -fi - diff --git a/bin/stop-test.js b/bin/stop-test.js deleted file mode 100644 index 45aa15e271..0000000000 --- a/bin/stop-test.js +++ /dev/null @@ -1,133 +0,0 @@ -/* -------------------------------- REQUIRES -------------------------------- */ - -var child = require("child_process"); -var assert = require("assert"); - -/* --------------------------------- CONFIG --------------------------------- */ - -if (process.argv[2] == null) { - [ - 'Usage: ', - '', - ' `node bin/stop-test.js i,j [rippled_path] [rippled_conf]`', - '', - ' Launch rippled and stop it after n seconds for all n in [i, j}', - ' For all even values of n launch rippled with `--fg`', - ' For values of n where n % 3 == 0 launch rippled with `--fg`\n', - 'Examples: ', - '', - ' $ node bin/stop-test.js 5,10', - (' $ node bin/stop-test.js 1,4 ' + - 'build/clang.debug/rippled $HOME/.confs/rippled.cfg') - ] - .forEach(function(l){console.log(l)}); - - process.exit(); -} else { - var testRange = process.argv[2].split(',').map(Number); - var rippledPath = process.argv[3] || 'build/rippled' - var rippledConf = process.argv[4] || 'rippled.cfg' -} - -var options = { - env: process.env, - stdio: 'ignore' // we could dump the child io when it fails abnormally -}; - -// default args -var conf_args = ['--conf='+rippledConf]; -var start_args = conf_args.concat([/*'--net'*/]) -var stop_args = conf_args.concat(['stop']); - -/* --------------------------------- HELPERS -------------------------------- */ - -function start(args) { - return child.spawn(rippledPath, args, options); -} -function stop(rippled) { child.execFile(rippledPath, stop_args, options)} -function secs_l8r(ms, f) {setTimeout(f, ms * 1000); } - -function show_results_and_exit(results) { - console.log(JSON.stringify(results, undefined, 2)); - process.exit(); -} - -var timeTakes = function (range) { - function sumRange(n) {return (n+1) * n /2} - var ret = sumRange(range[1]); - if (range[0] > 1) { - ret = ret - sumRange(range[0] - 1) - } - var stopping = (range[1] - range[0]) * 0.5; - return ret + stopping; -} - -/* ---------------------------------- TEST ---------------------------------- */ - -console.log("Test will take ~%s seconds", timeTakes(testRange)); - -(function oneTest(n /* seconds */, results) { - if (n >= testRange[1]) { - // show_results_and_exit(results); - console.log(JSON.stringify(results, undefined, 2)); - oneTest(testRange[0], []); - return; - } - - var args = start_args; - if (n % 2 == 0) {args = args.concat(['--fg'])} - if (n % 3 == 0) {args = args.concat(['--net'])} - - var result = {args: args, alive_for: n}; - results.push(result); - - console.log("\nLaunching `%s` with `%s` for %d seconds", - rippledPath, JSON.stringify(args), n); - - rippled = start(args); - console.log("Rippled pid: %d", rippled.pid); - - // defaults - var b4StopSent = false; - var stopSent = false; - var stop_took = null; - - rippled.once('exit', function(){ - if (!stopSent && !b4StopSent) { - console.warn('\nRippled exited itself b4 stop issued'); - process.exit(); - }; - - // The io handles close AFTER exit, may have implications for - // `stdio:'inherit'` option to `child.spawn`. - rippled.once('close', function() { - result.stop_took = (+new Date() - stop_took) / 1000; // seconds - console.log("Stopping after %d seconds took %s seconds", - n, result.stop_took); - oneTest(n+1, results); - }); - }); - - secs_l8r(n, function(){ - console.log("Stopping rippled after %d seconds", n); - - // possible race here ? - // seems highly unlikely, but I was having issues at one point - b4StopSent=true; - stop_took = (+new Date()); - // when does `exit` actually get sent? - stop(); - stopSent=true; - - // Sometimes we want to attach with a debugger. - if (process.env.ABORT_TESTS_ON_STALL != null) { - // We wait 30 seconds, and if it hasn't stopped, we abort the process - secs_l8r(30, function() { - if (result.stop_took == null) { - console.log("rippled has stalled"); - process.exit(); - }; - }); - } - }) -}(testRange[0], [])); \ No newline at end of file diff --git a/bin/update_binformat.js b/bin/update_binformat.js deleted file mode 100644 index 7987f72c82..0000000000 --- a/bin/update_binformat.js +++ /dev/null @@ -1,119 +0,0 @@ -/** - * bin/update_bintypes.js - * - * This unholy abomination of a script generates the JavaScript file - * src/js/bintypes.js from various parts of the C++ source code. - * - * This should *NOT* be part of any automatic build process unless the C++ - * source data are brought into a more easily parseable format. Until then, - * simply run this script manually and fix as needed. - */ - -// XXX: Process LedgerFormats.(h|cpp) as well. - -var filenameProto = __dirname + '/../src/cpp/ripple/SerializeProto.h', - filenameTxFormatsH = __dirname + '/../src/cpp/ripple/TransactionFormats.h', - filenameTxFormats = __dirname + '/../src/cpp/ripple/TransactionFormats.cpp'; - -var fs = require('fs'); - -var output = []; - -// Stage 1: Get the field types and codes from SerializeProto.h -var types = {}, - fields = {}; -String(fs.readFileSync(filenameProto)).split('\n').forEach(function (line) { - line = line.replace(/^\s+|\s+$/g, '').replace(/\s+/g, ''); - if (!line.length || line.slice(0, 2) === '//' || line.slice(-1) !== ')') return; - - var tmp = line.slice(0, -1).split('('), - type = tmp[0], - opts = tmp[1].split(','); - - if (type === 'TYPE') types[opts[1]] = [opts[0], +opts[2]]; - else if (type === 'FIELD') fields[opts[0]] = [types[opts[1]][0], +opts[2]]; -}); - -output.push('var ST = require("./serializedtypes");'); -output.push(''); -output.push('var REQUIRED = exports.REQUIRED = 0,'); -output.push(' OPTIONAL = exports.OPTIONAL = 1,'); -output.push(' DEFAULT = exports.DEFAULT = 2;'); -output.push(''); - -function pad(s, n) { while (s.length < n) s += ' '; return s; } -function padl(s, n) { while (s.length < n) s = ' '+s; return s; } - -Object.keys(types).forEach(function (type) { - output.push(pad('ST.'+types[type][0]+'.id', 25) + ' = '+types[type][1]+';'); -}); -output.push(''); - -// Stage 2: Get the transaction type IDs from TransactionFormats.h -var ttConsts = {}; -String(fs.readFileSync(filenameTxFormatsH)).split('\n').forEach(function (line) { - var regex = /tt([A-Z_]+)\s+=\s+([0-9-]+)/; - var match = line.match(regex); - if (match) ttConsts[match[1]] = +match[2]; -}); - -// Stage 3: Get the transaction formats from TransactionFormats.cpp -var base = [], - sections = [], - current = base; -String(fs.readFileSync(filenameTxFormats)).split('\n').forEach(function (line) { - line = line.replace(/^\s+|\s+$/g, '').replace(/\s+/g, ''); - - var d_regex = /DECLARE_TF\(([A-Za-z]+),tt([A-Z_]+)/; - var d_match = line.match(d_regex); - - var s_regex = /SOElement\(sf([a-z]+),SOE_(REQUIRED|OPTIONAL|DEFAULT)/i; - var s_match = line.match(s_regex); - - if (d_match) sections.push(current = [d_match[1], ttConsts[d_match[2]]]); - else if (s_match) current.push([s_match[1], s_match[2]]); -}); - -function removeFinalComma(arr) { - arr[arr.length-1] = arr[arr.length-1].slice(0, -1); -} - -output.push('var base = ['); -base.forEach(function (field) { - var spec = fields[field[0]]; - output.push(' [ '+ - pad("'"+field[0]+"'", 21)+', '+ - pad(field[1], 8)+', '+ - padl(""+spec[1], 2)+', '+ - 'ST.'+pad(spec[0], 3)+ - ' ],'); -}); -removeFinalComma(output); -output.push('];'); -output.push(''); - - -output.push('exports.tx = {'); -sections.forEach(function (section) { - var name = section.shift(), - ttid = section.shift(); - - output.push(' '+name+': ['+ttid+'].concat(base, ['); - section.forEach(function (field) { - var spec = fields[field[0]]; - output.push(' [ '+ - pad("'"+field[0]+"'", 21)+', '+ - pad(field[1], 8)+', '+ - padl(""+spec[1], 2)+', '+ - 'ST.'+pad(spec[0], 3)+ - ' ],'); - }); - removeFinalComma(output); - output.push(' ]),'); -}); -removeFinalComma(output); -output.push('};'); -output.push(''); - -console.log(output.join('\n')); - diff --git a/circle.yml b/circle.yml deleted file mode 100644 index a457f2f3f0..0000000000 --- a/circle.yml +++ /dev/null @@ -1,24 +0,0 @@ -machine: - services: - - docker -dependencies: - pre: - - sudo apt-add-repository -y ppa:ubuntu-toolchain-r/test - - echo "deb [arch=amd64 trusted=yes] https://test-mirrors.ripple.com/ubuntu/ trusty testing" | sudo tee /etc/apt/sources.list.d/ripple.list - - sudo apt-get update -qq - - sudo apt-get purge -qq libboost1.48-dev - - sudo apt-get install -qq libboost1.60-all-dev - - sudo apt-get install -qq clang-3.6 gcc-5 g++-5 libobjc-5-dev libgcc-5-dev libstdc++-5-dev libclang1-3.6 libgcc1 libgomp1 libstdc++6 scons protobuf-compiler libprotobuf-dev libssl-dev exuberant-ctags - - lsb_release -a - - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 99 - - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 99 - - sudo update-alternatives --force --install /usr/bin/clang clang /usr/bin/clang-3.6 99 --slave /usr/bin/clang++ clang++ /usr/bin/clang++-3.6 - - gcc --version - - clang --version - - clang++ --version -test: - pre: - - scons clang.debug - override: - # Execute unit tests under gdb - - gdb -return-child-result -quiet -batch -ex "set env MALLOC_CHECK_=3" -ex "set print thread-events off" -ex run -ex "thread apply all backtrace full" -ex "quit" --args build/clang.debug/rippled --unittest diff --git a/src/beast/doc/.gitignore b/doc/.gitignore similarity index 100% rename from src/beast/doc/.gitignore rename to doc/.gitignore diff --git a/doc/CHANGELOG b/doc/CHANGELOG deleted file mode 100644 index 03478bd82b..0000000000 --- a/doc/CHANGELOG +++ /dev/null @@ -1,29 +0,0 @@ -A list of rippled version numbers, and the Github pull requests they contain. - -0.28.0-b12: Includes pulls 836, 887, 902, 903 and 904. -0.28.0-b13: Includes pulls 906, 912, 913, 914 and 915. -0.28.0-b14: Includes pulls 907, 910, 922 and 923. -0.28.0-b15: Includes pulls 832, 870, 879, 883, 911, 916, 919, 920, 924, 925 and 928. FAILED pulls 909 and 926. -0.28.0-b16: Includes pulls 909, 926, 929, 931, 932, 935 and 934. -0.28.0-b17: Includes pulls 927, 939, 940, 943, 944, 945 and 949. -0.28.0-b18: Includes pulls 930, 946, 947, 948, 951, 952, 953, 954, 955, 956, 959, 960 and 962. -0.29.0-b19: Includes pulls 967, 969 and 971. -0.29.0-b20: Includes pulls 935, 942, 957, 958, 963, 964, 965, 966, 968, 972, 973, 974 and 975. -0.29.0-b21: Includes pulls 970 and 976. -0.28.1-b4: Includes pulls 968, 998, 1005, 1008, 1010, 1011 and 1012. -0.28.1-b6: Includes pulls 983, 984, 1013, 1023 and 1024. -0.28.1-b8: Includes pulls 988, 1009, 1014, 1019, 1029, 1031, 1033, 1034 and 1035. -0.28.1-b9: Includes pulls 1026, 1030, 1036, 1037, 1038, 1040, and 1041. -0.28.1-rc2: Includes pulls 1044 -0.28.1-rc3: Includes pulls 1052 and 1055. -0.28.1: Includes pulls 1056, 1059 and 1062, 1063. -0.28.2-b1: Includes pulls 866, 1045, 1046, 1047, 1050, 1051, 1057 -0.28.2-b2: Includes pulls 1058, 1061, 1064 and 1065 -0.28.2-b3: Includes pulls 1066, 1067, 1068 -0.28.2-b4: Includes pulls 1060, 1069, 1071, 1072, 1075 and 1076. -0.28.2-b5: Includes pulls 1073, 1074, 1081, 1083, 1084, 1087, 1089, 1090, 1091 -0.28.2-b6: Includes pulls 1085, 1093, 1094, 1096, 1101, 1102, 1105 -0.28.2-b7: Includes pulls 1077, 1080, 1086, 1095, 1098, 1106 and 1112. -0.28.2-b8: Includes pulls 1078, 1100, 1108, 1114, 1118, 1119 and 1121. -0.28.2-b9: Includes pulls 1053, 1109, 1111, 1117, 1122 and 1123. -0.29.1-b11: Includes pulls 1279, 1271, 1289, 1291, 1290, 1267, 1294, 1276, 1231, and 1286. diff --git a/doc/CheatSheet.md b/doc/CheatSheet.md deleted file mode 100644 index 7ce9cc2d81..0000000000 --- a/doc/CheatSheet.md +++ /dev/null @@ -1,18 +0,0 @@ -# Form - -- One class per header file. -- Place each data member on its own line. -- Place each ctor-initializer on its own line. -- Create typedefs for primitive types to describe them. -- Return descriptive local variables instead of constants. -- Use long descriptive names instead of abbreviations. -- Use "explicit" for single-argument ctors -- Avoid globals especially objects with static storage duration -- Order class declarations as types, public, protected, private, then data. -- Prefer 'private' over 'protected' - -# Function - -- Minimize external dependencies - * Pass options in the ctor instead of using theConfig - * Use as few other classes as possible diff --git a/doc/CodingStyle.md b/doc/CodingStyle.md deleted file mode 100644 index 3256675265..0000000000 --- a/doc/CodingStyle.md +++ /dev/null @@ -1,86 +0,0 @@ --------------------------------------------------------------------------------- - -# Coding Standards - -Coding standards used here gradually evolve and propagate through -code reviews. Some aspects are enforced more strictly than others. - -## Rules - -These rules only apply to our own code. We can't enforce any sort of -style on the external repositories and libraries we include. The best -guideline is to maintain the standards that are used in those libraries. - -* Tab inserts 4 spaces. No tab characters. -* Braces are indented in the [Allman style][1]. -* Modern C++ principles. No naked ```new``` or ```delete```. -* Line lengths limited to 80 characters. Exceptions limited to data and tables. - -## Guidelines - -If you want to do something contrary to these guidelines, understand -why you're doing it. Think, use common sense, and consider that this -your changes will probably need to be maintained long after you've -moved on to other projects. - -* Use white space and blank lines to guide the eye and keep your intent clear. -* Put private data members at the top of a class, and the 6 public special -members immediately after, in the following order: - * Destructor - * Default constructor - * Copy constructor - * Copy assignment - * Move constructor - * Move assignment -* Don't over-inline by defining large functions within the class -declaration, not even for template classes. - -## Formatting - -The goal of source code formatting should always be to make things as easy to -read as possible. White space is used to guide the eye so that details are not -overlooked. Blank lines are used to separate code into "paragraphs." - -* Always place a space before and after all binary operators, - especially assignments (`operator=`). -* The `!` operator should always be followed by a space. -* The `~` operator should be preceded by a space, but not followed by one. -* The `++` and `--` operators should have no spaces between the operator and - the operand. -* A space never appears before a comma, and always appears after a comma. -* Always place a space before an opening parenthesis. One exception is if - the parentheses are empty. -* Don't put spaces after a parenthesis. A typical member function call might - look like this: `foobar (1, 2, 3);` -* In general, leave a blank line before an `if` statement. -* In general, leave a blank line after a closing brace `}`. -* Do not place code or comments on the same line as any opening or - closing brace. -* Do not write `if` statements all-on-one-line. The exception to this is when - you've got a sequence of similar `if` statements, and are aligning them all - vertically to highlight their similarities. -* In an `if-else` statement, if you surround one half of the statement with - braces, you also need to put braces around the other half, to match. -* When writing a pointer type, use this spacing: `SomeObject* myObject`. - Technically, a more correct spacing would be `SomeObject *myObject`, but - it makes more sense for the asterisk to be grouped with the type name, - since being a pointer is part of the type, not the variable name. The only - time that this can lead to any problems is when you're declaring multiple - pointers of the same type in the same statement - which leads on to the next - rule: -* When declaring multiple pointers, never do so in a single statement, e.g. - `SomeObject* p1, *p2;` - instead, always split them out onto separate lines - and write the type name again, to make it quite clear what's going on, and - avoid the danger of missing out any vital asterisks. -* The previous point also applies to references, so always put the `&` next to - the type rather than the variable, e.g. `void foo (Thing const& thing)`. And - don't put a space on both sides of the `*` or `&` - always put a space after - it, but never before it. -* The word `const` should be placed to the right of the thing that it modifies, - for consistency. For example `int const` refers to an int which is const. - `int const*` is a pointer to an int which is const. `int *const` is a const - pointer to an int. -* Always place a space in between the template angle brackets and the type - name. Template code is already hard enough to read! - -[1]: http://en.wikipedia.org/wiki/Indent_style#Allman_style diff --git a/doc/Docker.md b/doc/Docker.md deleted file mode 100644 index d0103fbd9a..0000000000 --- a/doc/Docker.md +++ /dev/null @@ -1,16 +0,0 @@ -# Rippled Docker Image - -Rippled has a continuous deployment pipeline that turns every git commit into a -docker image for quick testing and deployment. - -To run the tip of the latest release via docker: - -```$ docker run -P -v /srv/rippled/ ripple/rippled:latest``` - -To run the tip of active development: - -```$ docker run -P -v /srv/rippled/ ripple/rippled:develop``` - -Where ```/srv/rippled``` points to a directory containing a rippled.cfg and -database files. By default, port 5005/tcp maps to the RPC port and 51235/udp to -the peer port. diff --git a/src/beast/doc/Dockerfile b/doc/Dockerfile similarity index 100% rename from src/beast/doc/Dockerfile rename to doc/Dockerfile diff --git a/doc/Doxyfile b/doc/Doxyfile deleted file mode 100644 index f79136c5d8..0000000000 --- a/doc/Doxyfile +++ /dev/null @@ -1,2304 +0,0 @@ -# Doxyfile 1.8.6 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed in -# front of the TAG it is preceding. -# -# All text after a single hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists, items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (\" \"). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all text -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv -# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv -# for the list of possible encodings. -# The default value is: UTF-8. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by -# double-quotes, unless you are using Doxywizard) that should identify the -# project for which the documentation is generated. This name is used in the -# title of most generated pages and in a few other places. -# The default value is: My Project. - -PROJECT_NAME = "RippleD" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This -# could be handy for archiving the generated documentation or if some version -# control system is used. - -PROJECT_NUMBER = - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a -# quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = "RippleD Server Software" - -# With the PROJECT_LOGO tag one can specify an logo or icon that is included in -# the documentation. The maximum height of the logo should not exceed 55 pixels -# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo -# to the output directory. - -PROJECT_LOGO = doc/LogoForDocumentation.png - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path -# into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If -# left blank the current directory will be used. - -OUTPUT_DIRECTORY = - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. -# The default value is: NO. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. -# The default value is: English. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member -# descriptions after the members that are listed in the file and class -# documentation (similar to Javadoc). Set to NO to disable this. -# The default value is: YES. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief -# description of a member or function before the detailed description -# -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. -# The default value is: YES. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator that is -# used to form the text in various listings. Each string in this list, if found -# as the leading text of the brief description, will be stripped from the text -# and the result, after processing the whole list, is used as the annotated -# text. Otherwise, the brief description is used as-is. If left blank, the -# following values are used ($name is automatically replaced with the name of -# the entity):The $name class, The $name widget, The $name file, is, provides, -# specifies, contains, represents, a, an and the. - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief -# description. -# The default value is: NO. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. -# The default value is: NO. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path -# before files name in the file list and in the header files. If set to NO the -# shortest path that makes the file name unique will be used -# The default value is: YES. - -FULL_PATH_NAMES = NO - -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. -# Stripping is only done if one of the specified strings matches the left-hand -# part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to -# strip. -# -# Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. -# This tag requires that the tag FULL_PATH_NAMES is set to YES. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the -# path mentioned in the documentation of a class, which tells the reader which -# header file to include in order to use a class. If left blank only the name of -# the header file containing the class definition is used. Otherwise one should -# specify the list of include paths that are normally passed to the compiler -# using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't -# support long names like on DOS, Mac, or CD-ROM. -# The default value is: NO. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) -# The default value is: NO. - -JAVADOC_AUTOBRIEF = YES - -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) -# The default value is: NO. - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as -# a brief description. This used to be the default behavior. The new default is -# to treat a multi-line C++ comment block as a detailed description. Set this -# tag to YES if you prefer the old behavior instead. -# -# Note that setting this tag to YES also means that rational rose comments are -# not recognized any more. -# The default value is: NO. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the -# documentation from any documented member that it re-implements. -# The default value is: YES. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a -# new page for each member. If set to NO, the documentation of a member will be -# part of the file/class/namespace that contains it. -# The default value is: NO. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen -# uses this value to replace tabs by spaces in code fragments. -# Minimum value: 1, maximum value: 16, default value: 4. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that act as commands in -# the documentation. An alias has the form: -# name=value -# For example adding -# "sideeffect=@par Side Effects:\n" -# will allow you to put the command \sideeffect (or @sideeffect) in the -# documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines. - -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make -# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C -# (default is Fortran), use: inc=Fortran f=C. -# -# Note For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by by putting a % sign in front of the word -# or globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = YES - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 2 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO these classes will be included in the various overviews. This option has -# no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = YES - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO these declarations will be -# included in the documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. -# The default value is: system dependent. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = YES - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = NO - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the -# todo list. This list is created by putting \todo commands in the -# documentation. -# The default value is: YES. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the -# test list. This list is created by putting \test commands in the -# documentation. -# The default value is: YES. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if ... \endif and \cond -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES the list -# will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = NO - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. Do not use file names with spaces, bibtex cannot handle them. See -# also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = YES - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO doxygen will only warn about wrong or incomplete parameter -# documentation, but not about the absence of documentation. -# The default value is: NO. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. -# Note: If this tag is empty the current directory is searched. - -INPUT = \ - src/ripple - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: http://www.gnu.org/software/libiconv) for the list of -# possible encodings. -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank the -# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, -# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, -# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, -# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, -# *.qsf, *.as and *.js. - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# -# -# where is the value of the INPUT_FILTER tag, and is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER ) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES, then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = YES - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see http://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = YES - -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = HtmlDocumentation - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- -# defined cascading style sheet that is included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefor more robust against future updates. -# Doxygen will copy the style sheet file to the output directory. For an example -# see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the stylesheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = NO - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = YES - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: http://developer.apple.com/tools/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = NO - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler ( hhc.exe). If non-empty -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = - -# The GENERATE_CHI flag controls if a separate .chi index file is generated ( -# YES) or that it should be included in the master .chm file ( NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated ( -# YES) or a normal table of contents ( NO) in the .chm file. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- -# folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 250 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# http://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using prerendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from http://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use + S -# (what the is depends on the OS and browser, but it is typically -# , /